The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
CHANGELOG

Version 2.1, released 01-Jul-2007
    
    Fixed blocking of insert / delete / apply operations when open in read_only mode
    Imported setup_combo() from Gtk2::Ex::DBI - setup & requery a combo
    Added on_row_select key to run external code when a row is selected
    Fixed text of error message when closing a windows that had an 'un-applied' datasheet
    Don't include identity columns in insert / update SQL ( fixes SQL Server updates )
    Added support for setting individual fields read_only
    Renamed column_value() to get_column_value() and added alias
    Added set_column_value()
    Renamed column_from_name() to column_from_sql_name ( and add legacy support )
    Don't append a primary key column if one is already defined
    Fixed warnings when hiding the status column ( don't set width to 0 )
    Fixed warnings when searching for a primary key ( uninitialised value )
    Renamed packages for custom cell renderers from MOFO:: to Gtk2::Ex::Datasheet::DBI::
        - even though the MOFOs still don't work :)
    Queue iter deletion until the end of the apply() method ( otherwise can't move to next )
    Added before_apply key to object constructor, to run external function before applying
        - return 1 to allow update, return 0 to abort update ( and continue with next record )
    Added 'no warnings' directive and commented out 'use warnings'. Switch around if you want warnings
    Added 'align' key to field hash - use either a string or a decimal from 0 to 1
    Default to right alignment for number fields
    Added DOUBLE to the list of numeric fields
    Added 'access_time' renderer to deal with weird MS Access formatted time values
        ( 1899-12-30 hh:mm:ss ) format - ie ALL times have 1899-12-30 prepended to them
    Allow setup_treeview() to continue without a primary key, but force to READ-ONLY
    More verbose and prettier warnings
    Added missing documentation for foreground_colour key in fields hash
    Fixed warnings when rendering a date cell with a NULL date
    Added support for pass_through queries that return a recordset ( including stored procedures ) - read_only
    Better detection of DATE column types from column_info ( use regex instead of exact match )
    Optimisation: Use stock gtk2 text renderers where possible ( ie when read-only )
    Added support for hard-coding a cell's background colour ( ie a field's background_colour key )
    Added sum_column() function, which returns the total off all values in the given column
    Added support for custom_cell_data_func - a user-defined function for formatting cell data
    Added 'quiet' flag to supress non-fatal warnings
    Added parser for SQL Server default definitions
    Allow 'faked' column_info hash to be passed into constructor
    Exclude the primary key column in updates for ALL databases
    ( also just use our $self->{primary_key} field to detect the primary key column )
    Fixed failure in setup_treeview() when column_info() fails
    Don't worry about detecting more than 1 primary key from column_info()
        - it doesn't work on multi-table queries anyway
    Added friendly_table_name key to constructor for use in dialogs ( imported from Gtk2::Ex::DBI )
    Added support for setting up chains of functions to be attached to a cell's custom_cell_data_func
    Added dd-mm-yyyy support to CellRendererDate
    Fixed incompatibility between us, CellRendererDate and gtk+-2.8.18+
    Re-implemented date_only renderer with a builtin_render_function
        - this is to deal with SQL Server's combination datetime fields when we only want a date
    Mark columns with a currency builtin render function
    Strip out dollar signs and commas from currency columns when applying, in get_column_value, and in sum_column
    Attached $self->{columns} ( Gtk2::TreeViewColumns ) to $self->{fields} ( and removed $self->{columns} )
    Store width of each column whatever in 'current_width' ( ie $self->{fields}[_field_no_]->{current_width} )
    Rename size_allocate() to on_size_allocate()
    Added support for using pango markup in the column heading, via a field's header_markup key
    Store column name in the treeview_column hash so we can easily figure what what column someone's clicked in
    Major reorganisation of $self->{fieldlist}, $self->{fields} and column handling to avoid off-by-one BS with status column
    Work-around for http://bugzilla.gnome.org/show_bug.cgi?id=317387! Woot!
    Removed Number::Format dependancy - doesn't install well under Windows
    Added count() function, with optional conditions ( similar to sum_column() )
    Optimised column_from_column_name and setup_treeview
    Fixed focus-out-event in custem CellRendererText not triggering the 'edited' signal. Finally. Thanks Muppet :)
    Fixed cell editable height problem in gtk-2.10.x. Thanks Torsten :)
    Fixed setting up primary_key_column and primary key in field list if a primary key is passed ( ie if column_info fails - very rare )
    Ported data lock functionality from Gtk2::Ex::DBI, adding functions:
        lock()
        unlock()
    Automatically scroll the treeview as the cursor changes
    Copy a cell's font size to the editable when editing ( currently fixed at Arial though )
    Update CellRendererDate to accept font sizes
    Imported calculator from Gtk2::Ex::DBI ( and added ->calculator( column_name ) method )
    Added GST removal and rounding to calculator
    Added on_changed functionality ( gets passed { treepath => $treepath, iter => $iter } )
    Pass model and iter to before_apply() and on_apply() functions
    Added DBD::SQLite support
    Added ( slightly buggy for some data, but hey ... ) initial column sorting support. Double-click in column headers to sort
    Fixed duplicate execution of validation code
    Added support for ticking over gtk2 main loop while populating a treeview ( good for slow networks )
    Fixed header alignment for datasheets that aren't visible when being constructed
    Added support for custom dialogs when datasheets need applying
    Added icons to all dialogs
    Added footer support, with sum, max, average
    Better currency formatting
    Added max_column() function
    Added average_column() function
    
    Documentation updates
    
    Patches from DLB:
        Add support for Postgres:
            Set search path in constructor when Postgres driver detected
            Added support for Postgres in last_insert_id()
        Added detection of primary key columns
    Other patches and suggestions merged
        Simplified primary key detection
        Allow 'faked' column_info hash to be passed into constructor
    
Version 2.0, released 16-Jan-2006
    
    Overhaul SQL clause handling - now all SQL-related stuff is in the 'sql' hash
    Added support for placeholders in where clause
    Added detection of primary key from column_info() ( MySQL & SQL Server only at present )
    Added destroy method, which destroys all signal handlers we've created, then destroys itself
        ( not working yet )
    Renamed $model_setup->{table} to $model_setup->{from} in dynamic models
    Added legacy mode to support 1.x requests
    Process dynamic models out of order when querying - no need to queue them for later
    Added method revert(), which is a synonym of undo()
    Added graceful handling of failure of $dbh->column_info ( warn to console what's happened )
    Warn to console if $dbh->column_info fails AND we don't have a primary_key definition
    Only ask to apply changes if not read_only
    Addded missing schema request to self
        - harmless anyway because we only support automatic renderer selection for MySQL currently
    Updated documentation & cleaned up POD somewhat
    
Version 1.0, ( not released )
    
    Added dump_on_error flag to dump SQL on a DBI error
    Converted more 0s to FALSEs
    
Version 0.9, released 16-Sep-2005
    
    Add some logic to MOFO::CellRendererDate so that popup calendar gets placed completely on-screen
    Added MOFO::CellRendererTime and use when a Time column is encountered
    Dialog question asking user whether to apply if window is closed with unapplied changes to recordset
    Add missing code to process sql_order_by
    Renamed readonly flag to read_only ( for consistency ) and hide status column when read_only
    
Version 0.8, released 15-Aug-2005
    
    Refresh dynamic combos when a toggle that they depend on is edited
    Automatically choose a renderer type based on the database field type of each field ( can be overriden )
    Automatically choose a default value for each column based on the database field definition ( can be overriden )
    Removed more Perl warnings re: uninitialised use of ...
    Choose string / numeric comparison based on database field type for combo renderers
    Rename 'none' renderer to 'hidden' ( and still support old 'none' renderers )
    Use text renderer for hidden columns ... so we can point dynamic combos at them and catch changes
    
Version 0.7, released 02-Aug-2005
    
    Added support for dynamic combos - ie combos whose options depend on the current row
    Disabled MOFO::CellRendererSpinButton ... not exactly working properly yet
    Add support for CellRendererCombos with a string ID ( previously only supported int IDs )
    Added undo() method - convenience function that basically does $self->query( undef, TRUE );
    Added MOFO::CellRendererDate - copied and pasted from Torsten Schoenfeld's example in the Gtk2 distribution
    Separated demo app from main package
    
Version 0.6, released 10-Jun-2005
    
    Switched standard CellRendererText with a custom renderer that has better focus policy after editing
    Added custom CellRendererSpinButton ( with improved focus policy ) for numeric values
    Fixed segfault on exit of example app
    
Version 0.5, released 08-Jun-2005
    
    Fixed make test so module actually installs via cpan
    
Version 0.4, released 27-May-2005
    
    Changed calculation of primary key column to use $self->fieldlist
    Added renderer type 'none' for hidden fields
    Insert method accepts a list of column / value pairs to set initial values
    Added column_from_name function to convert a column name into it's number in the model
    Added column_value to look up a value in the selected row
    Added question dialog to ask whether to apply current datasheet before querying ( override with 'dont_apply' )
    Cache the fieldlist array in $self->{fieldlist} so we don't have to query the DB every time we need a field list
    Remove requirement of field definitions - will use fieldnames from the database if none are given ( CellRendererText for everything )
    Added POD documentation
    
Version 0.3, released 24-May-2005
    
    Worked around 'Use of uninitialized value' warnings
    Added support for CellRendererCombo - thanks muppet :)
    Fixed bug where only the 1st updated row was applied
    Added support for CellRendererToggle
    Added dynamic column sizing, with mix of percentage and absolute values
    Added 'multi_select' property which sets 'multiple' selection mode ( only really affects deleting )
    
Version 0.2, released 19-May-2005
    
    Ported to Gtk2::ListStore / Gtk2::TreeView
        ( only supports text cell renderers currently )
    Renamed sql_fields to sql_select and changes requirement back to and SQL select statement
    Don't use the '!' special character for inserts - instead use record status indicator ( column 0 )
    All SQL operations occur in the 'apply' method as a batch
    Added constants for status indicators
    Added pixbuf column to display record status
    Added field validation plugin functionality
    Added intelligent detection of record status - don't consider non-changing 'row-changed' events a 'change'
    Added ReadOnly flag: prevents edits, inserts and deletes if set
    Put some actual data into the sql dump in the example application
    Cleaned up error dialogs and added more of them
    Removed all ComboBox stuff from example app for now
    
Version 0.1, released 16-May-2005

    First Version :)
    Querying database and dumping records into a Gtk2::Ex::Simple::List
    Detecting changes
    Updating affected records in the data as a batch
    Inserting records
    Deleting records