====== More XScalaWT ====== Here are some more Scala and XScalaWT examples, from recent experiments, for those who prefer simple code examples and don't want to read through the longer [[Simplifying SWT with Scala|tutorial]]. (As in the previous examples, I'll omit the package statement and imports.) class LoginDialog(display : Display) extends Shell(display, SWT.NO_TRIM) { implicit def unboxText2String(t : Text) = t.getText() var username : Text = null var password : Text = null var ok = false setMaximized(true) // since we're running inside RAP... this.contains( _.setLayout(new GridLayout(1, false)), _.setBackground(WHITE), $[Banner](SWT.NULL)( _.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false)) ), label("Username", _.setBackground(WHITE)), text(username=_), label("Password", _.setBackground(WHITE)), $[Text](SWT.BORDER | SWT.PASSWORD)(password=_), composite( _.setLayout(new GridLayout(2, true)), _.setLayoutData(new GridData(SWT.CENTER, SWT.NONE, false, false)), _.setBackground(WHITE), button("OK", _.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL)), { e : SelectionEvent => ok=true; getShell().dispose() } ), button("Cancel", _.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL)), { e : SelectionEvent => getShell().dispose() } ) ) ) def getCredentials = if (ok) new UserSession(username, password) else null } The example above shows the generic syntax that lets you access all of SWT, plus any custom controls that you might write. For example: $[Text](SWT.BORDER | SWT.PASSWORD)(password=_), and $[Banner](SWT.NULL)( _.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false)) ), ...which leads to the following: class Banner(parent : Composite, style : Int) extends Composite(parent, style) { this.contains ( _.setLayout(new GridLayout(3, true)), _.setBackground(WHITE), label(LOGO.image, _.setBackground(WHITE)), label( _.setLayoutData(new GridData(SWT.FILL, SWT.END, true, false)), _.setBackground(WHITE) ) ) } And for those interested, UserSession looks like this: class UserSession(var userName : String, var password : String) { def getPasswordMD5 = try { val algorithm = MessageDigest.getInstance("MD5") algorithm.reset algorithm.update(password.getBytes()) val messageDigest = algorithm.digest() val digestBuffer = messageDigest.foldLeft(new StringBuffer()) { (stringBuffer, byte) => stringBuffer.append(Integer.toHexString(0xFF & byte)) } digestBuffer.toString() } catch { case e : NoSuchAlgorithmException => throw new RuntimeException(e) } } Because the "userName" and "password" parameters are declared as "var" parameters, Scala will automatically turn them into bean properties with proper getters and setters. No more typing all that getFoo(), setFoo() boilerplate! The only thing I don't like about this code is that I'm constantly setting the background color to SWT.WHITE. Looks like I need to look into how to style RAP widgets. Or maybe look into the new E4 style sheet support for SWT... ~~LINKBACK~~ ~~DISCUSSION~~