SlideShare ist ein Scribd-Unternehmen logo
1 von 44
Downloaden Sie, um offline zu lesen
Theming GWT
Applications with the
Appearance Pattern
Colin Alworth / Sencha Inc.
colin.alworth@sencha.com
Three years ago
Cell API and Appearance Pattern
Two years ago
SenchaCon 2011, GXT 3 Preview released
Just over a year ago
GXT 3.0.0 uses Cell API in Fields, Appearance
everywhere
Theming GWT
Appearance pattern

Three main responsibilities
!
•
•
•

render initial content
update content based on changes, interaction
answer questions about rendered content
Examples
Theming GWT
Button Appearance
•

•

•

•

render text, icon, decoration
update for changes
update for hover, focus, mousedown
find focus element, find menu element
Theming GWT
Text Field
•

•

•

•

render with value, options
update for value, options
update for empty, focus, value
find focus element
Theming GWT
Panel
•

•

•

render static content
update to hide/show header, collapse/
expand panel
ask for icons on buttons, elements to hold
title, tools, body, buttons
Theming GWT
Appearance contract
•

•

•

appearance controls rendered html
widget deals with all logic
appearance implementation can choose to
use or ignore state changes
Theming GWT
Appearance contract - exceptions
•

•

ColorPalette/DatePicker - widget needs to
know relative positions of items
Grid/Tree - needs to guarantee fast creation/
lookups
Theming GWT
Appearance contract

Implementations should be stateless:
!
•

•

Ensures that appearances will behave for cells
Enables compiler to rewrite methods to static,
inline into owning widget if possible
!
Theming GWT
Constructing appearances
•

•

Widgets should invoke GWT.create on the
appearance interface
Module files can declare replace-with rules to
specify an implementation

!
!
Theming GWT
Module rules
<replace-with
class="com.sencha.gxt...NeptuneInfoAppearance">
<when-type-is
class="com.sencha.gxt...Info.InfoAppearance" />
</replace-with>
!
!
Theming GWT
Multiple themes in one app?
<replace-with
class="com.sencha.gxt...NeptuneInfoAppearance">
<when-type-is
class="com.sencha.gxt...Info.InfoAppearance" />
<when-property-is
name="gxt.theme" value="neptune" />
</replace-with>
!
!
Theming GWT
General API tips
•

Widgets should expose an appearance constructor
Enables individual cases to use a custom
appearance
Widget’s appearance field should be private/final
Avoids issues with changing appearance without
changing dom structure
Widgets should expose an appearance getter for
subclasses
•

•

•

•

!
!
Theming GWT
General API tips
•

•

Helpful have default appearance
implementations that are easy to extend,
changing minor details like styles
Appearances shouldn’t use generics, since
they are created by GWT.create, lose any
typesafety

!
!
Theming GWT
Implementing appearances
•

render method - SafeHtmlBuilder or SafeHtml,
either XTemplates, SafeHtmlTemplates, or
hand-written Java

!
<div class='{style.infoWrap}'>
<div class='{style.info}'></div>
</div>
!
public void render(SafeHtmlBuilder sb) {
sb.append(template.render(styles));
}
!
!
Theming GWT
Implementing appearances
•

find, update methods based on that structure

!

@Override
public Element getContentElement(Element parent) {
return parent.getFirstChildElement();
}
!
!
Theming GWT
Implementing appearances
•

•

Declare a default constructor (for
GWT.create and replace-with)
If it makes sense, ensure type can be
extended

!
!
Theming GWT
Composing a theme
•

•

•

consistent set of appearances
defined as a module made of of replacewith declarations
in GXT 3.1 comes with a gxt.theme property
for permutation switching of themes

!
!
Automating theme generation
Theming GWT
Automating theme generation
•

•

Early GXT 3 tried few constants in one file,
CssResource to reference these in all
appearances
Works when no images need to be
created...

!
!
Theming GWT
Legacy browser image generation

Base it on
CSS3 gradients
CSS3 rounded corners
SVG vector images
Starts us with a language we already know (rather
than inventing new)
Enables us to use CSS3 right away (in browsers that
support it)
•

•

•

•

•

!

!
!
Info Example
Theming GWT
Info.display("Hello world","Testing info popup");
Theming GWT
CSS3 html and css
<div class='{style.infoWrap}'>!
<div class='{style.info}'></div>!
</div>!
.infoWrap {!
border-style: none;!
border-radius: 8px;!
background-color: #000000;!
opacity: .8;!
margin: 2px 0 0 0;!
}!
.info {!
padding: 10px;!
}!
!
Theming GWT
Slicing Corners
Theming GWT
Slicing Edges
Theming GWT
Legacy 9-box html
<div class="{style.contentArea}">
<div class="{style.content}">
<div class="{style.info}">
</div>
</div>
<div class="{style.topLeft}"></div>
<div class="{style.top}"></div>
<div class="{style.topRight}"></div>
<div class="{style.bottomLeft}"></div>
<div class="{style.bottom}"></div>
<div class="{style.bottomRight}"></div>
<div class="{style.left}"></div>
<div class="{style.right}"></div>
</div>
TabPanel Example
!
Theming GWT
TabPanelExample
Theming GWT
TabPanelExample
Theming GWT
TabPanelExample
Theming GWT
Automating image generation
•

•

•

•

•

•

•

!

start with a CSS3 implementation, render in a
browser
specify images that need images
collect from browser positions, borders, corner
radius, gradient direction
decide which images - background, corners, sides
decide which images to stretch
take a screenshot
slice images from screenshot based on positions
Theming GWT
Theming GWT
Automating image generation
•

!

takes about 5 seconds, most of which is
starting browser and launching sample page
Theming GWT
Back to theme generation
•

•

•

•

CSS3 can be transformed to images
images + legacy css used for older
browsers
HTML structure different as well
nothing common except for a few values,
sizes - where do we store those?
Theming GWT
Theme config
theme {!
name = "themeName"!
basePackage = "com.company.theme"!
!
details {!
panel {!
}!
tabs {!
}!
//...!
}!
}!
!
Theming GWT
Theme config
theme {!
details {!
info {!
backgroundColor = "#ffffff"!
borderRadius = 8!
opacity = 1.0!
border = util.border('solid', '#cccccc', 2)!
headerText = util.fontStyle("Tahoma, Arial, Verdana, sansserif", '15px', '#555555', 'bold');!
messageText = util.fontStyle("Tahoma, Arial, Verdana, sansserif", '14px', '#555555');!
margin = util.margins(2,0,0,0)!
padding = util.padding(2,7)!
}!
}!
}!

!
!
Theming GWT
Theme config
•

•

•

•

•

namespaced properties for easier
organization
values can be string, int, double
some expressions supported
values can be referenced by path
basic set of util methods
Theming GWT
Running the themed
$ bin/themer.sh !
Command missing config files!
usage: ThemeBuilder [options] [config ...]!
-f,--force
force output overwrite!
-gen <path>
directory to generate code to!
-generateConfig <outputFile>
Generate sample configuration!
-h,--help
print this message!
-imageFile <path>
captured image used for slicing images!
-manifestFile <manifestFile>
json manifest file of the captured
image!
-out <jar>
path to jar file to generate. Default
is!
a jar named <theme.name>.jar in the!
current directory!
-warDir <warDir>
directory to compile the css3-based
theme!
to before images are sliced from it!

!
Theming GWT
Example config
$ themebuilder/bin/themer.sh themebuilder/examples/
quick-start/quick-start.theme!
template generation started!
template generation complete!
image generation started!
generating tool icons!
!

...!
!

slice complete!
packaging started!
packaging complete!
!
Theming GWT
Included samples
•

•

•

•

quick-start.theme
skeleton-config.theme
maven-jar/
maven-source/

Weitere ähnliche Inhalte

Was ist angesagt?

Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점
Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점
Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점
Jeado Ko
 
D2W Branding Using jQuery ThemeRoller
D2W Branding Using jQuery ThemeRollerD2W Branding Using jQuery ThemeRoller
D2W Branding Using jQuery ThemeRoller
WO Community
 
Iasi code camp 12 october 2013 shadow dom - mihai bîrsan
Iasi code camp 12 october 2013   shadow dom - mihai bîrsanIasi code camp 12 october 2013   shadow dom - mihai bîrsan
Iasi code camp 12 october 2013 shadow dom - mihai bîrsan
Codecamp Romania
 

Was ist angesagt? (20)

Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점
Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점
Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점
 
Modern android development
Modern android developmentModern android development
Modern android development
 
[FEConf Korea 2017]Angular 컴포넌트 대화법
[FEConf Korea 2017]Angular 컴포넌트 대화법[FEConf Korea 2017]Angular 컴포넌트 대화법
[FEConf Korea 2017]Angular 컴포넌트 대화법
 
Introducing ExtReact: Adding Powerful Sencha Components to React Apps
Introducing ExtReact: Adding Powerful Sencha Components to React AppsIntroducing ExtReact: Adding Powerful Sencha Components to React Apps
Introducing ExtReact: Adding Powerful Sencha Components to React Apps
 
Why You Should be Using Web Components Right Now. And How. ForwardJS July 2015
Why You Should be Using Web Components Right Now. And How. ForwardJS July 2015Why You Should be Using Web Components Right Now. And How. ForwardJS July 2015
Why You Should be Using Web Components Right Now. And How. ForwardJS July 2015
 
Angular js
Angular jsAngular js
Angular js
 
Angular js
Angular jsAngular js
Angular js
 
Start your app the better way with Styled System
Start your app the better way with Styled SystemStart your app the better way with Styled System
Start your app the better way with Styled System
 
AngularJs Workshop SDP December 28th 2014
AngularJs Workshop SDP December 28th 2014AngularJs Workshop SDP December 28th 2014
AngularJs Workshop SDP December 28th 2014
 
JS Fest 2018. Илья Иванов. Введение в React-Native
JS Fest 2018. Илья Иванов. Введение в React-NativeJS Fest 2018. Илья Иванов. Введение в React-Native
JS Fest 2018. Илья Иванов. Введение в React-Native
 
Introduction to Html5
Introduction to Html5Introduction to Html5
Introduction to Html5
 
D2W Branding Using jQuery ThemeRoller
D2W Branding Using jQuery ThemeRollerD2W Branding Using jQuery ThemeRoller
D2W Branding Using jQuery ThemeRoller
 
SPSTC - SharePoint & jQuery Essentials
SPSTC - SharePoint & jQuery EssentialsSPSTC - SharePoint & jQuery Essentials
SPSTC - SharePoint & jQuery Essentials
 
Angular js 1.3 basic tutorial
Angular js 1.3 basic tutorialAngular js 1.3 basic tutorial
Angular js 1.3 basic tutorial
 
Session 2- day 3
Session 2- day 3Session 2- day 3
Session 2- day 3
 
Vaadin Components @ Angular U
Vaadin Components @ Angular UVaadin Components @ Angular U
Vaadin Components @ Angular U
 
Web Components v1
Web Components v1Web Components v1
Web Components v1
 
Getting the Most Out of jQuery Widgets
Getting the Most Out of jQuery WidgetsGetting the Most Out of jQuery Widgets
Getting the Most Out of jQuery Widgets
 
Iasi code camp 12 october 2013 shadow dom - mihai bîrsan
Iasi code camp 12 october 2013   shadow dom - mihai bîrsanIasi code camp 12 october 2013   shadow dom - mihai bîrsan
Iasi code camp 12 october 2013 shadow dom - mihai bîrsan
 
Build a better UI component library with Styled System
Build a better UI component library with Styled SystemBuild a better UI component library with Styled System
Build a better UI component library with Styled System
 

Andere mochten auch

Andere mochten auch (8)

Using UIBinder with Ext GWT 3.0
Using UIBinder with Ext GWT 3.0Using UIBinder with Ext GWT 3.0
Using UIBinder with Ext GWT 3.0
 
Migrating from Ext GWT 2.x to 3.0
Migrating from Ext GWT 2.x to 3.0Migrating from Ext GWT 2.x to 3.0
Migrating from Ext GWT 2.x to 3.0
 
Ext GWT 3.0 Theming and Appearances
Ext GWT 3.0 Theming and AppearancesExt GWT 3.0 Theming and Appearances
Ext GWT 3.0 Theming and Appearances
 
Building Sencha Themes
Building Sencha ThemesBuilding Sencha Themes
Building Sencha Themes
 
Introducing Sencha Touch 2
Introducing Sencha Touch 2Introducing Sencha Touch 2
Introducing Sencha Touch 2
 
Présentation DevoxxFR 2015 sur GWT
Présentation DevoxxFR 2015 sur GWTPrésentation DevoxxFR 2015 sur GWT
Présentation DevoxxFR 2015 sur GWT
 
SenchaCon 2016: The Changing Landscape of JavaScript Testing - Joel Watson an...
SenchaCon 2016: The Changing Landscape of JavaScript Testing - Joel Watson an...SenchaCon 2016: The Changing Landscape of JavaScript Testing - Joel Watson an...
SenchaCon 2016: The Changing Landscape of JavaScript Testing - Joel Watson an...
 
SenchaCon 2016: Keynote Presentation - Art Landro, Gautam Agrawal, Mark Brocato
SenchaCon 2016: Keynote Presentation - Art Landro, Gautam Agrawal, Mark BrocatoSenchaCon 2016: Keynote Presentation - Art Landro, Gautam Agrawal, Mark Brocato
SenchaCon 2016: Keynote Presentation - Art Landro, Gautam Agrawal, Mark Brocato
 

Ähnlich wie GWT.create 2013: Themeing GWT Applications with the Appearance Pattern

Responsive Web Design: From Mobile To Desktop, And Beyond (updated for MobiDe...
Responsive Web Design: From Mobile To Desktop, And Beyond (updated for MobiDe...Responsive Web Design: From Mobile To Desktop, And Beyond (updated for MobiDe...
Responsive Web Design: From Mobile To Desktop, And Beyond (updated for MobiDe...
gravityworksdd
 

Ähnlich wie GWT.create 2013: Themeing GWT Applications with the Appearance Pattern (20)

Bootstrap webtech presentation - new
Bootstrap   webtech presentation - newBootstrap   webtech presentation - new
Bootstrap webtech presentation - new
 
Bootstrap 3 - Sleek, intuitive, and powerful mobile first front-end framework...
Bootstrap 3 - Sleek, intuitive, and powerful mobile first front-end framework...Bootstrap 3 - Sleek, intuitive, and powerful mobile first front-end framework...
Bootstrap 3 - Sleek, intuitive, and powerful mobile first front-end framework...
 
HTML5 and Joomla! 2.5 Template
HTML5 and Joomla! 2.5 TemplateHTML5 and Joomla! 2.5 Template
HTML5 and Joomla! 2.5 Template
 
Google web toolkit web conference presenation
Google web toolkit web conference presenationGoogle web toolkit web conference presenation
Google web toolkit web conference presenation
 
html5_css3
html5_css3html5_css3
html5_css3
 
Html 5 mobile - nitty gritty
Html 5 mobile - nitty grittyHtml 5 mobile - nitty gritty
Html 5 mobile - nitty gritty
 
"Responsive Web Design: Clever Tips and Techniques". Vitaly Friedman, Smashin...
"Responsive Web Design: Clever Tips and Techniques". Vitaly Friedman, Smashin..."Responsive Web Design: Clever Tips and Techniques". Vitaly Friedman, Smashin...
"Responsive Web Design: Clever Tips and Techniques". Vitaly Friedman, Smashin...
 
Xamarin 9/10 San Diego Meetup
Xamarin 9/10 San Diego MeetupXamarin 9/10 San Diego Meetup
Xamarin 9/10 San Diego Meetup
 
Web development basics (Part-1)
Web development basics (Part-1)Web development basics (Part-1)
Web development basics (Part-1)
 
Responsive Web Design: From Mobile To Desktop, And Beyond (updated for MobiDe...
Responsive Web Design: From Mobile To Desktop, And Beyond (updated for MobiDe...Responsive Web Design: From Mobile To Desktop, And Beyond (updated for MobiDe...
Responsive Web Design: From Mobile To Desktop, And Beyond (updated for MobiDe...
 
Responsive web design
Responsive web designResponsive web design
Responsive web design
 
IT230-Assignment 1 Solved.pdf
IT230-Assignment 1 Solved.pdfIT230-Assignment 1 Solved.pdf
IT230-Assignment 1 Solved.pdf
 
Front end full stack development module 1pptx
Front end full stack development module 1pptxFront end full stack development module 1pptx
Front end full stack development module 1pptx
 
Create Responsive Website Design with Bootstrap 3
Create Responsive Website Design with Bootstrap 3Create Responsive Website Design with Bootstrap 3
Create Responsive Website Design with Bootstrap 3
 
Web Campaign 2.pptx
Web Campaign 2.pptxWeb Campaign 2.pptx
Web Campaign 2.pptx
 
Developing Custom WordPress Themes for Clients
Developing Custom WordPress Themes for ClientsDeveloping Custom WordPress Themes for Clients
Developing Custom WordPress Themes for Clients
 
Ease into HTML5 and CSS3
Ease into HTML5 and CSS3Ease into HTML5 and CSS3
Ease into HTML5 and CSS3
 
New Elements & Features in HTML5
New Elements & Features in HTML5New Elements & Features in HTML5
New Elements & Features in HTML5
 
Html,CSS & UI/UX design
Html,CSS & UI/UX designHtml,CSS & UI/UX design
Html,CSS & UI/UX design
 
02 integrate highchart
02 integrate highchart02 integrate highchart
02 integrate highchart
 

Kürzlich hochgeladen

Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Victor Rentea
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
 

Kürzlich hochgeladen (20)

MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptx
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 

GWT.create 2013: Themeing GWT Applications with the Appearance Pattern