bof-5110 extending the groovy swingbuilder

25
Extending Groovys Swing User Interface in Builder to Build Richer Applications Danno Ferrin, Intelligent Software Solutions, Inc. James Williams, Spatial Networks, Inc. BOF-5110 Speaker’s logo here (optional)

Upload: danno-ferrin

Post on 12-May-2015

4.717 views

Category:

Business


1 download

TRANSCRIPT

Page 1: BOF-5110 Extending the Groovy SwingBuilder

Extending Groovys Swing User Interface in Builder to Build Richer Applications

Danno Ferrin, Intelligent Software Solutions, Inc.James Williams, Spatial Networks, Inc.

BOF-5110Speaker’s logo here

(optional)

Page 2: BOF-5110 Extending the Groovy SwingBuilder

2008 JavaOneSM Conference | java.com.sun/javaone | 2

Learn how to customized Groovy’s SwingBuilder to add custom widgets and non-visual components.

Page 3: BOF-5110 Extending the Groovy SwingBuilder

2008 JavaOneSM Conference | java.com.sun/javaone | 3

Not always an enterprise question…

BUT WILL IT

S C A L E?

Page 4: BOF-5110 Extending the Groovy SwingBuilder

2008 JavaOneSM Conference | java.com.sun/javaone | 4

Agenda

Ways to Extend SwingBuilderFactoryBuilderSupport OverviewCase Study: SwingXBuilder

Page 5: BOF-5110 Extending the Groovy SwingBuilder

2008 JavaOneSM Conference | java.com.sun/javaone | 5

Agenda

Ways to Extend SwingBuilderFactoryBuilderSupport Overview Case Study: SwingXBuilder

Page 6: BOF-5110 Extending the Groovy SwingBuilder

2008 JavaOneSM Conference | java.com.sun/javaone | 6

Issues of ScaleHow you extend should be driven by how much the extension is used

Magic Nodes• bean(), widget(), container()

Individual Factory Registration• Automatic Bean Factory• Custom Factory

Builder Suite• Example: SwingXBuilder

CompositeBuilder• <Coming Soon>

Single use of particular widgets

Multiple uses of a few types

Multiple use of a lot of types

Multiple uses from multiple suites

Page 7: BOF-5110 Extending the Groovy SwingBuilder

2008 JavaOneSM Conference | java.com.sun/javaone | 7

Magic Nodes

bean(…) • Accepts any object • Not added to parent • No child content

widget(…) • Accepts any java.awt.Component• Added to parent java.awt.Container• No child content

container(…)• Accepts any java.awt.Container• Added to parent java.awt.Container• Accepts child content

Page 8: BOF-5110 Extending the Groovy SwingBuilder

2008 JavaOneSM Conference | java.com.sun/javaone | 8

Magic Nodes

An instance of the object must be passed in as the argumentAttributes are applied as JavaBeans properties

Semi-Magic Nodes • Most existing nodes can become magic nodes • Argument must match node type

Page 9: BOF-5110 Extending the Groovy SwingBuilder

2008 JavaOneSM Conference | java.com.sun/javaone | 9

Magic Nodes Example

bean(model, propertyChanged: { panel.repaint() } )

widget(new JXMonthPanel(), selectedBackground:Color.YELLOW)

container(new JXTitlePane(), title:"Demo”) { // whatever you would add in the JXTitlePane}

Page 10: BOF-5110 Extending the Groovy SwingBuilder

2008 JavaOneSM Conference | java.com.sun/javaone | 10

Individual Factory Registration

First, what are the characteristics of the Widget?

Well behaved JavaBeans?• No-args constructor• Bean can be fully configured via properties

Complex Beans/Objects• Only constructors with arguments• Some features configured only by constructor

• Example: JFrame, JWindow, JDialog owner

• Non-JavaBeans style properties/configuration

Page 11: BOF-5110 Extending the Groovy SwingBuilder

2008 JavaOneSM Conference | java.com.sun/javaone | 11

Individual Factory Registration

Well behaved JavaBeans may use registerBeanFactory(…)• All lifecycle methods are automated• No fancy processing• Child nodes added via JComponent.add(child [,constraints])

• Some common cases handled based on widget type• JTable, Layouts, JScrollPane, java.awt.Window

Complex Beans/Objects must use registerFactory(…)• Must implement groovy.util.Factory• May extend groovy.util.AbstractFactory

• newInstance(builder, name, arg, attrs)is the only unimplemented method

Page 12: BOF-5110 Extending the Groovy SwingBuilder

2008 JavaOneSM Conference | java.com.sun/javaone | 12

Builder Suite

Logical progression from creating factories

How? Subclass the SwingBuilder• Do factory loading in instance methods

• Call those methods from the Constructor

• SwingBuilder factories may be over-ridden• SwingBuilder factories may be renamed –

getFactories().each {k, v -> registerFactory("j" + k, v)}

Page 13: BOF-5110 Extending the Groovy SwingBuilder

2008 JavaOneSM Conference | java.com.sun/javaone | 13

Builder Suite

But what if I want multiple suites?• JideSplitButton • JXMap • JRibbon

Ways to Add more than one suite• Manually add via magic nodes• Manual add factories after construction• Hand roll a custom suite

This can be burdensome…

Page 14: BOF-5110 Extending the Groovy SwingBuilder

2008 JavaOneSM Conference | java.com.sun/javaone | 14

Composite Builder

Coming Soon• Won’t be in Groovy 1.6 core

The Idea• Declare a builder that is a composite of other builders• Have each builder use a common Binding• Allow children of one builder to nest inside another

• Widgets from different libraries• Nesting non-GUI Widgets

tree() { rootFolder { treeNode(); treeNode(); treeNode(); }}

Page 15: BOF-5110 Extending the Groovy SwingBuilder

2008 JavaOneSM Conference | java.com.sun/javaone | 15

The Vision

def builder = new CompositeBuilder(SwingBuilder, ogb:ObjectGraphBuilder,jx:SwingXBuilder, jide:JIDEBuilder,fl:FlamingoBuilder,nodeName: randomFactory

)

builder.jxframe {flribbon {

editActionsGroup, saveActionsGroup}jidepopup(visible:false) { … popup contents

… }}

Page 16: BOF-5110 Extending the Groovy SwingBuilder

2008 JavaOneSM Conference | java.com.sun/javaone | 16

The code as of Today

Called ‘UberBuilder’• Available on SVN (only for the brave…)• https://svn.codehaus.org/groovy/trunk/groovy/modules/

griffon/

GUIBuilder is an auto composite of a few builders• SwingBuilder• SwingXBuilder• JIDEBuilder• GraphicsBuilder

Not quite soup yet…

Page 17: BOF-5110 Extending the Groovy SwingBuilder

2008 JavaOneSM Conference | java.com.sun/javaone | 17

Agenda

Ways to Extend SwingBuilderFactoryBuilderSupport OverviewCase Study: SwingXBuilder

Page 18: BOF-5110 Extending the Groovy SwingBuilder

2008 JavaOneSM Conference | java.com.sun/javaone | 18

First some Terminology

nodeName( argument, attr : value, attr2 : value) { … }

Node• Syntactically a method call, but it represents a widget or

bean

Argument• The un-named method argument for the node• As of Groovy 1.5 there can be only one

Attribute• Any named parameter in the node• Names cannot be duplicated – enforced by the Compiler

Child Content• The closure after the method• Usually executed by the builder

Page 19: BOF-5110 Extending the Groovy SwingBuilder

2008 JavaOneSM Conference | java.com.sun/javaone | 19

Factory Lifecycle

Page 20: BOF-5110 Extending the Groovy SwingBuilder

2008 JavaOneSM Conference | java.com.sun/javaone | 20

Delegate Closures

Some steps can be intercepted without a Factory• addPreInstantiateDelegate, addPostInstantiateDelegate,

addAttributeDelegate• {FactoryBulderSupport builder, Object node, Map attributes ->

… }

• addPostNodeCompleteDelegate • {FactoryBulderSupport builder, Object parent, Object node -> … }

Delegates handle all nodes• No picking and choosing, each closure must handle every call

Some built-in tasks done via delegates• Handling of constraints: attributes• Handling of id: attributes• Handling of bind() and attributes

Page 21: BOF-5110 Extending the Groovy SwingBuilder

2008 JavaOneSM Conference | java.com.sun/javaone | 21

Agenda

Ways to Extend SwingBuilderFactoryBuilderSupport OverviewCase Study: SwingXBuilder

Page 22: BOF-5110 Extending the Groovy SwingBuilder

2008 JavaOneSM Conference | java.com.sun/javaone | 22

SwingXBuilder

Google Summer of Code 2007 project• James Williams – Nova Southeastern University, FL

Proof of concept for SwingBuilder extension

First Groovy builder in 100% Groovy• SwingBuilder later ported to Groovy

Page 23: BOF-5110 Extending the Groovy SwingBuilder

2008 JavaOneSM Conference | java.com.sun/javaone | 23

Summary

SwingBuilder extension is easyChoose your extension method based on frequency of useFactoryBuilderSupport FTWLook to SwingXBuilder to see how it’s been done

Page 24: BOF-5110 Extending the Groovy SwingBuilder

2008 JavaOneSM Conference | java.com.sun/javaone | 24

For More Information

TS-5098• Friday at 12:10 in EP 305• Covers more of the SwingBuilder basics not covered here

Groovy• http://groovy.codehaus.org/

Builders mentioned in this presentation• http://groovy.codehaus.org/Swing+Builder• http://groovy.codehaus.org/SwingXBuilder• http://groovy.codehaus.org/JideBuilder• http://groovy.codehaus.org/JideBuilder

Groovy Swing team blogs• http://jroller.com/aalmiray• http://www.jameswilliams.be/blog• http://www.shemnon.com/speling

Page 25: BOF-5110 Extending the Groovy SwingBuilder

2008 JavaOneSM Conference | java.com.sun/javaone | 25

Danno Ferrin, Intelligent Software Solutions, Inc.

James Williams, Spatial Networks, Inc.

BOF-5110

Speaker’s logo here (optional)