[fusion-dev] Jx API Update
Paul Spencer
pspencer at dmsolutions.ca
Thu Sep 11 17:43:54 EDT 2008
For those of you wondering about the changes in the Jx API, I thought
I would give a bit more detail on that subject in a separate thread
(this one) because we really haven't talked about Jx much before (and
I'd like more people to be interested in it!). This is quite a long
email, but hopefully informative.
First, a bit of an introduction to Jx for those that are unfamiliar
with it.
Jx is a toolkit for building web applications. It bears some
similarity to ExtJS, GWT, YUI and other such toolkits, but takes a
somewhat different approach.
First, the similarities ...
Jx, just like the other toolkits, comprises a set of building blocks
that assist a web developer in creating appealing web-based
applications. Typical building blocks are buttons, menus, tabs,
dialogs, panels and layout controls. You pick and choose which
components you need and plug them together with your content and
custom application logic. The programming APIs are even somewhat
similar once you are familiar with each toolkit. The toolkits also
provide you with a consistent visual style for all the components that
you are using, something that really makes an application more
pleasant and easy to use for your end user.
Jx provides the following components:
Buttons
-------
Button - a simple clickable button
Flyout Button - exposes a panel when the button is clicked
Color Button - exposes a color picker when the button is clicked
Multi Button - a palette of buttons, one of which is in the toolbar -
it can be changed by choosing a new button from a flyout, similar to a
photoshop concept
Combo Button - an editable selection list
Button Set - not a visual widget, but groups toggle buttons together
so that only one can be active at a time
Tabs
----
Tab - a button that shows a content area when activated and hides it
when deactivated.
Tab Box - a combined tab bar and content area that you can put tabs into
Tab Set - manages a set of tabs so that only one is active at a time
Menus
-----
Menu Item - an entry in a menu
Sub Menu - a menu that goes in another menu
Menu - a menu that can contain menu items and sub menus, can be put in
a toolbar
Context Menu - a menu that can be shown anywhere, usually triggered by
a right mouse click
Trees
-----
Tree Item - an entry in a tree
Tree Folder - a folder in a tree, it contains folders and items
Tree - a root organizer for a tree
Panels
------
Panel - a basic layout element with a title bar optional toolbars and
a content area
Panel Set - manages a set of Panels in a vertical area such that the
panels can be resized and consume the vertical space of the container
(similar to the Outlook bar or an accordion)
Dialog - a floating panel that looks like a panel but can be moved and
resized
Grids
-----
Grid - a tabular control that has fixed headers for rows and columns
and scrollable content.
Layout Controls
---------------
Splitter - a control that splits an HTML element horizontally or
vertically and allows the user to resize the split areas.
Layout - a control that manages the size of elements based on a set of
rules
Other toolkits provide similar building blocks, often they provide
much more than Jx does.
Now the differences ...
When we first started working on Jx, there really was no other
alternative and the other well known toolkits didn't exist. At the
core of Jx is the guiding principle that we should leverage the
browser's layout engine and innate capabilities as much as possible.
A corollary to this principle was to use semantically correct HTML
structures whenever possible.
Having a thorough working knowledge of how HTML and CSS work in
various browsers has allowed us to stick reasonably closely to this
principle. We don't use unnecessary HTML elements and we don't use
CSS hacks (anymore). This is not to say that we have adhered
perfectly to this, but as we discover new techniques to do away with
code or minimize the HTML structure we try to include them as soon as
possible.
As a practical example, the ExtJS toolkit (not to pick on them, but
they are popular and will provide a good example) provides a basic
button object that is visually and functionally very similar to the Jx
button object.
The generated HTML from a simple button with just an image in it:
<table cellspacing="0" cellpadding="0" border="0" class="x-btn-wrap x-
btn x-btn-icon" id="ext-comp-1034" style="width: auto;"><tbody><tr><td
class="x-btn-left"><i> </i></td><td class="x-btn-center"><em
unselectable="on"><button type="button" class="x-btn-text" id="ext-
gen52" style="background-image: url(list-items.gif);"> </button></em></
td><td class="x-btn-right"><i> </i></td></tr></tbody></table>
Note that the structure of the button is created using a table and
there are 8 separate elements involved in the button structure
The equivalent Jx button:
<div class="jxButtonContainer"><a class="jxButton"
href="javascript:void(0)" title="" alt=""><span
class="jxButtonContent"><img class="jxButtonIcon" src="http://localhost/jx/images/a_pixel.png
" style="background-image: url(images/bug.png);"/><span/></span></a></
div>
The structure of the button contains 4 elements and yet provides the
same visual style and functionality.
In addition to the basic structure, the ExtJS button uses javascript
to trap the mouse over and out events and apply a class to the table
to give it a hover effect. Jx uses pure CSS by using the a:hover
selector to achieve the identical result, except the javascript
interpreter doesn't have to fire up and run code.
While this may not seem like a big difference, it does make a
difference when you have lots of buttons and other objects using half
or less of the HTML structure and a great many less event handlers.
All of this isn't to say that ExtJS is a bad toolkit - far from it,
they have many advantages over Jx including fantastic looking styles
and a much bigger set of great components (the grid control is
extremely good!). We don't have those in Jx. But it is useful to
point out why Jx (still) exists - believe me, we have discussed
dropping Jx several times in favour of some of these other toolkits.
So, now a bit more about what has changed.
The fundamental change that I wanted to make was to change the
underlying javascript library that Jx uses from Prototype and
Scriptaculous to MooTools.
We started using Prototype because I really liked the way it was built
- there were some alternatives at the time but this one seemed to be
the simplest to use and understand. Scriptaculous is a separate
library built on Prototype to provide visual effects.
As the state of the art in javascript libraries improved, I became
less satisfied with Prototype and especially Scriptaculous. They
didn't seem to be progressing at the same rate as other libraries, and
were starting to feel quite heavy. Jx has a fair amount of code and
we were becoming sensitive to its size. There were a couple of
alternatives, primarily jQuery and MooTools. In the end, I decided to
go with MooTools because it was very similar to Prototype,
incorporated some excellent visual effects, and was substantially
smaller.
The mechanics of switching from Prototype to MooTools was fairly
simple due to a similarity in style (MooTools was written by folks
that had used Prototype), and we were able to take advantage of some
new functions in MooTools to eliminate quite a bit of code (mostly
around class/object structure, HTML element creation and event
management).
In addition to switching over to MooTools, we decided to have a
thorough review of the current API, object structure and corresponding
CSS. This resulted in several weeks of tweaking and reworking various
objects, CSS, images etc until we came up with the current state. The
result is that the code is a lot cleaner, the API is more consistent
(there is still more that could be done here), and we use more
techniques for layout that avoid the need for javascript assistance.
Buttons are a basic building block of most applications. In the
previous version of Jx, there were several things that looked like
buttons but were actually implemented with different code because we
didn't see the core similarities the first time around. These have
all been changed to use the basic button class and extend it with new
behaviours, eliminating a lot of code and unnecessary complexity in
designing CSS for button-like things. In acknowledgement of this
change, things that are button-like are now in a slightly different
name space. For instance, where you would have created a new Jx.Tab
in the previous version, now you create a new Jx.Button.Tab.
One of the immediate advantages that we derived from this was that all
button-like things now take exactly the same options for labels,
images, tooltips etc. Whereas before, we didn't have a way of
including images on Tabs, now Tabs are essentially a button with a
different surrounding chrome and the image support comes naturally
through the button code. So now all these button-like controls all
work exactly the same way.
Tabs, Menu Items and all the button types now use the basic button
structure and code through inheritance.
We've done a similar thing with Dialogs and Panels. In the previous
version, these were two separate code bases. Now, panel contains the
basic layout code and dialog just uses it with some different chrome
and some new behaviour for being able to move and resize it. Again, a
big reduction in code and now they both behave the same way.
The other optimization here was replacing the TabBox with a Panel, not
as substantial an improvement but still providing more consistency.
We also worked quite a bit on looking that the javascript API exposed
for each component so that working with each would be similar. We've
largely settled on the technique of using an options object as a way
of passing arguments to object constructors. This technique is used
by many other toolkits too.
Thanks to those that managed to read this far! We have already
started to incorporate this new version of Jx in Fusion as I indicated
in another email. But Jx is really its own entity and deserves some
of its own limelight. In the coming weeks, we will be putting the
finishing touches on the new version including some documentation and
examples, and launching it on google code. I'll be sure to make an
announcement here when that happens.
In the mean time, if you have any questions about Jx, please feel free
to ask on this list. It is still a bit of a work in progress and we
have lots of little things left to do.
The work on Jx is the effort of several people at DM Solutions Group,
primarily myself and Fred Warnock.
Cheers
Paul
__________________________________________
Paul Spencer
Chief Technology Officer
DM Solutions Group Inc
http://www.dmsolutions.ca/
More information about the fusion-dev
mailing list