glimmer-dsl-swt 4.21.2.1 → 4.21.2.5

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: 07f68ad917d0e734926d2f4064fdaa7c7982d3164cb1ca8e26b183b49da1d2ef
4
- data.tar.gz: 859a163ecd57d0324135b8c29fced778c2f008a078af54c17d6497525ceda9dc
3
+ metadata.gz: d379f6055bc86787c888142b3ae76c8cec195e558b00880bdcc2ca5849f0323d
4
+ data.tar.gz: 1c4c5a96157a4ddf59515a9a3399f505071d3e9caf8e32656fb6238157ed8d78
5
5
  SHA512:
6
- metadata.gz: d9ff675ec4fc1b36815a1198be7aebcc35bc73c16fecb329f8ebfb2e182f0c9dff279098299ae665ea9edfe3f53c387e8e9ca841193c2b309558f4d3fcfba13a
7
- data.tar.gz: 93fbf2d0bed61c27cfe64163ed0a05e878ad588c93ca87522ace6b0e67c0e8c4cf559119cf0562ba4d9d864a93fcec18438f6035037dd37a9a6a5c19fab8989d
6
+ metadata.gz: 076e3436c4b1258a11b291df10196a9ee18e34703b8769de3b3d5d5120ee66927290e15aa874b98850ca7c73c537469130c1a20d2013f21bcff67b076c771e0c
7
+ data.tar.gz: ab43d3b02470e200dc0b84c2649f96cae1058307b06923d15c63f6a89f69407d4c66371cdce479b19ba9e5d27071a72b78ab516fde4350c0fdf6f953beb7d528
data/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # Change Log
2
2
 
3
+ ### 4.21.2.5
4
+
5
+ - Hello, Scrolled Composite! sample
6
+
7
+ ### 4.21.2.4
8
+
9
+ - Update gem `post_install_message` to clearly indicate that `-J-XstartOnFirstThread` jruby option is needed on the Mac and is handled automatically with global configuration after running `glimmer-setup`.
10
+
11
+ ### 4.21.2.3
12
+
13
+ - Upgrade to glimmer 2.5.1 to fix an issue with mistakenly referencing `OpenStruct` without `'ostruct'` being loaded
14
+
15
+ ### 4.21.2.2
16
+
17
+ - Demo file drag and drop in Hello, Drag and Drop!
18
+ - Make shapes added inside a widget with `:default` or `:max` dimensions auto-resize as the widget resizes
19
+ - Upgrade to glimmer 2.5.0
20
+
3
21
  ### 4.21.2.1
4
22
 
5
23
  - Update Hello, Drag and Drop! to include `list`, `label`, `text`, and `spinner` examples
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # [<img src="https://raw.githubusercontent.com/AndyObtiva/glimmer/master/images/glimmer-logo-hi-res.png" height=85 />](https://github.com/AndyObtiva/glimmer) Glimmer DSL for SWT 4.21.2.1
1
+ # [<img src="https://raw.githubusercontent.com/AndyObtiva/glimmer/master/images/glimmer-logo-hi-res.png" height=85 />](https://github.com/AndyObtiva/glimmer) Glimmer DSL for SWT 4.21.2.5
2
2
  ## JRuby Desktop Development GUI Framework
3
3
  [![Gem Version](https://badge.fury.io/rb/glimmer-dsl-swt.svg)](http://badge.fury.io/rb/glimmer-dsl-swt)
4
4
  [![Travis CI](https://travis-ci.com/AndyObtiva/glimmer-dsl-swt.svg?branch=master)](https://travis-ci.com/github/AndyObtiva/glimmer-dsl-swt)
@@ -6,8 +6,6 @@
6
6
  [![Maintainability](https://api.codeclimate.com/v1/badges/aaf1cba142dd351f84bd/maintainability)](https://codeclimate.com/github/AndyObtiva/glimmer-dsl-swt/maintainability)
7
7
  [![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)
8
8
 
9
- **[Contributors Wanted! (Submit a Glimmer App Sample to Get Started)](#contributing)**
10
-
11
9
  **(The Original Glimmer Library Handling the World’s Ruby GUI Needs Since 2007. Beware of Imitators!)**
12
10
 
13
11
  [Glimmer](https://github.com/AndyObtiva/glimmer) DSL for [SWT](https://www.eclipse.org/swt/) is a native-GUI cross-platform desktop development library written in [JRuby](https://www.jruby.org/), an OS-threaded faster JVM version of [Ruby](https://www.ruby-lang.org/en/). [Glimmer](https://github.com/AndyObtiva/glimmer)'s main innovation is a declarative [Ruby DSL](docs/reference/GLIMMER_GUI_DSL_SYNTAX.md#glimmer-dsl-syntax) that enables productive and efficient authoring of desktop application user-interfaces by relying on the robust [Eclipse SWT library](https://www.eclipse.org/swt/). [Glimmer](https://rubygems.org/gems/glimmer) additionally innovates by having built-in [data-binding](docs/reference/GLIMMER_GUI_DSL_SYNTAX.md#data-binding) support, which greatly facilitates synchronizing the GUI with domain models, thus achieving true decoupling of object oriented components and enabling developers to solve business problems (test-first) without worrying about GUI concerns, or alternatively drive development GUI-first, and then write clean business models afterwards. Not only does Glimmer provide a large set of GUI [widgets](docs/reference/GLIMMER_GUI_DSL_SYNTAX.md#widgets), but it also supports drawing Canvas Graphics like [Shapes](docs/reference/GLIMMER_GUI_DSL_SYNTAX.md#canvas-shape-dsl) and [Animations](docs/reference/GLIMMER_GUI_DSL_SYNTAX.md#canvas-animation-dsl). To get started quickly, [Glimmer](https://rubygems.org/gems/glimmer) offers [scaffolding](docs/reference/GLIMMER_COMMAND.md#scaffolding) options for [Apps](#in-production), [Gems](docs/reference/GLIMMER_COMMAND.md#custom-shell-gem), and [Custom Widgets](docs/reference/GLIMMER_GUI_DSL_SYNTAX.md#custom-widgets). [Glimmer](https://rubygems.org/gems/glimmer) also includes native-executable [packaging](docs/reference/GLIMMER_PACKAGING_AND_DISTRIBUTION.md) support, sorely lacking in other libraries, thus enabling the delivery of desktop apps written in [Ruby](https://www.ruby-lang.org/en/) as truly native DMG/PKG/APP files on the [Mac](https://www.apple.com/ca/macos), MSI/EXE files on [Windows](https://www.microsoft.com/en-ca/windows), and DEB/RPM files on [Linux](https://www.linux.org/). [Glimmer](https://github.com/AndyObtiva/glimmer) was the [first Ruby gem](https://rubygems.org/gems/glimmer) to bring [SWT](https://www.eclipse.org/swt/) (Standard Widget Toolkit) to [Ruby](https://www.ruby-lang.org/en/), thanks to creator [Andy Maleh](https://andymaleh.blogspot.com/), EclipseCon/EclipseWorld/RubyConf speaker.
@@ -15,14 +13,17 @@
15
13
  [<img src="https://covers.oreillystatic.com/images/9780596519650/lrg.jpg" width=105 /><br />
16
14
  Featured in JRuby Cookbook](http://shop.oreilly.com/product/9780596519650.do) and [Chalmers/Gothenburg University Software Engineering Master's Lecture Material](http://www.cse.chalmers.se/~bergert/slides/guest_lecture_DSLs.pdf)
17
15
 
18
- [Glimmer DSL for SWT](https://rubygems.org/gems/glimmer-dsl-swt) 4.21.2.1 includes [SWT 4.21](https://download.eclipse.org/eclipse/downloads/drops4/R-4.21-202109060500/), which was released on September 6, 2021. Gem version numbers are in sync with the SWT library versions. The first two digits represent the SWT version number. The last two digits represent the minor and patch versions of Glimmer DSL for SWT. Note that SWT now supports AARCH64 on Mac and Linux, but it is not fully tested in Glimmer DSL for SWT yet, so deem its support experimental for the time being without guarantees for functionality until declared otherwise (please report any issues you may encounter).
16
+ [SWT](https://www.eclipse.org/swt/) (Standard Widget Toolkit) is a very robust GUI toolkit that is most famous for building the [Eclipse IDE](https://www.eclipse.org/ide/), a free and open-source general language Integrated Development Environment that was the first to provide a high-performance pause-free [Java](https://www.oracle.com/ca-en/java/) IDE (unlike earlier versions of NetBeans and other [Java](https://www.oracle.com/ca-en/java/) IDEs), thanks to its very smart software architecture. Additionally, [Eclipse RCP (Rich Client Platform, built on top of SWT) has been used by NASA to build Mars Rover operational software](https://www.eclipse.org/community/casestudies/NASAfinal.pdf). So, [Eclipse technologies](https://www.eclipse.org/) are not only very highly proven, but are also considered some of the best in the world. In fact, it took CSS decades before it finally caught up with one of [SWT](https://www.eclipse.org/swt/)'s very effective ideas, the [GridLayout](https://help.eclipse.org/latest/index.jsp?topic=/org.eclipse.platform.doc.isv/reference/api/org/eclipse/swt/layout/package-summary.html). [Glimmer DSL for SWT](https://rubygems.org/gems/glimmer-dsl-swt) makes [Eclipse Technologies](https://www.eclipse.org/) available in [Ruby](https://www.ruby-lang.org) via [JRuby](https://www.jruby.org/).
17
+
18
+ ![Eclipse SWT RCP NASA Mars Rover](/images/glimmer-eclipse-swt-rcp-nasa-mars-rover.png)
19
+
20
+ [Glimmer DSL for SWT](https://rubygems.org/gems/glimmer-dsl-swt) 4.21.2.5 includes [SWT 4.21](https://download.eclipse.org/eclipse/downloads/drops4/R-4.21-202109060500/), which was released on September 6, 2021. Gem version numbers are in sync with the SWT library versions. The first two digits represent the SWT version number. The last two digits represent the minor and patch versions of Glimmer DSL for SWT. Note that SWT now supports AARCH64 on Mac and Linux, but it is not fully tested in Glimmer DSL for SWT yet, so deem its support experimental for the time being without guarantees for functionality until declared otherwise (please report any issues you may encounter).
19
21
 
20
22
  **Starting in version 4.20.0.0, [Glimmer DSL for SWT](https://rubygems.org/gems/glimmer-dsl-swt) comes with the new [***Shine***](/docs/reference/GLIMMER_GUI_DSL_SYNTAX.md#shine) syntax** for highly intuitive and visually expressive View/Model Attribute Mapping, relying on `<=>` for bidirectional (two-way) data-binding and `<=` for unidirectional (one-way) data-binding, providing an alternative to the `bind` keyword (keep in mind that it is still a beta, so default back to `bind` whenever needed).
21
23
 
22
24
  Please help make [Glimmer DSL for SWT](https://rubygems.org/gems/glimmer-dsl-swt) better by providing feedback and [contributing](#contributing) whenever possible. Any feature suggestions that are accepted could be implemented within weeks if not days.
23
25
 
24
- Glimmer DSL gems:
25
- - [glimmer-dsl-swt](https://github.com/AndyObtiva/glimmer-dsl-swt): Glimmer DSL for SWT (JRuby Desktop Development GUI Framework)
26
+ Other [Glimmer](https://rubygems.org/gems/glimmer) DSL gems you might be interested in:
26
27
  - [glimmer-dsl-opal](https://github.com/AndyObtiva/glimmer-dsl-opal): Glimmer DSL for Opal (Pure Ruby Web GUI and Auto-Webifier of Desktop Apps)
27
28
  - [glimmer-dsl-tk](https://github.com/AndyObtiva/glimmer-dsl-tk): Glimmer DSL for Tk (MRI Ruby Desktop Development GUI Library)
28
29
  - [glimmer-dsl-libui](https://github.com/AndyObtiva/glimmer-dsl-libui): Glimmer DSL for LibUI (Prerequisite-Free Ruby Desktop Development GUI Library)
@@ -41,6 +42,7 @@ include Glimmer
41
42
 
42
43
  shell {
43
44
  text "Glimmer"
45
+
44
46
  label {
45
47
  text "Hello, World!"
46
48
  }
@@ -232,7 +234,7 @@ Glimmer app:
232
234
 
233
235
  ## Background
234
236
 
235
- [Ruby](https://www.ruby-lang.org) is a dynamically-typed object-oriented language, which provides great productivity gains due to its powerful expressive syntax and dynamic nature. While it is proven by the [Ruby](https://www.ruby-lang.org) on Rails framework for web development, it currently lacks a robust platform-independent framework for building desktop applications. Given that Java libraries can now be utilized in Ruby code through JRuby, Eclipse technologies, such as [SWT](https://www.eclipse.org/swt/), JFace, and RCP can help fill the gap of desktop application development with Ruby.
237
+ [Ruby](https://www.ruby-lang.org) is a dynamically-typed object-oriented language, which provides great productivity gains due to its powerful expressive syntax and dynamic nature. While it is proven by the [Ruby](https://www.ruby-lang.org) on Rails framework for web development, it currently lacks a robust platform-independent framework for building desktop applications. Given that [Java](https://www.oracle.com/ca-en/java/) libraries can now be utilized in Ruby code through JRuby, Eclipse technologies, such as [SWT](https://www.eclipse.org/swt/), JFace, and RCP can help fill the gap of desktop application development with Ruby.
236
238
 
237
239
  ## Software Architecture
238
240
 
@@ -323,7 +325,7 @@ jgem install glimmer-dsl-swt
323
325
 
324
326
  Or this command if you want a specific version:
325
327
  ```
326
- jgem install glimmer-dsl-swt -v 4.21.2.1
328
+ jgem install glimmer-dsl-swt -v 4.21.2.5
327
329
  ```
328
330
 
329
331
  `jgem` is JRuby's version of `gem` command.
@@ -351,7 +353,7 @@ Note: if you're using activerecord or activesupport, keep in mind that Glimmer u
351
353
 
352
354
  Add the following to `Gemfile`:
353
355
  ```
354
- gem 'glimmer-dsl-swt', '~> 4.21.2.1'
356
+ gem 'glimmer-dsl-swt', '~> 4.21.2.5'
355
357
  ```
356
358
 
357
359
  And, then run:
@@ -372,7 +374,7 @@ glimmer
372
374
  ```
373
375
 
374
376
  ```
375
- Glimmer (JRuby Desktop Development GUI Framework) - JRuby Gem: glimmer-dsl-swt v4.21.2.1
377
+ Glimmer (JRuby Desktop Development GUI Framework) - JRuby Gem: glimmer-dsl-swt v4.21.2.5
376
378
 
377
379
  Usage: glimmer [--bundler] [--pd] [--quiet] [--debug] [--log-level=VALUE] [[ENV_VAR=VALUE]...] [[-jruby-option]...] (application.rb or task[task_args]) [[application2.rb]...]
378
380
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 4.21.2.1
1
+ 4.21.2.5
@@ -111,6 +111,7 @@ include Glimmer
111
111
 
112
112
  shell {
113
113
  text "Glimmer"
114
+
114
115
  label {
115
116
  text "Hello, World!"
116
117
  }
@@ -131,6 +132,7 @@ class HelloWorld
131
132
  # the following are GUI DSL keywords (shell, text, and label) used in the instance scope
132
133
  shell {
133
134
  text "Glimmer"
135
+
134
136
  label {
135
137
  text "Hello, World!"
136
138
  foreground COLOR_FOREGROUND_DEFAULT
@@ -210,6 +212,7 @@ For example, if we were to revisit `samples/hello/hello_world.rb` above (you may
210
212
  ```ruby
211
213
  shell {
212
214
  text "Glimmer"
215
+
213
216
  label {
214
217
  text "Hello, World!"
215
218
  }
@@ -223,6 +226,7 @@ Note that `shell` instantiates the outer shell **widget**, in other words, the w
223
226
  ```ruby
224
227
  # ...
225
228
  text "Glimmer" # text property of shell
229
+
226
230
  label { # label widget declaration as content of shell
227
231
  text "Hello, World!" # text property of label
228
232
  }
@@ -268,15 +272,19 @@ Example from [hello_tab.rb](samples/hello/hello_tab.rb) sample (you may copy/pas
268
272
  ```ruby
269
273
  shell {
270
274
  text "Hello, Tab!"
275
+
271
276
  tab_folder {
272
277
  tab_item {
273
278
  text "English"
279
+
274
280
  label {
275
281
  text "Hello, World!"
276
282
  }
277
283
  }
284
+
278
285
  tab_item {
279
286
  text "French"
287
+
280
288
  label {
281
289
  text "Bonjour Univers!"
282
290
  }
@@ -294,63 +302,63 @@ If you are an advanced user of Glimmer DSL for SWT and need more widgets, check
294
302
  This is not an exaustive list, but should give you a good start in learning Glimmer GUI DSL keywords, keeping in mind that the full list can be derived from the [SWT documentation](https://www.eclipse.org/swt/widgets/). More will be explained in the following sections.
295
303
 
296
304
  **Widgets:**
297
- - `button`: featured in [Hello, Checkbox!](GLIMMER_SAMPLES.md#hello-checkbox) / [Hello, Button!](GLIMMER_SAMPLES.md#hello-button) / [Hello, Table!](GLIMMER_SAMPLES.md#hello-table) / [Hello, Radio Group!](GLIMMER_SAMPLES.md#hello-radio-group) / [Hello, Radio!](GLIMMER_SAMPLES.md#hello-radio) / [Hello, Message Box!](GLIMMER_SAMPLES.md#hello-message-box) / [Hello, List Single Selection!](GLIMMER_SAMPLES.md#hello-list-single-selection) / [Hello, List Multi Selection!](GLIMMER_SAMPLES.md#hello-list-multi-selection) / [Hello, Group!](GLIMMER_SAMPLES.md#hello-group) / [Hello, Combo!](GLIMMER_SAMPLES.md#hello-combo) / [Hello, Checkbox Group!](GLIMMER_SAMPLES.md#hello-checkbox-group) / [Contact Manager](GLIMMER_SAMPLES.md#contact-manager) / [Tic Tac Toe](GLIMMER_SAMPLES.md#tic-tac-toe) / [Login](GLIMMER_SAMPLES.md#login)
298
- - `browser`: featured in [Hello, Browser!](GLIMMER_SAMPLES.md#hello-browser)
299
- - `calendar`: featured in [Hello, Date Time!](GLIMMER_SAMPLES.md#hello-date-time)
300
- - `checkbox`: featured in [Hello, Checkbox Group!](GLIMMER_SAMPLES.md#hello-checkbox-group) / [Hello, Checkbox!](GLIMMER_SAMPLES.md#hello-checkbox)
301
- - `checkbox_group`: featured in [Hello, Checkbox Group!](GLIMMER_SAMPLES.md#hello-checkbox-group)
302
- - `combo`: featured in [Hello, Table!](GLIMMER_SAMPLES.md#hello-table) / [Hello, Combo!](GLIMMER_SAMPLES.md#hello-combo)
303
- - `composite`: featured in [Hello, Composite!](GLIMMER_SAMPLES.md#hello-composite) / [Hello, Radio!](GLIMMER_SAMPLES.md#hello-radio) / [Hello, Computed!](GLIMMER_SAMPLES.md#hello-computed) / [Hello, Checkbox!](GLIMMER_SAMPLES.md#hello-checkbox) / [Tic Tac Toe](GLIMMER_SAMPLES.md#tic-tac-toe) / [Login](GLIMMER_SAMPLES.md#login) / [Contact Manager](GLIMMER_SAMPLES.md#contact-manager)
304
- - `cool_bar`: featured in [Hello, Cool Bar!](GLIMMER_SAMPLES.md#hello-cool-bar)
305
- - `date`: featured in [Hello, Table!](GLIMMER_SAMPLES.md#hello-table) / [Hello, Date Time!](GLIMMER_SAMPLES.md#hello-date-time) / [Hello, Custom Shell!](GLIMMER_SAMPLES.md#hello-custom-shell) / [Tic Tac Toe](GLIMMER_SAMPLES.md#tic-tac-toe)
306
- - `date_drop_down`: featured in [Hello, Table!](GLIMMER_SAMPLES.md#hello-table) / [Hello, Date Time!](GLIMMER_SAMPLES.md#hello-date-time)
307
- - `group`: featured in [Hello, Group!](GLIMMER_SAMPLES.md#hello-group) / [Contact Manager](GLIMMER_SAMPLES.md#contact-manager)
308
- - `label`: featured in [Hello, Computed!](GLIMMER_SAMPLES.md#hello-computed) / [Hello, Checkbox Group!](GLIMMER_SAMPLES.md#hello-checkbox-group) / [Hello, Checkbox!](GLIMMER_SAMPLES.md#hello-checkbox) / [Hello, World!](GLIMMER_SAMPLES.md#hello-world) / [Hello, Table!](GLIMMER_SAMPLES.md#hello-table) / [Hello, Tab!](GLIMMER_SAMPLES.md#hello-tab) / [Hello, Radio Group!](GLIMMER_SAMPLES.md#hello-radio-group) / [Hello, Radio!](GLIMMER_SAMPLES.md#hello-radio) / [Hello, Pop Up Context Menu!](GLIMMER_SAMPLES.md#hello-pop-up-context-menu) / [Hello, Menu Bar!](GLIMMER_SAMPLES.md#hello-menu-bar) / [Hello, Date Time!](GLIMMER_SAMPLES.md#hello-date-time) / [Hello, Custom Widget!](GLIMMER_SAMPLES.md#hello-custom-widget) / [Hello, Custom Shell!](GLIMMER_SAMPLES.md#hello-custom-shell) / [Contact Manager](GLIMMER_SAMPLES.md#contact-manager) / [Login](GLIMMER_SAMPLES.md#login)
309
- - `list` (w/ optional `:multi` SWT style): featured in [Hello, List Single Selection!](GLIMMER_SAMPLES.md#hello-list-single-selection) / [Hello, List Multi Selection!](GLIMMER_SAMPLES.md#hello-list-multi-selection) / [Contact Manager](GLIMMER_SAMPLES.md#contact-manager)
310
- - `menu`: featured in [Hello, Menu Bar!](GLIMMER_SAMPLES.md#hello-menu-bar) / [Hello, Pop Up Context Menu!](GLIMMER_SAMPLES.md#hello-pop-up-context-menu) / [Hello, Table!](GLIMMER_SAMPLES.md#hello-table)
311
- - `menu_bar`: featured in [Hello, Menu Bar!](GLIMMER_SAMPLES.md#hello-menu-bar)
312
- - `menu_item`: featured in [Hello, Table!](GLIMMER_SAMPLES.md#hello-table) / [Hello, Pop Up Context Menu!](GLIMMER_SAMPLES.md#hello-pop-up-context-menu) / [Hello, Menu Bar!](GLIMMER_SAMPLES.md#hello-menu-bar)
313
- - `message_box`: featured in [Hello, Table!](GLIMMER_SAMPLES.md#hello-table) / [Hello, Pop Up Context Menu!](GLIMMER_SAMPLES.md#hello-pop-up-context-menu) / [Hello, Message Box!](GLIMMER_SAMPLES.md#hello-message-box) / [Hello, Menu Bar!](GLIMMER_SAMPLES.md#hello-menu-bar)
314
- - `radio`: featured in [Hello, Radio!](GLIMMER_SAMPLES.md#hello-radio) / [Hello, Group!](GLIMMER_SAMPLES.md#hello-group)
315
- - `radio_group`: featured in [Hello, Radio Group!](GLIMMER_SAMPLES.md#hello-radio-group)
305
+ - `button`: featured in [Hello, Checkbox!](/docs/reference/GLIMMER_SAMPLES.md#hello-checkbox) / [Hello, Button!](/docs/reference/GLIMMER_SAMPLES.md#hello-button) / [Hello, Table!](/docs/reference/GLIMMER_SAMPLES.md#hello-table) / [Hello, Radio Group!](/docs/reference/GLIMMER_SAMPLES.md#hello-radio-group) / [Hello, Radio!](/docs/reference/GLIMMER_SAMPLES.md#hello-radio) / [Hello, Message Box!](/docs/reference/GLIMMER_SAMPLES.md#hello-message-box) / [Hello, List Single Selection!](/docs/reference/GLIMMER_SAMPLES.md#hello-list-single-selection) / [Hello, List Multi Selection!](/docs/reference/GLIMMER_SAMPLES.md#hello-list-multi-selection) / [Hello, Group!](/docs/reference/GLIMMER_SAMPLES.md#hello-group) / [Hello, Combo!](/docs/reference/GLIMMER_SAMPLES.md#hello-combo) / [Hello, Checkbox Group!](/docs/reference/GLIMMER_SAMPLES.md#hello-checkbox-group) / [Contact Manager](/docs/reference/GLIMMER_SAMPLES.md#contact-manager) / [Tic Tac Toe](/docs/reference/GLIMMER_SAMPLES.md#tic-tac-toe) / [Login](/docs/reference/GLIMMER_SAMPLES.md#login)
306
+ - `browser`: featured in [Hello, Browser!](/docs/reference/GLIMMER_SAMPLES.md#hello-browser)
307
+ - `calendar`: featured in [Hello, Date Time!](/docs/reference/GLIMMER_SAMPLES.md#hello-date-time)
308
+ - `checkbox`: featured in [Hello, Checkbox Group!](/docs/reference/GLIMMER_SAMPLES.md#hello-checkbox-group) / [Hello, Checkbox!](/docs/reference/GLIMMER_SAMPLES.md#hello-checkbox)
309
+ - `checkbox_group`: featured in [Hello, Checkbox Group!](/docs/reference/GLIMMER_SAMPLES.md#hello-checkbox-group)
310
+ - `combo`: featured in [Hello, Table!](/docs/reference/GLIMMER_SAMPLES.md#hello-table) / [Hello, Combo!](/docs/reference/GLIMMER_SAMPLES.md#hello-combo)
311
+ - `composite`: featured in [Hello, Composite!](/docs/reference/GLIMMER_SAMPLES.md#hello-composite) / [Hello, Radio!](/docs/reference/GLIMMER_SAMPLES.md#hello-radio) / [Hello, Computed!](/docs/reference/GLIMMER_SAMPLES.md#hello-computed) / [Hello, Checkbox!](/docs/reference/GLIMMER_SAMPLES.md#hello-checkbox) / [Tic Tac Toe](/docs/reference/GLIMMER_SAMPLES.md#tic-tac-toe) / [Login](/docs/reference/GLIMMER_SAMPLES.md#login) / [Contact Manager](/docs/reference/GLIMMER_SAMPLES.md#contact-manager)
312
+ - `cool_bar`: featured in [Hello, Cool Bar!](/docs/reference/GLIMMER_SAMPLES.md#hello-cool-bar)
313
+ - `date`: featured in [Hello, Table!](/docs/reference/GLIMMER_SAMPLES.md#hello-table) / [Hello, Date Time!](/docs/reference/GLIMMER_SAMPLES.md#hello-date-time) / [Hello, Custom Shell!](/docs/reference/GLIMMER_SAMPLES.md#hello-custom-shell) / [Tic Tac Toe](/docs/reference/GLIMMER_SAMPLES.md#tic-tac-toe)
314
+ - `date_drop_down`: featured in [Hello, Table!](/docs/reference/GLIMMER_SAMPLES.md#hello-table) / [Hello, Date Time!](/docs/reference/GLIMMER_SAMPLES.md#hello-date-time)
315
+ - `group`: featured in [Hello, Group!](/docs/reference/GLIMMER_SAMPLES.md#hello-group) / [Contact Manager](/docs/reference/GLIMMER_SAMPLES.md#contact-manager)
316
+ - `label`: featured in [Hello, Computed!](/docs/reference/GLIMMER_SAMPLES.md#hello-computed) / [Hello, Checkbox Group!](/docs/reference/GLIMMER_SAMPLES.md#hello-checkbox-group) / [Hello, Checkbox!](/docs/reference/GLIMMER_SAMPLES.md#hello-checkbox) / [Hello, World!](/docs/reference/GLIMMER_SAMPLES.md#hello-world) / [Hello, Table!](/docs/reference/GLIMMER_SAMPLES.md#hello-table) / [Hello, Tab!](/docs/reference/GLIMMER_SAMPLES.md#hello-tab) / [Hello, Radio Group!](/docs/reference/GLIMMER_SAMPLES.md#hello-radio-group) / [Hello, Radio!](/docs/reference/GLIMMER_SAMPLES.md#hello-radio) / [Hello, Pop Up Context Menu!](/docs/reference/GLIMMER_SAMPLES.md#hello-pop-up-context-menu) / [Hello, Menu Bar!](/docs/reference/GLIMMER_SAMPLES.md#hello-menu-bar) / [Hello, Date Time!](/docs/reference/GLIMMER_SAMPLES.md#hello-date-time) / [Hello, Custom Widget!](/docs/reference/GLIMMER_SAMPLES.md#hello-custom-widget) / [Hello, Custom Shell!](/docs/reference/GLIMMER_SAMPLES.md#hello-custom-shell) / [Contact Manager](/docs/reference/GLIMMER_SAMPLES.md#contact-manager) / [Login](/docs/reference/GLIMMER_SAMPLES.md#login)
317
+ - `list` (w/ optional `:multi` SWT style): featured in [Hello, List Single Selection!](/docs/reference/GLIMMER_SAMPLES.md#hello-list-single-selection) / [Hello, List Multi Selection!](/docs/reference/GLIMMER_SAMPLES.md#hello-list-multi-selection) / [Contact Manager](/docs/reference/GLIMMER_SAMPLES.md#contact-manager)
318
+ - `menu`: featured in [Hello, Menu Bar!](/docs/reference/GLIMMER_SAMPLES.md#hello-menu-bar) / [Hello, Pop Up Context Menu!](/docs/reference/GLIMMER_SAMPLES.md#hello-pop-up-context-menu) / [Hello, Table!](/docs/reference/GLIMMER_SAMPLES.md#hello-table)
319
+ - `menu_bar`: featured in [Hello, Menu Bar!](/docs/reference/GLIMMER_SAMPLES.md#hello-menu-bar)
320
+ - `menu_item`: featured in [Hello, Table!](/docs/reference/GLIMMER_SAMPLES.md#hello-table) / [Hello, Pop Up Context Menu!](/docs/reference/GLIMMER_SAMPLES.md#hello-pop-up-context-menu) / [Hello, Menu Bar!](/docs/reference/GLIMMER_SAMPLES.md#hello-menu-bar)
321
+ - `message_box`: featured in [Hello, Table!](/docs/reference/GLIMMER_SAMPLES.md#hello-table) / [Hello, Pop Up Context Menu!](/docs/reference/GLIMMER_SAMPLES.md#hello-pop-up-context-menu) / [Hello, Message Box!](/docs/reference/GLIMMER_SAMPLES.md#hello-message-box) / [Hello, Menu Bar!](/docs/reference/GLIMMER_SAMPLES.md#hello-menu-bar)
322
+ - `radio`: featured in [Hello, Radio!](/docs/reference/GLIMMER_SAMPLES.md#hello-radio) / [Hello, Group!](/docs/reference/GLIMMER_SAMPLES.md#hello-group)
323
+ - `radio_group`: featured in [Hello, Radio Group!](/docs/reference/GLIMMER_SAMPLES.md#hello-radio-group)
316
324
  - `scrolled_composite`
317
- - `shell`: featured in [Hello, Checkbox!](GLIMMER_SAMPLES.md#hello-checkbox) / [Hello, Button!](GLIMMER_SAMPLES.md#hello-button) / [Hello, Table!](GLIMMER_SAMPLES.md#hello-table) / [Hello, Tab!](GLIMMER_SAMPLES.md#hello-tab) / [Hello, Radio Group!](GLIMMER_SAMPLES.md#hello-radio-group) / [Hello, Radio!](GLIMMER_SAMPLES.md#hello-radio) / [Hello, List Single Selection!](GLIMMER_SAMPLES.md#hello-list-single-selection) / [Hello, List Multi Selection!](GLIMMER_SAMPLES.md#hello-list-multi-selection) / [Hello, Group!](GLIMMER_SAMPLES.md#hello-group) / [Hello, Date Time!](GLIMMER_SAMPLES.md#hello-date-time) / [Hello, Custom Shell!](GLIMMER_SAMPLES.md#hello-custom-shell) / [Hello, Computed!](GLIMMER_SAMPLES.md#hello-computed) / [Hello, Combo!](GLIMMER_SAMPLES.md#hello-combo) / [Hello, Checkbox Group!](GLIMMER_SAMPLES.md#hello-checkbox-group) / [Contact Manager](GLIMMER_SAMPLES.md#contact-manager) / [Tic Tac Toe](GLIMMER_SAMPLES.md#tic-tac-toe) / [Login](GLIMMER_SAMPLES.md#login)
318
- - `tab_folder`: featured in [Hello, Tab!](GLIMMER_SAMPLES.md#hello-tab)
319
- - `tab_item`: featured in [Hello, Tab!](GLIMMER_SAMPLES.md#hello-tab)
320
- - `table`: featured in [Hello, Custom Shell!](GLIMMER_SAMPLES.md#hello-custom-shell) / [Hello, Table!](GLIMMER_SAMPLES.md#hello-table) / [Contact Manager](GLIMMER_SAMPLES.md#contact-manager)
321
- - `table_column`: featured in [Hello, Table!](GLIMMER_SAMPLES.md#hello-table) / [Hello, Custom Shell!](GLIMMER_SAMPLES.md#hello-custom-shell) / [Contact Manager](GLIMMER_SAMPLES.md#contact-manager)
322
- - `text`: featured in [Hello, Computed!](GLIMMER_SAMPLES.md#hello-computed) / [Login](GLIMMER_SAMPLES.md#login) / [Contact Manager](GLIMMER_SAMPLES.md#contact-manager)
323
- - `time`: featured in [Hello, Table!](GLIMMER_SAMPLES.md#hello-table) / [Hello, Date Time!](GLIMMER_SAMPLES.md#hello-date-time)
325
+ - `shell`: featured in [Hello, Checkbox!](/docs/reference/GLIMMER_SAMPLES.md#hello-checkbox) / [Hello, Button!](/docs/reference/GLIMMER_SAMPLES.md#hello-button) / [Hello, Table!](/docs/reference/GLIMMER_SAMPLES.md#hello-table) / [Hello, Tab!](/docs/reference/GLIMMER_SAMPLES.md#hello-tab) / [Hello, Radio Group!](/docs/reference/GLIMMER_SAMPLES.md#hello-radio-group) / [Hello, Radio!](/docs/reference/GLIMMER_SAMPLES.md#hello-radio) / [Hello, List Single Selection!](/docs/reference/GLIMMER_SAMPLES.md#hello-list-single-selection) / [Hello, List Multi Selection!](/docs/reference/GLIMMER_SAMPLES.md#hello-list-multi-selection) / [Hello, Group!](/docs/reference/GLIMMER_SAMPLES.md#hello-group) / [Hello, Date Time!](/docs/reference/GLIMMER_SAMPLES.md#hello-date-time) / [Hello, Custom Shell!](/docs/reference/GLIMMER_SAMPLES.md#hello-custom-shell) / [Hello, Computed!](/docs/reference/GLIMMER_SAMPLES.md#hello-computed) / [Hello, Combo!](/docs/reference/GLIMMER_SAMPLES.md#hello-combo) / [Hello, Checkbox Group!](/docs/reference/GLIMMER_SAMPLES.md#hello-checkbox-group) / [Contact Manager](/docs/reference/GLIMMER_SAMPLES.md#contact-manager) / [Tic Tac Toe](/docs/reference/GLIMMER_SAMPLES.md#tic-tac-toe) / [Login](/docs/reference/GLIMMER_SAMPLES.md#login)
326
+ - `tab_folder`: featured in [Hello, Tab!](/docs/reference/GLIMMER_SAMPLES.md#hello-tab)
327
+ - `tab_item`: featured in [Hello, Tab!](/docs/reference/GLIMMER_SAMPLES.md#hello-tab)
328
+ - `table`: featured in [Hello, Custom Shell!](/docs/reference/GLIMMER_SAMPLES.md#hello-custom-shell) / [Hello, Table!](/docs/reference/GLIMMER_SAMPLES.md#hello-table) / [Contact Manager](/docs/reference/GLIMMER_SAMPLES.md#contact-manager)
329
+ - `table_column`: featured in [Hello, Table!](/docs/reference/GLIMMER_SAMPLES.md#hello-table) / [Hello, Custom Shell!](/docs/reference/GLIMMER_SAMPLES.md#hello-custom-shell) / [Contact Manager](/docs/reference/GLIMMER_SAMPLES.md#contact-manager)
330
+ - `text`: featured in [Hello, Computed!](/docs/reference/GLIMMER_SAMPLES.md#hello-computed) / [Login](/docs/reference/GLIMMER_SAMPLES.md#login) / [Contact Manager](/docs/reference/GLIMMER_SAMPLES.md#contact-manager)
331
+ - `time`: featured in [Hello, Table!](/docs/reference/GLIMMER_SAMPLES.md#hello-table) / [Hello, Date Time!](/docs/reference/GLIMMER_SAMPLES.md#hello-date-time)
324
332
  - `tool_bar`: featured in [Hello, Tool Bar!](/docs/reference/GLIMMER_SAMPLES.md#hello-tool-bar)
325
333
  - `tool_item`: featured in [Hello, Tool Bar!](/docs/reference/GLIMMER_SAMPLES.md#hello-tool-bar)
326
- - Glimmer::UI::CustomWidget: ability to define any keyword as a custom widget - featured in [Hello, Custom Widget!](GLIMMER_SAMPLES.md#hello-custom-widget)
327
- - Glimmer::UI::CustomShell: ability to define any keyword as a custom shell (aka custom window) that opens in a new browser window (tab) automatically unless there is no shell open in the current browser window (tab) - featured in [Hello, Custom Shell!](GLIMMER_SAMPLES.md#hello-custom-shell)
334
+ - Glimmer::UI::CustomWidget: ability to define any keyword as a custom widget - featured in [Hello, Custom Widget!](/docs/reference/GLIMMER_SAMPLES.md#hello-custom-widget)
335
+ - Glimmer::UI::CustomShell: ability to define any keyword as a custom shell (aka custom window) that opens in a new browser window (tab) automatically unless there is no shell open in the current browser window (tab) - featured in [Hello, Custom Shell!](/docs/reference/GLIMMER_SAMPLES.md#hello-custom-shell)
328
336
 
329
337
  **Layouts:**
330
- - `grid_layout`: featured in [Hello, Layout!](GLIMMER_SAMPLES.md#hello-layout) / [Hello, Custom Shell!](GLIMMER_SAMPLES.md#hello-custom-shell) / [Hello, Computed!](GLIMMER_SAMPLES.md#hello-computed) / [Hello, Table!](GLIMMER_SAMPLES.md#hello-table) / [Hello, Pop Up Context Menu!](GLIMMER_SAMPLES.md#hello-pop-up-context-menu) / [Hello, Menu Bar!](GLIMMER_SAMPLES.md#hello-menu-bar) / [Hello, List Single Selection!](GLIMMER_SAMPLES.md#hello-list-single-selection) / [Hello, List Multi Selection!](GLIMMER_SAMPLES.md#hello-list-multi-selection) / [Contact Manager](GLIMMER_SAMPLES.md#contact-manager) / [Login](GLIMMER_SAMPLES.md#login) / [Tic Tac Toe](GLIMMER_SAMPLES.md#tic-tac-toe)
331
- - `row_layout`: featured in [Hello, Layout!](GLIMMER_SAMPLES.md#hello-layout) / [Hello, Radio Group!](GLIMMER_SAMPLES.md#hello-radio-group) / [Hello, Radio!](GLIMMER_SAMPLES.md#hello-radio) / [Hello, Group!](GLIMMER_SAMPLES.md#hello-group) / [Hello, Date Time!](GLIMMER_SAMPLES.md#hello-date-time) / [Hello, Combo!](GLIMMER_SAMPLES.md#hello-combo) / [Hello, Checkbox Group!](GLIMMER_SAMPLES.md#hello-checkbox-group) / [Hello, Checkbox!](GLIMMER_SAMPLES.md#hello-checkbox) / [Contact Manager](GLIMMER_SAMPLES.md#contact-manager)
332
- - `fill_layout`: featured in [Hello, Layout!](GLIMMER_SAMPLES.md#hello-layout) / [Hello, Custom Widget!](GLIMMER_SAMPLES.md#hello-custom-widget)
333
- - `layout_data`: featured in [Hello, Layout!](GLIMMER_SAMPLES.md#hello-layout) / [Hello, Table!](GLIMMER_SAMPLES.md#hello-table) / [Hello, Custom Shell!](GLIMMER_SAMPLES.md#hello-custom-shell) / [Hello, Computed!](GLIMMER_SAMPLES.md#hello-computed) / [Tic Tac Toe](GLIMMER_SAMPLES.md#tic-tac-toe) / [Contact Manager](GLIMMER_SAMPLES.md#contact-manager)
338
+ - `grid_layout`: featured in [Hello, Layout!](/docs/reference/GLIMMER_SAMPLES.md#hello-layout) / [Hello, Custom Shell!](/docs/reference/GLIMMER_SAMPLES.md#hello-custom-shell) / [Hello, Computed!](/docs/reference/GLIMMER_SAMPLES.md#hello-computed) / [Hello, Table!](/docs/reference/GLIMMER_SAMPLES.md#hello-table) / [Hello, Pop Up Context Menu!](/docs/reference/GLIMMER_SAMPLES.md#hello-pop-up-context-menu) / [Hello, Menu Bar!](/docs/reference/GLIMMER_SAMPLES.md#hello-menu-bar) / [Hello, List Single Selection!](/docs/reference/GLIMMER_SAMPLES.md#hello-list-single-selection) / [Hello, List Multi Selection!](/docs/reference/GLIMMER_SAMPLES.md#hello-list-multi-selection) / [Contact Manager](/docs/reference/GLIMMER_SAMPLES.md#contact-manager) / [Login](/docs/reference/GLIMMER_SAMPLES.md#login) / [Tic Tac Toe](/docs/reference/GLIMMER_SAMPLES.md#tic-tac-toe)
339
+ - `row_layout`: featured in [Hello, Layout!](/docs/reference/GLIMMER_SAMPLES.md#hello-layout) / [Hello, Radio Group!](/docs/reference/GLIMMER_SAMPLES.md#hello-radio-group) / [Hello, Radio!](/docs/reference/GLIMMER_SAMPLES.md#hello-radio) / [Hello, Group!](/docs/reference/GLIMMER_SAMPLES.md#hello-group) / [Hello, Date Time!](/docs/reference/GLIMMER_SAMPLES.md#hello-date-time) / [Hello, Combo!](/docs/reference/GLIMMER_SAMPLES.md#hello-combo) / [Hello, Checkbox Group!](/docs/reference/GLIMMER_SAMPLES.md#hello-checkbox-group) / [Hello, Checkbox!](/docs/reference/GLIMMER_SAMPLES.md#hello-checkbox) / [Contact Manager](/docs/reference/GLIMMER_SAMPLES.md#contact-manager)
340
+ - `fill_layout`: featured in [Hello, Layout!](/docs/reference/GLIMMER_SAMPLES.md#hello-layout) / [Hello, Custom Widget!](/docs/reference/GLIMMER_SAMPLES.md#hello-custom-widget)
341
+ - `layout_data`: featured in [Hello, Layout!](/docs/reference/GLIMMER_SAMPLES.md#hello-layout) / [Hello, Table!](/docs/reference/GLIMMER_SAMPLES.md#hello-table) / [Hello, Custom Shell!](/docs/reference/GLIMMER_SAMPLES.md#hello-custom-shell) / [Hello, Computed!](/docs/reference/GLIMMER_SAMPLES.md#hello-computed) / [Tic Tac Toe](/docs/reference/GLIMMER_SAMPLES.md#tic-tac-toe) / [Contact Manager](/docs/reference/GLIMMER_SAMPLES.md#contact-manager)
334
342
 
335
343
  **Graphics/Style:**
336
- - `color`: featured in [Hello, Custom Widget!](GLIMMER_SAMPLES.md#hello-custom-widget) / [Hello, Menu Bar!](GLIMMER_SAMPLES.md#hello-menu-bar)
337
- - `font`: featured in [Hello, Checkbox Group!](GLIMMER_SAMPLES.md#hello-checkbox-group) / [Hello, Checkbox!](GLIMMER_SAMPLES.md#hello-checkbox) / [Hello, Table!](GLIMMER_SAMPLES.md#hello-table) / [Hello, Radio Group!](GLIMMER_SAMPLES.md#hello-radio-group) / [Hello, Radio!](GLIMMER_SAMPLES.md#hello-radio) / [Hello, Pop Up Context Menu!](GLIMMER_SAMPLES.md#hello-pop-up-context-menu) / [Hello, Menu Bar!](GLIMMER_SAMPLES.md#hello-menu-bar) / [Hello, Group!](GLIMMER_SAMPLES.md#hello-group) / [Hello, Date Time!](GLIMMER_SAMPLES.md#hello-date-time) / [Hello, Custom Widget!](GLIMMER_SAMPLES.md#hello-custom-widget) / [Hello, Custom Shell!](GLIMMER_SAMPLES.md#hello-custom-shell) / [Contact Manager](GLIMMER_SAMPLES.md#contact-manager) / [Tic Tac Toe](GLIMMER_SAMPLES.md#tic-tac-toe)
344
+ - `color`: featured in [Hello, Custom Widget!](/docs/reference/GLIMMER_SAMPLES.md#hello-custom-widget) / [Hello, Menu Bar!](/docs/reference/GLIMMER_SAMPLES.md#hello-menu-bar)
345
+ - `font`: featured in [Hello, Checkbox Group!](/docs/reference/GLIMMER_SAMPLES.md#hello-checkbox-group) / [Hello, Checkbox!](/docs/reference/GLIMMER_SAMPLES.md#hello-checkbox) / [Hello, Table!](/docs/reference/GLIMMER_SAMPLES.md#hello-table) / [Hello, Radio Group!](/docs/reference/GLIMMER_SAMPLES.md#hello-radio-group) / [Hello, Radio!](/docs/reference/GLIMMER_SAMPLES.md#hello-radio) / [Hello, Pop Up Context Menu!](/docs/reference/GLIMMER_SAMPLES.md#hello-pop-up-context-menu) / [Hello, Menu Bar!](/docs/reference/GLIMMER_SAMPLES.md#hello-menu-bar) / [Hello, Group!](/docs/reference/GLIMMER_SAMPLES.md#hello-group) / [Hello, Date Time!](/docs/reference/GLIMMER_SAMPLES.md#hello-date-time) / [Hello, Custom Widget!](/docs/reference/GLIMMER_SAMPLES.md#hello-custom-widget) / [Hello, Custom Shell!](/docs/reference/GLIMMER_SAMPLES.md#hello-custom-shell) / [Contact Manager](/docs/reference/GLIMMER_SAMPLES.md#contact-manager) / [Tic Tac Toe](/docs/reference/GLIMMER_SAMPLES.md#tic-tac-toe)
338
346
  - `Point` class used in setting location on widgets
339
- - `swt` and `SWT` class to set SWT styles on widgets - featured in [Hello, Custom Shell!](GLIMMER_SAMPLES.md#hello-custom-shell) / [Login](GLIMMER_SAMPLES.md#login) / [Contact Manager](GLIMMER_SAMPLES.md#contact-manager)
347
+ - `swt` and `SWT` class to set SWT styles on widgets - featured in [Hello, Custom Shell!](/docs/reference/GLIMMER_SAMPLES.md#hello-custom-shell) / [Login](/docs/reference/GLIMMER_SAMPLES.md#login) / [Contact Manager](/docs/reference/GLIMMER_SAMPLES.md#contact-manager)
340
348
 
341
349
  **Data-Binding/Observers:**
342
- - `bind`: featured in [Hello, Computed!](GLIMMER_SAMPLES.md#hello-computed) / [Hello, Combo!](GLIMMER_SAMPLES.md#hello-combo) / [Hello, Checkbox Group!](GLIMMER_SAMPLES.md#hello-checkbox-group) / [Hello, Checkbox!](GLIMMER_SAMPLES.md#hello-checkbox) / [Hello, Button!](GLIMMER_SAMPLES.md#hello-button) / [Hello, Table!](GLIMMER_SAMPLES.md#hello-table) / [Hello, Radio Group!](GLIMMER_SAMPLES.md#hello-radio-group) / [Hello, Radio!](GLIMMER_SAMPLES.md#hello-radio) / [Hello, List Single Selection!](GLIMMER_SAMPLES.md#hello-list-single-selection) / [Hello, List Multi Selection!](GLIMMER_SAMPLES.md#hello-list-multi-selection) / [Hello, Group!](GLIMMER_SAMPLES.md#hello-group) / [Hello, Date Time!](GLIMMER_SAMPLES.md#hello-date-time) / [Hello, Custom Widget!](GLIMMER_SAMPLES.md#hello-custom-widget) / [Hello, Custom Shell!](GLIMMER_SAMPLES.md#hello-custom-shell) / [Login](GLIMMER_SAMPLES.md#login) / [Contact Manager](GLIMMER_SAMPLES.md#contact-manager) / [Tic Tac Toe](GLIMMER_SAMPLES.md#tic-tac-toe)
343
- - `observe`: featured in [Hello, Table!](GLIMMER_SAMPLES.md#hello-table) / [Tic Tac Toe](GLIMMER_SAMPLES.md#tic-tac-toe)
344
- - `on_widget_selected`: featured in [Hello, Combo!](GLIMMER_SAMPLES.md#hello-combo) / [Hello, Checkbox Group!](GLIMMER_SAMPLES.md#hello-checkbox-group) / [Hello, Checkbox!](GLIMMER_SAMPLES.md#hello-checkbox) / [Hello, Button!](GLIMMER_SAMPLES.md#hello-button) / [Hello, Table!](GLIMMER_SAMPLES.md#hello-table) / [Hello, Radio Group!](GLIMMER_SAMPLES.md#hello-radio-group) / [Hello, Radio!](GLIMMER_SAMPLES.md#hello-radio) / [Hello, Pop Up Context Menu!](GLIMMER_SAMPLES.md#hello-pop-up-context-menu) / [Hello, Message Box!](GLIMMER_SAMPLES.md#hello-message-box) / [Hello, Menu Bar!](GLIMMER_SAMPLES.md#hello-menu-bar) / [Hello, List Single Selection!](GLIMMER_SAMPLES.md#hello-list-single-selection) / [Hello, List Multi Selection!](GLIMMER_SAMPLES.md#hello-list-multi-selection) / [Hello, Group!](GLIMMER_SAMPLES.md#hello-group) / [Contact Manager](GLIMMER_SAMPLES.md#contact-manager) / [Login](GLIMMER_SAMPLES.md#login) / [Tic Tac Toe](GLIMMER_SAMPLES.md#tic-tac-toe)
350
+ - `bind`: featured in [Hello, Computed!](/docs/reference/GLIMMER_SAMPLES.md#hello-computed) / [Hello, Combo!](/docs/reference/GLIMMER_SAMPLES.md#hello-combo) / [Hello, Checkbox Group!](/docs/reference/GLIMMER_SAMPLES.md#hello-checkbox-group) / [Hello, Checkbox!](/docs/reference/GLIMMER_SAMPLES.md#hello-checkbox) / [Hello, Button!](/docs/reference/GLIMMER_SAMPLES.md#hello-button) / [Hello, Table!](/docs/reference/GLIMMER_SAMPLES.md#hello-table) / [Hello, Radio Group!](/docs/reference/GLIMMER_SAMPLES.md#hello-radio-group) / [Hello, Radio!](/docs/reference/GLIMMER_SAMPLES.md#hello-radio) / [Hello, List Single Selection!](/docs/reference/GLIMMER_SAMPLES.md#hello-list-single-selection) / [Hello, List Multi Selection!](/docs/reference/GLIMMER_SAMPLES.md#hello-list-multi-selection) / [Hello, Group!](/docs/reference/GLIMMER_SAMPLES.md#hello-group) / [Hello, Date Time!](/docs/reference/GLIMMER_SAMPLES.md#hello-date-time) / [Hello, Custom Widget!](/docs/reference/GLIMMER_SAMPLES.md#hello-custom-widget) / [Hello, Custom Shell!](/docs/reference/GLIMMER_SAMPLES.md#hello-custom-shell) / [Login](/docs/reference/GLIMMER_SAMPLES.md#login) / [Contact Manager](/docs/reference/GLIMMER_SAMPLES.md#contact-manager) / [Tic Tac Toe](/docs/reference/GLIMMER_SAMPLES.md#tic-tac-toe)
351
+ - `observe`: featured in [Hello, Table!](/docs/reference/GLIMMER_SAMPLES.md#hello-table) / [Tic Tac Toe](/docs/reference/GLIMMER_SAMPLES.md#tic-tac-toe)
352
+ - `on_widget_selected`: featured in [Hello, Combo!](/docs/reference/GLIMMER_SAMPLES.md#hello-combo) / [Hello, Checkbox Group!](/docs/reference/GLIMMER_SAMPLES.md#hello-checkbox-group) / [Hello, Checkbox!](/docs/reference/GLIMMER_SAMPLES.md#hello-checkbox) / [Hello, Button!](/docs/reference/GLIMMER_SAMPLES.md#hello-button) / [Hello, Table!](/docs/reference/GLIMMER_SAMPLES.md#hello-table) / [Hello, Radio Group!](/docs/reference/GLIMMER_SAMPLES.md#hello-radio-group) / [Hello, Radio!](/docs/reference/GLIMMER_SAMPLES.md#hello-radio) / [Hello, Pop Up Context Menu!](/docs/reference/GLIMMER_SAMPLES.md#hello-pop-up-context-menu) / [Hello, Message Box!](/docs/reference/GLIMMER_SAMPLES.md#hello-message-box) / [Hello, Menu Bar!](/docs/reference/GLIMMER_SAMPLES.md#hello-menu-bar) / [Hello, List Single Selection!](/docs/reference/GLIMMER_SAMPLES.md#hello-list-single-selection) / [Hello, List Multi Selection!](/docs/reference/GLIMMER_SAMPLES.md#hello-list-multi-selection) / [Hello, Group!](/docs/reference/GLIMMER_SAMPLES.md#hello-group) / [Contact Manager](/docs/reference/GLIMMER_SAMPLES.md#contact-manager) / [Login](/docs/reference/GLIMMER_SAMPLES.md#login) / [Tic Tac Toe](/docs/reference/GLIMMER_SAMPLES.md#tic-tac-toe)
345
353
  - `on_modify_text`
346
- - `on_key_pressed` (and SWT alias `on_swt_keydown`) - featured in [Login](GLIMMER_SAMPLES.md#login) / [Contact Manager](GLIMMER_SAMPLES.md#contact-manager)
354
+ - `on_key_pressed` (and SWT alias `on_swt_keydown`) - featured in [Login](/docs/reference/GLIMMER_SAMPLES.md#login) / [Contact Manager](/docs/reference/GLIMMER_SAMPLES.md#contact-manager)
347
355
  - `on_key_released` (and SWT alias `on_swt_keyup`)
348
356
  - `on_mouse_down` (and SWT alias `on_swt_mousedown`)
349
- - `on_mouse_up` (and SWT alias `on_swt_mouseup`) - featured in [Hello, Custom Shell!](GLIMMER_SAMPLES.md#hello-custom-shell) / [Contact Manager](GLIMMER_SAMPLES.md#contact-manager)
357
+ - `on_mouse_up` (and SWT alias `on_swt_mouseup`) - featured in [Hello, Custom Shell!](/docs/reference/GLIMMER_SAMPLES.md#hello-custom-shell) / [Contact Manager](/docs/reference/GLIMMER_SAMPLES.md#contact-manager)
350
358
 
351
359
  **Event loop:**
352
- - `display`: featured in [Tic Tac Toe](GLIMMER_SAMPLES.md#tic-tac-toe)
353
- - `async_exec`: featured in [Hello, Custom Widget!](GLIMMER_SAMPLES.md#hello-custom-widget) / [Hello, Custom Shell!](GLIMMER_SAMPLES.md#hello-custom-shell)
360
+ - `display`: featured in [Tic Tac Toe](/docs/reference/GLIMMER_SAMPLES.md#tic-tac-toe)
361
+ - `async_exec`: featured in [Hello, Custom Widget!](/docs/reference/GLIMMER_SAMPLES.md#hello-custom-widget) / [Hello, Custom Shell!](/docs/reference/GLIMMER_SAMPLES.md#hello-custom-shell)
354
362
  - `sync_exec`: executes a block on the event loop synchronously (usually from another thread)
355
363
  - `timer_exec`: executes a block after a delay of time has passed
356
364
  - `auto_exec`: executes a block on the event loop synchronously only when needed (when running from a thread other than GUI thread)
@@ -400,12 +408,14 @@ Example (you may copy/paste in [`girb`](GLIMMER_GIRB.md)):
400
408
  @shell = shell {
401
409
  text "Application"
402
410
  row_layout
411
+
403
412
  @label1 = label {
404
413
  text "Hello,"
405
414
  }
406
415
  }
407
416
  @shell.content {
408
417
  minimum_size 130, 130
418
+
409
419
  label {
410
420
  text "World!"
411
421
  }
@@ -448,7 +458,7 @@ Dialog is a variation on Shell. It is basically a shell that is modal (blocks wh
448
458
 
449
459
  Glimmer facilitates building dialogs by using the `dialog` keyword, which automatically adds the SWT.DIALOG_TRIM and SWT.APPLICATION_MODAL [widget styles](#widget-styles) needed for a dialog.
450
460
 
451
- Check out [Hello, Dialog!](GLIMMER_SAMPLES.md#hello-dialog) sample to learn more.
461
+ Check out [Hello, Dialog!](/docs/reference/GLIMMER_SAMPLES.md#hello-dialog) sample to learn more.
452
462
 
453
463
  ##### message_box
454
464
 
@@ -461,8 +471,10 @@ include Glimmer
461
471
 
462
472
  @shell = shell {
463
473
  text 'Hello, Message Box!'
474
+
464
475
  button {
465
476
  text 'Please Click To Win a Surprise'
477
+
466
478
  on_widget_selected do
467
479
  message_box(@shell) {
468
480
  text 'Surprise'
@@ -502,6 +514,7 @@ automatically uses the `display` created earlier without having to explicitly ho
502
514
  ```ruby
503
515
  @display = display {
504
516
  cursor_location 300, 300
517
+
505
518
  on_swt_keydown do
506
519
  # ...
507
520
  end
@@ -519,7 +532,7 @@ Although SWT Display is not technically a widget, it has similar APIs and DSL su
519
532
 
520
533
  Most of the time, you simply get away with Ruby [Threads](https://ruby-doc.org/core-2.5.7/Thread.html) and [Mutexes](https://ruby-doc.org/core-2.5.7/Mutex.html).
521
534
 
522
- Otherwise, if you need more advanced concurrency, Glimmer includes the [concurrent-ruby gem](https://rubygems.org/gems/concurrent-ruby), which supports many helpful concurrency techniques such as [Thread Pools](http://ruby-concurrency.github.io/concurrent-ruby/master/file.thread_pools.html) (used in the [Mandelbrot Fractal](GLIMMER_SAMPLES.md#mandelbrot-fractal) sample).
535
+ Otherwise, if you need more advanced concurrency, Glimmer includes the [concurrent-ruby gem](https://rubygems.org/gems/concurrent-ruby), which supports many helpful concurrency techniques such as [Thread Pools](http://ruby-concurrency.github.io/concurrent-ruby/master/file.thread_pools.html) (used in the [Mandelbrot Fractal](/docs/reference/GLIMMER_SAMPLES.md#mandelbrot-fractal) sample).
523
536
 
524
537
  One thing Glimmer DSL for SWT innovates over plain old SWT is not requiring developers to explicitly use `Display.syncExec` from threads other than the GUI threads.
525
538
  Glimmer automatically detects if you're running in a different thread and uses `Display.syncExec` automatically using its own enhanced `auto_exec`
@@ -535,21 +548,22 @@ Example (you may copy/paste in [`girb`](GLIMMER_GIRB.md)):
535
548
  ```
536
549
  @shell = shell {
537
550
  text 'Glimmer'
551
+
538
552
  @label = label {
539
553
  text 'Hello, World!'
540
554
  }
541
555
  }
542
556
 
543
- Thread.new {
544
- [:red, :dark_green, :blue].cycle { |color|
545
- async_exec {
557
+ Thread.new do
558
+ [:red, :dark_green, :blue].cycle do |color|
559
+ async_exec do
546
560
  @label.content {
547
561
  foreground color if @shell.visible?
548
562
  }
549
- }
563
+ end
550
564
  sleep(1)
551
- }
552
- }
565
+ end
566
+ end
553
567
 
554
568
  @shell.open
555
569
  ```
@@ -627,8 +641,10 @@ shell {
627
641
  }
628
642
  menu {
629
643
  text 'Open &Recent'
644
+
630
645
  menu_item {
631
646
  text 'File 1'
647
+
632
648
  on_widget_selected do
633
649
  message_box {
634
650
  text 'File 1'
@@ -636,8 +652,10 @@ shell {
636
652
  }.open
637
653
  end
638
654
  }
655
+
639
656
  menu_item {
640
657
  text 'File 2'
658
+
641
659
  on_widget_selected do
642
660
  message_box {
643
661
  text 'File 2'
@@ -646,7 +664,9 @@ shell {
646
664
  end
647
665
  }
648
666
  }
667
+
649
668
  menu_item(:separator)
669
+
650
670
  menu_item {
651
671
  text 'E&xit'
652
672
 
@@ -657,19 +677,23 @@ shell {
657
677
  }
658
678
  menu {
659
679
  text '&Edit'
680
+
660
681
  menu_item {
661
682
  text 'Cut'
662
683
  accelerator :command, :X
663
684
  }
685
+
664
686
  menu_item {
665
687
  text 'Copy'
666
688
  accelerator :command, :C
667
689
  }
690
+
668
691
  menu_item {
669
692
  text 'Paste'
670
693
  accelerator :command, :V
671
694
  }
672
695
  }
696
+
673
697
  menu {
674
698
  text '&Options'
675
699
 
@@ -681,6 +705,7 @@ shell {
681
705
  @select_multiple_menu.enabled = true
682
706
  end
683
707
  }
708
+
684
709
  @select_one_menu = menu {
685
710
  text '&Select One'
686
711
  enabled false
@@ -688,13 +713,16 @@ shell {
688
713
  menu_item(:radio) {
689
714
  text 'Option 1'
690
715
  }
716
+
691
717
  menu_item(:radio) {
692
718
  text 'Option 2'
693
719
  }
720
+
694
721
  menu_item(:radio) {
695
722
  text 'Option 3'
696
723
  }
697
724
  }
725
+
698
726
  @select_multiple_menu = menu {
699
727
  text '&Select Multiple'
700
728
  enabled false
@@ -702,18 +730,23 @@ shell {
702
730
  menu_item(:check) {
703
731
  text 'Option 4'
704
732
  }
733
+
705
734
  menu_item(:check) {
706
735
  text 'Option 5'
707
736
  }
737
+
708
738
  menu_item(:check) {
709
739
  text 'Option 6'
710
740
  }
711
741
  }
712
742
  }
743
+
713
744
  menu {
714
745
  text '&Format'
746
+
715
747
  menu {
716
748
  text '&Background Color'
749
+
717
750
  COLORS.each { |color_style|
718
751
  menu_item(:radio) {
719
752
  text color_style.to_s.split('_').map(&:capitalize).join(' ')
@@ -724,8 +757,10 @@ shell {
724
757
  }
725
758
  }
726
759
  }
760
+
727
761
  menu {
728
762
  text 'Foreground &Color'
763
+
729
764
  COLORS.each { |color_style|
730
765
  menu_item(:radio) {
731
766
  text color_style.to_s.split('_').map(&:capitalize).join(' ')
@@ -737,8 +772,10 @@ shell {
737
772
  }
738
773
  }
739
774
  }
775
+
740
776
  menu {
741
777
  text '&View'
778
+
742
779
  menu_item(:radio) {
743
780
  text 'Small'
744
781
 
@@ -747,6 +784,7 @@ shell {
747
784
  @label.parent.pack
748
785
  end
749
786
  }
787
+
750
788
  menu_item(:radio) {
751
789
  text 'Medium'
752
790
  selection true
@@ -756,6 +794,7 @@ shell {
756
794
  @label.parent.pack
757
795
  end
758
796
  }
797
+
759
798
  menu_item(:radio) {
760
799
  text 'Large'
761
800
 
@@ -765,8 +804,10 @@ shell {
765
804
  end
766
805
  }
767
806
  }
807
+
768
808
  menu {
769
809
  text '&Help'
810
+
770
811
  menu_item {
771
812
  text '&Manual'
772
813
  accelerator :command, :shift, :M
@@ -778,6 +819,7 @@ shell {
778
819
  }.open
779
820
  end
780
821
  }
822
+
781
823
  menu_item {
782
824
  text '&Tutorial'
783
825
  accelerator :command, :shift, :T
@@ -789,7 +831,9 @@ shell {
789
831
  }.open
790
832
  end
791
833
  }
834
+
792
835
  menu_item(:separator)
836
+
793
837
  menu_item {
794
838
  text '&Report an Issue...'
795
839
 
@@ -825,10 +869,13 @@ shell {
825
869
  menu {
826
870
  menu {
827
871
  text '&History'
872
+
828
873
  menu {
829
874
  text '&Recent'
875
+
830
876
  menu_item {
831
877
  text 'File 1'
878
+
832
879
  on_widget_selected do
833
880
  message_box {
834
881
  text 'File 1'
@@ -836,8 +883,10 @@ shell {
836
883
  }.open
837
884
  end
838
885
  }
886
+
839
887
  menu_item {
840
888
  text 'File 2'
889
+
841
890
  on_widget_selected do
842
891
  message_box {
843
892
  text 'File 2'
@@ -846,10 +895,13 @@ shell {
846
895
  end
847
896
  }
848
897
  }
898
+
849
899
  menu {
850
900
  text '&Archived'
901
+
851
902
  menu_item {
852
903
  text 'File 3'
904
+
853
905
  on_widget_selected do
854
906
  message_box {
855
907
  text 'File 3'
@@ -857,8 +909,10 @@ shell {
857
909
  }.open
858
910
  end
859
911
  }
912
+
860
913
  menu_item {
861
914
  text 'File 4'
915
+
862
916
  on_widget_selected do
863
917
  message_box {
864
918
  text 'File 4'
@@ -1006,7 +1060,7 @@ shell {
1006
1060
  }.open
1007
1061
  ```
1008
1062
 
1009
- You may check out a more full-fledged example in [Hello, Sash Form!](GLIMMER_SAMPLES.md#hello-sash-form)
1063
+ You may check out a more full-fledged example in [Hello, Sash Form!](/docs/reference/GLIMMER_SAMPLES.md#hello-sash-form)
1010
1064
 
1011
1065
  ![Hello Sash Form](/images/glimmer-hello-sash-form.png)
1012
1066
 
@@ -1321,12 +1375,16 @@ This sets the shell `cursor` to that of `SWT::CURSOR_APPSTARTING`
1321
1375
 
1322
1376
  ### Layouts
1323
1377
 
1324
- Glimmer lays widgets out visually using SWT layouts, which can only be set on composite widget and subclasses.
1378
+ Glimmer lays widgets out visually using SWT layouts, configurable with many options (e.g. whether widgets are responsive to window sizing), which can only be set on composite widget and subclasses.
1325
1379
 
1326
1380
  The most common SWT layouts are:
1327
- - `FillLayout`: lays widgets out in equal proportion horizontally or vertically with spacing/margin options. This is the ***default*** layout for ***shell*** (with `:horizontal` option) in Glimmer.
1328
- - `RowLayout`: lays widgets out horizontally or vertically in varying proportions with advanced spacing/margin/justify options
1329
- - `GridLayout`: lays widgets out in a grid with advanced spacing/margin/alignment/indentation options. This is the **default** layout for **composite** in Glimmer. It is important to master.
1381
+ - [`fill_layout`](https://help.eclipse.org/latest/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/swt/layout/FillLayout.html): lays widgets out in equal proportion horizontally or vertically with spacing/margin options. This is the ***default*** layout for ***shell*** (with `:horizontal` option) in Glimmer.
1382
+ - [`row_layout`](https://help.eclipse.org/latest/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/swt/layout/RowLayout.html): lays widgets out horizontally or vertically in varying proportions with advanced spacing/margin/justify options
1383
+ - [`grid_layout`](https://help.eclipse.org/latest/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/swt/layout/GridLayout.html): lays widgets out in a grid with advanced spacing/margin/alignment/indentation options. This is the **default** layout for **composite** in Glimmer. It is important to master.
1384
+
1385
+ Note that if you need to have widgets fill a `row_layout` and resize automatically upon window resize, you must nest `fill true` within. This is the automatic behavior of `fill_layout`. For `grid_layout`, you would have to add `layout_data :fill, :center, true, false` to a child that you want to fill all available space horizontally (whether initially or after window resize) and `layout_data :fill, :fill, true, true` if you want to fill all available space horizontally and vertically.
1386
+
1387
+ Do not be alarmed if widget sizes were kept fixed on resize of a window or change of text data. This is normal behavior that can always be overridden with options, such as `fill true` mentioned above. You need to [learn more about each layout](https://help.eclipse.org/latest/index.jsp?topic=/org.eclipse.platform.doc.isv/reference/api/org/eclipse/swt/layout/package-summary.html) before you have mastered them enough for your needs. [Samples](/docs/reference/GLIMMER_SAMPLES.md) like [Hello, Layout!](/docs/reference/GLIMMER_SAMPLES.md#hello-layout) are greatly helpful in learning too.
1330
1388
 
1331
1389
  In Glimmer DSL, just like widgets, layouts can be specified with lowercase underscored names followed by a block containing properties, also lowercase underscored names (e.g. `RowLayout` is `row_layout`).
1332
1390
 
@@ -1483,6 +1541,23 @@ composite {
1483
1541
  # ...
1484
1542
  ```
1485
1543
 
1544
+ ```ruby
1545
+ # ...
1546
+ composite {
1547
+ grid_layout 3, false # grid layout with 3 columns not of equal width
1548
+ label {
1549
+ # layout data with explicit setting of properties instead of relying on arguments
1550
+ layout_data {
1551
+ horizontal_alignment :fill # could be :beginning, :center or :end too
1552
+ vertical_alignment :center # could be :beginning, :fill, or :end too
1553
+ grab_excess_horizontal_space true
1554
+ grab_excess_vertical_space false
1555
+ }
1556
+ }
1557
+ }
1558
+ # ...
1559
+ ```
1560
+
1486
1561
  ```ruby
1487
1562
  # ...
1488
1563
  composite {
@@ -1600,7 +1675,7 @@ Screenshot:
1600
1675
 
1601
1676
  If you specify the x and y coordinates as `:default`, `nil`, or leave them out, they get calculated automatically by centering the shape within its parent `canvas`.
1602
1677
 
1603
- If you specify the `width` and `height` parameters as `:max`, they get calculated from the parent's size, filling the parent maximally.
1678
+ If you specify the `width` and `height` parameters as `:max`, they get calculated from the parent's size, filling the parent maximally (and they are auto-calculated on parent resize).
1604
1679
 
1605
1680
  Note that you could shift a shape off its centered position within its parent `canvas` by setting `x` to `[:default, x_delta]` and `y` to `[:default, y_delta]`
1606
1681
 
@@ -1708,7 +1783,7 @@ shell {
1708
1783
  }.open
1709
1784
  ```
1710
1785
 
1711
- Learn more at the [Hello, Canvas! Sample](GLIMMER_SAMPLES.md#hello-canvas).
1786
+ Learn more at the [Hello, Canvas! Sample](/docs/reference/GLIMMER_SAMPLES.md#hello-canvas).
1712
1787
 
1713
1788
  If you ever have special needs or optimizations, you could always default to direct SWT painting via [org.eclipse.swt.graphics.GC](https://help.eclipse.org/2020-12/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/swt/graphics/GC.html) instead. Learn more at the [SWT Graphics Guide](https://www.eclipse.org/articles/Article-SWT-graphics/SWT_graphics.html) and [SWT Image Guide](https://www.eclipse.org/articles/Article-SWT-images/graphics-resources.html#Saving%20Images).
1714
1789
 
@@ -1759,15 +1834,15 @@ Shapes can be nested within each other. If you nest a shape within another, its
1759
1834
 
1760
1835
  As such, if you move the parent, it moves all its children with it.
1761
1836
 
1762
- If you specify the `x` and `y` coordinates as `:default`, `nil`, or leave them out, they get calculated automatically by centering the shape within its parent shape relatively.
1837
+ If you specify the `x` and `y` coordinates as `:default`, `nil`, or leave them out, they get calculated automatically by centering the shape within its parent shape relatively (and auto-recalculated on parent resize).
1763
1838
 
1764
1839
  If you specify the `width` and `height` parameters as `:default`, `nil`, or leave them out, they get calculated automatically from the shape's nested children shapes if any (e.g calculating the dimensions of a text from its extent according to its font size) or from the parent's size otherwise.
1765
1840
 
1766
- If you specify the `width` and `height` parameters as `:max`, they get calculated from the parent's size, filling the parent maximally.
1841
+ If you specify the `width` and `height` parameters as `:max`, they get calculated from the parent's size, filling the parent maximally (and auto-recalculated on parent resize).
1767
1842
 
1768
1843
  Note that you could shift a shape off its centered position within its parent shape by setting `x` to `[:default, x_delta]` and `y` to `[:default, y_delta]`
1769
1844
 
1770
- Check [Hello, Canvas!](GLIMMER_SAMPLES.md#hello-canvas) for an example that nests lines, points, a polyline, and an image within a drawn rectangle parent:
1845
+ Check [Hello, Canvas!](/docs/reference/GLIMMER_SAMPLES.md#hello-canvas) for an example that nests lines, points, a polyline, and an image within a drawn rectangle parent:
1771
1846
 
1772
1847
  ```ruby
1773
1848
  rectangle(205, 50, 88, 96) {
@@ -1789,7 +1864,7 @@ Check [Hello, Canvas!](GLIMMER_SAMPLES.md#hello-canvas) for an example that nest
1789
1864
 
1790
1865
  #### Shapes inside a Widget
1791
1866
 
1792
- Keep in mind that the Shape DSL can be used inside any widget, not just `canvas`. Unlike shapes on a `canvas`, which are standalone graphics, when included in a widget, which already has its own look and feel, shapes are used as a decorative add-on that complements its look by getting painted on top of it. For example, shapes were used to decorate `composite` blocks in the [Tetris](GLIMMER_SAMPLES.md#tetris) sample to have a more bevel look. In summary, Shapes can be used in a hybrid approach (shapes inside a widget), not just standalone in a `canvas`.
1867
+ Keep in mind that the Shape DSL can be used inside any widget, not just `canvas`. Unlike shapes on a `canvas`, which are standalone graphics, when included in a widget, which already has its own look and feel, shapes are used as a decorative add-on that complements its look by getting painted on top of it. For example, shapes were used to decorate `composite` blocks in the [Tetris](/docs/reference/GLIMMER_SAMPLES.md#tetris) sample to have a more bevel look. In summary, Shapes can be used in a hybrid approach (shapes inside a widget), not just standalone in a `canvas`.
1793
1868
 
1794
1869
  #### Shapes inside an Image
1795
1870
 
@@ -1939,7 +2014,7 @@ They are implemented with the help of the highly robust Java built-in shape geom
1939
2014
  - `Shape#x_end` : right-most included x coordinate
1940
2015
  - `Shape#y_end` : bottom-most included y coordinate
1941
2016
 
1942
- Check [Hello, Canvas!](GLIMMER_SAMPLES.md#hello-canvas) for an example.
2017
+ Check [Hello, Canvas!](/docs/reference/GLIMMER_SAMPLES.md#hello-canvas) for an example.
1943
2018
 
1944
2019
 
1945
2020
  #### Pixel Graphics
@@ -2157,7 +2232,7 @@ shell {
2157
2232
 
2158
2233
  ![Canvas Path Example](/images/glimmer-example-canvas-path.png)
2159
2234
 
2160
- Learn more at the [Hello, Canvas Path!](GLIMMER_SAMPLES.md#hello-canvas-path) and [Stock Ticker](GLIMMER_SAMPLES.md#stock-ticker) samples.
2235
+ Learn more at the [Hello, Canvas Path!](/docs/reference/GLIMMER_SAMPLES.md#hello-canvas-path) and [Stock Ticker](/docs/reference/GLIMMER_SAMPLES.md#stock-ticker) samples.
2161
2236
 
2162
2237
  ![Stock Ticker](/images/glimmer-stock-ticker.gif)
2163
2238
 
@@ -2252,7 +2327,7 @@ transform(1, 1, 4, 2, 2, 4).
2252
2327
  translate(3, 7)
2253
2328
  ```
2254
2329
 
2255
- Learn more at the [Hello, Canvas Transform! Sample](GLIMMER_SAMPLES.md#hello-canvas-transform).
2330
+ Learn more at the [Hello, Canvas Transform! Sample](/docs/reference/GLIMMER_SAMPLES.md#hello-canvas-transform).
2256
2331
 
2257
2332
  ### Canvas Animation DSL
2258
2333
 
@@ -2321,7 +2396,7 @@ API of Animation Object (returned from `animation` keyword):
2321
2396
  - `#cycle_limited?` returns true if `cycle_count` is specified
2322
2397
  - `#duration_limited?` returns true if `duration_limit` is specified
2323
2398
 
2324
- Learn more at the [Hello, Canvas Animation!](GLIMMER_SAMPLES.md#hello-canvas-animation) and [Hello, Canvas Animation Data Binding!](GLIMMER_SAMPLES.md#hello-canvas-animation-data-binding) samples.
2399
+ Learn more at the [Hello, Canvas Animation!](/docs/reference/GLIMMER_SAMPLES.md#hello-canvas-animation) and [Hello, Canvas Animation Data Binding!](/docs/reference/GLIMMER_SAMPLES.md#hello-canvas-animation-data-binding) samples.
2325
2400
 
2326
2401
  If there is anything missing you would like added to the Glimmer Animation DSL that you saw available in the SWT APIs, you may [report an issue](https://github.com/AndyObtiva/glimmer-dsl-swt/issues) or implement yourself and [contribute](#contributing) via a Pull Request.
2327
2402
 
@@ -2329,7 +2404,7 @@ If there is anything missing you would like added to the Glimmer Animation DSL t
2329
2404
 
2330
2405
  Animation could be alternatively implemented without the `animation` keyword through a loop that invokes model methods inside `sync_exec {}` (or `async_exec {}`), which indirectly cause updates to the GUI via data-binding.
2331
2406
 
2332
- The [Glimmer Tetris](GLIMMER_SAMPLES.md#tetris) sample provides a good example of that.
2407
+ The [Glimmer Tetris](/docs/reference/GLIMMER_SAMPLES.md#tetris) sample provides a good example of that.
2333
2408
 
2334
2409
  ### Data-Binding
2335
2410
 
@@ -2714,7 +2789,7 @@ shell {
2714
2789
  }
2715
2790
  ```
2716
2791
 
2717
- Check out [Hello, Table!](GLIMMER_SAMPLES.md#hello-table) for an actual example including table editors.
2792
+ Check out [Hello, Table!](/docs/reference/GLIMMER_SAMPLES.md#hello-table) for an actual example including table editors.
2718
2793
 
2719
2794
  [Are We There Yet?](#are-we-there-yet) is an actual production Glimmer application that takes full advantage of table capabilities, storing model data in a database via ActiveRecord. As such, it's an excellent demonstration of how to use Glimmer DSL for SWT with a database.
2720
2795
 
@@ -2722,7 +2797,7 @@ Check out [Hello, Table!](GLIMMER_SAMPLES.md#hello-table) for an actual example
2722
2797
 
2723
2798
  Glimmer automatically adds sorting support to the SWT `Table` widget.
2724
2799
 
2725
- Check out the [Contact Manager](GLIMMER_SAMPLES.md#contact-manager) sample for an example.
2800
+ Check out the [Contact Manager](/docs/reference/GLIMMER_SAMPLES.md#contact-manager) sample for an example.
2726
2801
  You may click on any column and it will sort by ascending order first and descending if you click again.
2727
2802
 
2728
2803
  Glimmer automatic table sorting supports `String`, `Integer`, and `Float` columns out of the box as well as any column data that is comparable.
@@ -2821,7 +2896,7 @@ This finds the root node. The array is a Java array. This enables easy passing o
2821
2896
  To edit a tree, you must invoke `TreeProxy#edit_selected_tree_item` or `TreeProxy#edit_tree_item`. This automatically leverages the SWT TreeEditor custom class behind the scenes, displaying
2822
2897
  a text widget to the user to change the selected or passed tree item text into something else. It automatically persists the change to `items` data-bound model on ENTER/FOCUS-OUT or cancels on ESC/NO-CHANGE.
2823
2898
 
2824
- Learn more at the [Hello, Tree!](GLIMMER_SAMPLES.md#hello-tree) and [Gladiator](GLIMMER_SAMPLES.md#gladiator) samples.
2899
+ Learn more at the [Hello, Tree!](/docs/reference/GLIMMER_SAMPLES.md#hello-tree) and [Gladiator](/docs/reference/GLIMMER_SAMPLES.md#gladiator) samples.
2825
2900
 
2826
2901
  #### DateTime
2827
2902
 
@@ -2844,7 +2919,7 @@ You can data-bind any of these properties:
2844
2919
  - `minutes bind(model, :property)`: produces an integer
2845
2920
  - `seconds bind(model, :property)`: produces an integer
2846
2921
 
2847
- Learn more at the [Hello, Date Time!](GLIMMER_SAMPLES.md#hello-date-time) sample.
2922
+ Learn more at the [Hello, Date Time!](/docs/reference/GLIMMER_SAMPLES.md#hello-date-time) sample.
2848
2923
 
2849
2924
  If you need a better widget with the ability to customize the date format pattern, check out the [Nebula CDateTime Glimmer Custom Widget](https://github.com/AndyObtiva/glimmer-cw-cdatetime-nebula)
2850
2925
 
@@ -3230,7 +3305,7 @@ The `checkboxes` property returns the list of nested `checkbox` widgets.
3230
3305
 
3231
3306
  When data-binding `selection`, the model property should have a matching property with `_options` suffix (e.g. `activities_options` for `activities`) to provide an `Array` of `String` objects for `checkbox` buttons.
3232
3307
 
3233
- You may see an example at the [Hello, Checkbox Group!](GLIMMER_SAMPLES.md#hello-checkbox-group) sample.
3308
+ You may see an example at the [Hello, Checkbox Group!](/docs/reference/GLIMMER_SAMPLES.md#hello-checkbox-group) sample.
3234
3309
 
3235
3310
  ![Hello Checkbox Group](/images/glimmer-hello-checkbox-group.png)
3236
3311
 
@@ -3265,7 +3340,7 @@ radio_group { |radio_group_proxy|
3265
3340
  # ...
3266
3341
  ```
3267
3342
 
3268
- You may see another example at the [Hello, Radio Group!](GLIMMER_SAMPLES.md#hello-radio-group) sample.
3343
+ You may see another example at the [Hello, Radio Group!](/docs/reference/GLIMMER_SAMPLES.md#hello-radio-group) sample.
3269
3344
 
3270
3345
  ##### Code Text Custom Widget
3271
3346
 
@@ -3529,7 +3604,7 @@ This adds some default keyboard shortcuts:
3529
3604
 
3530
3605
  If you prefer it to be vanilla with no default key event listeners, then pass the `default_behavior: false` option.
3531
3606
 
3532
- Learn more at [Hello, Code Text!](GLIMMER_SAMPLES.md#hello-code-text)
3607
+ Learn more at [Hello, Code Text!](/docs/reference/GLIMMER_SAMPLES.md#hello-code-text)
3533
3608
 
3534
3609
  ##### Video Custom Custom Widget
3535
3610
 
@@ -3544,7 +3619,7 @@ Simply install the [glimmer-cw-video](https://rubygems.org/gems/glimmer-cw-video
3544
3619
  This [Eclipse guide](https://www.eclipse.org/articles/Article-Writing%20Your%20Own%20Widget/Writing%20Your%20Own%20Widget.htm) for how to write custom SWT widgets is also applicable to Glimmer Custom Widgets written in Ruby. I recommend reading it:
3545
3620
  [https://www.eclipse.org/articles/Article-Writing%20Your%20Own%20Widget/Writing%20Your%20Own%20Widget.htm](https://www.eclipse.org/articles/Article-Writing%20Your%20Own%20Widget/Writing%20Your%20Own%20Widget.htm)
3546
3621
 
3547
- Also, you may check out [Hello, Custom Widget!](GLIMMER_SAMPLES.md#hello-custom-widget) for another example.
3622
+ Also, you may check out [Hello, Custom Widget!](/docs/reference/GLIMMER_SAMPLES.md#hello-custom-widget) for another example.
3548
3623
 
3549
3624
  ### Custom Shells
3550
3625
 
@@ -3615,7 +3690,7 @@ shell { |app_shell|
3615
3690
 
3616
3691
  If you use a Custom Shell as the top-level app shell, you may invoke the class method `.launch` instead to avoid building an app class yourself or including Glimmer into the top-level namespace (e.g. `Tetris.launch` instead of `include Glimmer; tetris.open`)
3617
3692
 
3618
- You may check out [Hello, Custom Shell!](GLIMMER_SAMPLES.md#hello-custom-shell) for another example.
3693
+ You may check out [Hello, Custom Shell!](/docs/reference/GLIMMER_SAMPLES.md#hello-custom-shell) for another example.
3619
3694
 
3620
3695
  ### Drag and Drop
3621
3696
 
@@ -3641,7 +3716,7 @@ As a second option, you may customize the data being transferred through drag an
3641
3716
  3. On the drop target widget, add `on_drop` [DropTargetListener](https://help.eclipse.org/2020-03/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/swt/dnd/DropTargetListener.html) event handler block at minimum (you may also add `on_drag_enter` [must set [`event.detail`](https://help.eclipse.org/2020-06/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/swt/dnd/DropTargetEvent.html#detail) if added], `on_drag_over`, `on_drag_leave`, `on_drag_operation_changed` and `on_drop_accept` if needed)
3642
3717
  4. Read `event.data` and consume it (e.g. change widget text) inside the `on_drop` event handler block.
3643
3718
 
3644
- Example (taken from [samples/hello/hello_drag_and_drop.rb](GLIMMER_SAMPLES.md#hello-drag-and-drop) / you may copy/paste in [`girb`](GLIMMER_GIRB.md)):
3719
+ Example (taken from [samples/hello/hello_drag_and_drop.rb](/docs/reference/GLIMMER_SAMPLES.md#hello-drag-and-drop) / you may copy/paste in [`girb`](GLIMMER_GIRB.md)):
3645
3720
 
3646
3721
  ```ruby
3647
3722
  class Location
@@ -5,6 +5,7 @@
5
5
  - [Hello, Label!](#hello-label)
6
6
  - [Hello, Text!](#hello-text)
7
7
  - [Hello, Composite!](#hello-composite)
8
+ - [Hello, Scrolled Composite!](#hello-scrolled-composite)
8
9
  - [Hello, Layout!](#hello-layout)
9
10
  - [Hello, Shell!](#hello-shell)
10
11
  - [Hello, Tab!](#hello-tab)
@@ -178,6 +179,18 @@ Code:
178
179
 
179
180
  ![Hello Composite](/images/glimmer-hello-composite.png)
180
181
 
182
+ #### Hello, Scrolled Composite!
183
+
184
+ This sample demonstrates the `scrolled_composite` widget, which is used to add scrollbars around content that exceeds the size of the window.
185
+
186
+ Code:
187
+
188
+ [samples/hello/hello_scrolled_composite.rb](/samples/hello/hello_scrolled_composite.rb)
189
+
190
+ ![Hello Scrolled Composite](/images/glimmer-hello-scrolled-composite.png)
191
+
192
+ ![Hello Scrolled Composite](/images/glimmer-hello-scrolled-composite-scrolled.png)
193
+
181
194
  #### Hello, Layout!
182
195
 
183
196
  This sample demonstrates the standard 3 layouts in SWT (though one can write their own for very advanced applications): `fill_layout`, `row_layout`, and `grid_layout`
Binary file
@@ -33,7 +33,7 @@ module Glimmer
33
33
  # of a ModelBinding, which is then connected to an anonymous widget observer
34
34
  # (aka widget_data_binder as per widget_data_binders array)
35
35
  #
36
- # Depends on BindCommandHandler
36
+ # Depends on BindExpression
37
37
  class DataBindingExpression < Expression
38
38
  def can_interpret?(parent, keyword, *args, &block)
39
39
  args.size == 1 and
@@ -110,6 +110,7 @@ module Glimmer
110
110
 
111
111
  def deregister_shape_painting
112
112
  @paint_listener_proxy&.deregister
113
+ @resize_listener_proxy&.deregister
113
114
  end
114
115
 
115
116
  def setup_shape_painting
@@ -143,6 +144,7 @@ module Glimmer
143
144
  shape_painter.call(self) # treat self as paint event since image has its own gc and doesn't do repaints (it's a one time deal for now though could be adjusted in the future.)
144
145
  else
145
146
  @paint_listener_proxy = on_swt_paint(&shape_painter)
147
+ @resize_listener_proxy = on_swt_Resize { shapes.each(&:calculated_args_changed!) }
146
148
  end
147
149
  else
148
150
  redraw if respond_to?(:redraw) && @finished_add_content && !is_disposed
@@ -76,8 +76,8 @@ shell {
76
76
 
77
77
  list {
78
78
  # Option 1: Automatic Drop Data Consumption
79
- # drop_target :unique # does not add same data twice
80
79
  drop_target true
80
+ # drop_target :unique # setting drop_target to :unique makes the list not add the same data twice
81
81
 
82
82
  # Option 2: Manual Drop Data Consumption
83
83
  # on_drop do |event|
@@ -91,6 +91,7 @@ shell {
91
91
  # transfer :text # options: :text, :file, :rtf
92
92
  #
93
93
  # on_drag_enter do |event|
94
+ # ### event.detail = DND::DROP_NONE # To reject a drop, you can set event.detail to DND::DROP_NONE
94
95
  # drop_widget = event.widget.control.data('proxy') # obtain Glimmer widget proxy since it permits nicer syntax for setting background via symbol
95
96
  # drop_widget.background = :red
96
97
  # end
@@ -195,7 +196,7 @@ shell {
195
196
  }
196
197
 
197
198
  label {
198
- text 'Drop To Insert'
199
+ text 'Drop To Replace'
199
200
  }
200
201
 
201
202
  spinner {
@@ -209,5 +210,40 @@ shell {
209
210
  drop_target true
210
211
  }
211
212
  }
213
+ tab_item {
214
+ fill_layout
215
+ text 'File'
216
+
217
+ @drop_zone_label = label(:center, :wrap) {
218
+ text 'Drop One File Or More Here'
219
+ background :white
220
+
221
+ rectangle {
222
+ foreground :black
223
+ line_width 4
224
+ line_style :dash
225
+ }
226
+
227
+ drop_target(:drop_copy) {
228
+ transfer :file
229
+
230
+ on_drag_enter do |event|
231
+ drop_widget = event.widget.control.data('proxy') # obtain Glimmer widget proxy since it permits nicer syntax for setting background via symbol
232
+ drop_widget.background = :yellow
233
+ end
234
+
235
+ on_drag_leave do |event|
236
+ drop_widget = event.widget.control.data('proxy') # obtain Glimmer widget proxy since it permits nicer syntax for setting background via symbol
237
+ drop_widget.background = :white
238
+ end
239
+
240
+ on_drop do |event|
241
+ drop_widget = event.widget.control.data('proxy') # obtain Glimmer widget proxy since it permits nicer syntax for setting background/cursor via symbol
242
+ drop_widget.background = :white
243
+ @drop_zone_label.text = event.data.to_a.join("\n")
244
+ end
245
+ }
246
+ }
247
+ }
212
248
  }
213
249
  }.open
@@ -0,0 +1,95 @@
1
+ # Copyright (c) 2007-2021 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-dsl-swt'
23
+
24
+ include Glimmer
25
+
26
+ shell {
27
+ grid_layout {
28
+ margin_width 0
29
+ margin_height 0
30
+ }
31
+
32
+ text 'Hello, Scrolled Composite!'
33
+ maximum_size 400, 400
34
+
35
+ composite {
36
+ layout_data {
37
+ horizontal_alignment :center
38
+ }
39
+
40
+ row_layout
41
+
42
+ button {
43
+ text '<<'
44
+
45
+ on_widget_selected do
46
+ @scrolled_composite.set_origin(0, @scrolled_composite.origin.y)
47
+ end
48
+ }
49
+
50
+ button {
51
+ text '>>'
52
+
53
+ on_widget_selected do
54
+ @scrolled_composite.set_origin(@inner_composite.size.x, @scrolled_composite.origin.y)
55
+ end
56
+ }
57
+
58
+ button {
59
+ text '^^'
60
+
61
+ on_widget_selected do
62
+ @scrolled_composite.set_origin(@scrolled_composite.origin.x, 0)
63
+ end
64
+ }
65
+
66
+ button {
67
+ text 'vv'
68
+
69
+ on_widget_selected do
70
+ @scrolled_composite.set_origin(@scrolled_composite.origin.x, @inner_composite.size.y)
71
+ end
72
+ }
73
+ }
74
+
75
+ @scrolled_composite = scrolled_composite {
76
+ layout_data :fill, :fill, true, true
77
+
78
+ @inner_composite = composite {
79
+ row_layout(:vertical)
80
+
81
+ background :white
82
+
83
+ 50.times do |n|
84
+ label {
85
+ layout_data {
86
+ height 20
87
+ }
88
+
89
+ text "Line #{n+1} has a lot of gibberish in it. In fact, it has so much gibberish that it does not fit the window horizontally, so scrollbars must be used to see all the text."
90
+ background :white
91
+ }
92
+ end
93
+ }
94
+ }
95
+ }.open
@@ -25,6 +25,7 @@ include Glimmer
25
25
 
26
26
  shell {
27
27
  text 'Glimmer'
28
+
28
29
  label {
29
30
  text 'Hello, World!'
30
31
  }
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: 4.21.2.1
4
+ version: 4.21.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andy Maleh
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-11-19 00:00:00.000000000 Z
11
+ date: 2021-12-03 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: 2.4.0
18
+ version: 2.5.1
19
19
  name: glimmer
20
20
  prerelease: false
21
21
  type: :runtime
@@ -23,7 +23,7 @@ dependencies:
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 2.4.0
26
+ version: 2.5.1
27
27
  - !ruby/object:Gem::Dependency
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
@@ -667,6 +667,7 @@ files:
667
667
  - samples/hello/hello_radio_group.rb
668
668
  - samples/hello/hello_sash_form.rb
669
669
  - samples/hello/hello_scale.rb
670
+ - samples/hello/hello_scrolled_composite.rb
670
671
  - samples/hello/hello_shape.rb
671
672
  - samples/hello/hello_shell.rb
672
673
  - samples/hello/hello_slider.rb
@@ -709,7 +710,7 @@ post_install_message:
709
710
 
710
711
  You are ready to use `glimmer` and `girb` commands on Windows and Linux.
711
712
 
712
- On the Mac, run `glimmer-setup` command to complete setup of Glimmer DSL for SWT, making `glimmer` and `girb` commands ready for use:
713
+ On the Mac, run `glimmer-setup` command to complete setup of Glimmer DSL for SWT (it will configure a Mac required jruby option globally `-J-XstartOnFirstThread` so that you do not have to add manually), making `glimmer` and `girb` commands ready for use:
713
714
 
714
715
  glimmer-setup
715
716