The days of building Web applications from scratch are over, as a variety of JavaScript libraries are freely available to provide a solid foundation. One JavaScript library that I recently learned about is qooxdoo (its Web site prescribes pronouncing the name as "cooks do").

It is an open source AJAX Framework that simplifies building Web user interfaces.

I decided to take qooxdoo for a test drive, and the results left me feeling cold. If you want to check out the library for yourself, this article provides some information that will be useful to you.

How to get qooxdoo

Qooxdoo is freely available for download in these options:

|> Quickstart: This is the easiest way to take a peek at qooxdoo. A simple application is included, along with a pre-build script, so no software is installed on your system. You can view the samples via your browser.
|> Evaluation: This allows you to view qooxdoo in action without actually installing any software. You can run all sample code to get an idea of what qooxdoo can do for you.
|> SDK: All source code is included, so you can dig into the meat of qooxdoo. It allows you to build full-blown qooxdo applications. It does require some system setup to use the integrated tools.
|> Skeleton: This is a starting point for building custom applications via qooxdoo. The build process has been pre-configured, so you can concentrate on development as opposed to system setup. This download is included with the SDK installation as well.
|> RPC backend: A number of RPC servers are available in a separate download. This allows you to setup RPC calls to the servers in your JavaScript code (via qooxdoo).

Each download option includes a link for the latest stable build as well as a link to older builds. The downloads are contained within compressed files that include release notes and a readme file to guide you through any necessary setup. You can take a look at the quickstart or evaluation downloads to get an idea of what is possible with qooxdoo.

What qooxdoo provides

I am always a bit apprehensive when approaching JavaScript libraries or any programming language add-ons; my main concern is compatibility. I avoid libraries that extend basic functionality, thus adding its own twist. A good example of such an approach is most things from Microsoft.

I am happy to report that qooxdoo does not extend native JavaScript; this makes it easy to integrate with other libraries or custom code that you may be using on a project. The JavaScript within qooxdoo is completely object-oriented and based on namespaces. There are currently about 350 classes in the library.

The code has been tweaked and tested to eliminate any memory leaks, and popular browsers (Internet Explorer, Firefox, Opera, and Safari) are supported.

Along with the base JavaScript framework, qooxdoo includes a GUI toolkit and is AJAX enabled. Qooxdoo provides these features through its JavaScript code:

|> Event-based programming: It fully supports events-based programming to handle user interaction within the UI. In addition, you can use AJAX functionality to communicate with the Web server.
|> Layout manager: Qooxdoo provides various ways to lay out a UI, including the Canvas, Box, and Grid. The concept of a layout manager will be familiar to Java developers. The layout managers are flexible and provide support for auto-sizing UI elements.
|> Widgets: Various UI elements or widgets are available to quickly build a Web interface. This includes building a menu, toolbar, text fields, and so forth.
|> Themes: Qooxdoo allows you to set up and use consistent presentation or themes for a Web application. This includes such things as colors, fonts, borders, and icons.
|> Communication: Qooxdoo embraces AJAX. You can easily achieve server-based communication using the XMLRequest object.
|> Internationalisation: Qooxdoo has built-in support for both internationalisation and localisation, which provides support for all languages and locales across the world.
|> Build system: UNIX-style make commands supposedly hide complexity. Class dependencies are automatically resolved, and JavaScript compression is employed.
|> Optimised code: The code has been designed for high performance applications with no memory leaks present.

Licensing

Current and future qooxdoo releases are made available under the GNU Lesser General Public License (LGPL) and the Eclipse Public License (EPL). You choose which license to follow, so review both licensing options before using qooxdoo in an application.

My thoughts on qooxdoo

My very first impression of the qooxdoo library was positive, but this quickly went south as I dug deeper into actually using it. First, it has been developed on UNIX with UNIX in mind. This is painfully clear to non-UNIX developers when qooxdoo requires usage of many UNIX-based tools like make. The setup requirements for Windows are complicated, and the process of actually building and rolling out an application is confusing and not worth the time. However, you may have a different opinion when or if you give it a try.

You decide

The abundance of free code both simplifies and muddles the life of a developer. The code available via libraries such as qooxdoo is well-tested and rock solid, but deciding on which library to use (if any) can be an arduous process.

If you are looking to build power Web interfaces that employ AJAX functionality, qooxdoo may be a good choice. The key is that you need to spend time learning about it in order to make a well-informed choice.

Have you used qooxdoo in past or present development projects? Do you prefer other libraries? Share your thoughts and experience with the Web development community by posting to the article discussion.

Wide World of Web This was published in Wide World of Web, check every Wednesday for more stories

Related links

Comments

1

Dan McDonald - 20/05/08

Thanks, this was a good, brief overview of the framework.

» Report offensive content

2

PICO - 05/08/08

Yes, your assessment of the Qooxdoo framework is RIGHT ON THE MONEY. It is a good framework, it is headed in the right direction, BUT it is just not quite there yet. It is an overall confusing mess. You CAN get good results (like I did) if youre willing to spend a LOT of time figuring things out for yourself. The documentation, while there is a lot of it, actually is not very helpful at all. Alot of it is outdated, or simply missing, or written in terse broken english that is not helpful at all. That being said, I think Qooxdoo can and will get better. I think the devs need to concentrate on making this a little more straighforward for windows developers specifically. Having to use cygwin is a pain in my ass, along with all these compile and moving shit around and folders freakin everywhere VERY CONFUSING

» Report offensive content

3

Jason Sage - 18/08/08

I am not a stranger to UNIX or Linux (though no wiz either) so I don't mind Cygwin. I spent all day today attempting to install the qooxdoo SDK. I failed and I think its partially because the makefile stuff points to python2.5 in /usr/lib and the Cygwin I installed today had python2.5 in a different directory. (I was following the instructions on the qooxdoo website "how to" document verbatum to make sure I had the correct "optional cygwin" software) The qooxdoo makefile had python referenced as in /usr/lib ... So I tried to copy python2.5 to that directory so make would find it... no dice.

I don't know "make" well enough to get much from the error messages - (just enough to locate the wrong path :) )

I finally went back to tinker with the "Build" zip file thats available for download. (BTW 0.7.3 I think is the version I have) I was able to paste some code from the demo to a copy of the quickstart project they give ya and I was happy it ran!

I got this annoying (helpful I'm sure but) debug window popup thing. I'm posting the code (just a demo "virtual tree 1" from the "demobrowser" application, that ships with qooxdoo, worked into my quickstart "template" sample they give ya.

NOTE I also copied the media in the "resource" folder from the demo to the same relavetive location in my quickstart directory (to get the graphics and whatever things the qx classes (or I) might want.)

So - I'm still not using the SDK - but - for now - I'm going to give this qooxdoo thing a fair shake - it looks very pretty when its running!

(P.S. Look at the end of the posted source code. There are two lines:

qx.log.Logger.ROOT_LOGGER.removeAllAppenders();
qx.log.Logger.ROOT_LOGGER.setMinLevel(qx.log.Logger.LEVEL_ERROR);

They remove the debug window popup. The gentleman who posted that on the mailing list said - the second of these two lines might not be necessary but he uses it on his released stuff. So - comment out - have debug window - uncomment - Woo Hoo! No Popup!)


--Jason

/* ************************************************************************

Copyright:

License:

Authors:

************************************************************************ */

/**
* Your application
*/
qx.Class.define("Application",
{
extend : qx.application.Gui,

members :
{
main : function()
{
this.base(arguments);

var t = new qx.ui.tree.Tree("Root");

with(t)
{
setBackgroundColor("white");
setBorder("inset");
setOverflow("scrollY");

setHeight(null);
setTop(48);
setLeft(20);
setWidth(200);
setBottom(48);
};

qx.ui.core.ClientDocument.getInstance().add(t);
// One icon for selected and one for unselected states
var te1 = new qx.ui.tree.TreeFolder("Desktop", "icon/16/places/user-desktop.png", "icon/16/apps/accessories-dictionary.png");
t.add(te1);

var te1_1 = new qx.ui.tree.TreeFolder("Files");
var te1_2 = new qx.ui.tree.TreeFolder("Workspace");
var te1_3 = new qx.ui.tree.TreeFolder("Network");
var te1_4 = new qx.ui.tree.TreeFolder("Trash");

te1.add(te1_1, te1_2, te1_3, te1_4);

// One icon specified, and used for both selected unselected states
var te1_2_1 = new qx.ui.tree.TreeFile("Windows (C:)", "icon/16/devices/drive-harddisk.png");
var te1_2_2 = new qx.ui.tree.TreeFile("Documents (D:)", "icon/16/devices/drive-harddisk.png");

te1_2.add(te1_2_1, te1_2_2);


var te2 = new qx.ui.tree.TreeFolder("Inbox");

var te2_1 = new qx.ui.tree.TreeFolder("Presets");
var te2_2 = new qx.ui.tree.TreeFolder("Sent");
var te2_3 = new qx.ui.tree.TreeFolder("Trash", "icon/16/places/user-trash.png");
var te2_4 = new qx.ui.tree.TreeFolder("Data");
var te2_5 = new qx.ui.tree.TreeFolder("Edit");

var te2_5_1 = new qx.ui.tree.TreeFolder("Chat");
var te2_5_2 = new qx.ui.tree.TreeFolder("Pustefix");
var te2_5_3 = new qx.ui.tree.TreeFolder("TINC");

var te2_5_3_1 = new qx.ui.tree.TreeFolder("Announce");
var te2_5_3_2 = new qx.ui.tree.TreeFolder("Devel");

te2_5_3.add(te2_5_3_1, te2_5_3_2);

te2_5.add(te2_5_1, te2_5_2, te2_5_3);

var te2_6 = new qx.ui.tree.TreeFolder("Lists");

var te2_6_1 = new qx.ui.tree.TreeFolder("Relations");
var te2_6_2 = new qx.ui.tree.TreeFolder("Company");
var te2_6_3 = new qx.ui.tree.TreeFolder("Questions");
var te2_6_4 = new qx.ui.tree.TreeFolder("Internal");
var te2_6_5 = new qx.ui.tree.TreeFolder("Products");
var te2_6_6 = new qx.ui.tree.TreeFolder("Press");
var te2_6_7 = new qx.ui.tree.TreeFolder("Development");
var te2_6_8 = new qx.ui.tree.TreeFolder("Competition");

te2_6.add(te2_6_1, te2_6_2, te2_6_3, te2_6_4, te2_6_5, te2_6_6, te2_6_7, te2_6_8);

var te2_7 = new qx.ui.tree.TreeFolder("Personal");

var te2_7_1 = new qx.ui.tree.TreeFolder("Bugs");
var te2_7_2 = new qx.ui.tree.TreeFolder("Family");
var te2_7_3 = new qx.ui.tree.TreeFolder("Projects");
var te2_7_4 = new qx.ui.tree.TreeFolder("Holiday");

te2_7.add(te2_7_1, te2_7_2, te2_7_3, te2_7_4);

var te2_8 = new qx.ui.tree.TreeFolder("Big");

for (var i=0;i<50; i++) {
te2_8.add(new qx.ui.tree.TreeFolder("Item " + i));
};

var te2_9 = new qx.ui.tree.TreeFolder("Spam");

te2.add(te2_1, te2_2, te2_3, te2_4, te2_5, te2_6, te2_7, te2_8, te2_9);

t.add(te2);
qx.ui.core.ClientDocument.getInstance().add(t);






var commandFrame = new qx.ui.groupbox.GroupBox("Control");

with(commandFrame)
{
setTop(48);
setLeft(250);

setWidth("auto");
setHeight("auto");
};

qx.ui.core.ClientDocument.getInstance().add(commandFrame);




var tCurrentLabel = new qx.ui.basic.Atom("Current Folder: ");

with(tCurrentLabel)
{
setLeft(0);
setTop(0);
};

commandFrame.add(tCurrentLabel);



var tCurrentInput = new qx.ui.form.TextField;

with(tCurrentInput)
{
setLeft(0);
setRight(0);
setTop(20);

setReadOnly(true);
};

commandFrame.add(tCurrentInput);

t.getManager().addEventListener("changeSelection", function(e) {
if (e.getData().length > 0) {
tCurrentInput.setValue(e.getData()[0].getLabelObject().getText());
}
});



var tDoubleClick = new qx.ui.form.CheckBox("Use double click?");

with(tDoubleClick) {
setTop(60);
setLeft(0);
};

commandFrame.add(tDoubleClick);

tDoubleClick.addEventListener("changeChecked", function(e) { t.setUseDoubleClick(e.getData()); });



var tTreeLines = new qx.ui.form.CheckBox("Use tree lines?");

with(tTreeLines) {
setTop(80);
setLeft(0);
setChecked(true);
};

commandFrame.add(tTreeLines);

tTreeLines.addEventListener("changeChecked", function(e) { t.setUseTreeLines(e.getData()); });



var testButton = new qx.ui.form.Button( "Dispose selected node" );
testButton.setTop(100);
testButton.addEventListener( "execute", function( e ) {
var currentItem = t.getManager().getSelectedItem();
if (currentItem != null) {
currentItem.destroy();
currentItem = null;
}
} );

commandFrame.add( testButton );
}
}
});

qx.core.Init.getInstance().setApplication(new Application);
qx.log.Logger.ROOT_LOGGER.removeAllAppenders();
qx.log.Logger.ROOT_LOGGER.setMinLevel(qx.log.Logger.LEVEL_ERROR);

» Report offensive content

Leave a comment

You must read and type the 6 chars within 0..9 and A..F

* indicates mandatory fields.

3

Jason Sage - 18/08/08

I am not a stranger to UNIX or Linux (though no wiz either) so I don't mind Cygwin. I spent all ... more

2

PICO - 08/05/08

Yes, your assessment of the Qooxdoo framework is RIGHT ON THE MONEY. It is a good framework, it is headed ... more

1

Dan McDonald - 20/05/08

Thanks, this was a good, brief overview of the framework. ... more

Log in


Sign up | Forgot your password?

  • Staff Share a keyboard and mouse with Synergy

    Even in the era of virtualization, many IT pros (including myself) have a small army of computers sitting on, under, and around their desks. Read more »

    -- posted by Staff

  • Staff Android devs less than gruntled

    Yet more discouraging news on the Android front. Having hacked off its developer community by releasing updated SDKs to just a small group of chosen devs, Google has now given the brush-off to a petition that called for more to be given to the wider community. Read more »

    -- posted by Staff

  • Staff VMware shows how not to do it

    As a developer there will be a time when you ship a bug -- be it a stub that you left in, or a flaming, crashtastic segfault. The next time this happens and your bosses come baying for blood, point them in the direction of VMware, who this week gave the developer world a great example of how to ship a showstopper bug. Read more »

    -- posted by Staff

What's on?

  • Club Builder: Captain Obvious vs the Crackpots

    In the case of the bleeding obvious, IBM says open source needs good designers; a claim is made that China can activate your phone to snoop on you; and we take a look at the Defcon conference.