The week in qooxdoo (2008-06-27)
Filed under: Activity Reports
By Thomas Herchenröder @ June 27, 2008 20:06
Portal - A Low-level DOM Demo
With Portal a new application has entered the qooxdoo trunk. This small demo shows some cool features of the new low-level layer, which will be a subset of the upcoming qooxdoo 0.8 release. This layer does not use any of the high-level qooxdoo widgets. Instead, it is a lightweight, DOM-oriented solution that provides an alternative to other popular libraries like Prototype or jQuery. Of course, it is fully cross-browser and allows for very sophisticated coding by offering all the well-known OO features of qooxdoo. A comprehensive API documentation - even for such a low-level app - can easily be generated. Be sure to check it out!
Eclipse Ganymed
Probably you have already heard about the release of Eclipse 3.4 (called "Ganymed"), which was made available about two days ago. They stick to an annual release cycle, so the new version includes a lot of fixes and improvements. If you are an Eclipse guy, you probably have the IDE (which is only one but the most prominent part of the entire Eclipse ecosystem) installed and running already. If not, this is a good opportunity to give the Eclipse IDE a try. While it may not be perfect (well, what editor or IDE is?), it is an excellent solution. Best of it, it's open source! Of course, we had to celebrate the new Ganymed release at one of the DemoCamp events.
Generator
A major part of this past week went into carving out the Config and Job classes that are responsible for providing the information from the config files to the rest of the Generator. They handle all the including of configs and expanding of jobs, returning a fully expanded job that has all the information and is ready to be run. The code is now clearer, better organized and reflects much better the "theory" behind it. I really started loving it.
On the feature level, these are the news:
- Name space-less includes
As mentioned in a previous post, jobs from external configs are added to the local job list (they are "lifted"). Previously, these imported jobs were renamed to include a prefix that acted as some kind of name space, and thus could prevent name clashes. This has been disabled by default, so external jobs will now be added to the list of runnable jobs with their original names. This puts the burden of avoiding name clashes on the importing config, but now you can run e.g. a 'source' job without even defining one.
On the other hand, you can still define optional name spaces for the job names from those imports. To support this, the syntax for the top-level include key has been changed; it is now an array holding a map for each imported external config. The mandatory entry in those maps is a 'path' key that points to the file location. If you wish to import the jobs namespaced, add the optional 'as' key in the respective map. The format for referencing those jobs slightly shifted to use '::' as a name space separator (rather than '/'), so if you used"include" : [ { "path" : "../my/other/config.json", "as" : "otherConfig" } ]you could refer to a job from that config e.g. in an 'extend' section like this
"extend" : [ "otherConfig::<jobname>" ]
and external jobs will also be listed in this form on the command line with '?' as the jobs argument.
- 'export' lists
Configs can now list the jobs they want to get exported when another config includes it. This is just a selection from the entire list of this config's job keys, and helps to limit name space pollution in the importing config. The syntax is a straight-forward top-level entry like this:"export" : [ "jobA", "jobB", "jobC" ]
- Top-level macros
You can now add a 'let' section on the top-level. Macros defined therein will be added to every job automatically and without explicit reference, so be aware of side effects. If a job already defines a 'let' map, the global map will be merged into the local in the usual way, only adding new keys and their values. This is done before any extend is resolved, so keys from the global let take precedence over all jobs from the extend section. - The rational behind it is that most standard configs can be reduced to just including the 'application.json' default config, and adding some macros. The experimental 'defaults' job that had similar qualities is gone.
The full documentation for all these config settings is available here.
If you look at the current config.json files of our standard applications (Apiviewer, Feedreader, etc.) they are on various levels of making use of configuration features. Some rely on the settings from the central application.json, others make their settings explicit, doing it more "by hand". Expect to see more features moving into these config files while the config file feature set stabilizes.
Widgets
Subcontrol support
Subwidgeting and child widget handling was a major theme this week. Subcontrol support was added to a lot more widgets thanks to Jonathan's and Sebastian's work. This new widget managment is used for lazy creation and automatic disposal of widgets, but also for the new appearance theme features. Every subcontrol is seen as a child in the appearance as well. The previously flat structure flag keys became somewhat structured resembling XPath expressions, e.g. "spinner-up-button" became "spinner/upbutton". Here are some more facts:
- These widgets now use child controls:
SplitPane, ComboBox, SelectBox, Spinner, Toolbar, TabView - These widgets use remote children handling now:
ComboBox, SelectBox, Toolbar - ComboBox and SelectBox have gotten a nice "Modern" theme.
- All appearance names have been consolidated (e.g. it is now "textfield" instead of "text-field")
Spinner
The Spinner is completely themable with all internal children by changing the (public) appearance property. All internal widgets get updated automatically. The minimum/maximum handling of the Spinner was improved. The new version does not accept a value anymore which is out of the currently configured range. The old version did some implicit normalization which is not regarded as a good idea anymore.
ScrollArea
Some remaining issues in the ScrollArea were fixed. The scroll-into-view feature is now available on every widget and is automatically scheduled using the queue managment when the widget or the child to scroll is not rendered at the moment. Gecko and Safari lost the current scroll position when a DOM node gets invisible or temporarly removed. This is an issue for us, especially in the new Selectbox and Combobox widgets because they should re-open the popup in the state they were closed. The scroll area now takes care of these issues and recovers the last known state on every open of the popup.
Miscellaneous
The Element event handler was fixed. After some rework of the event system some weeks ago this handler got a few issues. Events like "scroll" or "load" etc. should now work again.
The Selectbox and Combobox widgets have gotten another bunch of love. They are now regarded as nearly feature complete and appear to be quite solid already.
The Splitpane widget has got a lot of fixes to improve the rendering in some edge cases. The issue where the splitter was moved some pixels away from the cursor on the mouse up event was fixed as well. There are no known rendering issues anymore in the splitpane. Please try it yourself.
Global cursor support was re-introduced in the trunk. As this was a performance issue in IE all the time and never worked 100% OK, the feature was removed in IE. In all other browsers the feature is quite cool, especially for scenarios like resizing or drag&drop where the original target is left during a mouse move sequence. You can see the feature yourself in the Splitpane demo.
Some minor issues with the event handling where fixed. The last weeks version had issues to remove captured listeners. This is quite critical in some areas and good to know that it should now work correctly.
That's for this week's report - have a nice weekend!

Comment by petr
Nice work,
I’m looking forward new release
June 27, 2008 20:49
Comment by Gaëtan de Menten
Here are my comments at this point… You are probably aware of most issues, but maybe not all… The portal demo is impressive… Seems very responsive/fluid. The spinner demo has a problem with the numberformat stuff, and when using the keyboard to change its value (the corresponding button gets stuck). Is a more Modern appearance planned for the spinner, slider and splitpane?
Window browser’s window close button doesn’t seem to work. The two first demo in “animation” don’t seem to work anymore (or any other demo which used the modern appearance).
The first tab in TabViews seem to be missing the left border when activated, it’s a bit ugly.
June 27, 2008 20:58
Comment by LH
In the portal demo a drag and drop selects a lot of the text around the box that is moved. I think you should deactivate the text selection there
(tested under ubuntu 8.04 with firefox 3.0)
June 27, 2008 21:00
Comment by Sebastian Werner
Thank you for your feedback. Really appreciated. The mentioned bugs are mostly known. We will fix them until the final release. This is just a snapshot of our current work.
@Gaëtan: Yes, a modern theme which covers all widgets is planned for 0.8. Currently all demos use the classic theme because of the latest editions in the theme system e.g. sub control handling, which is not yet ported to the Modern theme.
TabViews are still in the works. This is just a really early version. To fully support them we need to wait for state inheritance support which is planned to be included in the forthcoming alpha2.
June 27, 2008 21:36
Comment by qxlover
When will Table be ported?
June 29, 2008 15:47
Comment by Krycek
Every week 0.8 looks better and better!
I can’t wait to see what you will do next
June 29, 2008 21:44
Comment by Sebastian Werner
The table is planned for after-alpha2. This means somewhere in July.
July 1, 2008 08:24