Tuesday, July 13, 2010


Version 1.0 of Sage is finally out and there are a couple of noteworthy changes.

All Non-OSS dependencies removed
  • Prior to v1.0 the commercially licensed JIDE libraries were needed to launch Sage. This is no longer the case. The only library now needed is the jide-oss library. If the basic Swing components plus jide-oss meet your needs, then you are good to go. The Black Majic and Covergirls demo use this configuration. Check them out to see an example of the available functionality. Here is some of what will not be available, all specialized tables (including tree
    and property tables), JIDE specific table enhancements like header/footer tables, column/row spanning, all table editing enhancements (Sage and JIDE), specialized combo boxes ( including the date chooser and color chooser ), docking and frames, and the specialized tab panes (outlook, floor, document).
Native Browser Support
  • Thanks to the fine work by the folks at the SWT Project and Christopher Deckers Native Swing Project, you can now embed the native browser in Sage apps (IE on Win32, Safari on OS X, and Firefox on Linux). The JVM property -DSage.webBrowser=swt enables this feature and registers the appropriate mime types and viewers.

New Default LNF
  • There is a new Default Look And Feel (LNF) which is the LNF used when you don't specify one or you use the name "Default". This is basically the System LNF on windows and Mac and the Cross Platform one on Linux with some platform specific enhancements and some standard UI properties and colors set. Using this LNF and setting the Sage.control color property will give you nice gradients (for light colors) derived from the specified color. It will also give you the improved HTML support and nice looking combo boxes, spinners and scroll bars on non-Mac platforms.

Improved HTML Capabilities
  • Hyperlinks in Table and List viewers - Table and List viewers now support hyperlinks via the default Label renderer. You can use HTML links in your table/list data and then attach a hyperlink listener the table/list. Sage will invoke the appropriate method (entered, exited, clicked) when the user interacts with a hyperlink. HTML 5 Canvas support - An HTML 5 Canvas widget has been added. This widget supports the HTMLCanvasElement and CanvasRenderingContext2D APIs such that any code written for those APIs will run unmodified in Sage. You can also retrieve a CanvasRenderingContext2D handle that will allow you to draw on the background of any Sage widget via this API. The cool thing about supporting this API is not the functionality it exposes (you already have the full Java2D API at your disposal), but the ability to leverage libraries written to this API. Supposedly Flash CS5 will emit code for the HTML5 Canvas. See the Black Majic demo for a couple Chrome Experiments demos running in Sage.
  • HTML Lists Enhancements - The default Swing HTML list painter has been replaced so that now bulleted lists are painted properly and they scale as the font size increase. Also there are new actions for inserting lists into existing HTML text and they should work as expected (i.e. not the default Swing behavior).
  • Dynamic color support - You can now use any Sage color name in your HTML and style sheets. If that color is a dynamic color then the color of the rendered HTML will change whenever you update the dynamic color's value.
  • Enhanced support in Labels. A new UI property has be introduced (Sage.Label.useCustomEditorKit) that when set to true will allow labels to take advantage of all Sage specific HTML enhancements. This means that all global styles defined in your custom style-sheet will be utilized by labels (including dynamic colors). Labels also support hyperlinks and expose APIs to find the link or text under the mouse pointer. The Black Majic demo makes minimal use of dynamic colors and a custom style sheet. This property is automatically enabled under the default LNF

Improved Asynchronous Programming Support.
  • All runnables now support the ability to specify code that gets called when the execution of the runnable has completed, and code that gets called when the runnable is canceled. You can also be notified via the standard Java wait/notify model wen the execution is complete.
  • New APIs for the delayed retrieval of icons/images with the ability to specify the image to display while the requested image is still being loaded. The ability to isolate background loading of images such that they don't block other background tasks from running.
  • Support for animated spinners that can be displayed while background tasks are running

Check out the Boondoggle Facebook application which showcases all of the new HTML enhancements (except for the Canvas) and the heavy use of the asynchronous capabilities to arbitrarily cancel pending data loads and start new ones. Even if you don't have a Facebook account you can still see some additional screenshots as the Boondoggle's page is public. Below is a screen shot of Boondoggle displaying the Facebook feed for Nickelback. What you are looking at is a TreeTable widget rendering the HTML(the bright white text are hyper links). This particular table also supports text selection and copying (like in a text editor). The text "They have extended their Dark Horse World Tour. The next leg of the tour, produced by Live Nation, will begin on September 14 in Nashville and will run through October 30 in Las Vegas." was copied and pasted into this document. This functionality is implemented in JavaScript using a custom background painter and the ability to find the text at any point in a label-based renderer.

Boondoggle Facebook Application