glimmer-dsl-swt 4.17.2.4 → 4.17.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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
+ minimum_size 1280, 768
104
+ text 'Glimmer Meta-Sample (The Sample of Samples)'
105
+
106
+ on_swt_show {
107
+ SampleDirectory.selected_sample = SampleDirectory.all_samples.first
108
+ }
109
+
110
+ sash_form {
111
+ composite {
112
+ grid_layout 1, false
113
+
114
+ expand_bar {
115
+ layout_data(:fill, :fill, true, true)
116
+ font height: 30
117
+
118
+ SampleDirectory.sample_directories.each { |sample_directory|
119
+ expand_item {
120
+ layout_data(:fill, :fill, true, true)
121
+ grid_layout 2, false
122
+ text "#{sample_directory.name} Samples"
123
+
124
+ sample_directory.samples.each { |sample|
125
+ label_radio = radio {
126
+ selection bind(sample, :selected)
127
+ }
128
+ label {
129
+ layout_data :fill, :center, true, false
130
+ text sample.name
131
+ font height: 24
132
+
133
+ on_mouse_up {
134
+ sample.selected = true
135
+ }
136
+ }
137
+ }
138
+ }
139
+ }
140
+ }
141
+
142
+ button {
143
+ layout_data(:fill, :center, true, false) {
144
+ height_hint 120
145
+ }
146
+ text 'Launch Sample'
147
+ font height: 30
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
@@ -0,0 +1,108 @@
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
+ class HelloExpandBar
23
+ include Glimmer
24
+
25
+ def launch
26
+ shell {
27
+ grid_layout(1, false) {
28
+ margin_width 0
29
+ margin_height 0
30
+ }
31
+ minimum_size 320, 240
32
+ text 'Hello, Expand Bar!'
33
+
34
+ @status_label = label(:center) {
35
+ text ' '
36
+ layout_data :fill, :center, true, false
37
+ font height: 24
38
+ }
39
+
40
+ expand_bar {
41
+ layout_data :fill, :fill, true, true
42
+
43
+ expand_item {
44
+ text 'Productivity'
45
+
46
+ button {
47
+ text 'Word Processing'
48
+ }
49
+ button {
50
+ text 'Spreadsheets'
51
+ }
52
+ button {
53
+ text 'Presentations'
54
+ }
55
+ button {
56
+ text 'Database'
57
+ }
58
+ }
59
+
60
+ expand_item {
61
+ text 'Tools'
62
+
63
+ button {
64
+ text 'Calculator'
65
+ }
66
+ button {
67
+ text 'Unit Converter'
68
+ }
69
+ button {
70
+ text 'Currency Converter'
71
+ }
72
+ button {
73
+ text 'Scientific Calculator'
74
+ }
75
+ }
76
+
77
+ expand_item {
78
+ text 'Reading'
79
+
80
+ button {
81
+ text 'eBooks'
82
+ }
83
+ button {
84
+ text 'News'
85
+ }
86
+ button {
87
+ text 'Blogs'
88
+ }
89
+ button {
90
+ text 'Papers'
91
+ }
92
+ }
93
+
94
+ on_item_expanded { |expand_event|
95
+ @status_label.text = "#{expand_event.item.text} Expanded!"
96
+ }
97
+
98
+ on_item_collapsed { |expand_event|
99
+ @status_label.text = "#{expand_event.item.text} Collapsed!"
100
+ }
101
+
102
+
103
+ }
104
+ }.open
105
+ end
106
+ end
107
+
108
+ HelloExpandBar.new.launch
@@ -0,0 +1,137 @@
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
+ class SashFormPresenter
23
+ include Glimmer
24
+
25
+ attr_accessor :sash_width, :orientation, :orientation_style
26
+
27
+ def initialize
28
+ @sash_width = 10
29
+ self.orientation = 'horizontal'
30
+ end
31
+
32
+ def orientation_options
33
+ ['horizontal', 'vertical']
34
+ end
35
+
36
+ def orientation=(value)
37
+ @orientation = value
38
+ self.orientation_style = swt(@orientation)
39
+ end
40
+ end
41
+
42
+ @presenter = SashFormPresenter.new
43
+
44
+ include Glimmer
45
+
46
+ shell {
47
+ grid_layout 1, false
48
+ minimum_size 740, 0
49
+ text 'Hello, Sash Form!'
50
+
51
+ @sash_form = sash_form {
52
+ layout_data(:fill, :fill, true, true) {
53
+ height_hint 200
54
+ }
55
+ sash_width bind(@presenter, :sash_width)
56
+ orientation bind(@presenter, :orientation_style)
57
+ weights 1, 2
58
+
59
+ @green_label = label {
60
+ text 'Hello, (resize >>)'
61
+ background :dark_green
62
+ foreground :white
63
+ font height: 30
64
+ }
65
+
66
+ @red_label = label {
67
+ text '(<< resize) Sash Form!'
68
+ background :red
69
+ foreground :white
70
+ font height: 30
71
+ }
72
+ }
73
+
74
+ composite {
75
+ layout_data(:fill, :fill, true, true)
76
+ grid_layout 2, true
77
+
78
+ label {
79
+ layout_data(:right, :center, true, false)
80
+ text 'Sash Width:'
81
+ font height: 16
82
+ }
83
+ spinner {
84
+ layout_data(:fill, :center, true, false) {
85
+ width_hint 100
86
+ }
87
+ selection bind(@presenter, :sash_width)
88
+ font height: 16
89
+ }
90
+
91
+ label {
92
+ layout_data(:right, :center, true, false)
93
+ text 'Orientation:'
94
+ font height: 16
95
+ }
96
+ combo(:read_only, :border) {
97
+ layout_data(:fill, :center, true, false) {
98
+ width_hint 100
99
+ }
100
+ selection bind(@presenter, :orientation)
101
+ font height: 16
102
+ }
103
+
104
+ button {
105
+ layout_data(:fill, :center, true, false)
106
+ text 'Maximize Green Label'
107
+ foreground :dark_green
108
+ font height: 16
109
+
110
+ on_widget_selected {
111
+ @sash_form.maximized_control = @green_label.swt_widget
112
+ }
113
+ }
114
+ button {
115
+ layout_data(:fill, :center, true, false)
116
+ text 'Maximize Red Label'
117
+ foreground :red
118
+ font height: 16
119
+
120
+ on_widget_selected {
121
+ @sash_form.maximized_control = @red_label.swt_widget
122
+ }
123
+ }
124
+
125
+ button {
126
+ layout_data(:fill, :center, true, false) {
127
+ horizontal_span 2
128
+ }
129
+ text 'Maximize None'
130
+ font height: 16
131
+
132
+ on_widget_selected {
133
+ @sash_form.maximized_control = nil
134
+ }
135
+ }
136
+ }
137
+ }.open
@@ -0,0 +1,138 @@
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
+ verbiage = <<-MULTI_LINE_STRING
23
+
24
+ Glimmer DSL for SWT is a native-GUI cross-platform desktop development library written in JRuby,
25
+ an OS-threaded faster version of Ruby.
26
+ Glimmer's main innovation is a declarative Ruby DSL that enables productive and efficient authoring
27
+ of desktop application user-interfaces while relying on the robust Eclipse SWT library.
28
+ Glimmer additionally innovates by having built-in data-binding support, which greatly facilitates
29
+ synchronizing the GUI with domain models, thus achieving true decoupling of object oriented components
30
+ and enabling developers to solve business problems (test-first) without worrying about GUI concerns.
31
+ To get started quickly, Glimmer offers scaffolding options for Apps, Gems, and Custom Widgets.
32
+ Glimmer also includes native-executable packaging support, sorely lacking in other libraries,
33
+ thus enabling the delivery of desktop apps written in Ruby as truly native DMG/PKG/APP files on
34
+ the Mac + App Store, MSI/EXE files on Windows, and Gem Packaged Shell Scripts on Linux.
35
+
36
+ MULTI_LINE_STRING
37
+
38
+ class StyledTextPresenter
39
+ include Glimmer
40
+ attr_accessor :text, :caret_offset, :selection_count, :selection, :top_pixel
41
+
42
+ def line_index_for_offset(line_offset)
43
+ text[0..line_offset].split("\n").size
44
+ end
45
+ end
46
+
47
+ include Glimmer
48
+
49
+ @presenter = StyledTextPresenter.new
50
+ @presenter.text = verbiage*8
51
+ @presenter.caret_offset = 0
52
+ @presenter.selection_count = 0
53
+ @presenter.selection = Point.new(0, 0)
54
+ @presenter.top_pixel = 0
55
+
56
+ shell {
57
+ text 'Hello, Styled Text!'
58
+
59
+ composite {
60
+ @styled_text = styled_text {
61
+ layout_data :fill, :fill, true, true
62
+ text bind(@presenter, :text)
63
+ left_margin 5
64
+ top_margin 5
65
+ right_margin 5
66
+ bottom_margin 5
67
+ # caret offset scrolls text to view when out of page
68
+ caret_offset bind(@presenter, :caret_offset)
69
+ # selection_count is not needed if selection is used
70
+ selection_count bind(@presenter, :selection_count)
71
+ # selection contains both caret_offset and selection_count, but setting it does not scroll text into view if out of page
72
+ selection bind(@presenter, :selection)
73
+ # top_pixel indicates vertically what pixel scrolling is at in a long multi-page text document
74
+ top_pixel bind(@presenter, :top_pixel)
75
+
76
+ # This demonstrates how to set styles via a listener
77
+ on_line_get_style { |line_style_event|
78
+ line_offset = line_style_event.lineOffset
79
+ if @presenter.line_index_for_offset(line_offset) % 52 < 13
80
+ line_size = line_style_event.lineText.size
81
+ style_range = StyleRange.new(line_offset, line_size, color(:blue).swt_color, nil, swt(:italic))
82
+ style_range.font = Font.new(display.swt_display, 'Times New Roman', 18, swt(:normal))
83
+ line_style_event.styles = [style_range].to_java(StyleRange)
84
+ elsif @presenter.line_index_for_offset(line_offset) % 52 < 26
85
+ line_size = line_style_event.lineText.size
86
+ style_range = StyleRange.new(line_offset, line_size, color(:dark_green).swt_color, color(:yellow).swt_color, swt(:bold))
87
+ line_style_event.styles = [style_range].to_java(StyleRange)
88
+ elsif @presenter.line_index_for_offset(line_offset) % 52 < 39
89
+ line_size = line_style_event.lineText.size
90
+ style_range = StyleRange.new(line_offset, line_size, color(:red).swt_color, nil, swt(:normal))
91
+ style_range.underline = true
92
+ style_range.font = Font.new(display.swt_display, 'Arial', 16, swt(:normal))
93
+ line_style_event.styles = [style_range].to_java(StyleRange)
94
+ else
95
+ line_size = line_style_event.lineText.size
96
+ style_range = StyleRange.new(line_offset, line_size, color(:dark_magenta).swt_color, color(:cyan).swt_color, swt(:normal))
97
+ style_range.strikeout = true
98
+ line_style_event.styles = [style_range].to_java(StyleRange)
99
+ end
100
+ }
101
+ }
102
+
103
+ composite {
104
+ row_layout :horizontal
105
+
106
+ label {
107
+ text 'Caret Offset:'
108
+ }
109
+ text {
110
+ text bind(@presenter, :caret_offset, on_read: ->(o) {"%04d" % [o] })
111
+ }
112
+ label {
113
+ text 'Selection Count:'
114
+ }
115
+ text {
116
+ text bind(@presenter, :selection_count, on_read: ->(o) {"%04d" % [o] })
117
+ }
118
+ label {
119
+ text 'Selection Start:'
120
+ }
121
+ text {
122
+ text bind(@presenter, 'selection.x', on_read: ->(o) {"%04d" % [o] })
123
+ }
124
+ label {
125
+ text 'Selection End:'
126
+ }
127
+ text {
128
+ text bind(@presenter, 'selection.y', on_read: ->(o) {"%04d" % [o] })
129
+ }
130
+ label {
131
+ text 'Top Pixel:'
132
+ }
133
+ text {
134
+ text bind(@presenter, :top_pixel, on_read: ->(o) {"%04d" % [o] })
135
+ }
136
+ }
137
+ }
138
+ }.open