Upload
james-williams
View
1.998
Download
0
Tags:
Embed Size (px)
Citation preview
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)
2008 JavaOneSM Conference | java.com.sun/javaone | 2
Learn how to customized Groovy’s SwingBuilder to add custom widgets and non-visual components.
2008 JavaOneSM Conference | java.com.sun/javaone | 3
Not always an enterprise question…
BUT WILL IT
S C A L E?
2008 JavaOneSM Conference | java.com.sun/javaone | 4
Agenda
Ways to Extend SwingBuilderFactoryBuilderSupport OverviewCase Study: SwingXBuilder
2008 JavaOneSM Conference | java.com.sun/javaone | 5
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
2008 JavaOneSM Conference | java.com.sun/javaone | 6
Agenda
Ways to Extend SwingBuilderFactoryBuilderSupport Overview Case Study: SwingXBuilder
2008 JavaOneSM Conference | java.com.sun/javaone | 7
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
2008 JavaOneSM Conference | java.com.sun/javaone | 8
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
2008 JavaOneSM Conference | java.com.sun/javaone | 9
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
2008 JavaOneSM Conference | java.com.sun/javaone | 10
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}
2008 JavaOneSM Conference | java.com.sun/javaone | 11
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
2008 JavaOneSM Conference | java.com.sun/javaone | 12
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])
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
2008 JavaOneSM Conference | java.com.sun/javaone | 13
Builder Suite
Logical progression from creating factories
Subclass SwingBuilder• Do magic in the Constructor• SwingBuilder factories can be over-ridden• SwingBuilder factories can be renamed –
getFactories().each {k, v -> registerFactory("j" + k, v)}
2008 JavaOneSM Conference | java.com.sun/javaone | 14
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….
2008 JavaOneSM Conference | java.com.sun/javaone | 15
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(); }}
2008 JavaOneSM Conference | java.com.sun/javaone | 16
The Vision
def builder = new CompositeBuilder(SwingBuilder, ogb:ObjectGraphBuilder,jx:SwingXBuilder, jide:JIDEBuilder,fl:FlamingoBuilder,nodeName: randomFactory)
builder.jxframe {ribbon {
editActionsGroup, saveActionsGroup}jidepopup(visible:false) { … popup contents
… }}
2008 JavaOneSM Conference | java.com.sun/javaone | 17
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…
2008 JavaOneSM Conference | java.com.sun/javaone | 18
Agenda
Ways to Extend SwingBuilderFactoryBuilderSupport OverviewCase Study: SwingXBuilder
2008 JavaOneSM Conference | java.com.sun/javaone | 19
Factory Lifecycle
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
2008 JavaOneSM Conference | java.com.sun/javaone | 21
Agenda
Ways to Extend SwingBuilderFactoryBuilderSupport OverviewCase Study: SwingXBuilder
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
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
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/GraphicsBuilder
Groovy Swing team blogs• http://jroller.com/aalmiray• http://www.jameswilliams.be/blog• http://www.shemnon.com/speling
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)