<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-33434069</id><updated>2012-05-29T02:05:54.150+02:00</updated><category term='eclipse'/><category term='xtend'/><category term='swt'/><title type='text'>Moritz' Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.moritz.eysholdt.de/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33434069/posts/default/-/eclipse'/><link rel='alternate' type='text/html' href='http://blog.moritz.eysholdt.de/search/label/eclipse'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Moritz Eysholdt</name><uri>http://www.blogger.com/profile/09696008168578996501</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/-t65BciSbhRQ/TunFVnA3S5I/AAAAAAAAAC4/9pcY_xfz6fI/s220/me3.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>1</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-33434069.post-5643028947172257862</id><published>2011-12-22T19:05:00.002+01:00</published><updated>2011-12-24T01:00:27.260+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='xtend'/><category scheme='http://www.blogger.com/atom/ns#' term='swt'/><title type='text'></title><content type='html'>&lt;h1&gt;Building SWT User Interfaces with Xtend&lt;/h1&gt;  &lt;p&gt;  &lt;i&gt;&lt;a href="http://xtend-lang.org/"&gt;Xtend&lt;/a&gt; is a programming    language that compiles to Java, but &lt;a href="http://xtend-lang.org/"&gt;adds new features&lt;/a&gt;, such as closures. This article    applies Xtend to implement &lt;a href="http://eclipse.org/swt/"&gt;SWT&lt;/a&gt;   UIs and shows how the resulting code can be more readable and concise    compared to Java. &lt;/i&gt; &lt;/p&gt;  &lt;p&gt;  When you’ve been programming desktop applications with Eclipse before,   you probably have used the &lt;a href="http://eclipse.org/swt/"&gt;Standard    Widget Toolkit (SWT)&lt;/a&gt;, since it provides the fundamental UI elements   (aka Widgets), such as windows, buttons, edit fields, checkboxes, etc.  &lt;/p&gt;  &lt;p&gt;The first thing you probably did was to create a window with   several nicely arranged widgets. This task includes choosing the   proper parent widget for all widgets, configuring layouts, etc. Then,   the next step usually is to implement behavior for some widgets, so   that the user can interact with the UI. This includes for example   implementing selection listeners for buttons.&lt;/p&gt;   &lt;p&gt;These two tasks have different characteristics:&lt;/p&gt;  &lt;ul&gt;  &lt;li&gt;To arrange widgets nicely, the developer's code needs to    creates trees of objects. In such trees, windows are the root nodes,    composites etc. the intermediate nodes and buttons, text fields, etc.    are the leaf nodes. In the context of the web and HTML, an equivalent    tree is the &lt;a    href="http://en.wikipedia.org/wiki/Document_object_model"&gt;DOM     (Document Object Model)&lt;/a&gt;. For SWT, this tree becomes very visible in    the XML-based approaches to specify UIs, such as &lt;a    href="http://cookxml.yuanheng.org/cookswt/"&gt;CookSwt&lt;/a&gt; and &lt;a    href="http://code.google.com/p/swtxml/"&gt;swtxml&lt;/a&gt;.   &lt;/li&gt;  &lt;li&gt;To implement behavior, the developer usually creates    anonymous or nested classes in Java. These classes implement event    handlers and are registered as event listeners.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;SWT User Interfaces are usually implemented using Java. However,   the way to implement both patterns in Java bears room for improvement,   because:&lt;/p&gt; &lt;ul&gt;  &lt;li&gt;Java doesn’t have a special pattern to create trees. The    standard pattern is to imperatively create objects and establish    references between them. Whether the resulting objects form a tree or    a graph is not obvious to the reader of the code, since for him/her    it is just a linear sequence of statements.&lt;/li&gt;  &lt;li&gt;Anonymous classes in Java have a particularly noisy syntax.    The extreme scenario (which is fairly common) is when the actual code    that handles the event is only a single Java statement. In this    scenario, the majority of the code is not the execution logic of the    handler, but the declaration of the class and the handlers method.&lt;/li&gt; &lt;/ul&gt;   &lt;h2&gt;Designing User Interfaces using Trees: Builder Syntax&lt;/h2&gt;  &lt;p&gt;  Xtend offers to improve the situation due to its support for a &lt;a    href="http://www.eclipse.org/Xtext/xtend/documentation/index.html#builderSyntax"&gt;builder    syntax&lt;/a&gt; and its support for &lt;a    href="http://www.eclipse.org/Xtext/xtend/documentation/index.html#closures"&gt;closures&lt;/a&gt;.  &lt;/p&gt; &lt;ul&gt;  &lt;li&gt;&lt;a    href="http://www.eclipse.org/Xtext/xtend/documentation/index.html#builderSyntax"&gt;Builder     syntax&lt;/a&gt; is a pattern that creates an object tree and allows the code    to be formatted like a tree (using indentation an brackets).&lt;/li&gt;  &lt;li&gt;&lt;a    href="http://www.eclipse.org/Xtext/xtend/documentation/index.html#closures"&gt;Closures&lt;/a&gt;   allow to define instructions that can be executed later. You may    perceive it as similar to an anonymous class with a single method,    but without the syntactic overhead of a method declaration.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The following snippet illustrates the builder syntax in Xtend.   As indicated already, the style of the code reflects the tree   structure of the SWT widgets. This example creates a shell with one   label, one text filed and one button. Additionally, it arranges them   using a GridLayout.&lt;/p&gt; &lt;div style="float: right; margin-right: 150px; margin-top: 60px"&gt;  &lt;img alt="Builder Syntax" src="http://4.bp.blogspot.com/-8WVcXt_llmQ/TvNve0-bS-I/AAAAAAAAADs/-uqswlCWMDM/s1600/buildersyntax.png"&gt; &lt;/div&gt; &lt;div style="margin-top: 20px; margin-bottom: 20px"&gt;  &lt;style type="text/css"&gt;   p.pa1 {margin: 0.0px 0.0px 0.0px 0.0px; padding: 0px; font: 11.0px Monaco}    p.pa2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #0138b1}    span.sa1 {color: #941c64}    span.sa2 {color: #bc4219}    span.sa3 {color: #909090}    span.sa4 {color: #0431c3}    span.sa5 {color: #3a40f4}    span.sa6 {color: #000000}    span.sa7 {color: #0138b1}   &lt;/style&gt;  &lt;p class="pa1"&gt;&lt;span class="sa1"&gt;val&lt;/span&gt; shell = newShell(display) [&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;  &lt;p class="pa1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="sa2"&gt;layout&lt;/span&gt; = &lt;span class="sa1"&gt;new&lt;/span&gt; GridLayout(&lt;span class="sa3"&gt;3&lt;/span&gt;, &lt;span class="sa1"&gt;false&lt;/span&gt;)&lt;/p&gt;  &lt;p class="pa1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="sa2"&gt;newLabel&lt;/span&gt;(SWT::&lt;span class="sa4"&gt;NONE&lt;/span&gt;) [&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;  &lt;p class="pa1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="sa2"&gt;text&lt;/span&gt; = &lt;span class="sa5"&gt;"To:"&lt;/span&gt;&lt;/p&gt;  &lt;p class="pa1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;] &lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;  &lt;p class="pa1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="sa2"&gt;newText&lt;/span&gt;(SWT::&lt;span class="sa4"&gt;BORDER&lt;/span&gt;) [&lt;/p&gt;  &lt;p class="pa1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="sa2"&gt;layoutData&lt;/span&gt; = newGridData() [&lt;/p&gt;  &lt;p class="pa2"&gt;&lt;span class="sa6"&gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;grabExcessHorizontalSpace&lt;span class="sa6"&gt; = &lt;/span&gt;&lt;span class="sa1"&gt;true&lt;/span&gt;&lt;/p&gt;  &lt;p class="pa1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="sa7"&gt;horizontalAlignment&lt;/span&gt; = SWT::&lt;span class="sa4"&gt;FILL&lt;/span&gt;&lt;/p&gt;  &lt;p class="pa1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;]&lt;/p&gt;  &lt;p class="pa1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;]&lt;/p&gt;  &lt;p class="pa1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="sa2"&gt;newButton&lt;/span&gt;(SWT::&lt;span class="sa4"&gt;PUSH&lt;/span&gt;) [&lt;/p&gt;  &lt;p class="pa1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="sa2"&gt;text&lt;/span&gt; = &lt;span class="sa5"&gt;"Send"&lt;/span&gt;&lt;/p&gt;  &lt;p class="pa1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;]&lt;/p&gt;  &lt;p class="pa1"&gt;]&lt;/p&gt; &lt;/div&gt; &lt;p&gt;To understand the code from the Xtend code snippet above and to   compare it with Java, the following things may be noteworthy:&lt;/p&gt; &lt;ul&gt;  &lt;li&gt;All referenced elements in the snippet are Java elements from SWT,    except for the &lt;code&gt;new*()&lt;/code&gt;-methods. Those are methods    implemented in a custom &lt;a    href="https://github.com/meysholdt/blog/blob/master/001_xtend_and_swt/src/blog_001_xtend_and_swt/XtendSWTLib.java"&gt;Java     factory class&lt;/a&gt;. They all conform to the following pattern    illustrated in the next code snippet.    &lt;div style="margin-top: 20px; margin-bottom: 20px"&gt;    &lt;style type="text/css"&gt;     p.pb1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco}      span.sb1 {color: #941c64}     &lt;/style&gt;    &lt;p class="pb1"&gt;&lt;span class="sb1"&gt;public&lt;/span&gt; &lt;span class="sb1"&gt;static&lt;/span&gt; Button newButton(Composite parent, &lt;span class="sb1"&gt;int&lt;/span&gt; style, Procedure1&amp;lt;Button&amp;gt; init) {&lt;/p&gt;    &lt;p class="pb1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;Button btn = &lt;span class="sb1"&gt;new&lt;/span&gt; Button(parent, style);&lt;/p&gt;    &lt;p class="pb1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;init.apply(btn);&lt;/p&gt;    &lt;p class="pb1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="sb1"&gt;return&lt;/span&gt; btn;&lt;/p&gt;    &lt;p class="pb1"&gt;}&lt;/p&gt;   &lt;/div&gt; The &lt;code&gt;new*()&lt;/code&gt;-methods can be invoked from the    snippet like member methods since they have been imported as    extension methods. &lt;a    href="http://www.eclipse.org/Xtext/xtend/documentation/index.html#extensionMethods"&gt;Extension     methods&lt;/a&gt; are methods defined in a different class which can be    invoked like member methods on any kind of object that the method    accepts as its first parameter. In the snippet, the extension methods    are invoked on the &lt;a    href="http://www.eclipse.org/Xtext/xtend/documentation/index.html#implicitParameter"&gt;implicit     variable&lt;/a&gt; &lt;code&gt;it&lt;/code&gt;.   &lt;/li&gt;  &lt;li&gt;You probably have noticed that all invocations of &lt;code&gt;new*()&lt;/code&gt;-methods    are followed by a code block surrounded by brackets "&lt;code&gt;[]&lt;/code&gt;".    This code block defines a closure which is passed as the last    parameter to the &lt;code&gt;new*()&lt;/code&gt;-method. You could as well pass    in the closure explicitly as the last parameter to the method.    However, this syntax can improve readability of the code. Since the    closure has one parameter and no return value, its class implements    interface &lt;code&gt;Procedure1&lt;/code&gt; (&lt;a    href="https://github.com/eclipse/xtext/blob/master/plugins/org.eclipse.xtext.xbase.lib/src/org/eclipse/xtext/xbase/lib/Procedures.java"&gt;src&lt;/a&gt;).   &lt;/li&gt;  &lt;li&gt;No closures in this example declare parameters. However, they    do have one implicit parameter. An example of a closure with    parameters is &lt;code&gt;[param | param.doSomething() ]&lt;/code&gt;. Xtend    supports an &lt;a href=""&gt;implicit variable&lt;/a&gt; named &lt;code&gt;it&lt;/code&gt;.    If a closure has a parameter but does not declare the parameter, the    parameters' value can be accessed through the variable &lt;code&gt;it&lt;/code&gt;.    Usage of the variable &lt;code&gt;it&lt;/code&gt; is implicit in the same way as    you know it from &lt;code&gt;this&lt;/code&gt;, with the difference that you can    not assign new values to &lt;code&gt;this&lt;/code&gt;. When accessing members of    &lt;code&gt;it&lt;/code&gt; (e.g. &lt;code&gt;horizontalAlignment&lt;/code&gt;), stating the    name &lt;code&gt;it&lt;/code&gt; is optional. Furthermore, you can invoke    extension methods on &lt;code&gt;it&lt;/code&gt;: In the code snippet, the method    &lt;code&gt;newText(Composite, int)&lt;/code&gt; has two parameters. The value    for &lt;code&gt;Composite&lt;/code&gt; is the value of &lt;code&gt;it&lt;/code&gt; from the    surrounding closure, which is in fact the shell (the window).   &lt;/li&gt;  &lt;li&gt;Xtend allows to use &lt;a    href="http://www.eclipse.org/Xtext/xtend/documentation/index.html#featureCalls"&gt;Getter/Setter-pairs     like properties&lt;/a&gt;: Instead of &lt;code&gt;setText("Send")&lt;/code&gt; you may    write &lt;code&gt;text = "Send"&lt;/code&gt;  &lt;/li&gt; &lt;/ul&gt;   &lt;h2&gt;Using Closures to make User Interfaces Interactive&lt;/h2&gt; &lt;p&gt;To implement event handlers it is common in Java to use   anonymous or nested classes. The snippet below uses Xtends closures to   do the same in a syntactically more concise way.&lt;/p&gt; &lt;div style="float: right; margin-right: 150px; margin-top: 20px"&gt;  &lt;img alt="Event Handling" src="http://2.bp.blogspot.com/-99CmhXb300E/TvNvfIlYS5I/AAAAAAAAAD4/v56t1CBhgFg/s1600/eventhandling.png" align="right"&gt; &lt;/div&gt; &lt;div style="margin-top: 20px; margin-bottom: 20px"&gt;   &lt;style type="text/css"&gt;     p.pc1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco}      span.sc1 {color: #bc4219}      span.sc2 {color: #0431c3}      span.sc3 {color: #3a40f4}      span.sc4 {color: #0138b1}      span.sc5 {color: #941c64}    &lt;/style&gt;  &lt;p class="pc1"&gt;&lt;span class="sc1"&gt;newButton&lt;/span&gt;(SWT::&lt;span class="sc2"&gt;PUSH&lt;/span&gt;) [&lt;/p&gt;  &lt;p class="pc1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="sc1"&gt;text&lt;/span&gt; = &lt;span class="sc3"&gt;"Send"&lt;/span&gt;&lt;/p&gt;  &lt;p class="pc1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;addListener(SWT::&lt;span class="sc2"&gt;Selection&lt;/span&gt;) [&lt;/p&gt;  &lt;p class="pc1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;newMessageBox((&lt;span class="sc4"&gt;widget&lt;/span&gt; &lt;span class="sc5"&gt;as&lt;/span&gt; Control).shell, SWT::&lt;span class="sc2"&gt;OK&lt;/span&gt;) [&lt;span&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class="pc1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="sc1"&gt;message&lt;/span&gt; = &lt;span class="sc3"&gt;"Hello World"&lt;/span&gt;&lt;/p&gt;  &lt;p class="pc1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;].open()&lt;/p&gt;  &lt;p class="pc1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;]&lt;/p&gt;  &lt;p class="pc1"&gt;]&lt;/p&gt; &lt;/div&gt; &lt;p&gt;The snippet above uses the Builder Syntax (as described in the   last section) to create a Button. When the button is clicked, a   MessageBox will be created and shown to the user.&lt;/p&gt; &lt;p&gt;  The interesting part here is   &lt;code&gt;addListener(int, Listener)&lt;/code&gt;  . This method accepts two parameters with the second parameter being   an instance of interface   &lt;code&gt;Listener&lt;/code&gt;  (&lt;a    href="https://github.com/eclipse/eclipse.platform.swt/blob/master/bundles/org.eclipse.swt/Eclipse%20SWT/common/org/eclipse/swt/widgets/Listener.java"&gt;src&lt;/a&gt;)   . In the snippet the second parameter for   &lt;code&gt;addListener&lt;/code&gt;  is a closure (the code block surrounded with   &lt;code&gt;[]&lt;/code&gt;  in   &lt;code&gt;addListener(SWT::Selection) [ ... ]&lt;/code&gt;  ). When the Xtend code is compiled to Java, the closure is compiled   into an anonymous Java class which implements the interface   &lt;code&gt;Listener&lt;/code&gt;  . This, however, is only possible for interfaces that have just a   single method.  &lt;/p&gt;   &lt;h2&gt;A Comprehensive Example&lt;/h2&gt; &lt;div style="float: right; margin-right: 20px; margin-top: 00px"&gt;  &lt;img alt="Builder Syntax and Event Handling" src="http://3.bp.blogspot.com/-LcjdRQRJP4c/TvNvfZTYQyI/AAAAAAAAAEE/a8-DqbkjY1g/s1600/messageform.png" align="right"&gt; &lt;/div&gt; &lt;div&gt;  &lt;style type="text/css"&gt;    p.pd1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco}     p.pd2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px}     p.pd3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #0138b1}     span.sd1 {color: #941c64}     span.sd2 {color: #909090}     span.sd3 {color: #bc4219}     span.sd4 {color: #0431c3}     span.sd5 {color: #3a40f4}     span.sd6 {color: #000000}     span.sd7 {color: #0138b1}   &lt;/style&gt;  &lt;p class="pd1"&gt;&lt;span class="sd1"&gt;package&lt;/span&gt; blog_001_xtend_and_swt&lt;/p&gt;  &lt;p class="pd2"&gt;&lt;br&gt;&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span class="sd1"&gt;import&lt;/span&gt; org.eclipse.swt.SWT&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span class="sd1"&gt;import&lt;/span&gt; org.eclipse.swt.layout.GridLayout&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span class="sd1"&gt;import&lt;/span&gt; org.eclipse.swt.widgets.Display&lt;/p&gt;  &lt;p class="pd2"&gt;&lt;br&gt;&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span class="sd1"&gt;import&lt;/span&gt; &lt;span class="sd1"&gt;static&lt;/span&gt; &lt;span class="sd1"&gt;extension&lt;/span&gt; blog_001_xtend_and_swt.XtendSWTLib.*&lt;/p&gt;  &lt;p class="pd2"&gt;&lt;br&gt;&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span class="sd1"&gt;class&lt;/span&gt; MessageForm {&lt;/p&gt;  &lt;p class="pd2"&gt;&lt;br&gt;&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="sd1"&gt;def&lt;/span&gt; &lt;span class="sd1"&gt;static&lt;/span&gt; &lt;span class="sd1"&gt;void&lt;/span&gt; main(String[] args) {&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="sd1"&gt;new&lt;/span&gt; MessageForm().run(args)&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;}&lt;/p&gt;  &lt;p class="pd2"&gt;&lt;span&gt; &amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="sd1"&gt;def&lt;/span&gt; &lt;span class="sd1"&gt;void&lt;/span&gt; run(String[] args) {&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="sd1"&gt;val&lt;/span&gt; display = &lt;span class="sd1"&gt;new&lt;/span&gt; Display()&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="sd1"&gt;val&lt;/span&gt; shell = newShell(display) [&lt;span&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;setSize(&lt;span class="sd2"&gt;400&lt;/span&gt;, &lt;span class="sd2"&gt;400&lt;/span&gt;)&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="sd3"&gt;layout&lt;/span&gt; = &lt;span class="sd1"&gt;new&lt;/span&gt; GridLayout(&lt;span class="sd2"&gt;3&lt;/span&gt;, &lt;span class="sd1"&gt;false&lt;/span&gt;)&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="sd3"&gt;newLabel&lt;/span&gt;(SWT::&lt;span class="sd4"&gt;NONE&lt;/span&gt;) [&lt;span&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="sd3"&gt;text&lt;/span&gt; = &lt;span class="sd5"&gt;"To:"&lt;/span&gt;&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;] &lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="sd1"&gt;val&lt;/span&gt; to = &lt;span class="sd3"&gt;newText&lt;/span&gt;(SWT::&lt;span class="sd4"&gt;BORDER&lt;/span&gt;) [&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="sd3"&gt;layoutData&lt;/span&gt; = newGridData() [&lt;/p&gt;  &lt;p class="pd3"&gt;&lt;span class="sd6"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;grabExcessHorizontalSpace&lt;span class="sd6"&gt; = &lt;/span&gt;&lt;span class="sd1"&gt;true&lt;/span&gt;&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="sd7"&gt;horizontalAlignment&lt;/span&gt; = SWT::&lt;span class="sd4"&gt;FILL&lt;/span&gt;&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;]&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;]&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="sd1"&gt;val&lt;/span&gt; send = &lt;span class="sd3"&gt;newButton&lt;/span&gt;(SWT::&lt;span class="sd4"&gt;PUSH&lt;/span&gt;) [&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="sd3"&gt;text&lt;/span&gt; = &lt;span class="sd5"&gt;"Send"&lt;/span&gt;&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;]&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="sd1"&gt;val&lt;/span&gt; msg = &lt;span class="sd3"&gt;newText&lt;/span&gt;(SWT::&lt;span class="sd4"&gt;BORDER&lt;/span&gt;) [&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="sd3"&gt;layoutData&lt;/span&gt; = newGridData() [&lt;/p&gt;  &lt;p class="pd3"&gt;&lt;span class="sd6"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;grabExcessHorizontalSpace&lt;span class="sd6"&gt; = &lt;/span&gt;&lt;span class="sd1"&gt;true&lt;/span&gt;&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="sd7"&gt;grabExcessVerticalSpace&lt;/span&gt; = &lt;span class="sd1"&gt;true&lt;/span&gt;&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="sd7"&gt;horizontalSpan&lt;/span&gt; = &lt;span class="sd2"&gt;3&lt;/span&gt;&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="sd7"&gt;horizontalAlignment&lt;/span&gt; = SWT::&lt;span class="sd4"&gt;FILL&lt;/span&gt;&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="sd7"&gt;verticalAlignment&lt;/span&gt; = SWT::&lt;span class="sd4"&gt;FILL&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;]&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;]&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;send.addListener(SWT::&lt;span class="sd4"&gt;Selection&lt;/span&gt;) [&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;newMessageBox(send.shell, SWT::&lt;span class="sd4"&gt;OK&lt;/span&gt;) [&lt;span&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="sd3"&gt;message&lt;/span&gt; = to.text + &lt;span class="sd5"&gt;"\n"&lt;/span&gt; + msg.text&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;].open()&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;]&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;]&lt;/p&gt;  &lt;p class="pd2"&gt;&lt;span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;shell.open()&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="sd1"&gt;while&lt;/span&gt; (!shell.isDisposed()) {&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="sd1"&gt;if&lt;/span&gt; (!display.readAndDispatch())&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;display.sleep()&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;}&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;display.dispose()&lt;/p&gt;  &lt;p class="pd1"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;}&lt;/p&gt;  &lt;p class="pd1"&gt;}&lt;/p&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33434069-5643028947172257862?l=blog.moritz.eysholdt.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.moritz.eysholdt.de/feeds/5643028947172257862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33434069&amp;postID=5643028947172257862' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33434069/posts/default/5643028947172257862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33434069/posts/default/5643028947172257862'/><link rel='alternate' type='text/html' href='http://blog.moritz.eysholdt.de/2011/12/building-swt-user-interfaces-with-xtend.html' title=''/><author><name>Moritz Eysholdt</name><uri>http://www.blogger.com/profile/09696008168578996501</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/-t65BciSbhRQ/TunFVnA3S5I/AAAAAAAAAC4/9pcY_xfz6fI/s220/me3.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-8WVcXt_llmQ/TvNve0-bS-I/AAAAAAAAADs/-uqswlCWMDM/s72-c/buildersyntax.png' height='72' width='72'/><thr:total>5</thr:total></entry></feed>
