                 Picalo Data Analysis Toolkit
                    http://www.picalo.org
                                  
-----------------------------------------------------------------------                                  
IMPORTANT NOTE: I am anxious to move Picalo to the new Python 3.0.
Py3 is the first version of Python that breaks backward compatibility.
This means that it may break some of your scripts.  I will release
the Py3 version of Picalo first as 4.90 for testing, then 5.00 for
the release build.  If you have written scripts in Picalo, please
watch for this change as it may break things.            
-----------------------------------------------------------------------                                  

Welcome to this version of Picalo!  This file will show each time you
install an updated version, and it tells you what is new, updated, and 
fixed with each version.  You can close this tab by clicking the fourth 
icon from the left on the icon bar (the tab icon with a red X on it).

                == THE PROJECT FOLDER ==
To begin using Picalo, choose a 'Project Folder'.  A project folder is 
simply a directory on your computer where you store Picalo files like
tables, scripts, and database connections.  You can create a new, empty
directory in your documents folder, or you can select an existing
directory.

           == DOCUMENTATION: THE PICALO COOKBOOK ==
Once you have a project folder, the best place to start is the Picalo 
Cookbook--available on the Help menu or on the Picalo web site.  The 
Cookbook contains 'recipes' for most of the common tasks users do in 
Picalo.  It is a good read for novices and experienced users alike.

                        BUG REPORTS
Please report any bugs or feature requests to the bug tracker at
http://www.picalo.org/. 

                 Enjoy this version of Picalo!                                  

CHANGE LOG:

Plans for next version: Rework the data typing in the system, especially the
date and time types.  I've never been happy with the way they work in Picalo.
If you have ideas on making them better, let me know.

BUGS/FEATURE REQUESTS:
  - Update the cookbook to include pivot tables
  - Update the advanced manual (first chapters need manual updating)
  - Error during Excel file import - Dates don't come in right
  - Add a "separate table from table list" option to get a table out of a table list.
  - Add the ability to import xlsx files
    
- version 4.92
  - More beta testing for Picalo v5.  
  - Fixed bugs in the Database.py file.  Forgot to test this one in the last beta. :)
  - Refactored the code to get rid of picalo/base and picalo/base/Global.  It's cleaner now.
    
- version 4.91
  - Beta testing release for Picalo v5.  This is a MAJOR REVISION.  I won't be able to put
    all the changes in this list.  Every file in Picalo has been updated to use the new structures,
    and general testing and bug fixing occurred.
  - IMPORTANT: Code routines can only call Table.deref_column one time (not recursively).  It used to be
    able to be called as many times as you want.  The addition of virtual column indices
    made it only work one time.  If it's called a second time, it will think the real index
    is the virtual column index and get it wrong.
  - Table.save, save(), and load() are deprecated.  Use a project instead to take advantage of ZODB.
  - Added Zope Object Database integration.  I was worried it would be bloated because 
    Zope can be bloated at times, but it's fast, and most importantly, it's making
    memory usage incredibly efficient.
  - Lots of changes to Table.py, Record,py, Column.py, and elsewhere to reflect the ZODB
    integration.  This release represents a pretty major change to the entire underbelly
    of Picalo.  I was able to keep the API stable through all of this.
  - Addition of the Project.py file and object.
  - Columns now use a virtual ordering.  Moving columns around is now very fast because the 
    actual data structure doesn't change.
  - Adding columns is fast now.  Data are only added to the rows as the user adds them.  Otherwise
    they don't use memory.
    
- version 4.41    
  - Fixed a small bug in Number.py to match an API spec change in Python 2.7
  - Reverted back to Python 2.5 in Mac.  There are just too many issues with 32/64-bit in
    Snow Leopard right now.  wx is only 32-bit, Python 2.6+ on Snow Leopard tries to go
    64-bit. 
  - Fixed the etree.ElementTree not found error.
    
- version 4.40    
  - Updated all software dependencies: e.g. wxPython to 2.8.11.0, MySQLdb to 1.2.3, etc.
  - Fixed a bug caused by 4.39's static expressions/formatting changes.  When you 
    stratified, it didn't create the new table list correctly.
  - Fixed a bug as Detectlets end where the MiniHelp doesn't work.
  - Fixed a bug that kept Benford's law from running (append_calculated api was wrong).
    
- version 4.39
  - API CHANGE: Table.append_calculated and Table.insert_calculated now take
    a column type as well as the expression. There is no such thing anymore as a 
    column that has no type -- even for active calculated columns.
  - A very large change in the code this version is the new way Picalo does
    formats on fields.  Formats are now supported both in the back end and in the
    GUI.  I've never been fully happy with formats in Picalo, so it was good to 
    finally fix it right.  Many different date and number special characters can format
    fields in scientific notation, using dollar signs or other characters, etc.
    See the create table dialog for more info on this.  This affected code throughout
    the base classes.
  - Added a "format builder" dialog to the create table dialog to help users create
    formats in the new system.
  - Fixed the post_table method to handle dates correctly.  It now uses the 
    standard date format, and it should upload to most databases.
  - Updated the wxPython build for Mac so it works on both 64-bit and 32-bit
    machines.
  - Slicing of filtered tables now works correctly (including table[:])
  - Added common python modules to the advanced manual, expression builder
    dialog.
  - Reran the epydoc and the advanced manual reference.  They are now updated.
  - Right-clicking a tab name no longer causes an error. 
  - Changed "By Unique Column values..." to simply "By Value..."
  - Changed the way new records are appended to tables.  Picalo is now smarter
    about the way parameters are sent into the append_record and related 
    methods.
  - Added integer arithmetic to Date and DateTime objects.  You can now add the integer
    "5" to a field and it assumes you want days to be added or subtracted.
    Floats work too: 5.5 means 5 and a half days.
  - Made the circular logic checker (in Expression.evaluate) more robust.  It can find more
    instances of circular logic (which cause infinite loops in the code)
  - 'recordindex', 'record1index', and 'record2index' are now reserved words.  You can use them in
    most expressions to denote the current record's (denoted by 'record') index.  
  - Fixed an error that occurred in the GUI when adding a calculated field to a string field.
  - On the Summarize dialog, changed "Results Table List" to "Results Table".
  - Updated the cookbook and advanced manual for all these changes (especially for the
    API changes on formatted and calculated fields)
  - Deprecated the currency type.  There is no longer a need for it now that formats
    take care of all formatting.  Just use a number type and format: $#,##0.00

- version 4.38
  - Fixed a bug where 'mailbox' was not included in the frozen app.

- version 4.37
  - Fixed a big bug in Detectlets. (thanks Gutemberg Vieria)

- version 4.36
  - Change to allow None to be returned from Detectlets (thanks Gutemberg Vieria)
  - Bug in choice controls in Detectlets fixed (thanks Gutemberg Vieria)
  - Fixed the Debian control file to require python-chardet
  - Fixed the Debian apt archive.  It was broken since the move to the new picalo.org
    server.

- version 4.35
  - Oracle driver (cx_Oracle) now included and integrated into Picalo's GUI.
    This should be faster than going through ODBC since it is direct.
    This only works on Windows so far.  Mac and Linux users are out for the moment.
  - Troubleshot several Oracle issues.  In particular, Oracle does not like spaces
    in the path to Picalo.exe. If you are using Oracle, please install to something
    simple like c:\picalo.
  - SQLite driver (sqlite3) integrated into Picalo's GUI.  Driver support 
    is PRELIMINARY at this point.  In particular, I can't set column types
    since SQLite won't report column types to me.  So everything stays a string
    type in the returned tables.
  - Wizards that return empty tables now show the empty table. Before it looked
    like nothing happened.
  - The value editor (Edit in a Separate Window) dialog is resizable now, plus
    it is larger when it first shows.
  - Added the "ignore exact matches" check box to the Join By Fuzzy Match dialog.
  - Fixed a small bug in reorder_columns that missed the last column value in
    the table.
  - Fixed a bug during update checking where it failed when proxies are being used
    in some environments.  It still fails with some proxies, but it fails more
    gracefully now.
  - Fixed a bug where copy/paste in a table didn't allow for international characters.
  - Fixed a bug where self.updatefieldinfo was spelled wrong in the Text Import 
    Wizard.  This was causing it to fail.
  - MySQL and Oracle now show field names in the visual query editor.
  - Database connections now refresh (i.e. get their table names) automatically when
    the connection is opened.

- version 4.34
  - Added email.importers to the setup.py file.  The email package does some wierd
    imports, so py2exe and py2app don't pick them up automatically.
  - Added a "file" type to the Detectlet wizard in __init__.py.
  - New wizard for importing email from mbox and maildir.
  - Updated the cookbook and other manuals for the new file type and for the
    email wizards.
  - Rearranged the wizard module so it was global to Picalo.  The detectlet
    area simply uses it.
  - Reworked the unicode support in the delimited text importer. We now use the 
    chardet module (downloaded from a third party) to autodetect unicode
    encodings.  It works much better than before.
  - Added an "encoding" option to the text import wizard.  You can now specify
    the unicode encoding of a text file, or you can let Picalo automatically
    figure out the encoding.
    For the first time, I'm really satisfied with the unicode implementation in 
    Picalo.  It seems to finally be working correctly in tests with different
    country character sets.
  - Fixed a bug in move_column and reorder_columns where only the column header
    would move, not the data.  This was a carryover from when we were using
    dictionaries rather than lists to store table data.

- version 4.33
  - Fixed dialogs.py to do the right terms for OdbcConnections.
  - Tested in Vista 32-bit vs. Vista 64-bit.  I had started compiling on 64-bit
    with 32-bit components (so it would run both places), but it still put a
    64-bit piece into it.  So I went entirely back to Vista 32 for compiling.
  - Added __delslice__ to Table.py.  You can now delete table slices correctly.
    This was there before, but it wasn't active because list.__setslice__ took over.
  - Moved to Python 2.6 and new versions of wxPython
  - Disabled delayed loading of data from queries.  This was a great idea, but it
    was buggy so far.  It needs to be implemented again.
  - Added __pg_repr__ to the number class so it worked with Pygresql driver.  Somehow
    this is now required as of Python 2.6.

- version 4.32
  - This was a redo because 4.31 somehow didn't work right.  Just a recompile from
    scratch.

- version 4.31
  - Fixed a bug in the database connection wizard: the odbc parameters were mismatched.
  - Added MySQLdb to the Mac version.  I accidentally forgot to include it in my new
    Macbook Pro. :)  Sorry everyone. New computer.

- version 4.30
  - Added sections to the Picalo Cookbook for the new wildcard_match and regex_match
    functions.
  - Added radio buttons for "Include Matching Records" and "Exclude Matching Records"
    to the filter dialog in the GUI.
  - Added examples to the code documentation for the new matching functions.
  - New feature: Select by wildcard and Select by RegEx dialogs in the GUI.
  - "Table has unsaved changes" now has the table name rather than Untitled.
  - Fixed table saving bug when a table variable is set to something else.
  - MAJOR CHANGE: Tested the page caching scheme a lot.  It turns out that Python won't
    release memory back to the OS *even if* I explicitly delete it.  So the caching
    scheme will never work anyway.  It will have to wait until the C version of Table,
    where we can manage memory any way we want.  I went through all the code and removed
    everything related to the paging scheme.
  - Fixed a bug where __len__ would not recreate the filter index if needed.
  - Changed the regular expression that finds detectlets so they work in different
    languages.  Thanks for the new regex code from Gutemberg Vieira.
  - Doubled the size of the user input boxes in Detectlets.
  
- version 4.29
  - Fixed an infinite loop when the project folder is not found in ObjectTree.py.
  - Fixed the close bug in Windows where a table would pop back up during the save question.
  - Enabled precision in Table Properties for expression-based fields.
  - Fixed the date format bug in Table Properties that showed an error.
  - Fixed the history saving when the project folder is not found (skips saving now).
  - Fixed a bug in Detectlets where the example input data has the same name as the
    results table.
  - Added the ability to create a boolean from another boolean.  This makes save/load work
    better.
  - You can no longer add records by scrolling to the end of a table.  You have to do it
    explicitly on the menu.
  - Fixed a misspelling of Synax to Syntax
  - New feature: the table filter box now detects a single = and asks the user whether to
    change to a ==.
  - Made set_changed on tables more fine-tuned and more detailed.  It only asks for saving 
    if data or columns of tables really have changed.  Filtering and other innocent analyses
    don't set the changed flag to true.
  - New feature: Added the Simple.regex_match and Simple.wildcard_match functions to Simple.py.
  - New feature: Added a new dialog to the spreadsheet to help create searching by regex and
    by wildcard.

- version 4.28
  - The import dialog now remembers the last-used directory (for multiple imports).
  - Fixed a bug in Table.find where the records() method was used.  values() was needed.
    This resulted from a search and replace done in an earlier version.

- version 4.27
  - Made "value in rec" work for records.
  - Enhanced "value in col" for columns.  Now works on partial values.
  - Detectlets can return lists of tables to show multiple input data tables
  - Modified the advanced manual to reflect the new way of doing example input data
  - Files in the Detectlets directory that start with '.' no longer show in menu.

- version 4.26
  - Rewrote the entire ObjectTree refreshing algorithm.  It now uses wx.CallAfter rather
    than the previous two-thread algorithm.  This new algorithm should be much more stable
    and, since it doesn't use the idle thread, make Picalo snappier.  This one was a lot
    of work.
  - Integrated the Portugues file into Picalo!  It looks cool in another language.
    Thanks to Paulo Pastilha for the translation!
  - Modified the update_language_files.py and Languages.py files to correctly
    translate the menu system for the different languages.
  - Added a few new fun languages: Elmer Fudd, Swedish Chef, l33t, Pig Latin
    The create_fun_languages.py script creates these when the language files
    are updated.  Modified the Preferences dialog with a disclaimer about discrimination.
  - Added the bug tracker to the Help menu.
  - Fixed small bug in the history window so it correctly identifies the timestamp.
  - Removed debug print statements in compare_records that was accidentally left in 4.25.
  - Fixed the Help menu items (http links and pdf files) based on submission from
    Andrew Jacobs.  Thanks, Andrew!
  - Added better debugging information to the Detectlet wizard (for developers).

- version 4.25
  - Added new icons for the Windows edition, changed MainFrame to use png-based
    icons rather than the classic ones.  Icons look much nicer now.
  - Changed the linux icons to have the correct resolution for linux.
  - Created .deb and .rpm files up for the first time.  It has two packages, one for
    the core library and one for the gui app.
  - Modified the way the tools directory is found to work with the new linux packages.
  - Changed the Mac icon to only affect the Mac doc
  - Fixed a bug where the wrong page would close in MainFrame.closePage()
  - Added the MainFrame.showError methods
  - Picalo now saves and reloads the history for each project directory.
  - Added clearing of history and script output
  - Changed compare_records to be zero-based rather than one-based.
  - Stopped using threads to check for updates because it froze under Linux.  

- version 4.24
  - Placed the source code in SVN.
  - Modified the create scripts to work with the new SVN directory trees.
  - Fixed a bug in the linux version where onIdle was called recursively.
  - This version marks the first time I'm seriously going to start testing the linux
    version.  I'll get a .deb and/or .rpm file up soon.

- version 4.23
  - Made significant adjustments to the reading and writing of unicode data in the delimited
    file import, prettyprint, fixed text import, and other areas of picalo.
  - Fixed a bug in make_unicode that turned unicode parameters into strings.
  - Fixed a bug in picalo.lib,delimitedtext.py that wouldn't do quotes right on empty fields.

- version 4.22
  - Refactored all file saving and loading and import and export routines from Table.py to Filer.py
  - Modified the load_fixed method to take files that do not have line separators.
  - IMPORTANT: load_fixed now requires that you specify the last column ending position.  It 
    automatically figured this out in previous versions.
  - Added a new recipe for loading EBCDIC files into Picalo to the cookbook.
  - Fixed a serious bug that prevented saving or saving as new/imported/existing tables.

- version 4.21
  - Changed delimited text to save with the line separator of the platform (Win or Unix)
  - Removed all use of the python 'csv' module because it took too much memory.
  - Added a new picalo.lib.delimitedtext module to do csv, tsv, and other delimited text formats.
    It is slower than the built-in, C-based csv module, but it can handle millions of records.  I
    tested it against 50 million records (4 GB file) and it never used much memory.
  - Fixed delimited and fixed reading and writing to handle unicode correctly.  Unicode has
    long been supported by Picalo, but some encodings were fragile.  It works robustly now.

- version 4.20
  - Updated all libraries to their newest releases:
      wxWidgets 2.8.4.0
      psycopg2 2.0.6
      pygresql 3.8.1
      mysqldb 1.1.6
  - Added the PyGreSQL PostgreSQL driver.  This driver is better-tested than psycopg2, but it's 
    slower for high volume transactions.  This gives the user the choice of which one to use.
  - Tables and queries now have to be shown in tabs to be in memory.  This removes the confusion
    of objects in memory but not displayed.
  - Tested the table caching scheme quite a bit more.  This didn't seem to alleviate memory
    problems with big tables.  Made minor bug fixes to ensure it released memory correctly.
    It seems to allow unlimited-size tables now.
  - This is the first time I've built everything on Vista rather than XP.  Also Leopard rather
    than Tiger.

- version 4.19
  - Added the little X icons on all notebook windows for easier closing.  Unfortunately wx for Mac
    doesn't support this yet, so it only works on Windows.
  - Fixed a small bug where you could lose your work in a script if you cancel the save box on close.
  - Made the autofilter menu options when right-clicking a cell limit the size of the menu
    (for very large cell values), and it makes sure it is one of the standard types
  - Filtering by right-clicking a cell now sets the quotes "" depending upon field type
    (rather than guessing).
  - Tables can now have None for their column type now, which means anything can be in the column.
  - Big Change: activated the new table caching scheme.  I've been working on this for about six
    months.  When tables get too many records, Picalo pages the data to temporary files so it doesn't 
    run out of memory.  Right now the caching is set at 100,000 records in memory at a time.  

- version 4.18
  - Fixed a small bug when uploading tables with number fields to ODBC MS Access connections.
  - Fixed a bug when exporting formatted columns to CSV
  - Fixed a bug that occurred when the ObjectTree tried to read a closed database connection.

- version 4.17
  - Added feature to allow user to copy queries to picalo tables by right-clicking them.
  - Fixed an interesting bug that occurred when replacing one tablearray with another in the same
    variable name.
  - Fixed database loading bug that wouldn't allow more records because database tables
    are read-only.
  - Fixed set_readonly in table to disallow changing readonly status in tables.
  - Added _get_columns to the PyODBC driver wrapper.  The query builder now works with ODBC connections.
  - Fixed a bug when viewing tables from the query builder.  They were prettyprint-ing instead
    of viewing.

- version 4.16
  - The CHANGELOG.TXT (this file!) now shows when users install a new version.
  - Fixed a bug with the auto-check for new updates to Picalo.
  - Fixed the double Tools menu that showed up last version.
  - Fixed \ to / in the new file open code
  - Fixed the expression builder button in many dialogs. It now inserts the builded text.
  - Finally fixed the second help and window menu that showed in Picalo for Mac OS X.
  - Picalo now reports when circular logic is present in formulas.  This fixed a bug when adding
    calculated columns as well (where circular logic caused infinite recursion).  Quite a hairy change
    this one was.
  - Updated the rest of Picalo's base routines and GUI to reflect the new circular logic detecting code.
  - Finally got rid of the "Error loading xrc resources" box by moving the init code to PicaloApp.OnInit().
  - Fixed a number of bugs with calculated fields in the table properties dialog
  - When you click on a cell containing an error object, it now brings up a dialog explaining the error
  - When you change from a calculated column to a regular column, the expression values for each cell are
    set as defaults in the cells (for the new type).
  - Added the cell value editor dialog
  - Database tables can now be directly analyzed in Picalo.  They are included in most dialogs.
    (no need to "Copy to Picalo Table")
  - Database tables are now read-only again.  They cannot be modified.
  - Changed spreadsheet.py to correctly show whether a table is readonly or not, even if the a change 
    call fails.
  - Added the "Set to None" menu option when right-clicking a cell.
  - Fixed new bug in filters caused by changes in how expressions work.
  - Selection now does not have to include any criteria (just to limit columns)
  - Made the Select By Key dialog a little prettier.
  - Added the Select By Record Index dialog to the data menu.
  - You can now copy and paste entire tables, columns, and rows.
  - Added the 'Edit in Separate editor' dialog
  - Added the 'Calculate in Expression Builder' to individual cells (right click)
    
- version 4.15
  - Fixed the recursion in updating object tree.  In 4.12 it was only recursing one deeper than the existing
    tree.
  - Fixed a bug in the new table properties dialog when format was None.
  - Fixed a small bug where the expression built in the expression builder didn't come back to dialogs that called it.
  - Allowed a full table to be added as the initial cell values in insert_column (first column is used)
  - Fixed TableArray.insert_column and append_column.  These needed to take another TableArray rather than a
    single list of records.
  - Made the display of a table list (the table index) zero based in the GUI.  It was already zero-based in the
    shell and scripts.
  - Updated the summarize dialogs to say "summarize" rather than "stratify".  It's just cleaner that way.
  - Changed set_format and set_type in TableArray and TableList to match Table.py.  Table changed in a recent
    version and I didn't make the change in the lists.
  - Changed dialogs that used to use float to the new number type.

- version 4.14
  - Made the history window permanent in the directory.  It automatically loads and saves with Picalo 
    project directories.
  - Removed the save and clear history commands.  It's automatic now.
  - Removed an extraneous File menu separator.
  - Fixed file save and save as when no item has been clicked on the tree.
  - Separated the directory scanning (for the object tree) into a separate thread.  This was difficult,
    but it now doesn't block the GUI when a really slow or large directory tree has to be processed.
  - Fixed a bug that occurred when inserting a row into an empty table.
  - Fixed a bug when changing projects (object tree couldn't find dir at first)
  - Made the spreadsheet view rows zero-based.  This looks weird, but it is the way Picalo works.
  - Copy DB Table to regular Table now has a default table name.
  
- version 4.13
  - Got skipped somehow.  :)  (I told people 4.14 was coming next, so I went right to that)

- version 4.12
  - Added the text-based progress bar.  Refactored the entire progress bar code to handle both
    text-based and gui-based dialogs.
  - Fixed the graphic plugin so it didn't need write permissions to the c:\ drive.
  - Took out the graphing capabilities altogether.  No one was using it and Excel is much nicer.  Until
    I'm ready to spend more time on the graphing capabilities, I'm removing it from the app.
  - Table, Record, and Column iterators use generators now rather than old-style code.
  - Database now uses generators as well (yield-type code).
  - Major change: Tables now have their memory paged in and out of disk in an efficient manner.
    Picalo should now be able to handle files of any size, even huge ones, as long as you have enough
    disk space.
  - Removed the Delayed Database cursors, _datasource in Table, and all other separate data sources.
  - Major change: The project is now simply a directory.  All Picalo objects in the tree have filenames
    behind them.
  - Added the new Database.Query object.  This is a large new piece of the app.
  - Totally revamped the Project object tree scanning algorithm.  It is more efficient and correct now.
  - Added is_changed to TableList and TableArray
  - Fixed an infinite recursion bug when copying table slices
  - Fixed a bug where Picalo won't come back up when it is quit in a minimized state
  - Fixed a bug in Tables where _update_filter_index was spelled wrong.
  - Centralized the cut, copy, and paste operations
  - Recoded how window focusing works between the different windows of the app
  - Updated the view() method in table to accept Query objects
  - New 'number' type!  floats are out because they don't do decimal places as expected.
  - Fixed formats for numbers, dates in the TableProperties dialog.  Formats are back in business.
  - Converted values sent to Record.__init__ to list if necessary (databases send tuples)
  - Menu now changes when pages are changed, not when windows are focused on.
  - Spaced out the bottom of the toolbar on Windows -- it was too close.
  - Fixed filtering to use the new pagefiles
  - Fixed a small bug in Table.prettyprint() where formatted fields weren't printing correctly.
  - Modified Spreadsheet.py to allow queries to be viewed.
  - Created an "Edit Query" button to allow the user to change the sql of a query.
  
- version 4.11
  - Added the 'del table['col']' syntax for deleting columns.
  - Wrote the first version of the cookbook and integrated it into the help menu
  - Made _get_tables visible by changing to list_tables in Database.py.
  - Output.write always calls Update and onIdle now so script output shows while script is running
  - All shell commands (push) now remove the progress dialog if it doesn't remove itself
  - Running a script now always forces a save or it won't run.  Too many users were losing unsaved
    files and complained.
  - Allowed a script to continue when cancel is pressed.  A dialog now asks the user to confirm the cancel.

- version 4.10
  - Included the python tutorial in the Help menu
  - Fixed a bug in wx.ChoiceBox that resulted because of the update to wx 2.8.
  - Changed Dialogs.initTables() to include TableArrays now by default.
  - Fixed summarize functions to work with Table Arrays.  They still had some bugs from 
    the 4.09 changes.
  - Added a check in Spreadsheet.py to show an error if a tablelist of tablelists was viewed.
  - TableArray slices now return new TableArrays with the slice items
  - TableList slices now return new TableLists with the slice items

- version 4.09
  - Added more menu options when items are right clicked in the tree
  - Added the ability to right-click a table list to recombine it.
  - Added the cancel button to the progress dialog.  This is really cool!  All I had to do was throw
    an exception from the progress bar update and it kicks all the way back to the GUI from anywhere.
    Gotta love exceptions.  The new exception is Utils.UserCancelledError
  - Fixed a bug that threw an exception when the last column was deleted in Table Properties dialog
  - Calculated fields in Table Properties now works
  - Added the table['colname'] syntax (instead of table.column('colname'))
  - Sorting occurs before sorting by date/step now.
  - Updated run_tablelist to allow for functions that do not return a value (such as sorting)
  - Scripts can now import modules from their own directory.  If a script has been saved to
    disk, it adds its directory to sys.path.
  - summarize_by_value can now take TableArrays as the table parameter.
  - Updated to wxWidgets 2.8.  Made several changes to the code to work with 2.8.
  - Changed the toolbars to be created with the frame.  Toolbars are also now just a regular component
    rather than the window managing the toolbar.
  - Removed the pushing and popping of toolbars.

- version 4.08
  - The output window is now wrapped so long output lines don't go off the screen.
  - Fixed an extraneous updateStatus in Spreadsheet
  - Text import now changes field names if the user asks for it
  - Field names can be changed to their same field name now
  - Summarizing by two columns works now
  - Copy DB table to Picalo table now has a default name
  - Initializing a table with records (Table.extend) now show an "initializing records" progress dlg.
  - Fixed font bug in the new fixed width text import dialog on Windows
  - Changed add Benford's column to simply put the calcuation rather than the difference.
  - Updated the summarize_by_date and stratify_by_date dialogs in the gui as well as in Grouping.py
    to reflect the new data types in Picalo.

- version 4.07
  - Fixed a small bug in post_table (cols was not found)
  - Sorting is now prevented when table is read-only.
  - Included the sys module in the default-included modules.
  - Delimited file wizard now changes \ to / to prevent problems.
  - Fixed saving and loading of files throughout to use / not \.
  - Database tables can now be refreshed from the database (Database._Connection.refresh and on 
    right-click menu in MainFrame).
  - Fixed the QueryBuilder frame so it fits on a 1024x768 resolution screen.
  - Fixed a bug in find_gaps where a column was named "Gap Rows", an invalid colum name
    by new Picalo standards.
  - Removed debug information that was printing with when Projects were saving.
  - Added filename member to TableList and TableArray.
  - When projects are saved, table filenames default to their variable names now.
  - Mainframe now correctly changes the page
  - Record counts were added to the status bar on a spreadsheet view
  - load_delimited is now zero based to be compliant with Python lists
  - Fixed a bug in load_delimited when loading files without headers
  - Added load_fixed to the data import wizard!  This took a lot of work to do the custom control painting.
  
- version 4.05
  - Overhauled the query builders in Database.py.  They now directly run on the database and are
    much more robust because they use the parameterized execute statement (DB-API 2.0)
  - Updated post_table in Database.py to use the new query builders.
  - Modified post_table to gather column type from the actual column type rather than
    guessing every time.  It only guesses on calculated columns now.
  - Added get_type and get_format to Column.py

- version 4.04
  - Fixed bugs in the Excel importing routine.  The dialog wasn't ever running the actual load_excel command inside
    of finish().
  - Made the Data Import Wizard bigger so it shows more data in the preview window.
  - Matched insert_column (and related methods) in TableArray and TableList to the new API in Table.

- version 4.03
  - Added a "Run Script in Detectlet Wizard" into the Detectlets menu.  This makes debugging detectlets easier.
  - Fixed Crosstable.py for valid column names.  It now complies with the rules for column naming.
  
- version 4.02
  - Table.filter() now throws an AssertionError when the filtering expression raises an error.
  - We now import some commonly used libraries into Picalo, such as re, urllib, os, os.path, etc.
  
- version 4.01
  - Fixed small table loading bug - columns were not saved right.
  - Fixed a bug in Crosstable.py which allowed duplicate column names in rare cases.
  
- version 4.00
  - New major version number because 1) new save/load format, and 2) lots of new features like Table Properties, 
    Visual Query builder, etc.
  - Fixed saving of command log
  - Added date and time to command log
  - Added command log history to loading/saving of projects  
  - Removed extraneous pprint statement from Project.py
  - Fixed the database rececent connections, which were still going to the old File menu instead
    of the new Data menu location.
  - Added right-clickable options to tables in the tree - copy, remove, delete, save, save as, close, sort, etc.
  - Took wxID_CANCEL out of Dialogs.py.  Now we just use cancel to signify the button.
  - The Dialog superclass now returns the return code if the dialog is called manually.
  - Added the expression builder to the menu as well as to many program dialogs!
  - Fixed a bug when dialogs were closing - they now return wx.ID or wx.Cancel as they should  
  - Fixed saving of tablelists.  They can be saved just like any other table in the Picalo application.
  - TableLists and TableArrays can now be exported from the GUI.  It only saves the top-most viewing table.
  - New Table Properties dialog.  You can now append calculated columns to tables through the GUI!
  - Removed Column.set_expression and added the functionality to set_type, where it belongs.
  - Took off initial commands because it needs to go into the project now
  - Added read-only checking to the Column.py module.
  - The preferences are now saved using the preferred platform method (registry, Unix text file, Mac Library dir)
  - Fixed the sash position on startup when no preferences file exists (used to be a left pane size of 0)
  - Added hte Visual Query builder!
  - Changed queries so they are saved in the project.  They don't create a new table now.
  - Added the DelayedDatabaseDataSource class to Database.py
  - Added the _delayed_table method to Database.Connection.
  - Fixed a bug where typing '.' into the shell caused a progress bar for a number of queries (very annoying).
  - Enabled the "Queries" tree item in the left-side tree.  It now lists all available queries.
  - Fixed problem where PostgreSQL would freeze the connection (abort state) when an attribute wasn't found in __getattr__
  - Fixed bug in Simple.describe where the Descriptive column was the wrong type (should have been unicode)
  - MainFrame.getTables now returns queries as well as regular tables.
  - Fixed bug in Simple.get_unordered.  It had a bad column name.
  - Fixed several insert_column bugs in Dialogs.py.  The column type is now added with the new columns.
  - Updated all detectlets to current changes in Picalo. 
  - Added about 10 new detectlets that were programmed by Jeff Richardson.  Thanks Jeff!
  - Fixed the constructor of Currency.currency so it accepts numbers with dollar signs, euros, etc.
  - Fixed the boolean type.  It now shows correctly in tables.
  
- version 3.03
  - Fixed a bug when opening projects with a file name
  - Fixed the ODBC driver for Windows. It was never updated to the new scheme.
  - Fixed the same bug in the MySQL driver for Windows.
  - Fixed a small bug when connecting to Access tables over ODBC - length didn't work (record_count).
  - Fixed __len__ on Database.DatabaseDataSource
  - Created the DatabaseDataSource._retrieve_records method to optimize retrieval of database records
  - Added DatabaseDataSource._retrieved_all
  - Fixed bug when saving/opening tables in Windows (we now change backslashes to forward slashes in all OS's)
  - Removed the table.close() when a table is opened that is already opened.

- version 3.00
  - Fixed a small bug in Column.py that returned the wrong value
  - Records now return slices (ie. data[0][1:5])
  - Upgraded the save/load format to support a dictionary for meta information
    This breaks compatability with previous tables saved, but since few people are 
    using Picalo yet, I'm doing it now.
  - Fixed Calendar.py -- it wouldn't save (added the __reduce_ex__ method)
  - Fixed Calendar.py -- it was sometimes using the wrong constructor.
  - Updated Calendar.py to use a class instead of a list for formatting
  - Added the text import wizard!  
  - Added the table export dialog.
  - Added the import Excel feature to the text import wizard.
  - Added the ability for wizards pages to have a dynamic order.
  - Changed Record back to extend list (rather than dict, as I put in v2.61).  The dict
    extension was extremely fast, but it took up too much memory.  Going back to a list
    slowed things down about 4 times slower, but the memory usage is much, much more
    efficient.  We still have a net speed up of at least 5 times faster than v2.60.

- version 2.68
  - Fixed bug in Simple.py where col_match_same, col_match_diff, custom_match_same, custom_match_diff
    were returning lists rather than TableLists.

- version 2.67
  - Fixed bug in Detectlets/__init__.py where TableList wasn't being imported
  - Added the Table.move_column method
  - Added the Table.reorder_columns method.
  - Updated the TableProperties dialog to use the new reorder_columns method.  Columns can now
    be moved left and right in the table.
  - Fixed the cell drawing bug where cell text would raise 4 pixels when the mouse moved over them.
  - Join/match dialogs only require one table now (instead of two).  So you can join a table
    to itself.
    

- version 2.66
  - First time on Intel Macs.  Had to switch to numarray rather than numpy as numarray doesn't throw a
    bus error on Intel Macs.
  - Fixed a bug where the Spreadsheet asked for invalid columns when columns are deleted in TableProperties.
  - The TableProperties window was doing set_format every time a table was changed.  This now only happens
    when the format has actually changed.
  - When a field was deleted in TableProperties, it removed the wrong index in column_indices.  This is fixed now.
  - Updated the pyODBC text in the dialogs.
  - The filter no longer clears the text when the filter is released.
  - Tables can now be created the old way again -- field types default to string.
  - Fixed Database.py to work with the new typing system.
  
  
- version 2.65
  - Small bug in load table dialog fixed.
  - Variable name can be wrong when loading tables if filename starts with a number.
  - Table fonts can now be set globally.
  - Updated the Preferences dialog to support new fonts in tables.
  - Add line numbers to the editor
  - Find dialog should come up with whatever text was there previously selected.
  - Bug in Find dialog - when finding records in tables, it can find offscreen.
    It should scroll to the found record.
  - HUGE change to column types and formats.  Types are now simpler and easier to understand.
  - Changed the Table constructor to support the new typing system.
  - Changed all the libraries and supporting functions to use the new typing system.
  - Changed the examples throughout the code to use the new typing system and new Table constructor.
  - Made changes to the GUI to support the new types.
  - New currency type.
  - New boolean type.
  
  
- version 2.64
  - Enabled record.colname = value type of access to set values in a record.a
  - Changed load and save to do None values to empty string rather than <N>.
  - Tables loaded from databases are now efficient.  Records are only loaded just in time.
  - Made a new type: TableArray, which holds compatible tables.  TableArrays
    can be sent into most picalo functions.  TableLists are now a weaker form
    that can only be viewed.
  - Read only flag added to tables.  table.set_readonly(True or False) method.
  - Added tablelist.set_readonly to match the table version.
  - Added a button on the GUI for the new read only flag.  It's a toggle button.
  - Select By Value dialog lets you pick which columns to select now.
  - Select By Expression dialog lets you pick which columns to select now.
  - Added the ability to delete multiple columns by sending a list to table.delete_column().
  - Added the ability of the GUI to view regular lists and tuples os tables.  This allows
    routines to return regular lists of tables (that don't have to hold the same type of
    table like TableLists do).
  
- version 2.63
  - Added left and right joins to the join functionality.
  - Added left and right joins to the col_join functionality.
  - Renamed the col_join_same function to col_join.
  - Added __len__ to Record.py (now reports correct length).
  - Changed the error log to go to the Script Output window rather than the console.
    This makes it more clear for people to find the error log.

- version 2.62
  - Updated functions in Simple.py to follow the new TableList rules 
    (TableLists can only contain tables with the same number of columns)
  - Created the TimeDelta and DateDelta time duration types in base/Calendar.py.
  - Updated Grouping.py to use the new TimeDelta and DateDelta types.
  - Enabled DateTime(2005, 5, 30) type of date constructor in baes/Calendar.py.
  - Further profiled code and made slight changes to Table.py and Record.py.

- version 2.61
  - Profiled the code for speed increases.  The profile_code.py file can be used to
    profile things now.
  - Changed the Record class to extend dictionary rather than list.  Speed increase 
    of at least 20 times!
  - Removed the record_dict function (it was slowing things down)
  - Embedded code into the Record.__getitem__ function rather than calling other
    functions.  Again a speed increase!

- version 2.60
  - Small bug in the fuzzy matching fixed.

- version 2.59
  - Fixed several small bugs
  - Removed the "Insert/Add Column" dialog (will be included in table properties
    dialog in next release)
  - Made the "Open recent tables" menu update itself when tables are opened from it.
  - Fixed small bug in Global.make_valid_variable when variable was None or ''.
  - Fixed a problem with the Detectlets not showing up in the Windows frozen version!

- version 2.57
  - Fixed a small bug in the dialogs for fuzzy and soundex matching.

- version 2.56
  - Switched to the pyodbc module for odbc access.
  - Added graphics to the tables and databases listed in the left-side list.
  - Combined the tables and databases into a single "Data Sources" list.
  - Added table finding to supported databases.  When you connect to one, you can
    now browse the available tables, view data, and count records.
  - Switched from mx.DateTime to the standard datetime module in Python 2.3+
  - Added a Date type to complement the DateTime type
  - Fixed a small bug in Spreadsheet that occurred when a table was closed then
    reopened (causing a PyDeadObjectError)
  - Fixed the TableProperties to use the new Date and DateTime types from datetime
  - Continued the refactoring of the base modules.
  - Updated the Utils.py documentation functions to work with the new base modules dir.
  
- version 2.55
  - TableLists can now be sent into most functions in picalo (both GUI and command line)
  - Many Table methods can be applied to TableList now. For example, TableList.filter will
    filter each table in the list.
  - Split the huge __init__.py file into the base/ modules.  This was a big refactor of code.
  - The Shell now honors the autocompletion settings in the Preferences dialog.
  - Thanks to pyExcelerator, Picalo can now read and write Excel files natively!
    That's worth a new release.  On we go.
  
- version 2.54  
  - The PCO format is now automatically gzipped on load and save.  This provides 
    about a 60 percent disk savings.
  - Made the new cell renderer return unicode strings rather than ascii strings
    to support internationalization.
  - The default string type for cells is now unicode() rather than str().
  
- version 2.53
  - Fixed a small bug in the filter.  The expression now has to explicitly == True.
  - Fixed a small bug in the new code from 2.51.  The custom cell renderer wasn't
    showing selections.  It does now.
  
- version 2.52
  - Changed the GUI to use the PythonWin ODBC code
  - Upgraded to the psycopg2 driver for Mac and Windows builds
  - Added type setting for enhanced-supported database drivers.  input_exp and 
    output_exp are now set for psycopg, MySQLdb, and odbc.  Since Gadfly doesn't 
    include type information in cursor.description, it's not possible there.
  - Changed the None type to '<N>' in GUI, loading, saving, and pretty printing
  - Psycopg (postgresql driver) is now available in the windows build
  - MySQLdb (mysql driver) is now available in the Mac build
  - Enabled the Windows XP theme in py2exe by adding a manifest

- version 2.51 - Many changes and upgrades in this release
  - Upgraded wxPython to 2.6.3.0
  - Tested the Gadfly database again.  It had a few issues.  Fixed them.
  - Tested the SnakeSQL database to see if it would be a good replacement for
    Gadfly.  But Gadfly is quite a bit more mature.  So I fixed the Gadfly issues
    instead.
  - Created Database.gadfly_connection to wrap the creation of gadfly databases.
  - Fixed the Gadfly creation dialog so it supports the new gadfly_connection method.
    The dialog getCode() method is much simpler now.
  - Updated the user manual and API documentation for the gadfly_connection method.
  - Fixed a bug in the database connection dialog where it didn't repaint the
    mainframe when it gets resized.
  - Added the PicaloHelpers.create_directory method so making directories on
    Windows doesn't fail.
  - Fixed a small bug in the spreadsheet.  The dirty level now uses max() to
    ensure that it doesn't ever get downgraded by subsequent calls
  - Fixed the table properties dialog - the table wasn't updating because
    onIdle was only being called for tables in the notebook.
  - Fixed a bug in the Find and Replace window when a table had no data
  - Added the fmt() method to dialogs so backslashes get escaped in values
  - Changed the dialogs to use assertions on init() and on ok()
  - Fixed the titles of many of the dialogs (they somehow got changed to the
    same text as the message text)
  - added str() to charts so if grouping field is numeric it works
  - On windows, the \\ code gets messy when a table is reloaded.  Fixed.
  - On stratify dialog, change to a check box list.  Done.
  - When a dialog opens, selected the currently-visible table in the table drop downs
  - Errors caused in the shell (but initiated by the GUI dialogs) now show a nice error dialog.
  - Bug fixed: When you open a table in windows using the GUI, don't move the
    mouse at all after clicking OK.  The mouse will remain an hourglass,
    even though the program is still fully functional.
  - The str(DateTime) can now turn back into a DateTime (the .00 extension)
    (added the mx.DateTime.ISO.ParseDateTime logic to the __init__.DateTime function.
  - Table Properties dialog now hides any active edit control before saving.  Otherwise
    any value currently being edited is not yet in the table
  - Added assertion code to all the picalo functions to verify types and input data.
  - Added the row field labels to the pivot table [0][0] cell
  - Added checking for valid variables from dialogs
  - Asked the user if a variable is reused in a dialog
  - Added summarization dialogs to the GUI
  - Added filtering to any Picalo Table
  - Added filtering GUI code to the Spreadsheet.py
  - Column types now have to have valid Python variable names
  - Fixed a bug in Simple.col_join_same which changed source table column names
  - Changed how Picalo expressions work: rec['colname'] is now just colname in expressions.
  - Enable filtering of tables, both directly with Table and in the GUI
  - Added shortcuts to the GUI for quick filters (right click cells)
  - Fixed the display of numbers in the gui - make format part of the table properties window
  - Changed the table properties dialog to get rid of the conversion expression
  - In fact, recreated the TableProperties dialog from scratch
  - Added input mask, display mask, and decimal places to tables
  - Created a custom grid renderer for input_exp and output_exp in Spreadsheet.py
  - Modified the DateTime types to work with the new TableProperties dialog

- version 2.50
  - Special version built for research into detectlets
  
- version 2.49
  - Code reviewed the notebook page closing code.  Fixed a destroy()
    bug that would crash the program (at times) when an editor is closed.
  - Added the NotebookComponent.onPageClose method.
  - Cleaned up the closing, removing, and deleting of tables.  The options
    should be more clear to the user now.
  - Fixed a small but when running scripts.  If they don't compile, an if 
    statement stops them from running now.
  - Fixed the offset and lineno when scripts fail.
  - Added the Table.save_xml method for generic saving of data in xml format.
  - Added show_progress to save_fixed and save_xml.
  - Set onIdle to be controlled by the mainframe.  It now calls other windows.
    This way only the active page receives onIdle events.
  - Added the current position of the editor caret to the status bar.
  
- version 2.48
  - Fixed the problem of the menu not updating to the selected tab.
  - Re-disabled :) the progress bar delay.  It didn't work as planned.
  - Code reviewed all progress bar code.  It was not clearing after some
    functions.  It is now in a try/finally loop throughout the code.
  - The detectlet wizard clears the progress bar after running detectlets
    even if a detectlet doesn't do it correctly
  - The script runner clears the progress bar even if a user script doesn't
    do it right.
  - Code reviewed the editor to see why it was crashing when closing.  No luck
    yet.
  - Fixed the cursor problem on Windows where the cursor doesn't change back
    to a regular cursor after an analysis (the hourglass stayed).
  - Fixed a layout bug where the disk browser was the wrong size upon
    Picalo startup.
  - Fixed a bug where clear_progress wasn't getting imported into some modules.

- version 2.46
  - YES!  Fixed the threading issue.  Wx does NOT like it when separate
    threads access it's objects.  Now all the previous threading is done
    with idle events that wx calls.  I think it will be more stable now.
    Lesson learned: don't use Python threads with wx widgets.
  - Reenabled the progress bar delay so it doesn't flicker at the user
    on very short analyses.

- version 2.45
  - The progress bar now runs in the main thread.
  - Scripts that run go in the main thread too, now.  wx stuff doesn't
    work well in separate threads.  they have to run in the main thread.

- version 2.43
  - "from picalo import *" now hits the shell no matter what's set
    in the preferences.  If a user were to remove this in earlier 
    versions, Picalo wouldn't work anymore.
  - The info area (shell, output, etc.) doesn't change the menu
    anymore.  It didn't make sense to have two visible notebooks
    (table/script notebook and info area notebook) changing the
    menu at the same time.
  - Added the DETECTLET_STANDARD requirement to detectlets.
  - Added a boolean type to the quicktypes and table types
  - Fixed a serious bug that crashed Picalo when a table variable
    was assigned to another table.
  - Fixed a bug that occurred when creating tables through the
    GUI - it didn't show newly-added rows.
  - Fixed a bug when a table changes to another type of variable.
    For example, if d=Table(), then you call d=5 and the table
    was visible, it is removed from the GUI.

March 11 - version 2.42
  - The 2.41 release had a bug in the menu system.  It's fixed now.

March 10, 2006 - verison 2.41
  - Made the select by value dialog more powerful.
  - Fixed a bug that crashes the program when the spreadsheet closes.
  - The spreadsheet now destroys normally (calls its wx.Panel super)
  - The automatic menu builder uses slashes rather than underscores for separation
    now since some options want underscores in them.

February 23, 2006 - version 2.39
  - Added printing capabilities for tables (spreadsheets)
  - Added automatic checking for updates at application start and on the help menu.
  - Added checking for updates to the help menu
  - Fixed the Macintosh icon to the new blue theme

January 17, 2006 - version 2.37
  - Started the changelog.  I should have been keeping this all along.
    This version is fully functional, has detectlets, and such.
    It is released in Windows, Mac as installable binaries,
    source distribution for Linux
    Main change on this version is the upgrade to wxPython 2.6.2.1.
    This wx version has major updates for Mac, minor ones for Windows.