glimmer-dsl-swt 0.1.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4b54809644b379821d606ce742901ec5ce91197bfccb33ee15893d9b809ef766
4
- data.tar.gz: f322c7d1c9f2a7aa9b97709739978317c727a0988dec41c397db205c544c3c7b
3
+ metadata.gz: fee38949564fb2b0f3874a1bad1229cfb813439f0dca2e08b8d293b8c61fecb9
4
+ data.tar.gz: eb0e920dba273a6a343aeeb34cc664c33b7238b151df0e8cd5a4679aaee85b29
5
5
  SHA512:
6
- metadata.gz: 54539c2fa3414d637fa6e29578e88c592f09d292c7027308ced2a8ddd84f11ed6d36ec769ec9e8c06113c3fed16c08cba4774f92b5d167e8f16867788fd7106d
7
- data.tar.gz: 8f3f36715b553078f72f0fd66f635437344ba0151a1ba2665852cee9fb81658afb265d66493d0b61d42083f1ebb3c963368fc43c6f74133e4b9bf73d79fb8395
6
+ metadata.gz: c5ca29f9d303aa9320acb7f97492c8caf9d7e1135597ba646a3e5b238ec6e47408da2e4ea87f74c50ae283cd313def6d35c93e622040123dfb438c12d9330f8c
7
+ data.tar.gz: cd22b1bf5093d4a3a1c9caea73d152678395e7aa0110bdcfbe1df2ee923ca85d601c8529120a17acadabe75af979fc3791477ec00dde075b59a1f13565f5cf2a
data/README.md CHANGED
@@ -1,9 +1,12 @@
1
- # <img src="https://raw.githubusercontent.com/AndyObtiva/glimmer/master/images/glimmer-logo-hi-res.png" height=105 /> Glimmer DSL for SWT 0.1.2 (Desktop GUI)
1
+ # <img src="https://raw.githubusercontent.com/AndyObtiva/glimmer/master/images/glimmer-logo-hi-res.png" height=85 /> Glimmer DSL for SWT 0.2.3 (Desktop GUI)
2
2
  [![Gem Version](https://badge.fury.io/rb/glimmer-dsl-swt.svg)](http://badge.fury.io/rb/glimmer-dsl-swt)
3
3
  [![Travis CI](https://travis-ci.com/AndyObtiva/glimmer-dsl-swt.svg?branch=master)](https://travis-ci.com/github/AndyObtiva/glimmer-dsl-swt)
4
+ [![Coverage Status](https://coveralls.io/repos/github/AndyObtiva/glimmer-dsl-swt/badge.svg?branch=master)](https://coveralls.io/github/AndyObtiva/glimmer-dsl-swt?branch=master)
4
5
  [![Join the chat at https://gitter.im/AndyObtiva/glimmer](https://badges.gitter.im/AndyObtiva/glimmer.svg)](https://gitter.im/AndyObtiva/glimmer?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
5
6
 
6
- [Glimmer](https://github.com/AndyObtiva/glimmer) DSL for SWT enables desktop development with Glimmer.
7
+ [Glimmer](https://github.com/AndyObtiva/glimmer) DSL for [SWT](https://www.eclipse.org/swt/) enables desktop development with [Glimmer](https://github.com/AndyObtiva/glimmer).
8
+
9
+ [Glimmer](https://github.com/AndyObtiva/glimmer) is a native-GUI cross-platform desktop development library written in Ruby. Glimmer's main innovation is a JRuby DSL that enables productive and efficient authoring of desktop application user-interfaces while relying on the robust Eclipse SWT library. Glimmer additionally innovates by having built-in data-binding support to greatly facilitate synchronizing the GUI with domain models. As a result, that achieves true decoupling of object oriented components, enabling developers to solve business problems without worrying about GUI concerns, or alternatively drive development GUI-first, and then write clean business models test-first afterwards.
7
10
 
8
11
  You may find full setup/usage instructions at the main [Glimmer project page](https://github.com/AndyObtiva/glimmer).
9
12
 
@@ -12,6 +15,23 @@ Other Glimmer DSL gems:
12
15
  - [glimmer-dsl-xml](https://github.com/AndyObtiva/glimmer-dsl-xml): Glimmer DSL for XML (& HTML)
13
16
  - [glimmer-dsl-css](https://github.com/AndyObtiva/glimmer-dsl-css): Glimmer DSL for CSS (Cascading Style Sheets)
14
17
 
18
+ ## Example
19
+
20
+ ```ruby
21
+ include Glimmer
22
+
23
+ shell {
24
+ text 'Glimmer'
25
+ label {
26
+ text 'Hello, World!'
27
+ }
28
+ }.open
29
+ ```
30
+
31
+ ![Glimmer DSL for SWT Hello World](https://github.com/AndyObtiva/glimmer/blob/master/images/glimmer-hello-world.png)
32
+
33
+ Learn more at the main [Glimmer project page](https://github.com/AndyObtiva/glimmer).
34
+
15
35
  ## Help
16
36
 
17
37
  ### Issues
@@ -1 +1 @@
1
- jruby-9.2.11.1
1
+ jruby-9.2.12.0
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.2
1
+ 0.2.3
Binary file
@@ -3,11 +3,18 @@ require 'glimmer/swt/packages'
3
3
  module Glimmer
4
4
  class << self
5
5
  def included(klass)
6
+ if Object.const_defined?(:ActiveSupport) && ActiveSupport.const_defined?(:Dependencies)
7
+ begin
8
+ ActiveSupport::Dependencies.unhook!
9
+ rescue => e
10
+ # noop TODO support logging unimportant details below debug level
11
+ end
12
+ end
6
13
  if Config.import_swt_packages
7
14
  klass.include(SWT::Packages)
8
15
  klass.extend(SWT::Packages)
9
- klass.extend(Glimmer)
10
16
  end
17
+ klass.extend(Glimmer)
11
18
  end
12
19
  end
13
20
  end
@@ -1,16 +1,24 @@
1
1
  module Glimmer
2
2
  module Config
3
+ DEFAULT_IMPORT_SWT_PACKAGES = [
4
+ 'org.eclipse.swt',
5
+ 'org.eclipse.swt.widgets',
6
+ 'org.eclipse.swt.layout',
7
+ 'org.eclipse.swt.graphics',
8
+ 'org.eclipse.swt.browser',
9
+ 'org.eclipse.swt.custom',
10
+ 'org.eclipse.swt.dnd',
11
+ ]
12
+
3
13
  class << self
4
14
  # Tells Glimmer to import SWT packages into including class (default: true)
5
15
  def import_swt_packages=(value)
6
- @@import_swt_packages = !!value
16
+ @@import_swt_packages = value
7
17
  end
8
18
 
9
19
  # Returns whether Glimmer will import SWT packages into including class
10
20
  def import_swt_packages
11
- unless defined? @@import_swt_packages
12
- @@import_swt_packages = true
13
- end
21
+ @@import_swt_packages = DEFAULT_IMPORT_SWT_PACKAGES if !defined?(@@import_swt_packages) || (defined?(@@import_swt_packages) && @@import_swt_packages == true)
14
22
  @@import_swt_packages
15
23
  end
16
24
  end
@@ -2,9 +2,14 @@ $LOAD_PATH.unshift(File.expand_path('..', __FILE__))
2
2
 
3
3
  # External requires
4
4
  require 'java'
5
- require 'nested_inherited_jruby_include_package'
6
- require 'super_module'
7
- require 'glimmer'
5
+ if ENV['BUNDLER_REQUIRE'].to_s.downcase == 'true'
6
+ require 'bundler'
7
+ Bundler.require
8
+ else
9
+ require 'nested_inherited_jruby_include_package'
10
+ require 'super_module'
11
+ require 'glimmer'
12
+ end
8
13
 
9
14
  # Internal requires
10
15
  require 'ext/glimmer/config'
@@ -1,4 +1,3 @@
1
- require 'glimmer'
2
1
  require 'glimmer/data_binding/observable'
3
2
  require 'glimmer/data_binding/observer'
4
3
 
@@ -22,23 +22,24 @@ module Glimmer
22
22
  @table.body_root.column_properties = @column_properties
23
23
  end
24
24
  call(@model_binding.evaluate_property)
25
- model = model_binding.base_model
26
- observe(model, model_binding.property_name_expression)
25
+ observe(model_binding)
27
26
  @table.on_widget_disposed do |dispose_event|
28
27
  unregister_all_observables
29
28
  end
30
29
  end
31
30
 
32
31
  def call(new_model_collection=nil)
32
+ new_model_collection = @model_binding.evaluate_property # this ensures applying converters (e.g. :on_read)
33
33
  if new_model_collection and new_model_collection.is_a?(Array)
34
34
  observe(new_model_collection, @column_properties)
35
35
  @model_collection = new_model_collection
36
36
  end
37
- populate_table(@model_collection, @table, @column_properties)
37
+ populate_table(@model_collection, @table, @column_properties)
38
38
  end
39
-
39
+
40
40
  def populate_table(model_collection, parent, column_properties)
41
41
  selected_table_item_models = parent.swt_widget.getSelection.map(&:getData)
42
+ parent.finish_edit!
42
43
  parent.swt_widget.removeAll
43
44
  model_collection.each do |model|
44
45
  table_item = TableItem.new(parent.swt_widget, SWT::SWTProxy[:none])
@@ -35,6 +35,10 @@ module Glimmer
35
35
  parent.on_widget_selected do
36
36
  model_binding.call(widget_binding.evaluate_property)
37
37
  end
38
+
39
+ parent.on_modify_text do
40
+ model_binding.call(widget_binding.evaluate_property)
41
+ end
38
42
  end
39
43
  end
40
44
  end
@@ -0,0 +1,25 @@
1
+ require 'glimmer/dsl/static_expression'
2
+ require 'glimmer/swt/dnd_proxy'
3
+
4
+ # TODO consider turning static keywords like bind into methods
5
+
6
+ module Glimmer
7
+ module DSL
8
+ module SWT
9
+ # Responsible for returning DND constant values
10
+ #
11
+ # Named DndExpression (not DNDExpression) so that the DSL engine
12
+ # discovers quickly by convention
13
+ class DndExpression < StaticExpression
14
+ def can_interpret?(parent, keyword, *args, &block)
15
+ block.nil? &&
16
+ args.size > 0
17
+ end
18
+
19
+ def interpret(parent, keyword, *args, &block)
20
+ Glimmer::SWT::DNDProxy[*args]
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -14,10 +14,6 @@ module Glimmer
14
14
 
15
15
  include_package 'org.eclipse.swt.widgets'
16
16
 
17
- def can_interpret?(parent, keyword, *args, &block)
18
- keyword == 'message_box'
19
- end
20
-
21
17
  def interpret(parent, keyword, *args, &block)
22
18
  potential_parent = args.first
23
19
  parent = args.shift if potential_parent.is_a?(Shell) || (potential_parent.respond_to?(:swt_widget) && potential_parent.swt_widget.is_a?(Shell))
@@ -1,10 +1,18 @@
1
1
  require 'os'
2
2
 
3
+ # TODO refactor to nest under RakeTask namespace
4
+
3
5
  module Glimmer
4
6
  module Package
5
7
  class << self
6
8
  attr_accessor :javapackager_extra_args
7
9
 
10
+ def clean
11
+ require 'fileutils'
12
+ FileUtils.rm_rf('dist')
13
+ FileUtils.rm_rf('packages')
14
+ end
15
+
8
16
  def config
9
17
  project_name = File.basename(File.expand_path('.'))
10
18
  if !File.exists?('config/warble.rb')
@@ -13,7 +21,7 @@ module Glimmer
13
21
  system('warble config')
14
22
  new_config = File.read('config/warble.rb').split("\n").inject('') do |output, line|
15
23
  if line.include?('config.dirs =')
16
- line = line.sub('# ', '').sub(/=[^=\n]+$/, '= %w(app config db lib script bin docs fonts icons images sounds videos)')
24
+ line = line.sub('# ', '').sub(/=[^=\n]+$/, '= %w(app config db lib script bin docs fonts icons images sounds videos vendor)')
17
25
  end
18
26
  if line.include?('config.includes =')
19
27
  line = line.sub('# ', '').sub(/=[^=\n]+$/, "= FileList['LICENSE.txt', 'VERSION']")
@@ -4,6 +4,11 @@ require_relative 'package'
4
4
 
5
5
  namespace :glimmer do
6
6
  namespace :package do
7
+ desc 'Clean by removing "dist" and "packages" directories'
8
+ task :clean do
9
+ Glimmer::Package.clean
10
+ end
11
+
7
12
  desc 'Generate JAR config file'
8
13
  task :config do
9
14
  Glimmer::Package.config
@@ -59,4 +64,26 @@ namespace :glimmer do
59
64
  Scaffold.custom_widget_gem(args[:custom_widget_name], args[:namespace])
60
65
  end
61
66
  end
67
+
68
+ namespace :list do
69
+ task :list_require do
70
+ require_relative 'rake_task/list'
71
+ end
72
+
73
+ desc 'List Glimmer custom widget gems available at rubygems.org (query is optional)'
74
+ task :custom_widget_gems, [:query] => :list_require do |t, args|
75
+ Glimmer::RakeTask::List.custom_widget_gems(args[:query])
76
+ end
77
+
78
+ desc 'List Glimmer custom shell gems available at rubygems.org (query is optional)'
79
+ task :custom_shell_gems, [:query] => :list_require do |t, args|
80
+ Glimmer::RakeTask::List.custom_shell_gems(args[:query])
81
+ end
82
+
83
+ desc 'List Glimmer DSL gems available at rubygems.org (query is optional)'
84
+ task :dsl_gems, [:query] => :list_require do |t, args|
85
+ Glimmer::RakeTask::List.dsl_gems(args[:query])
86
+ end
87
+
88
+ end
62
89
  end
@@ -0,0 +1,73 @@
1
+ require 'facets'
2
+ require 'text-table'
3
+
4
+ module Glimmer
5
+ module RakeTask
6
+ # Lists Glimmer related gems to use in rake_task.rb
7
+ class List
8
+ class << self
9
+ REGEX_GEM_LINE = /^([^\(]+) \(([^\)]+)\)$/
10
+
11
+ def custom_widget_gems(query=nil)
12
+ list_gems('glimmer-cw-', query) do |result|
13
+ puts
14
+ puts " Glimmer Custom Widget Gems#{" matching [#{query}]" if query} at rubygems.org:"
15
+ puts result
16
+ end
17
+ end
18
+
19
+ def custom_shell_gems(query=nil)
20
+ list_gems('glimmer-cs-', query) do |result|
21
+ puts
22
+ puts " Glimmer Custom Shell Gems#{" matching [#{query}]" if query} at rubygems.org:"
23
+ puts result
24
+ end
25
+ end
26
+
27
+ def dsl_gems(query=nil)
28
+ list_gems('glimmer-dsl-', query) do |result|
29
+ puts
30
+ puts " Glimmer DSL Gems#{" matching [#{query}]" if query} at rubygems.org:"
31
+ puts result
32
+ end
33
+ end
34
+
35
+ def list_gems(gem_prefix, query=nil, &printer)
36
+ lines = `gem search -d #{gem_prefix}`.split("\n")
37
+ gems = lines.slice_before {|l| l.match(REGEX_GEM_LINE) }.to_a
38
+ gems = gems.map do |gem|
39
+ {
40
+ name: gem[0].match(REGEX_GEM_LINE)[1],
41
+ version: gem[0].match(REGEX_GEM_LINE)[2],
42
+ author: gem[1].strip,
43
+ description: gem[4..-1].map(&:strip).join(' ')
44
+ }
45
+ end.select do |gem|
46
+ query.nil? || "#{gem[:name]} #{gem[:author]} #{gem[:description]}".downcase.include?(query.to_s.downcase)
47
+ end
48
+ printer.call(tablify(gem_prefix, gems))
49
+ end
50
+
51
+ def tablify(gem_prefix, gems)
52
+ array_of_arrays = gems.map do |gem|
53
+ [
54
+ gem[:name].sub(gem_prefix, '').underscore.titlecase,
55
+ gem[:name],
56
+ gem[:version],
57
+ gem[:author].sub('Author: ', ''),
58
+ gem[:description],
59
+ ]
60
+ end
61
+ Text::Table.new(
62
+ :head => %w[Name Gem Version Author Description],
63
+ :rows => array_of_arrays,
64
+ :horizontal_padding => 1,
65
+ :vertical_boundary => ' ',
66
+ :horizontal_boundary => ' ',
67
+ :boundary_intersection => ' '
68
+ )
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -2,6 +2,8 @@ require 'fileutils'
2
2
  require 'os'
3
3
  require 'facets'
4
4
 
5
+ # TODO refactor to nest under RakeTask namespace
6
+
5
7
  class Scaffold
6
8
  class << self
7
9
  include FileUtils
@@ -56,7 +58,7 @@ class Scaffold
56
58
 
57
59
  # for a library or gem, you might want to ignore these files since the code is
58
60
  # intended to run in multiple environments; otherwise, check them in:
59
- Gemfile.lock
61
+ # Gemfile.lock
60
62
  # .ruby-version
61
63
  # .ruby-gemset
62
64
 
@@ -177,6 +179,7 @@ class Scaffold
177
179
  end
178
180
 
179
181
  def custom_shell_gem(custom_shell_name, namespace)
182
+ return puts('Namespace is required! Usage: glimmer scaffold:custom_shell_gem[custom_shell_name,namespace]') unless `git config --get github.user`.to_s.strip == 'AndyObtiva'
180
183
  gem_name = "glimmer-cs-#{compact_name(custom_shell_name)}"
181
184
  gem_summary = "#{human_name(custom_shell_name)} - Glimmer Custom Shell"
182
185
  if namespace
@@ -216,6 +219,7 @@ class Scaffold
216
219
  end
217
220
 
218
221
  def custom_widget_gem(custom_widget_name, namespace)
222
+ 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'
219
223
  gem_name = "glimmer-cw-#{compact_name(custom_widget_name)}"
220
224
  gem_summary = "#{human_name(custom_widget_name)} - Glimmer Custom Widget"
221
225
  if namespace
@@ -0,0 +1,34 @@
1
+ require 'glimmer/swt/style_constantizable'
2
+
3
+ module Glimmer
4
+ module SWT
5
+ # Proxy for org.eclipse.swt.dnd.DND
6
+ #
7
+ # Follows the Proxy Design Pattern
8
+ class DNDProxy
9
+ include StyleConstantizable
10
+
11
+ class << self
12
+ JAVA_IMPORT = 'org.eclipse.swt.dnd.DND'
13
+
14
+ java_import JAVA_IMPORT
15
+
16
+ def constant_java_import
17
+ JAVA_IMPORT
18
+ end
19
+
20
+ def constant_source_class
21
+ DND
22
+ end
23
+
24
+ def constant_value_none
25
+ DND::DROP_NONE
26
+ end
27
+
28
+ def extra_styles
29
+ {}
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,13 +1,16 @@
1
+ require 'ext/glimmer/config'
2
+
1
3
  module Glimmer
2
4
  module SWT
3
5
  # This contains Java imports of SWT Java packages
4
6
  module Packages
5
- include_package 'org.eclipse.swt'
6
- include_package 'org.eclipse.swt.widgets'
7
- include_package 'org.eclipse.swt.layout'
8
- include_package 'org.eclipse.swt.graphics'
9
- include_package 'org.eclipse.swt.browser'
10
- include_package 'org.eclipse.swt.custom'
7
+ class << self
8
+ def included(klass)
9
+ Glimmer::Config.import_swt_packages.to_a.each do |package|
10
+ include_package(package) if package.is_a?(String)
11
+ end
12
+ end
13
+ end
11
14
  end
12
15
  end
13
16
  end
@@ -0,0 +1,120 @@
1
+ require 'glimmer/error'
2
+
3
+ module Glimmer
4
+ module SWT
5
+ # Mixin for all proxy classes that manage style constants (e.g. SWT, DND, etc...)
6
+ module StyleConstantizable
7
+ include SuperModule
8
+
9
+ class << self
10
+ REGEX_SYMBOL_NEGATIVITY = /^([^!]+)(!)?$/
11
+
12
+ def constant_java_import
13
+ raise 'Not implemented! Mixer must implement!'
14
+ end
15
+
16
+ def constant_source_class
17
+ raise 'Not implemented! Mixer must implement!'
18
+ end
19
+
20
+ def constant_value_none
21
+ raise 'Not implemented! Mixer must implement!'
22
+ end
23
+
24
+ # hash of extra styles (i.e. new style combinations)
25
+ def extra_styles
26
+ raise 'Not implemented! Mixer must implement!'
27
+ end
28
+
29
+ def error_message_invalid_style
30
+ " is an invalid #{constant_source_class.name.split(':').last} style! Please choose a style from #{constant_java_import} class constants." # TODO parameterize
31
+ end
32
+
33
+ # Gets constants (e.g. SWT::CONSTANT) where constant is
34
+ # passed in as a lower case symbol
35
+ def [](*symbols)
36
+ symbols = symbols.first if symbols.size == 1 && symbols.first.is_a?(Array)
37
+ result = symbols.compact.map do |symbol|
38
+ constant(symbol).tap do |constant_value|
39
+ raise Glimmer::Error, symbol.to_s + error_message_invalid_style unless constant_value.is_a?(Integer)
40
+ end
41
+ end.reduce do |output, constant_value|
42
+ if constant_value < 0
43
+ output & constant_value
44
+ else
45
+ output | constant_value
46
+ end
47
+ end
48
+ result.nil? ? constant_value_none : result
49
+ end
50
+
51
+ # Returns style integer value for passed in symbol or allows
52
+ # passed in object to pass through (e.g. Integer). This makes is convenient
53
+ # to use symbols or actual style integers in Glimmer
54
+ # Does not raise error for invalid values. Just lets them pass as is.
55
+ # (look into [] operator if you want an error raised on invalid values)
56
+ def constant(symbol)
57
+ return symbol unless symbol.is_a?(Symbol) || symbol.is_a?(String)
58
+ symbol_string, negative = extract_symbol_string_negativity(symbol)
59
+ swt_constant_symbol = symbol_string.downcase == symbol_string ? symbol_string.upcase.to_sym : symbol_string.to_sym
60
+ bit_value = constant_source_class.const_get(swt_constant_symbol)
61
+ negative ? ~bit_value : bit_value
62
+ rescue => e
63
+ begin
64
+ # Glimmer::Config.logger&.debug(e.full_message)
65
+ alternative_swt_constant_symbol = constant_source_class.constants.find {|c| c.to_s.upcase == swt_constant_symbol.to_s.upcase}
66
+ bit_value = constant_source_class.const_get(alternative_swt_constant_symbol)
67
+ negative ? ~bit_value : bit_value
68
+ rescue => e
69
+ # Glimmer::Config.logger&.debug(e.full_message)
70
+ bit_value = extra_styles[swt_constant_symbol]
71
+ if bit_value
72
+ negative ? ~bit_value : bit_value
73
+ else
74
+ symbol
75
+ end
76
+ end
77
+ end
78
+
79
+ def extract_symbol_string_negativity(symbol)
80
+ if symbol.is_a?(Symbol) || symbol.is_a?(String)
81
+ symbol_negativity_match = symbol.to_s.match(REGEX_SYMBOL_NEGATIVITY)
82
+ symbol = symbol_negativity_match[1]
83
+ negative = !!symbol_negativity_match[2]
84
+ [symbol, negative]
85
+ else
86
+ negative = symbol < 0
87
+ [symbol, negative]
88
+ end
89
+ end
90
+
91
+ def negative?(symbol)
92
+ extract_symbol_string_negativity(symbol)[1]
93
+ end
94
+
95
+ def has_constant?(symbol)
96
+ return false unless symbol.is_a?(Symbol) || symbol.is_a?(String)
97
+ constant(symbol).is_a?(Integer)
98
+ end
99
+
100
+ def constantify_args(args)
101
+ args.map {|arg| constant(arg)}
102
+ end
103
+
104
+ # Deconstructs a style integer into symbols
105
+ # Useful for debugging
106
+ def deconstruct(integer)
107
+ constant_source_class.constants.reduce([]) do |found, c|
108
+ constant_value = constant_source_class.const_get(c) rescue -1
109
+ is_found = constant_value.is_a?(Integer) && (constant_value & integer) == constant_value
110
+ is_found ? found += [c] : found
111
+ end
112
+ end
113
+
114
+ def include?(swt_constant, *symbols)
115
+ swt_constant & self[symbols] == self[symbols]
116
+ end
117
+ end
118
+ end
119
+ end
120
+ end
@@ -1,106 +1,38 @@
1
- require 'glimmer/error'
1
+ require 'glimmer/swt/style_constantizable'
2
2
 
3
3
  module Glimmer
4
- module SWT # TODO Consider making this the class below to ease calling it
4
+ module SWT
5
5
  # Proxy for org.eclipse.swt.SWT
6
6
  #
7
7
  # Follows the Proxy Design Pattern
8
- class SWTProxy
9
- class << self
10
- java_import 'org.eclipse.swt.SWT'
11
-
12
- ERROR_INVALID_STYLE = " is an invalid SWT style! Please choose a style from org.eclipse.swt.SWT class constants."
13
- REGEX_SYMBOL_NEGATIVITY = /^([^!]+)(!)?$/
14
-
15
- # Gets SWT constants as if calling SWT::CONSTANT where constant is
16
- # passed in as a lower case symbol
17
- def [](*symbols)
18
- symbols = symbols.first if symbols.size == 1 && symbols.first.is_a?(Array)
19
- result = symbols.compact.map do |symbol|
20
- constant(symbol).tap do |constant_value|
21
- raise Error, symbol.to_s + ERROR_INVALID_STYLE unless constant_value.is_a?(Integer)
22
- end
23
- end.reduce do |output, constant_value|
24
- if constant_value < 0
25
- output & constant_value
26
- else
27
- output | constant_value
28
- end
29
- end
30
- result.nil? ? SWT::NONE : result
31
- end
32
-
33
- # Returns SWT style integer value for passed in symbol or allows
34
- # passed in object to pass through (e.g. Integer). This makes is convenient
35
- # to use symbols or actual SWT style integers in Glimmer
36
- # Does not raise error for invalid values. Just lets them pass as is.
37
- # (look into [] operator if you want an error raised on invalid values)
38
- def constant(symbol)
39
- return symbol unless symbol.is_a?(Symbol) || symbol.is_a?(String)
40
- symbol_string, negative = extract_symbol_string_negativity(symbol)
41
- swt_constant_symbol = symbol_string.downcase == symbol_string ? symbol_string.upcase.to_sym : symbol_string.to_sym
42
- bit_value = SWT.const_get(swt_constant_symbol)
43
- negative ? ~bit_value : bit_value
44
- rescue => e
45
- begin
46
- # Glimmer::Config.logger&.debug(e.full_message)
47
- alternative_swt_constant_symbol = SWT.constants.find {|c| c.to_s.upcase == swt_constant_symbol.to_s.upcase}
48
- bit_value = SWT.const_get(alternative_swt_constant_symbol)
49
- negative ? ~bit_value : bit_value
50
- rescue => e
51
- # Glimmer::Config.logger&.debug(e.full_message)
52
- bit_value = Glimmer::SWT::SWTProxy::EXTRA_STYLES[swt_constant_symbol]
53
- if bit_value
54
- negative ? ~bit_value : bit_value
55
- else
56
- symbol
57
- end
58
- end
59
- end
8
+ class SWTProxy
9
+ include StyleConstantizable
60
10
 
61
- def extract_symbol_string_negativity(symbol)
62
- if symbol.is_a?(Symbol) || symbol.is_a?(String)
63
- symbol_negativity_match = symbol.to_s.match(REGEX_SYMBOL_NEGATIVITY)
64
- symbol = symbol_negativity_match[1]
65
- negative = !!symbol_negativity_match[2]
66
- [symbol, negative]
67
- else
68
- negative = symbol < 0
69
- [symbol, negative]
70
- end
71
- end
72
-
73
- def negative?(symbol)
74
- extract_symbol_string_negativity(symbol)[1]
75
- end
76
-
77
- def has_constant?(symbol)
78
- return false unless symbol.is_a?(Symbol) || symbol.is_a?(String)
79
- constant(symbol).is_a?(Integer)
11
+ class << self
12
+ JAVA_IMPORT = 'org.eclipse.swt.SWT'
13
+
14
+ java_import JAVA_IMPORT
15
+
16
+ def constant_java_import
17
+ JAVA_IMPORT
80
18
  end
81
19
 
82
- def constantify_args(args)
83
- args.map {|arg| constant(arg)}
20
+ def constant_source_class
21
+ SWT
84
22
  end
85
23
 
86
- # Deconstructs a style integer into symbols
87
- # Useful for debugging
88
- def deconstruct(integer)
89
- SWT.constants.reduce([]) do |found, c|
90
- constant_value = SWT.const_get(c) rescue -1
91
- is_found = constant_value.is_a?(Integer) && (constant_value & integer) == constant_value
92
- is_found ? found += [c] : found
93
- end
24
+ def constant_value_none
25
+ SWT::NONE
94
26
  end
95
-
96
- def include?(swt_constant, *symbols)
97
- swt_constant & self[symbols] == self[symbols]
27
+
28
+ def extra_styles
29
+ EXTRA_STYLES
98
30
  end
99
31
  end
100
-
32
+
101
33
  EXTRA_STYLES = {
102
34
  NO_RESIZE: self[:shell_trim, :resize!, :max!]
103
- }
35
+ }
104
36
  end
105
37
  end
106
38
  end
@@ -68,6 +68,21 @@ module Glimmer
68
68
  })
69
69
  end
70
70
 
71
+ # Indicates if table is in edit mode, thus displaying a text widget for a table item cell
72
+ def edit_mode?
73
+ !!@edit_mode
74
+ end
75
+
76
+ def cancel_edit!
77
+ @cancel_edit&.call if @edit_mode
78
+ end
79
+
80
+ def finish_edit!
81
+ @finish_edit&.call if @edit_mode
82
+ end
83
+
84
+ # Indicates if table is editing a table item because the user hit ENTER or focused out after making a change in edit mode to a table item cell.
85
+ # It is set to false once change is saved to model
71
86
  def edit_in_progress?
72
87
  !!@edit_in_progress
73
88
  end
@@ -78,24 +93,32 @@ module Glimmer
78
93
 
79
94
  def edit_table_item(table_item, column_index, before_write: nil, after_write: nil, after_cancel: nil)
80
95
  return if table_item.nil?
96
+ @cancel_edit&.call if @edit_mode
97
+ @edit_mode = true
81
98
  content {
82
99
  @table_editor_text_proxy = text {
83
100
  focus true
84
101
  text table_item.getText(column_index)
85
102
  action_taken = false
86
- cancel = lambda {
87
- @table_editor_text_proxy.swt_widget.dispose
103
+ @cancel_edit = lambda do
104
+ @cancel_in_progress = true
105
+ @table_editor_text_proxy&.swt_widget&.dispose
88
106
  @table_editor_text_proxy = nil
89
107
  after_cancel&.call
90
108
  @edit_in_progress = false
91
- }
92
- action = lambda { |event|
93
- if !action_taken && !@edit_in_progress
109
+ @cancel_in_progress = false
110
+ @cancel_edit = nil
111
+ @edit_mode = false
112
+ end
113
+ @finish_edit = lambda do |event=nil|
114
+ if table_item.isDisposed
115
+ @cancel_edit.call
116
+ elsif !action_taken && !@edit_in_progress && !@cancel_in_progress
94
117
  action_taken = true
95
118
  @edit_in_progress = true
96
119
  new_text = @table_editor_text_proxy.swt_widget.getText
97
120
  if new_text == table_item.getText(column_index)
98
- cancel.call
121
+ @cancel_edit.call
99
122
  else
100
123
  before_write&.call
101
124
  table_item.setText(column_index, new_text)
@@ -103,19 +126,19 @@ module Glimmer
103
126
  model.send("#{column_properties[column_index]}=", new_text) # makes table update itself, so must search for selected table item again
104
127
  edited_table_item = search { |ti| ti.getData == model }.first
105
128
  swt_widget.showItem(edited_table_item)
106
- @table_editor_text_proxy.swt_widget.dispose
129
+ @table_editor_text_proxy&.swt_widget&.dispose
107
130
  @table_editor_text_proxy = nil
108
131
  after_write&.call(edited_table_item)
109
132
  @edit_in_progress = false
110
133
  end
111
134
  end
112
- }
113
- on_focus_lost(&action)
135
+ end
136
+ on_focus_lost(&@finish_edit)
114
137
  on_key_pressed { |key_event|
115
138
  if key_event.keyCode == swt(:cr)
116
- action.call(key_event)
139
+ @finish_edit.call(key_event)
117
140
  elsif key_event.keyCode == swt(:esc)
118
- cancel.call
141
+ @cancel_edit.call
119
142
  end
120
143
  }
121
144
  }
@@ -2,6 +2,7 @@ require 'glimmer/swt/widget_listener_proxy'
2
2
  require 'glimmer/swt/color_proxy'
3
3
  require 'glimmer/swt/font_proxy'
4
4
  require 'glimmer/swt/swt_proxy'
5
+ require 'glimmer/swt/dnd_proxy'
5
6
  require 'glimmer/data_binding/observable_widget'
6
7
 
7
8
  # TODO refactor to make file smaller and extract sub-widget-proxies out of this
@@ -30,6 +31,8 @@ module Glimmer
30
31
  "list" => [:border, :v_scroll],
31
32
  "button" => [:push],
32
33
  "menu_item" => [:push],
34
+ "drag_source" => [:drop_copy],
35
+ "drop_target" => [:drop_copy],
33
36
  }
34
37
 
35
38
  DEFAULT_INITIALIZERS = {
@@ -48,7 +51,7 @@ module Glimmer
48
51
  end,
49
52
  }
50
53
 
51
- attr_reader :swt_widget
54
+ attr_reader :swt_widget, :drag_source_proxy, :drop_target_proxy, :drag_source_style, :drag_source_transfer, :drop_target_transfer
52
55
 
53
56
  # Initializes a new SWT Widget
54
57
  #
@@ -72,7 +75,18 @@ module Glimmer
72
75
  if @arg_extractor_mapping[underscored_widget_name]
73
76
  @arg_extractor_mapping[underscored_widget_name].call(args)
74
77
  else
75
- [args, []]
78
+ extra_options = []
79
+ style_args = args.select {|arg| arg.is_a?(Symbol) || arg.is_a?(String)}
80
+ if style_args.any?
81
+ style_arg_start_index = args.index(style_args.first)
82
+ style_arg_last_index = args.index(style_args.last)
83
+ extra_options = args[style_arg_last_index+1..-1]
84
+ args = args[style_arg_start_index..style_arg_last_index]
85
+ elsif args.first.is_a?(Integer)
86
+ extra_options = args[1..-1]
87
+ args = args[0..0]
88
+ end
89
+ [args, extra_options]
76
90
  end
77
91
  end
78
92
 
@@ -81,7 +95,7 @@ module Glimmer
81
95
  if widget_custom_attribute
82
96
  @swt_widget.respond_to?(widget_custom_attribute[:setter][:name])
83
97
  else
84
- @swt_widget.respond_to?(attribute_setter(attribute_name), args)
98
+ @swt_widget.respond_to?(attribute_setter(attribute_name), args) || respond_to?(ruby_attribute_setter(attribute_name), args)
85
99
  end
86
100
  end
87
101
 
@@ -89,9 +103,11 @@ module Glimmer
89
103
  widget_custom_attribute = widget_custom_attribute_mapping[attribute_name.to_s]
90
104
  if widget_custom_attribute
91
105
  widget_custom_attribute[:setter][:invoker].call(@swt_widget, args)
92
- else
106
+ elsif @swt_widget.respond_to?(attribute_setter(attribute_name), args)
93
107
  apply_property_type_converters(attribute_name, args)
94
108
  @swt_widget.send(attribute_setter(attribute_name), *args) unless @swt_widget.send(attribute_getter(attribute_name)) == args.first
109
+ else
110
+ send(ruby_attribute_setter(attribute_name), args)
95
111
  end
96
112
  end
97
113
 
@@ -129,6 +145,23 @@ module Glimmer
129
145
  observer.call(false)
130
146
  }
131
147
  end,
148
+ :selection => lambda do |observer|
149
+ on_widget_selected { |selection_event|
150
+ observer.call(@swt_widget.getSelection)
151
+ } if can_handle_observation_request?(:on_widget_selected)
152
+ end,
153
+ :text => lambda do |observer|
154
+ on_modify_text { |modify_event|
155
+ observer.call(@swt_widget.getText)
156
+ } if can_handle_observation_request?(:on_modify_text)
157
+ end,
158
+ },
159
+ Java::OrgEclipseSwtWidgets::Combo => {
160
+ :text => lambda do |observer|
161
+ on_modify_text { |modify_event|
162
+ observer.call(@swt_widget.getText)
163
+ }
164
+ end,
132
165
  },
133
166
  Java::OrgEclipseSwtWidgets::Text => {
134
167
  :text => lambda do |observer|
@@ -251,7 +284,12 @@ module Glimmer
251
284
  end
252
285
 
253
286
  def has_style?(style)
254
- (@swt_widget.style & SWTProxy[style]) == SWTProxy[style]
287
+ begin
288
+ comparison = SWTProxy[style]
289
+ rescue
290
+ comparison = DNDProxy[style]
291
+ end
292
+ (@swt_widget.style & comparison) == comparison
255
293
  end
256
294
 
257
295
  def dispose
@@ -268,15 +306,28 @@ module Glimmer
268
306
  def add_observer(observer, property_name)
269
307
  property_listener_installers = @swt_widget.class.ancestors.map {|ancestor| widget_property_listener_installers[ancestor]}.compact
270
308
  widget_listener_installers = property_listener_installers.map{|installer| installer[property_name.to_s.to_sym]}.compact if !property_listener_installers.empty?
271
- widget_listener_installers.to_a.each do |widget_listener_installer|
272
- widget_listener_installer.call(observer)
273
- end
309
+ widget_listener_installers.to_a.first&.call(observer)
274
310
  end
275
311
 
276
312
  def remove_observer(observer, property_name)
277
313
  # TODO consider implementing if remove_observer is needed (consumers can remove listener via SWT API)
278
314
  end
279
315
 
316
+ def ensure_drag_source_proxy(style=[])
317
+ @drag_source_proxy ||= self.class.new('drag_source', self, style).tap do |proxy|
318
+ proxy.set_attribute(:transfer, :text)
319
+ end
320
+ end
321
+
322
+ def ensure_drop_target_proxy(style=[])
323
+ @drop_target_proxy ||= self.class.new('drop_target', self, style).tap do |proxy|
324
+ proxy.set_attribute(:transfer, :text)
325
+ proxy.on_drag_enter { |event|
326
+ event.detail = DNDProxy[:drop_copy]
327
+ }
328
+ end
329
+ end
330
+
280
331
  # TODO eliminate duplication in the following methods perhaps by relying on exceptions
281
332
 
282
333
  def can_handle_observation_request?(observation_request)
@@ -286,9 +337,31 @@ module Glimmer
286
337
  SWTProxy.has_constant?(constant_name)
287
338
  elsif observation_request.start_with?('on_')
288
339
  event = observation_request.sub(/^on_/, '')
289
- can_add_listener?(event)
290
- else
291
- false
340
+ can_add_listener?(event) || can_handle_drag_observation_request?(observation_request) || can_handle_drop_observation_request?(observation_request)
341
+ end
342
+ end
343
+
344
+ def can_handle_drag_observation_request?(observation_request)
345
+ return false unless swt_widget.is_a?(Control)
346
+ potential_drag_source = @drag_source_proxy.nil?
347
+ ensure_drag_source_proxy
348
+ @drag_source_proxy.can_handle_observation_request?(observation_request).tap do |result|
349
+ if potential_drag_source && !result
350
+ @drag_source_proxy.swt_widget.dispose
351
+ @drag_source_proxy = nil
352
+ end
353
+ end
354
+ end
355
+
356
+ def can_handle_drop_observation_request?(observation_request)
357
+ return false unless swt_widget.is_a?(Control)
358
+ potential_drop_target = @drop_target_proxy.nil?
359
+ ensure_drop_target_proxy
360
+ @drop_target_proxy.can_handle_observation_request?(observation_request).tap do |result|
361
+ if potential_drop_target && !result
362
+ @drop_target_proxy.swt_widget.dispose
363
+ @drop_target_proxy = nil
364
+ end
292
365
  end
293
366
  end
294
367
 
@@ -298,7 +371,14 @@ module Glimmer
298
371
  add_swt_event_listener(constant_name, &block)
299
372
  elsif observation_request.start_with?('on_')
300
373
  event = observation_request.sub(/^on_/, '')
301
- add_listener(event, &block)
374
+ if can_add_listener?(event)
375
+ event = observation_request.sub(/^on_/, '')
376
+ add_listener(event, &block)
377
+ elsif can_handle_drag_observation_request?(observation_request)
378
+ @drag_source_proxy&.handle_observation_request(observation_request, &block)
379
+ elsif can_handle_drop_observation_request?(observation_request)
380
+ @drop_target_proxy&.handle_observation_request(observation_request, &block)
381
+ end
302
382
  end
303
383
  end
304
384
 
@@ -310,12 +390,24 @@ module Glimmer
310
390
 
311
391
  def style(underscored_widget_name, styles)
312
392
  styles = [styles].flatten.compact
313
- styles.empty? ? default_style(underscored_widget_name) : SWTProxy[*styles]
393
+ if styles.empty?
394
+ default_style(underscored_widget_name)
395
+ else
396
+ begin
397
+ SWTProxy[*styles]
398
+ rescue
399
+ DNDProxy[*styles]
400
+ end
401
+ end
314
402
  end
315
403
 
316
404
  def default_style(underscored_widget_name)
317
405
  styles = DEFAULT_STYLES[underscored_widget_name] || [:none]
318
- SWTProxy[styles]
406
+ SWTProxy[styles] rescue DNDProxy[styles]
407
+ end
408
+
409
+ def ruby_attribute_setter(attribute_name)
410
+ "#{attribute_name}="
319
411
  end
320
412
 
321
413
  def attribute_setter(attribute_name)
@@ -339,7 +431,7 @@ module Glimmer
339
431
  def add_listener(underscored_listener_name, &block)
340
432
  widget_add_listener_method, listener_class, listener_method = self.class.find_listener(@swt_widget.getClass, underscored_listener_name)
341
433
  widget_listener_proxy = nil
342
- safe_block = lambda { |event| block.call(event) unless @swt_widget.isDisposed }
434
+ safe_block = lambda { |event| block.call(event) unless @swt_widget.isDisposed }
343
435
  listener = listener_class.new(listener_method => safe_block)
344
436
  @swt_widget.send(widget_add_listener_method, listener)
345
437
  widget_listener_proxy = WidgetListenerProxy.new(swt_widget: @swt_widget, swt_listener: listener, widget_add_listener_method: widget_add_listener_method, swt_listener_class: listener_class, swt_listener_method: listener_method)
@@ -416,6 +508,38 @@ module Glimmer
416
508
  }
417
509
  end
418
510
 
511
+ def drag_source_style=(style)
512
+ ensure_drag_source_proxy(style)
513
+ end
514
+
515
+ def drop_target_style=(style)
516
+ ensure_drop_target_proxy(style)
517
+ end
518
+
519
+ def drag_source_transfer=(args)
520
+ args = args.first if !args.empty? && args.first.is_a?(ArrayJavaProxy)
521
+ ensure_drag_source_proxy
522
+ @drag_source_proxy.set_attribute(:transfer, args)
523
+ end
524
+
525
+ def drop_target_transfer=(args)
526
+ args = args.first if !args.empty? && args.first.is_a?(ArrayJavaProxy)
527
+ ensure_drop_target_proxy
528
+ @drop_target_proxy.set_attribute(:transfer, args)
529
+ end
530
+
531
+ def drag_source_effect=(args)
532
+ args = args.first if args.is_a?(Array)
533
+ ensure_drag_source_proxy
534
+ @drag_source_proxy.set_attribute(:drag_source_effect, args)
535
+ end
536
+
537
+ def drop_target_effect=(args)
538
+ args = args.first if args.is_a?(Array)
539
+ ensure_drop_target_proxy
540
+ @drop_target_proxy.set_attribute(:drop_target_effect, args)
541
+ end
542
+
419
543
  def apply_property_type_converters(attribute_name, args)
420
544
  if args.count == 1
421
545
  value = args.first
@@ -478,6 +602,25 @@ module Glimmer
478
602
  value.to_s
479
603
  end
480
604
  end,
605
+ :transfer => lambda do |value|
606
+ value = value.first if value.is_a?(Array) && value.size == 1 && value.first.is_a?(Array)
607
+ transfer_object_extrapolator = lambda do |transfer_name|
608
+ transfer_type = "#{transfer_name.to_s.camelcase(:upper)}Transfer".to_sym
609
+ transfer_type_alternative = "#{transfer_name.to_s.upcase}Transfer".to_sym
610
+ transfer_class = org.eclipse.swt.dnd.const_get(transfer_type) rescue org.eclipse.swt.dnd.const_get(transfer_type_alternative)
611
+ transfer_class.getInstance
612
+ end
613
+ result = value
614
+ if value.is_a?(Symbol) || value.is_a?(String)
615
+ result = [transfer_object_extrapolator.call(value)]
616
+ elsif value.is_a?(Array)
617
+ result = value.map do |transfer_name|
618
+ transfer_object_extrapolator.call(transfer_name)
619
+ end
620
+ end
621
+ result = result.to_java(Transfer) unless result.is_a?(ArrayJavaProxy)
622
+ result
623
+ end,
481
624
  :visible => lambda do |value|
482
625
  !!value
483
626
  end,
metadata CHANGED
@@ -1,21 +1,21 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: glimmer-dsl-swt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - AndyMaleh
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-17 00:00:00.000000000 Z
11
+ date: 2020-07-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
15
15
  requirements:
16
16
  - - "~>"
17
17
  - !ruby/object:Gem::Version
18
- version: 0.9.2
18
+ version: 0.9.4
19
19
  name: glimmer
20
20
  type: :runtime
21
21
  prerelease: false
@@ -23,7 +23,7 @@ dependencies:
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.9.2
26
+ version: 0.9.4
27
27
  - !ruby/object:Gem::Dependency
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
@@ -57,7 +57,7 @@ dependencies:
57
57
  requirements:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
- version: 0.8.1
60
+ version: 0.8.2
61
61
  name: puts_debuggerer
62
62
  type: :runtime
63
63
  prerelease: false
@@ -65,7 +65,27 @@ dependencies:
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 0.8.1
68
+ version: 0.8.2
69
+ - !ruby/object:Gem::Dependency
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 1.2.4
75
+ - - "<"
76
+ - !ruby/object:Gem::Version
77
+ version: 2.0.0
78
+ name: text-table
79
+ type: :runtime
80
+ prerelease: false
81
+ version_requirements: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: 1.2.4
86
+ - - "<"
87
+ - !ruby/object:Gem::Version
88
+ version: 2.0.0
69
89
  - !ruby/object:Gem::Dependency
70
90
  requirement: !ruby/object:Gem::Requirement
71
91
  requirements:
@@ -194,7 +214,49 @@ dependencies:
194
214
  - - "~>"
195
215
  - !ruby/object:Gem::Version
196
216
  version: 3.5.0
197
- description: Glimmer DSL for SWT (Desktop GUI)
217
+ - !ruby/object:Gem::Dependency
218
+ requirement: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - '='
221
+ - !ruby/object:Gem::Version
222
+ version: 0.8.23
223
+ name: coveralls
224
+ type: :development
225
+ prerelease: false
226
+ version_requirements: !ruby/object:Gem::Requirement
227
+ requirements:
228
+ - - '='
229
+ - !ruby/object:Gem::Version
230
+ version: 0.8.23
231
+ - !ruby/object:Gem::Dependency
232
+ requirement: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - "~>"
235
+ - !ruby/object:Gem::Version
236
+ version: 0.16.1
237
+ name: simplecov
238
+ type: :development
239
+ prerelease: false
240
+ version_requirements: !ruby/object:Gem::Requirement
241
+ requirements:
242
+ - - "~>"
243
+ - !ruby/object:Gem::Version
244
+ version: 0.16.1
245
+ - !ruby/object:Gem::Dependency
246
+ requirement: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - "~>"
249
+ - !ruby/object:Gem::Version
250
+ version: 0.7.0
251
+ name: simplecov-lcov
252
+ type: :development
253
+ prerelease: false
254
+ version_requirements: !ruby/object:Gem::Requirement
255
+ requirements:
256
+ - - "~>"
257
+ - !ruby/object:Gem::Version
258
+ version: 0.7.0
259
+ description: Glimmer DSL for SWT (Desktop GUI) - JRuby on SWT
198
260
  email: andy.am@gmail.com
199
261
  executables:
200
262
  - glimmer
@@ -230,6 +292,7 @@ files:
230
292
  - lib/glimmer/dsl/swt/data_binding_expression.rb
231
293
  - lib/glimmer/dsl/swt/dialog_expression.rb
232
294
  - lib/glimmer/dsl/swt/display_expression.rb
295
+ - lib/glimmer/dsl/swt/dnd_expression.rb
233
296
  - lib/glimmer/dsl/swt/dsl.rb
234
297
  - lib/glimmer/dsl/swt/exec_expression.rb
235
298
  - lib/glimmer/dsl/swt/layout_data_expression.rb
@@ -254,9 +317,11 @@ files:
254
317
  - lib/glimmer/launcher.rb
255
318
  - lib/glimmer/package.rb
256
319
  - lib/glimmer/rake_task.rb
320
+ - lib/glimmer/rake_task/list.rb
257
321
  - lib/glimmer/scaffold.rb
258
322
  - lib/glimmer/swt/color_proxy.rb
259
323
  - lib/glimmer/swt/display_proxy.rb
324
+ - lib/glimmer/swt/dnd_proxy.rb
260
325
  - lib/glimmer/swt/font_proxy.rb
261
326
  - lib/glimmer/swt/layout_data_proxy.rb
262
327
  - lib/glimmer/swt/layout_proxy.rb
@@ -264,6 +329,7 @@ files:
264
329
  - lib/glimmer/swt/message_box_proxy.rb
265
330
  - lib/glimmer/swt/packages.rb
266
331
  - lib/glimmer/swt/shell_proxy.rb
332
+ - lib/glimmer/swt/style_constantizable.rb
267
333
  - lib/glimmer/swt/swt_proxy.rb
268
334
  - lib/glimmer/swt/tab_item_proxy.rb
269
335
  - lib/glimmer/swt/table_proxy.rb