glimmer-dsl-swt 0.6.2 → 0.6.7

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.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -2
  3. data/VERSION +1 -1
  4. data/bin/girb +1 -1
  5. data/bin/glimmer +5 -1
  6. data/icons/scaffold_app.png +0 -0
  7. data/lib/ext/glimmer/config.rb +13 -1
  8. data/lib/glimmer-dsl-swt.rb +5 -9
  9. data/lib/glimmer/Rakefile +5 -0
  10. data/lib/glimmer/data_binding/table_items_binding.rb +4 -1
  11. data/lib/glimmer/dsl/swt/message_box_expression.rb +9 -1
  12. data/lib/glimmer/dsl/swt/widget_expression.rb +1 -7
  13. data/lib/glimmer/launcher.rb +59 -20
  14. data/lib/glimmer/package.rb +26 -9
  15. data/lib/glimmer/rake_task.rb +115 -5
  16. data/lib/glimmer/scaffold.rb +66 -33
  17. data/lib/glimmer/swt/display_proxy.rb +13 -2
  18. data/lib/glimmer/swt/message_box_proxy.rb +23 -5
  19. data/lib/glimmer/swt/shell_proxy.rb +0 -1
  20. data/lib/glimmer/swt/table_proxy.rb +60 -2
  21. data/lib/glimmer/swt/widget_proxy.rb +44 -19
  22. data/samples/elaborate/contact_manager.rb +121 -0
  23. data/samples/elaborate/contact_manager/contact.rb +11 -0
  24. data/samples/elaborate/contact_manager/contact_manager_presenter.rb +26 -0
  25. data/samples/elaborate/contact_manager/contact_repository.rb +244 -0
  26. data/samples/elaborate/login.rb +108 -0
  27. data/samples/elaborate/tic_tac_toe.rb +55 -0
  28. data/samples/elaborate/tic_tac_toe/board.rb +124 -0
  29. data/samples/elaborate/tic_tac_toe/cell.rb +27 -0
  30. data/samples/elaborate/user_profile.rb +55 -0
  31. data/samples/hello/hello_browser.rb +8 -0
  32. data/samples/hello/hello_combo.rb +38 -0
  33. data/samples/hello/hello_computed.rb +69 -0
  34. data/samples/hello/hello_computed/contact.rb +21 -0
  35. data/samples/hello/hello_drag_and_drop.rb +29 -0
  36. data/samples/hello/hello_list_multi_selection.rb +48 -0
  37. data/samples/hello/hello_list_single_selection.rb +37 -0
  38. data/samples/hello/hello_menu_bar.rb +64 -0
  39. data/samples/hello/hello_message_box.rb +15 -0
  40. data/samples/hello/hello_pop_up_context_menu.rb +36 -0
  41. data/samples/hello/hello_tab.rb +24 -0
  42. data/samples/hello/hello_world.rb +8 -0
  43. metadata +65 -8
@@ -0,0 +1,121 @@
1
+ require_relative "contact_manager/contact_manager_presenter"
2
+
3
+ class ContactManager
4
+ include Glimmer
5
+
6
+ def initialize
7
+ @contact_manager_presenter = ContactManagerPresenter.new
8
+ @contact_manager_presenter.list
9
+ end
10
+
11
+ def launch
12
+ shell {
13
+ text "Contact Manager"
14
+ composite {
15
+ group {
16
+ grid_layout(2, false) {
17
+ margin_width 0
18
+ margin_height 0
19
+ }
20
+ layout_data :fill, :center, true, false
21
+ text 'Lookup Contacts'
22
+ font height: 24
23
+
24
+ label {
25
+ layout_data :right, :center, false, false
26
+ text "First &Name: "
27
+ font height: 16
28
+ }
29
+ text {
30
+ layout_data :fill, :center, true, false
31
+ text bind(@contact_manager_presenter, :first_name)
32
+ on_key_pressed {|key_event|
33
+ @contact_manager_presenter.find if key_event.keyCode == swt(:cr)
34
+ }
35
+ }
36
+
37
+ label {
38
+ layout_data :right, :center, false, false
39
+ text "&Last Name: "
40
+ font height: 16
41
+ }
42
+ text {
43
+ layout_data :fill, :center, true, false
44
+ text bind(@contact_manager_presenter, :last_name)
45
+ on_key_pressed {|key_event|
46
+ @contact_manager_presenter.find if key_event.keyCode == swt(:cr)
47
+ }
48
+ }
49
+
50
+ label {
51
+ layout_data :right, :center, false, false
52
+ text "&Email: "
53
+ font height: 16
54
+ }
55
+ text {
56
+ layout_data :fill, :center, true, false
57
+ text bind(@contact_manager_presenter, :email)
58
+ on_key_pressed {|key_event|
59
+ @contact_manager_presenter.find if key_event.keyCode == swt(:cr)
60
+ }
61
+ }
62
+
63
+ composite {
64
+ row_layout {
65
+ margin_width 0
66
+ margin_height 0
67
+ }
68
+ layout_data(:right, :center, false, false) {
69
+ horizontal_span 2
70
+ }
71
+
72
+ button {
73
+ text "&Find"
74
+ on_widget_selected { @contact_manager_presenter.find }
75
+ on_key_pressed {|key_event|
76
+ @contact_manager_presenter.find if key_event.keyCode == swt(:cr)
77
+ }
78
+ }
79
+
80
+ button {
81
+ text "&List All"
82
+ on_widget_selected { @contact_manager_presenter.list }
83
+ on_key_pressed {|key_event|
84
+ @contact_manager_presenter.list if key_event.keyCode == swt(:cr)
85
+ }
86
+ }
87
+ }
88
+ }
89
+
90
+ table(:multi) { |table_proxy|
91
+ layout_data {
92
+ horizontal_alignment :fill
93
+ vertical_alignment :fill
94
+ grab_excess_horizontal_space true
95
+ grab_excess_vertical_space true
96
+ height_hint 200
97
+ }
98
+ table_column {
99
+ text "First Name"
100
+ width 80
101
+ }
102
+ table_column {
103
+ text "Last Name"
104
+ width 80
105
+ }
106
+ table_column {
107
+ text "Email"
108
+ width 200
109
+ }
110
+ items bind(@contact_manager_presenter, :results),
111
+ column_properties(:first_name, :last_name, :email)
112
+ on_mouse_up { |event|
113
+ table_proxy.edit_table_item(event.table_item, event.column_index)
114
+ }
115
+ }
116
+ }
117
+ }.open
118
+ end
119
+ end
120
+
121
+ ContactManager.new.launch
@@ -0,0 +1,11 @@
1
+ class ContactManager
2
+ class Contact
3
+ attr_accessor :first_name, :last_name, :email
4
+
5
+ def initialize(attribute_map)
6
+ @first_name = attribute_map[:first_name]
7
+ @last_name = attribute_map[:last_name]
8
+ @email = attribute_map[:email]
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,26 @@
1
+ require_relative "contact_repository"
2
+
3
+ class ContactManager
4
+ class ContactManagerPresenter
5
+ attr_accessor :results
6
+ @@contact_attributes = [:first_name, :last_name, :email]
7
+ @@contact_attributes.each {|attribute_name| attr_accessor attribute_name}
8
+
9
+ def initialize(contact_repository = nil)
10
+ @contact_repository = contact_repository || ContactRepository.new
11
+ @results = []
12
+ end
13
+
14
+ def list
15
+ self.results = @contact_repository.find({})
16
+ end
17
+
18
+ def find
19
+ filter_map = {}
20
+ @@contact_attributes.each do |attribute_name|
21
+ filter_map[attribute_name] = self.send(attribute_name) if self.send(attribute_name)
22
+ end
23
+ self.results = @contact_repository.find(filter_map)
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,244 @@
1
+ require_relative "contact"
2
+
3
+ class ContactManager
4
+ class ContactRepository
5
+ NAMES_FIRST = %w[
6
+ Liam
7
+ Noah
8
+ William
9
+ James
10
+ Oliver
11
+ Benjamin
12
+ Elijah
13
+ Lucas
14
+ Mason
15
+ Logan
16
+ Alexander
17
+ Ethan
18
+ Jacob
19
+ Michael
20
+ Daniel
21
+ Henry
22
+ Jackson
23
+ Sebastian
24
+ Aiden
25
+ Matthew
26
+ Samuel
27
+ David
28
+ Joseph
29
+ Carter
30
+ Owen
31
+ Wyatt
32
+ John
33
+ Jack
34
+ Luke
35
+ Jayden
36
+ Dylan
37
+ Grayson
38
+ Levi
39
+ Isaac
40
+ Gabriel
41
+ Julian
42
+ Mateo
43
+ Anthony
44
+ Jaxon
45
+ Lincoln
46
+ Joshua
47
+ Christopher
48
+ Andrew
49
+ Theodore
50
+ Caleb
51
+ Ryan
52
+ Asher
53
+ Nathan
54
+ Thomas
55
+ Leo
56
+ Isaiah
57
+ Charles
58
+ Josiah
59
+ Hudson
60
+ Christian
61
+ Hunter
62
+ Connor
63
+ Eli
64
+ Ezra
65
+ Aaron
66
+ Landon
67
+ Adrian
68
+ Jonathan
69
+ Nolan
70
+ Jeremiah
71
+ Easton
72
+ Elias
73
+ Colton
74
+ Cameron
75
+ Carson
76
+ Robert
77
+ Angel
78
+ Maverick
79
+ Nicholas
80
+ Dominic
81
+ Jaxson
82
+ Greyson
83
+ Adam
84
+ Ian
85
+ Austin
86
+ Santiago
87
+ Jordan
88
+ Cooper
89
+ Brayden
90
+ Roman
91
+ Evan
92
+ Ezekiel
93
+ Xaviar
94
+ Jose
95
+ Jace
96
+ Jameson
97
+ Leonardo
98
+ Axel
99
+ Everett
100
+ Kayden
101
+ Miles
102
+ Sawyer
103
+ Jason
104
+ Emma
105
+ Olivia
106
+ Ava
107
+ Isabella
108
+ Sophia
109
+ Charlotte
110
+ Mia
111
+ Amelia
112
+ Harper
113
+ Evelyn
114
+ Abigail
115
+ Emily
116
+ Elizabeth
117
+ Mila
118
+ Ella
119
+ Avery
120
+ Sofia
121
+ Camila
122
+ Aria
123
+ Scarlett
124
+ Victoria
125
+ Madison
126
+ Luna
127
+ Grace
128
+ Chloe
129
+ Penelope
130
+ Layla
131
+ Riley
132
+ Zoey
133
+ Nora
134
+ Lily
135
+ Eleanor
136
+ Hannah
137
+ Lillian
138
+ Addison
139
+ Aubrey
140
+ Ellie
141
+ Stella
142
+ Natalie
143
+ Zoe
144
+ Leah
145
+ Hazel
146
+ Violet
147
+ Aurora
148
+ Savannah
149
+ Audrey
150
+ Brooklyn
151
+ Bella
152
+ Claire
153
+ Skylar
154
+ Lucy
155
+ Paisley
156
+ Everly
157
+ Anna
158
+ Caroline
159
+ Nova
160
+ Genesis
161
+ Emilia
162
+ Kennedy
163
+ Samantha
164
+ Maya
165
+ Willow
166
+ Kinsley
167
+ Naomi
168
+ Aaliyah
169
+ Elena
170
+ Sarah
171
+ Ariana
172
+ Allison
173
+ Gabriella
174
+ Alice
175
+ Madelyn
176
+ Cora
177
+ Ruby
178
+ Eva
179
+ Serenity
180
+ Autumn
181
+ Adeline
182
+ Hailey
183
+ Gianna
184
+ Valentina
185
+ Isla
186
+ Eliana
187
+ Quinn
188
+ Nevaeh
189
+ Ivy
190
+ Sadie
191
+ Piper
192
+ Lydia
193
+ Alexa
194
+ Josephine
195
+ Emery
196
+ Julia
197
+ Delilah
198
+ Arianna
199
+ Vivian
200
+ Kaylee
201
+ Sophie
202
+ Brielle
203
+ Madeline
204
+ ]
205
+ NAMES_LAST = %w[
206
+ Smith
207
+ Johnson
208
+ Williams
209
+ Brown
210
+ Jones
211
+ Miller
212
+ Davis
213
+ Wilson
214
+ Anderson
215
+ Taylor
216
+ ]
217
+ def initialize(contacts = nil)
218
+ @contacts = contacts || 1000.times.map do |n|
219
+ random_first_name_index = (rand*NAMES_FIRST.size).to_i
220
+ random_last_name_index = (rand*NAMES_LAST.size).to_i
221
+ first_name = NAMES_FIRST[random_first_name_index]
222
+ last_name = NAMES_LAST[random_last_name_index]
223
+ email = "#{first_name}@#{last_name}.com".downcase
224
+ Contact.new(
225
+ first_name: first_name,
226
+ last_name: last_name,
227
+ email: email
228
+ )
229
+ end
230
+ end
231
+
232
+ def find(attribute_filter_map)
233
+ @contacts.find_all do |contact|
234
+ match = true
235
+ attribute_filter_map.keys.each do |attribute_name|
236
+ contact_value = contact.send(attribute_name).downcase
237
+ filter_value = attribute_filter_map[attribute_name].downcase
238
+ match = false unless contact_value.match(filter_value)
239
+ end
240
+ match
241
+ end
242
+ end
243
+ end
244
+ end
@@ -0,0 +1,108 @@
1
+ require "java"
2
+ require "observer"
3
+
4
+ #Presents login screen data
5
+ class LoginPresenter
6
+
7
+ attr_accessor :user_name
8
+ attr_accessor :password
9
+ attr_accessor :status
10
+
11
+ def initialize
12
+ @user_name = ""
13
+ @password = ""
14
+ @status = "Logged Out"
15
+ end
16
+
17
+ def status=(status)
18
+ @status = status
19
+
20
+ #TODO add feature to bind dependent properties to master property (2017-07-25 nested data binding)
21
+ notify_observers("logged_in")
22
+ notify_observers("logged_out")
23
+ end
24
+
25
+ def valid?
26
+ !@user_name.to_s.strip.empty? && !@password.to_s.strip.empty?
27
+ end
28
+
29
+ def logged_in
30
+ self.status == "Logged In"
31
+ end
32
+
33
+ def logged_out
34
+ !self.logged_in
35
+ end
36
+
37
+ def login
38
+ return unless valid?
39
+ self.status = "Logged In"
40
+ end
41
+
42
+ def logout
43
+ self.user_name = ""
44
+ self.password = ""
45
+ self.status = "Logged Out"
46
+ end
47
+
48
+ end
49
+
50
+ #Login screen
51
+ class Login
52
+ include Glimmer
53
+
54
+ def launch
55
+ presenter = LoginPresenter.new
56
+ @shell = shell {
57
+ text "Login"
58
+ composite {
59
+ grid_layout 2, false #two columns with differing widths
60
+
61
+ label { text "Username:" } # goes in column 1
62
+ @user_name_text = text { # goes in column 2
63
+ text bind(presenter, :user_name)
64
+ enabled bind(presenter, :logged_out)
65
+ on_key_pressed { |event|
66
+ @password_text.set_focus if event.keyCode == swt(:cr)
67
+ }
68
+ }
69
+
70
+ label { text "Password:" }
71
+ @password_text = text(:password, :border) {
72
+ text bind(presenter, :password)
73
+ enabled bind(presenter, :logged_out)
74
+ on_key_pressed { |event|
75
+ presenter.login if event.keyCode == swt(:cr)
76
+ }
77
+ }
78
+
79
+ label { text "Status:" }
80
+ label { text bind(presenter, :status) }
81
+
82
+ button {
83
+ text "Login"
84
+ enabled bind(presenter, :logged_out)
85
+ on_widget_selected { presenter.login }
86
+ on_key_pressed { |event|
87
+ presenter.login if event.keyCode == swt(:cr)
88
+ }
89
+ }
90
+
91
+ button {
92
+ text "Logout"
93
+ enabled bind(presenter, :logged_in)
94
+ on_widget_selected { presenter.logout }
95
+ on_key_pressed { |event|
96
+ if event.keyCode == swt(:cr)
97
+ presenter.logout
98
+ @user_name_text.set_focus
99
+ end
100
+ }
101
+ }
102
+ }
103
+ }
104
+ @shell.open
105
+ end
106
+ end
107
+
108
+ Login.new.launch