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!