glimmer-dsl-swt 4.17.3.0 → 4.17.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 4.17.3.0
1
+ 4.17.4.0
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: glimmer-dsl-swt 4.17.3.0 ruby lib
5
+ # stub: glimmer-dsl-swt 4.17.4.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "glimmer-dsl-swt".freeze
9
- s.version = "4.17.3.0"
9
+ s.version = "4.17.4.0"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib".freeze]
13
13
  s.authors = ["AndyMaleh".freeze]
14
- s.date = "2020-10-18"
14
+ s.date = "2020-10-21"
15
15
  s.description = "Glimmer DSL for SWT (JRuby Desktop Development GUI Library)".freeze
16
16
  s.email = "andy.am@gmail.com".freeze
17
17
  s.executables = ["glimmer".freeze, "girb".freeze]
@@ -81,10 +81,10 @@ Gem::Specification.new do |s|
81
81
  "lib/glimmer/rake_task.rb",
82
82
  "lib/glimmer/rake_task/list.rb",
83
83
  "lib/glimmer/rake_task/package.rb",
84
- "lib/glimmer/rake_task/sample.rb",
85
84
  "lib/glimmer/rake_task/scaffold.rb",
86
85
  "lib/glimmer/swt/color_proxy.rb",
87
86
  "lib/glimmer/swt/cursor_proxy.rb",
87
+ "lib/glimmer/swt/custom/code_text.rb",
88
88
  "lib/glimmer/swt/display_proxy.rb",
89
89
  "lib/glimmer/swt/dnd_proxy.rb",
90
90
  "lib/glimmer/swt/font_proxy.rb",
@@ -94,6 +94,7 @@ Gem::Specification.new do |s|
94
94
  "lib/glimmer/swt/menu_proxy.rb",
95
95
  "lib/glimmer/swt/message_box_proxy.rb",
96
96
  "lib/glimmer/swt/packages.rb",
97
+ "lib/glimmer/swt/sash_form_proxy.rb",
97
98
  "lib/glimmer/swt/scrolled_composite_proxy.rb",
98
99
  "lib/glimmer/swt/shell_proxy.rb",
99
100
  "lib/glimmer/swt/style_constantizable.rb",
@@ -112,6 +113,7 @@ Gem::Specification.new do |s|
112
113
  "samples/elaborate/contact_manager/contact_manager_presenter.rb",
113
114
  "samples/elaborate/contact_manager/contact_repository.rb",
114
115
  "samples/elaborate/login.rb",
116
+ "samples/elaborate/meta_sample.rb",
115
117
  "samples/elaborate/tic_tac_toe.rb",
116
118
  "samples/elaborate/tic_tac_toe/board.rb",
117
119
  "samples/elaborate/tic_tac_toe/cell.rb",
@@ -128,6 +130,7 @@ Gem::Specification.new do |s|
128
130
  "samples/hello/hello_menu_bar.rb",
129
131
  "samples/hello/hello_message_box.rb",
130
132
  "samples/hello/hello_pop_up_context_menu.rb",
133
+ "samples/hello/hello_sash_form.rb",
131
134
  "samples/hello/hello_tab.rb",
132
135
  "samples/hello/hello_world.rb",
133
136
  "vendor/swt/linux/swt.jar",
@@ -155,7 +158,7 @@ Gem::Specification.new do |s|
155
158
  s.add_runtime_dependency(%q<os>.freeze, [">= 1.0.0", "< 2.0.0"])
156
159
  s.add_runtime_dependency(%q<rake>.freeze, [">= 10.1.0", "< 14.0.0"])
157
160
  s.add_runtime_dependency(%q<text-table>.freeze, [">= 1.2.4", "< 2.0.0"])
158
- s.add_runtime_dependency(%q<tty-markdown>.freeze, [">= 0.6.0", "< 2.0.0"])
161
+ s.add_runtime_dependency(%q<rouge>.freeze, [">= 3.23.0", "< 4.0.0"])
159
162
  s.add_development_dependency(%q<juwelier>.freeze, [">= 2.4.9", "< 3.0.0"])
160
163
  s.add_development_dependency(%q<warbler>.freeze, [">= 2.0.5", "< 3.0.0"])
161
164
  s.add_development_dependency(%q<rspec-mocks>.freeze, ["~> 3.5.0"])
@@ -174,7 +177,7 @@ Gem::Specification.new do |s|
174
177
  s.add_dependency(%q<os>.freeze, [">= 1.0.0", "< 2.0.0"])
175
178
  s.add_dependency(%q<rake>.freeze, [">= 10.1.0", "< 14.0.0"])
176
179
  s.add_dependency(%q<text-table>.freeze, [">= 1.2.4", "< 2.0.0"])
177
- s.add_dependency(%q<tty-markdown>.freeze, [">= 0.6.0", "< 2.0.0"])
180
+ s.add_dependency(%q<rouge>.freeze, [">= 3.23.0", "< 4.0.0"])
178
181
  s.add_dependency(%q<juwelier>.freeze, [">= 2.4.9", "< 3.0.0"])
179
182
  s.add_dependency(%q<warbler>.freeze, [">= 2.0.5", "< 3.0.0"])
180
183
  s.add_dependency(%q<rspec-mocks>.freeze, ["~> 3.5.0"])
@@ -34,6 +34,7 @@ require 'glimmer'
34
34
  require 'logging'
35
35
  require 'nested_inherited_jruby_include_package'
36
36
  require 'super_module'
37
+ require 'rouge'
37
38
 
38
39
  # Internal requires
39
40
  require 'ext/glimmer/config'
@@ -25,6 +25,7 @@ require 'glimmer/dsl/parent_expression'
25
25
  require 'glimmer/dsl/top_level_expression'
26
26
  require 'glimmer/ui/custom_widget'
27
27
  require 'glimmer/ui/custom_shell'
28
+ require 'glimmer/swt/custom/code_text'
28
29
 
29
30
  module Glimmer
30
31
  module DSL
@@ -56,3 +56,4 @@ require 'glimmer/swt/scrolled_composite_proxy'
56
56
  require 'glimmer/swt/tree_proxy'
57
57
  require 'glimmer/swt/table_proxy'
58
58
  require 'glimmer/swt/table_column_proxy'
59
+ require 'glimmer/swt/sash_form_proxy'
@@ -62,26 +62,9 @@ namespace :glimmer do
62
62
  end
63
63
  end
64
64
 
65
- namespace :sample do
66
- task :requires do
67
- require_relative 'rake_task/sample'
68
- end
69
-
70
- desc 'Runs a Glimmer internal sample [included in gem]. If no name is supplied, it runs all samples.'
71
- task :run, [:name] => [:requires] do |t, args|
72
- Glimmer::RakeTask::Sample.run(args[:name])
73
- end
74
-
75
- desc 'Lists Glimmer internal samples [included in gem]. Filters by query if specified (query is optional)'
76
- task :list, [:query] => [:requires] do |t, args|
77
- Glimmer::RakeTask::Sample.list(args[:query])
78
- end
79
-
80
- desc 'Outputs code for a Glimmer internal sample [included in gem] (name is required)'
81
- task :code, [:name] => [:requires] do |t, args|
82
- Glimmer::RakeTask::Sample.code(args[:name])
83
- end
84
-
65
+ desc 'Brings up the Glimmer Meta-Sample app to allow browsing, running, and viewing code of Glimmer samples'
66
+ task :samples do
67
+ Glimmer::Launcher.new([File.expand_path('../../../samples/elaborate/meta_sample.rb', __FILE__)]).launch
85
68
  end
86
69
 
87
70
  namespace :package do
@@ -95,7 +78,7 @@ namespace :glimmer do
95
78
  Glimmer::RakeTask::Package.gemspec
96
79
  end
97
80
 
98
- desc 'Generate gem'
81
+ desc 'Generate gem under pkg directory'
99
82
  task :gem do
100
83
  Glimmer::RakeTask::Package.gem
101
84
  end
@@ -0,0 +1,88 @@
1
+ require 'glimmer/ui/custom_widget'
2
+
3
+ module Glimmer
4
+ module SWT
5
+ module Custom
6
+ # CodeText is a customization of StyledText with support for Ruby Syntax Highlighting
7
+ class CodeText
8
+ include Glimmer::UI::CustomWidget
9
+
10
+ SYNTAX_COLOR_MAP = {
11
+ Builtin: [215,58,73],
12
+ Class: [3,47,98],
13
+ Constant: [0,92,197],
14
+ Double: [0,92,197],
15
+ Escape: [:red],
16
+ Function: [:blue],
17
+ Instance: [227,98,9],
18
+ Integer: [:blue],
19
+ Interpol: [:blue],
20
+ Keyword: [:blue],
21
+ Name: [111,66,193], #purple
22
+ Operator: [:red],
23
+ Pseudo: [:dark_red],
24
+ Punctuation: [:blue],
25
+ Single: [106,115,125], # Also, Comments
26
+ Symbol: [:dark_green],
27
+ Text: [75, 75, 75],
28
+ }
29
+
30
+ # TODO support `option :language`
31
+ # TODO support auto language detection
32
+
33
+ def text=(value)
34
+ swt_widget&.text = value
35
+ end
36
+
37
+ def text
38
+ swt_widget&.text
39
+ end
40
+
41
+ def syntax_highlighting
42
+ return [] if text.to_s.strip.empty?
43
+ code = text
44
+ lexer = Rouge::Lexer.find_fancy('ruby', code)
45
+ lex = lexer.lex(code).to_a
46
+ code_size = 0
47
+ lex_hashes = lex.map do |pair|
48
+ {token_type: pair.first, token_text: pair.last}
49
+ end.each do |hash|
50
+ hash[:token_index] = code_size
51
+ code_size += hash[:token_text].size
52
+ end
53
+ # TODO consider grouping by line to optimize performance for line get style listener
54
+ end
55
+
56
+ before_body {
57
+ @swt_style = swt_style == 0 ? [:border, :multi, :v_scroll, :h_scroll] : swt_style
58
+ }
59
+
60
+ body {
61
+ styled_text(swt_style) {
62
+ font name: 'Consolas', height: 15
63
+ foreground rgb(75, 75, 75)
64
+ left_margin 5
65
+ top_margin 5
66
+ right_margin 5
67
+ bottom_margin 5
68
+
69
+ on_line_get_style { |line_style_event|
70
+ styles = []
71
+ line_style_event.lineOffset
72
+ syntax_highlighting.each do |token_hash|
73
+ if token_hash[:token_index] >= line_style_event.lineOffset && token_hash[:token_index] < (line_style_event.lineOffset + line_style_event.lineText.size)
74
+ start_index = token_hash[:token_index]
75
+ size = token_hash[:token_text].size
76
+ token_color = SYNTAX_COLOR_MAP[token_hash[:token_type].name] || [:black]
77
+ token_color = color(*token_color).swt_color
78
+ styles << StyleRange.new(start_index, size, token_color, nil)
79
+ end
80
+ end
81
+ line_style_event.styles = styles.to_java(StyleRange) unless styles.empty?
82
+ }
83
+ }
84
+ }
85
+ end
86
+ end
87
+ end
88
+ end
@@ -26,7 +26,7 @@ require 'glimmer/swt/shell_proxy'
26
26
 
27
27
  module Glimmer
28
28
  module SWT
29
- # Proxy for org.eclipse.swt.widgets.Shell
29
+ # Proxy for org.eclipse.swt.widgets.MessageBox
30
30
  #
31
31
  # Follows the Proxy Design Pattern
32
32
  class MessageBoxProxy
@@ -0,0 +1,53 @@
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 'glimmer/swt/widget_proxy'
23
+
24
+ module Glimmer
25
+ module SWT
26
+ # Proxy for org.eclipse.swt.custom.SashForm
27
+ #
28
+ # Follows the Proxy Design Pattern
29
+ class SashFormProxy < WidgetProxy
30
+ def post_add_content
31
+ swt_widget.setWeights(@weights) unless @weights.nil?
32
+ end
33
+
34
+ def set_attribute(attribute_name, *args)
35
+ if attribute_name.to_s == "weights"
36
+ @weights = args
37
+ @weights = @weights.first if @weights.first.is_a?(Array)
38
+ else
39
+ super(attribute_name, *args)
40
+ end
41
+ end
42
+
43
+ def get_attribute(attribute_name)
44
+ if attribute_name.to_s == "weights"
45
+ swt_widget.getWeights.to_a
46
+ else
47
+ super(attribute_name)
48
+ end
49
+ end
50
+
51
+ end
52
+ end
53
+ end
@@ -55,7 +55,7 @@ module Glimmer
55
55
  "radio" => [:radio],
56
56
  "scrolled_composite" => [:border, :h_scroll, :v_scroll],
57
57
  "spinner" => [:border],
58
- "styled_text" => [:border],
58
+ "styled_text" => [:border, :multi, :v_scroll, :h_scroll],
59
59
  "table" => [:virtual, :border, :full_selection],
60
60
  "text" => [:border],
61
61
  "toggle" => [:toggle],
@@ -0,0 +1,166 @@
1
+ class Sample
2
+ attr_accessor :sample_directory, :file, :selected
3
+
4
+ def initialize(file, sample_directory: )
5
+ self.file = file
6
+ self.sample_directory = sample_directory
7
+ end
8
+
9
+ def name
10
+ if @name.nil?
11
+ @name = File.basename(file, '.rb').split('_').map(&:capitalize).join(' ')
12
+ if @name.start_with?('Hello')
13
+ name_parts = @name.split
14
+ name_parts[0] = name_parts.first + ','
15
+ name_parts[-1] = name_parts.last + '!'
16
+ @name = name_parts.join(' ')
17
+ end
18
+ end
19
+ @name
20
+ end
21
+
22
+ def content
23
+ @content ||= File.read(file)
24
+ end
25
+
26
+ def launch
27
+ load file
28
+ end
29
+ end
30
+
31
+ class SampleDirectory
32
+ class << self
33
+ attr_accessor :selected_sample
34
+
35
+ def sample_directories
36
+ if @sample_directories.nil?
37
+ @sample_directories = Dir.glob(File.join(File.expand_path('..', __FILE__), '*')).
38
+ select { |file| File.directory?(file) }.
39
+ map { |file| SampleDirectory.new(file) }
40
+ glimmer_gems = Gem.find_latest_files("glimmer-*-*")
41
+ sample_directories = glimmer_gems.map do |lib|
42
+ File.dirname(File.dirname(lib))
43
+ end.select do |gem|
44
+ Dir.exist?(File.join(gem, 'samples'))
45
+ end.map do |gem|
46
+ Dir.glob(File.join(gem, 'samples', '*')).select {|file_or_dir| Dir.exist?(file_or_dir)}
47
+ end.flatten.uniq.reverse
48
+ if Dir.exist?('samples')
49
+ Dir.glob(File.join('samples', '*')).to_a.reverse.each do |dir|
50
+ sample_directories << dir if Dir.exist?(dir)
51
+ end
52
+ end
53
+ sample_directories = sample_directories.uniq {|dir| File.basename(dir)}
54
+ @sample_directories = sample_directories.map { |file| SampleDirectory.new(file) }
55
+ end
56
+ @sample_directories
57
+ end
58
+
59
+ def all_samples
60
+ @all_samples ||= sample_directories.map(&:samples).reduce(:+)
61
+ end
62
+ end
63
+
64
+ include Glimmer # used for observe syntax
65
+
66
+ attr_accessor :file
67
+
68
+ def initialize(file)
69
+ self.file = file
70
+ end
71
+
72
+ def name
73
+ File.basename(file).split('_').map(&:capitalize).join(' ')
74
+ end
75
+
76
+ def samples
77
+ if @samples.nil?
78
+ @samples = Dir.glob(File.join(file, '*')).
79
+ select { |file| File.file?(file) }.
80
+ map { |sample_file| Sample.new(sample_file, sample_directory: self) }.
81
+ sort_by(&:name)
82
+
83
+ @samples.each do |sample|
84
+ observe(sample, :selected) do |new_selected_value|
85
+ if new_selected_value
86
+ self.class.all_samples.reject {|a_sample| a_sample.name == sample.name}.each do |other_sample|
87
+ other_sample.selected = false
88
+ end
89
+ self.class.selected_sample = sample
90
+ end
91
+ end
92
+ end
93
+ end
94
+ @samples
95
+ end
96
+ end
97
+
98
+ class MetaSampleApplication
99
+ include Glimmer
100
+
101
+ def launch
102
+ shell {
103
+ text 'Glimmer Meta-Sample (The Sample of Samples)'
104
+
105
+ on_swt_show {
106
+ SampleDirectory.selected_sample = SampleDirectory.all_samples.first
107
+ }
108
+
109
+ sash_form {
110
+ composite {
111
+ grid_layout 1, false
112
+
113
+ scrolled_composite {
114
+ layout_data(:fill, :fill, true, true)
115
+
116
+ composite {
117
+ SampleDirectory.sample_directories.each { |sample_directory|
118
+ group {
119
+ layout_data(:fill, :fill, true, true)
120
+ grid_layout 2, false
121
+ text sample_directory.name
122
+ font height: 30
123
+
124
+ sample_directory.samples.each { |sample|
125
+ label_radio = radio {
126
+ selection bind(sample, :selected)
127
+ }
128
+ label {
129
+ text sample.name
130
+ font height: 30
131
+
132
+ on_mouse_up {
133
+ sample.selected = true
134
+ }
135
+ }
136
+ }
137
+ }
138
+ }
139
+ }
140
+ }
141
+
142
+ button {
143
+ layout_data(:center, :center, false, false) {
144
+ height_hint 150
145
+ }
146
+ text 'Launch Sample'
147
+ font height: 45
148
+ on_widget_selected {
149
+ SampleDirectory.selected_sample.launch
150
+ }
151
+ }
152
+ }
153
+
154
+ code_text {
155
+ text bind(SampleDirectory, 'selected_sample.content')
156
+ editable false
157
+ caret nil
158
+ }
159
+
160
+ weights 1, 2
161
+ }
162
+ }.open
163
+ end
164
+ end
165
+
166
+ MetaSampleApplication.new.launch