For those of you who’ve been watching our blog, you’d probably realize that we’ve been rather quiet over the past couple months. That almost always means that we’re in heads down coding mode. And 2.9 will show it. First and foremost, this is the first of a series of blog posts that describe what is included in 2.9. Since there is a lot to cover, we’ve decided to break down the major pieces of functionality into their own respective blog posts. In addition to a number of newly added features, there are as usual, the bug fixes, enhancements to existing features, as well as newly added features other than the ones that we’ve dedicated individual blog posts to.

We’re making a request. If you are an existing customer who has let their subscription lapse, PLEASE renew it. All our work is of no use if we are not able to get it to you. We have very reasonable renewal fees, and the value you get in terms of updates, bug fixes, new features, performance improvements, as well as personalized support is immense. There have been a number of instances where customers have come to us with support requests that are time critical, and we are not able to assist because the subscription to support and updates has expired, because they chose not to or delayed renewal. We want your experience with our products and our service to be nothing short of spectacular, and we need your commitment to be able to do that.

That said, please find below, the usual list of enhancements, bug fixes and new features:

  • New Feature, All Grids, Multiple Preferences:  This feature is covered in detail in this blog post: . The following properties were added to enable this:
    • enableMultiplePreferences : A Flag that will enable multiple named versions of preferences to be persisted. This is new functionality introduced in v2.9.
    • New method: get/setGridPreferencesInfo :When enableMultiplePreferences = true, this represents a list of all preferences saved for this grid.
    • autoLoadPreferences : By default, when the grid's creation complete event is dispatched, the grid will go in and load the saved preference. This works well in most cases, but in some cases, where the data needed to build seleciton comboboxes (for filters) is built from the dataprovider, it makes sense to wait until the dataprovider is loaded to parse and set the preferences, otherwise the grid will end up ignoring saved preferences for filters that have dropdown based UI. In this case set autoLoadPreferences to true, and manually call loadPreferences when the data is recevied from the server and the dataprovider is set.
    • New Class, GridPreferencesInfo : Class added in 2.9 to support multiple preferences. Each IPersistable has a gridpreferences object, that contains an array of PreferenceInfo objects
    • New Class, PreferenceInfo : Class added in 2.9 to support multiple preferences. Store information about the name of the preference, whether or not it is a system preference (which cannot be deleted), and the preference string associated with this name.
  • New Feature, All Grids, Asynchronous Printing: This feature is covered in detail in this blog post. The following properties were added to enable this:
    • pdfPrinter : A class that pulls in a PDF library (like AlivePDF) and spits out the PDF bytes to it. We purposely do not include a concrete implementation in the core library code so that there are no dependencies on a specific PDF library and you can plug in your own. The sample project includes an example of using AlivePDF. A class that takes the PDF Pages as they are generated. This functionality was introduced in 2.9 to provide a responsive UI during the generation of the PDF. Previously, the print controller created image snapshots in memory, and handed them all to the pdf engine, which processed them individually by adding them to the display tree in one go. Instead, now, the step of the snapshot itself adds the image to the pdf doc and this whole thing runs inside a timer so the UI has an opportunity to update itself. First, you specify a class that implements IPDFPrinter as the pdfPrinter property. The AlivePdfPrinter is a sample implementation of IPDFPrinter. This class should expose the methods defined in the IPDFPrinter which are used as such: The beginDocument method is called when the Print controller is ready to send out the pages. For each page generated by the Print Controller, the addPage method is called. Once all pages are added to the doc, the endDocument method is called.
    • PrintOptions, asynch : Flag to enable asynchronous processing of the print results. If you set this to true, the pages are processed in timer events, giving the application an opportunity to show progress and prevent timeouts. Asynch can only work if you specify the preview flag, because the print then shows the progress in the preview window, and uses the preview window as a parent container.
    • PrintOptions, asynchDelayCapture : Flag to wait for the grid to completely render prior to capturing a snapshot for printing. The way the print works, is that it renders each page of the grid takes a snapshot and adds it to the print object to be spooled to the printer. Same concept applies to pdf where instead of adding to the print object the snapshot is converted to an image and added to the pdf bytestream. This does not work well in scenarios where you have external images that are loaded by url as opposed to using embedded assets. In scenarios like these you may need to add a delay to the printing mechanism to ensure that enough time is available for the external images to load. This flag, in combination with the asynchTimeInterval lets you control the amount of time that the print mechanism will wait after the grid is rendered to capture the snapshot.
    • PrintOptions, asynchTimeInterval : The time interval, in milliseconds, used by the timer of the execute() method to iteratively process pages. You can set it to a higher value if you want to wait for longer before the next page is processed. This is used in cases where you are loading external images in your item renderers. Please make sure you also set asynchDelayCapture to true in this scenario. The default value is 1, which allows enough time for the UI to update itself to show the end user a progress bar and also prevents timeouts while printing or exporting to pdf a large number of pages.
  • Enhancement/Bug Fix, All products:  Module support within popup windows. More details about this are included in this blog post The following properties were added to support this:
    • useModuleFactory : Flag that indicates to use the module factory of the grid to show popups. Use this when you are using modules and your parent application is not under your control. Please note, you will still need to ensure that the parent application imports PopupManager. http://bugs.adobe.com/jira/browse/SDK-873
  • Enhancement, All Products:  Ability to associate custom data with preference persistence. The PreferencePersistenceEvent now has a “customData” property that will piggy back along with the default persistence properties for preference persistence.
  • Enhancement, All Grids:  Added the new useExcelExporter flag along with the new ExcelExporter which provide HTML based excel export. Not only does this create a .xls document as opposed to .csv document, but also it handles non ASCII characters better than the stock CsvExporter. Example here: HTMLExcelExporter.mxml (2.45 kb)
  • Enhancement, All Grids:  Added two new events beforeExport and afterExport which let you fully customize the exported output.
  • Enhancement, All Grids:  Ability to define the behavior of hidden columns when you do print or export. The following new properties were added to PrintExportOptions support this functionality:
    • hideHiddenColumns : A flag that will hide any columns that are not visible from being printed or exported by default. User can still go into column picker and include these columns. To disable the user from printing or exporting invisible columns altogether, please use the excludeHiddenColumns instead. Please note, when you set this flag, the columnsToPrint will get overwritten, so any changes you make to that array will be ignored.
    • excludeHiddenColumns : A flag that will disable the user from printing or exporting invisible columns altogether . User cannot go into column picker and include these columns. To hide any columns that are not visible from being printed or exported by default, please use the hideHiddenColumns instead.
    • For Ultimate, the following properties were added:
        • printOptions : The Print options object that is used to configure the print behavior - currently only supported in Ultimate.
        • pdfOptions: The Print options object that is used to configure the pdf behavior - currently only supported in Ultimate.
        • wordOptions: The Export options object that is used to configure the word export behavior - currently only supported in Ultimate.
        • excelOptions: The Export options object that is used to configure the excel export behavior - currently only supported in Ultimate.
    • For all the above properties, you can set the defaults for the hideHiddenColumns and the excludeHiddenColumns on basis of your needs. For example:

public class YourDataGrid extends FlexDataGrid

          {

                   public function YourDataGrid()

                   {

                             super();

                   addEventListener(FlexEvent.CREATION_COMPLETE, onCreationComplate);                                 

                   }

 

                   protected function onCreationComplate(event:FlexEvent):void

                   {

                             printOptions.hideHiddenColumns=true;

                             pdfOptions.hideHiddenColumns=true;

                             excelOptions.hideHiddenColumns=true;

                             wordOptions.hideHiddenColumns=true;

                             pdfPrinter = new AlivePdfPrinter;

                   }

}

OR

                             <nestedtreedatagrid:FlexDataGrid id="grid"  creationComplete="grid.printOptions.hideHiddenColumns=true; grid.pdfOptions.hideHiddenColumns=true;"


  • Enhancement/BugFix, MultiSelectCombobox:  Added the useModuleFactory style property for better support within modular applications.
  • Enhancement, MultiSelectCombobox:  Full KeyBoard support, including Arrow Keys, Space based selection, tab keys.
  • Enhancement , Combobox:  Added the “rowHeight” property to specify a custom row height for the dropdown items. Fixed bug with the addAllItem flag is set to true, and the combobox is rebuilt, the first non-All item is selected by default.
  • Enhancement, DateCombobox:Added support to display the actual date chosen when user chooses “Custom” date range.

 

  • Bug Fix, MultiSelectComboBox:When the addAllItem flag is set to true, and the MSCB is rebuild, the first non-All item is selected by default.

  • Enhancement, Ultimate:  Convenience properties to quickly override the default popups for print/export/change/persist/manage settings. The following properties were added to support this:
    • popupFactoryExportOptions : The renderer that shows up when the user clicks on the Word or Excel button - currently only supported in Ultimate
    • popupFactoryOpenSettingsPopup : The renderer that shows up when the user clicks on the Open Settings button - currently only supported in Ultimate
    • popupFactoryPrintOptions : The renderer that shows up when the user clicks on the Print or PDF button - currently only supported in Ultimate
    • popupFactorySaveSettingsPopup : The renderer that shows up when the user clicks on the Save Settings button - currently only supported in Ultimate
    • popupFactorySettingsPopup : The renderer that shows up when the user clicks on the Settings button - currently only supported in Ultimate
  • Enhancement, Ultimate:  Added the new OLAPFlexDataGrid, an extension to Ultimate that supports OLAP Queries. More details here.
  • Enhancement, Ultimate:  Much better and faster mechanism for drawing filler cells. The new default for enableFillerRows is true. This means that when there is not enough data to fill the entire height of the grid, blank rows will be drawn to fill up the space.
  • Enhancement, Ultimate:  Variable Header Row Heights. When you set “variableHeaderRowHeight” to true, and specify headerWordWrap to true for one of the columns, the grid will automatically size the header so that the header text is fully visible.
  • Enhancement, Ultimate:  Numerous documentation updates.
  • Enhancement, Ultimate:  Column Drag and Drop can be dropped on both sides of the target column, based on where you take your mouse.
  • Enhancement, Ultimate:  Numerous performance enhancements.
  • Enhancement, Ultimate:  Ability to specify which column is the collapse state column in a column group. Previously, this defaulted to the first column and could not be changed. Added collapseStateColumn and userLastColumnAsCollapseStateColumn to control this behavior.
  • Enhancement, Ultimate:  Default the Pager Control to the optimized PagerControlAS when enableDataCellOptimization to true.
  • Bug Fix, Ultimate:  Removed Flicker of the entire application when a Flexicious Ultimate Grid is added to the stage.
  • Bug Fix, Ultimate:  When columnWidthMode=fixed, user could not resize the column.
  • Bug Fix, Ultimate:  In certain scenarios, multiple change events were dispatched in response to a single user action.
  • Bug Fix, Ultimate:  Printing in a number of scenarios caused rows to be cut off or rows to be skipped over altogether.
  • Bug Fix, Ultimate:  In certain scenarios, the filtering caused items with children to no longer have the expand collapse icon.
  • Bug Fix, Ultimate:  In certain scenarios, the pager was no longer drawn.
  • Bug Fix, Ultimate:  If you have rowSpan, and the grid has scrolled down, and you change the data provider, the top of the grid is no longer drawn.
  • Bug Fix, Ultimate: If you set recalculateSeedOnEachScroll=true, and there is no data to display, null pointer.
  • Bug Fix, Ultimate: fitToContent did not take into account headerText when dataProvider.length=0.
  • Bug Fix, Ultimate: Scenarios where there was a large gap to scroll over while in edit mode caused a null pointer.
  • Bug Fix, Ultimate: Editable cells did not respect row spans and col spans.
  • Bug Fix, Ultimate: Show Hide footer when footer was above the body caused blank areas.
  • Bug Fix, Ultimate: Inner level sort did not work for XML List Collections.
  • Bug Fix, Ultimate: Fixed NPE when tabbing over a large area to get to the next editable cell.
  • Bug Fix, Ultimate: The dynamicLevelCreated event was not being dispatched in certain scenarios.

  • Enhancement, Dashboard: Task bar & Tiny Charts
  • Enhancement, Dashboard: 20% Improvement in rendering performance.
  • Enhancement, Dashboard: Added ability to embed tiny charts within datagrids (or other list based controls)
  • Enhancement, Dashboard: Animation for close, minimize and open transitions.
  • Enhancement, Dashboard: Added the dashboard task bar, and support for minimize operation.
  • Enhancement, Dashboard: Added support for 3D chart renderering for column and bar tiny charts.
  • Enhancement, Dashboard: Added new component: ExtendedTitleWindow - Extend the Spark TitleWindow to add support for maximize, restore, maximize on double click. resize, and close button.
  • Bug Fix, Dashboard: Preference persistence for dashlets did not work in certain scenarios.
  • Bug Fix, Dashboard: Printing for maximized dashlets did not work.
  • Bug Fix, Dashboard: Resizing the tiny charts did not re-render the chart in certain scenarios.

 

  • Bug Fix, Spark: Fix for grids with horizontal scroll on, filtering caused filters out of the view port to loose filtered state.