qooxdoo 0.8.3 (2009-09-10)

Summary

qooxdoo 0.8.3 is a solid maintenance/bugfix release. A main focus was on consolidating and stabilizing some of the framework’s API, so you should expect quite a number of deprecations. Those typically won't affect yourbuild" version. Instead, the deprecation warnings of your "source" version will be a rather straightforward guide you'd follow to replace legacy API manually. The 0.8.3 release also continues to ship with some larger features that are either new () or have matured (data binding).

It is recommended that users upgrade their existing to this latest stable version.

Highlights

  • New Form Handling
  • Unified Selection API
  • New FlowLayout

Framework

Core

Global Error Handling
  • Added support for a global exception handler. The technique is covered in detail in a separate blog post.
Type checks
  • Type checks in JavaScript are surprisingly hard to get right. To solve this issue on a framework level we have introduced the qx.lang.Type utility class, which contains type checks for all native JavaScript types.
Client Detection
  • We changed the client detection for Internet Explorer 8. The qx.bom.client.Engine.VERSION is always set to 8.0 when an IE8 is detected. To determine the mode in which IE8 runs, the new attribute DOCUMENT_MODE can be used.
  • qooxdoo now also detects Adobe AIR and Gears.
Internet Explorer
  • Improved console support for IE8. The console can now be used to log messages similar to the FireBug console.
  • ResourceManager class now offers a better support for IE in HTTPS mode.
Debugging
  • To gain a better debugger and profiler support we introduced the support for the displayName property on function objects. This greatly enhances WebKit debugging/profiling of qooxdoo applications.
Translation
  • The framework now comes with an additional Dutch translation (thanks to Isaak Malik).

Application

  • Inline applications will warn users when the container element has no dimensions and dynamics are on.
  • Several fixes for inline application / inline root widget

Transport

  • A fix to prevent a request timeout after the user handler was called, has been committed by Derrell Lipman.

Low-level

  • Introduced low-level blocker class to either block the entire document or a specific element
  • Introduced low-level window class to work with native windows
  • Added caching of the text selection. As a consequence of this enhancement you can select text even if the DOM element itself is not yet available.
  • Improved qx.bom.element.Location, which now supports margins on the body.
  • Class qx.xml.Element now supports XML namespaces in its methods selectNodes() and selectSingleNode().
  • qx.util.ColorUtil now accepts rgba values for cssStringToRgb().
  • qx.util.NumberFormat: A new changeNumberFormat event is fired if the prefix or postfix changes.
  • qooxdoo's CSS selector engine has been updated to the latest version of Sizzle, which is also the engine used in jQuery.
  • Fixed a rare race condition in animations, which could prevent effects from being started.
  • Improved keyboard handling performance in Firefox.

GUI Toolkit

UI Core

Selection API
  • The selection handling of the widget system was reworked and consolidated. The old selection API had a different API for multi and single selection. Therefore a new Selection API was implemented, to get a consistent API for both cases. For more details have a look at New Selection API. A handy feature was also added: a new method invert() is available to, you guessed it, invert a multi selection.
Tooltips
  • In addition to a widget's toolTip property two additional properties toolTipText and toolTipIcon have been added. These properties use a shared tooltip widget instance, which helps to reduce the memory footprint of an application.
  • The tooltip manager has been improved and now supports tooltips for invalidation messages.
Blocker
  • Added new class Blocker, which allows to use more than one blocker instance.
Appearance
  • A syncAppearance event has been added to qooxdoo widgets. This event is fired after the appearance has been applied. This way it is possible to react on state changes and to read property values originating from the appearance theme.
  • Monospace fonts are now really monospaced under Mac OS X.
Misc
  • Widgets can fire a beforeContextmenuOpen event before a context menu is opened.
  • Every widget now fires the createChildControl event after a child control was created
  • All widgets now have a getChildren() method which returns only those child widgets that were added by the application developer using the add() method.
  • Reintroduced isSeeable() on every widget which returns whether the widget is visible on screen.
  • turned ResourceManger into a singleton, changing static methods to member methods, adding deprecation to the static methods. Use qx.util.ResourceManager.getInstance() now to access the previously static members.
  • Renamed methods of text selection API and deprecated the existing ones
  • Removed flickering of drag&drop cursor for IE browsers
  • Deprecated getToolbar() method in favor for getMenubar()

Data Binding

  • General improvements in most of the classes.
  • The JSON marshaler has changed its API to a more general way.
    • An IMarshaler interface has been introduced.
    • A static createModel() function can now be used to create models.
  • A set of default converters has been added to the framework by qx.data.Conversion
  • Two serializers for qooxdoo model classes have been added to qx.util.Serializer named toJson() and toUriParameter()
  • A new controller has been added, which is responsible for binding a form to a model. For more information take a look at the wiki documentation of the data binding or at the form controller demo.

Layouts

Flow Layout
  • The flow layout manager has been re-added to qooxdoo. It hasn't been part of the framework since the 0.8 release. A flow layout renders widgets just as a word processor renders text. Widgets are placed one after the other until there is no space left on the current line. If a widget doesn't fit into the remaining space of the line, a new line is created and the widget is placed at the beginning of the new line. The flow layout is based on the excellent community contribution by Chris Banford. See demo or docs.

Widgets

Flash
  • Migrated the missing embed widget for Flash movies from the old qooxdoo 0.7.4 release. Along the way we improved support for the External Interface of Flash to allow for a two-way communication between ActionScript and JavaScript. See the Flash demo. Known issue: hiding and showing the widget reload the Flash movie Bug 2367
ThemedIframe
  • If possible qooxdoo renders its own scroll bars instead of the browser's native scroll bars. This allows us to style the scroll bars the way we want. One place where native scroll bars were still used was the Iframe widget. We now have an additional ThemedIframe class, which uses qooxdoo's themed scroll bars if possible. Due to security restrictions of the browser this is only possible if the iframe's source is served from the same domain as the main application.
RadioGroup
Menu
  • Added feature to block the background if the menu is shown. This is interesting for context menus and can be activated with the blockBackground property.
  • Menu widget now only opens if valid opener widget is configured
ComboBox and SelectBox
  • Improved the pop-up list of both widgets. In some use cases it could happen that the pop-up list wasn't in sync with the selected value.
  • Fixed issue with '@' and '€' characters in ComboBox widget
Spinner
  • qx.ui.form.Spinner: Now updates its textfield if the application locale changes. This affects the display (e.g. the decimal separator which might change across languages) as well as the input filter.
DateField
  • Changed default date format from 'short' to 'medium' for the DateField widget
Resizable Widgets
  • The MResizable mixin has been enhanced to allow for setting the resizability of each edge separately. This affects for example the window widget.
Table
  • Table pane now supports the paneReloadsData event
  • The table model now offers a new event sorted to signal sorting changed
  • Improved performance of remote table model by allowing only a single pending request for row count at the same time
  • Automatic selection of table rows by the keyboard can now be turned off - see new property rowFocusChangeModifiesSelection
TabView
  • TabView buttons can now have a close button (Demo). Also improved the look of the tab view when using small icons, and also enabled centered text.
SplitPane
  • It reacts quicker in Opera and shows the correct cursor in some edge cases. It also has a new property indicating at which distance the resize cursor should be shown.
List
  • The List widget no longer blocks default keys. This was really annoying, since one could not use browser shortcuts (e.g. open a new tab) when a List widget was focused.
Misc
  • TextArea now supports maxLength.
  • Fixed property "selectable" on Label.

Virtual Widgets

  • TreeVirtual: When a node is added to a tree, two icons can be provided: one for when the node is not selected, and one for when it is selected. In this case the icon must be refreshed when the row is selected. For that to happen you now have to set the alwaysUpdateCells property to true. Unlike the previous releases the default value of alwaysUpdateCells was left at Table's default of false. Please note: When setting this property to true you incur a failure of double click events in IE and also of immediate selection of a row upon right-click (and sometimes left-click too). Bug 605.

Theming

HBox/VBox Decorators
 
* Since version 0.8 of qooxdoo we have the Grid decorator. The Grid decorator can be used to set an image background in a way that scales the inner parts but leaves the border images intact. The grid is very powerful but in some cases it might not be necessary to resize the widget in both dimension. For the special case that a widget is only stretched in one dimension we have added the HBox and VBox decorators. They use three images and only scale the middle image. In comparison to the Grid decorator, the HBox/VBox decorators require 6 DOM elements less.
Misc
  • The decorators "Uniform", "Single", "Double" and "Beveled" now also support to set the background image position.
  • include now no longer fails on key collisions by quietly ignoring them (the original theme wins)

Form handling

  • Many bugfixes and improvements.
  • A buddy property has been introduced for the label. With such a buddy, you can connect a label to a form item, e.g. to properly set the focus when clicking on the associated label. Give it a try in the form showcase.
  • All text input fields do now have a liveUpdate property, which configures if the changeValue event should be fired on every keystroke or only when focus is lost and returns.
  • A placeholder, also known as "ghost", has been introduced for text inputs.
  • Additionally, a filter for input fields has been introduced.
  • We have normalized the API for all form widgets. That included adding interfaces for all necessary purposes.
  • With that refactoring of the widgets API, we introduced invalid states for all widgets. These states will be displayed as a red broder in most cases.
  • Additionally, the qx.ui.basic.Label has been included in the API change so that is has the same API as a TextField for example.
  • During those changes, we fixed a misbehavior in the ComboBox which always added the first item of the list in the textfield.
  • The old name / value pairs on all form widgets has been deprecated.
  • On top of that new states and refactored API, we built a validation manager named qx.ui.form.validation.Manager which can validate widgets synchronously and asynchronously.
  • Another task of a form is resetting the whole form which also has been added in a separate class called qx.ui.form.Resetter.
  • On top of those two features, another layer has been added. This layer is responsible for the whole form handling and rendering. For that, we introduced a special renderer interface for forms and a set of default renderers. Take a look at the demos to see what renderers are included: Single Column Double Column Single Column using placeholders Custom Renderer.
  • Another new widget is qx.ui.form.RadioButtonGroup which can be added to the layout and takes the RadioGroup for the logical connection of the added RadioButtons.
  • Take a look at the new form handling wiki documentation to get more details on the whole form handling.

Applications

Inspector

  • Done some bug fixes, specially issues with the property window. Also took care of lint issues and potential memory leaks.
  • The Inspector's widget window can display either the public children hierarchy or the full internal hierarchy, which includes sub controls implicitly created by those widgets.

Demobrowser

  • The Demo Browser shows the correct demo titles again.

Playground

  • The code behind the editor, i.e. the excellent CodeMirror project, was updated to the latest snapshot, which should include many bugfixes for various browsers.
  • The playground saves the user entered code as a hash in the URI, which has some nice benefits: You can link to examples in the playground, and you won't loose your code on application reload.
  • The entire playground app can now be debugged with the Inspector, i.e. you can now also examine the results of your code snippets entered into the playground editor, e.g. inspecting a widget by mouse or displaying its widget hierarchy.
  • To prevent unintended code loss the switch between samples must now be confirmed.

Feedreader

  • The feedreader is now also available in Dutch (thanks to Isaak Malik for providing the translation).

Test Runner

  • The selected tree node is now saved in a cookie and reselected when the testrunner is being reloaded. The width of the testrunner's panes is saved as well and restored on reload.
  • Stack trace information in the test results can now be toggled on/off.

Tooling

The qooxdoo tool chain saw a lot of bugfixes, refactoring and refinement.

Generation

  • Allow configuration of system wide cache dir; implemented single-file cache locking so no two concurrent generator runs can access the same cache item simultaneously.
  • Allowed lib scan results to be cached to disk (previously: only memory), allowing to take advantage of unchanged libs across generator invocations. while this won't make a difference when building Demobrowser, it should make one during development life-cycle and re-compilation of a certain application, especially on platforms where disk scans are expensive.
  • Variant calculation now takes advantage of the file caching strategy.
  • Cross-Drive Setups on Windows has been addressed. Now it is possible to distribute your qooxdoo setup across local Windows drives. For example, you can unpack a qooxdoo SDK on one drive and create and work with an application on another.
  • Unicode support was improved, particularly for application namespaces.
  • Analysis work and code improvements were done for resolving dependencies within qooxdoo classes. This area needs further work to address some problematic cases, e.g. static, stateful classes.
  • Fixed a few issues of correctly url-encoding certain parts of an uri.
  • Add support for dumping dependency information as native Json, or as Dot or Flare dependency graph format. See "log/dependencies" config syntax.

Configuration

  • Unified "debug" subkeys under the "log" key, so we have a single point of config for all reporting features; the "log" key is now interpreted both declaratively (adding aspects to other actions like compilation) and imperatively (triggering the execution of dedicated actions). The "log" key might evolve into the single interface for a rich set of logging, tracing and reporting features.
  • changed format of the "combine-images" config key, to take more information than before; this way, the generated .meta files now only contain "image Id's", through providing "prefix" attributes with the involved paths which are then stripped for the .meta file; as a consequence, the format of the .meta files changed too.
  • The 'resource' key in decoration and icon themes was too limited. It was only possible to set exactly one resource directory. It has been replaced by the new 'alias' key, which expects a map as value. The map keys are the alias names and the values the corresponding resource directories.

Optimization

  • Private optimization is now reliable accross multiple runs (i.e. classes).
  • fixed bug in variable optimizer where names that were declared ('var' or param) but never used could be captured.
  • major re-write of the way the leading variable is detected in a dotted chain of identifiers (like foo in "foo.bar.baz"); this also affects the compiler (variableoptimizer).
  • Handling of parts has been reworked, particularly the collapsing of packages in a part. Modularizing a large app into so-called parts is an experimental feature targeted for a future release.

Code Validation

  • major revamp of the ecmalint checks for privates, protected and implicit members, to allow fine-tuning of respective check scope; e.g. privates are now checked in all occurrences, both rvals and lvals, not only lvals as before.
  • made checking for multiply defined vars optional (action "multidefined_variables"), i.e. you have to explicitly specify it if you want it.
  • Now most of the framework code (i.e. excluding legacy, tests, application) is validated and basically ecmalint-compliant.

Contributions

  • It is now quite easy to setup a typical project for qooxdoo-contrib. The create-application.py script can now also generate a so-called "contribution" skeleton. This skeleton is pre-configured and adopted to the qooxdoo-contrib infrastructure.

Documentation

  • There should be full API coverage (except for the experimental qx.ui.virtual). Thanks to an excellent contribution by Nick Glencross, many misspelled API docs, some inline comments and a few error messages were corrected.
  • As a reminder see the searchable API viewer, which is also prebuilt into the SDK, so it runs out-of-the-box without installation.

Migration

  • Since the 0.8.3 had the focus on consolidating and stabilizing much of the framework's API, you should expect quite a number of deprecation warnings in the console when running your "source" version of your app in 0.8.3. The "build" version however should to a large extend work as before, since the deprecated API is still supported. There are a few cases that could not properly be deprecated (e.g. some form or value handling). Just follow the deprecation warnings an replace the mentioned code constructs step-by-step.
  • As mentioned we changed some implementations of value properties (return type for example) on form items. This as well as the consolidated selection API might be the areas that most of your manual migration work goes into.
  • Configuration of parts (an advanced, experimental feature) has changed from 0.8.2 to 0.8.3. You'd have to adjust your config.json.