See the Subversion log for all the details. =============================================================================== Dabo 0.8.2 (2007-10-24) (Revision 3580): Most Notable Things: + The dabodemo and daboide repositories are now inside the main dabo repository. + We no longer maintain separate stable branch; point releases are snapshots of the development branch instead of merely backported bugfixes. + Web Update is available; after downloading and installing this version of Dabo, you can turn Web Update on in the new Edit|Preferences window and be notified when updates are available. Dabo will then update itself if you wish. UI: + Added masking ability to dTextBox and dEditBox, via the Mask and MaskedValue properties. + Added dRadioMenuItem + dEditor now formats lots of languages, not just python. Thanks Nate! + Improved the code completion logic of dEditor to not just blindly execute code, which is slow and dangerous. + Added dEvents.InteractiveChange, + dLinePlot added thanks to Nate. + Fixed ShowBox property in dRadioList (#1093). + Fixed Enter not firing Hit in dComboBox (#1061). + Fixed dEditor bug if a def statement was the last line in the file. (#1031). + Fixed problem in dGrid where a column sizing operation would sometimes start a sort operation. Thanks Larry! + Put in Kevin Edward's solution for replacing deprecated calls in dGridSizer.py. Thanks Kevin! + Grid selection wasn't updating correctly when navigating with the keyboard. Thanks Simen for reporting and helping to fix the problem. + Added FrameCount and PictureIndex properties to dImage to deal with multi-image files. + Added PreferenceDialog class, a central place for putting application preferences. + Added the HotKey property to dMenuItem, allowing for setting the hotkeys separately from the Caption. Added ui.dialogs.HotKeyEditor, for use by the user in the new PreferenceDialog to remap hotkeys. + Enhanced dPageList to be better behaved when resizing. + Added Transparency property to forms. 255 is totally opaque; 0 is totally transparent. + Disabled the calendar and shortcut keys in dDateTextBox when ReadOnly=True. (#1103). + The RowNumChanged event now passes the old and new row numbers, and the bizobj that changed rows. + Improved performance of refreshes for dLabel with WordWrap=True. (#1105). + Fixed dHtmlBox to find inline images on Windows. + Corrected a problem with text controls losing their selection information when they lose focus. (#1104). db: + Improved the firebird code to get the pk of the table. Thanks Uwe! + John made improvements to dbPostgres.py + Fixed problem in determining NonUpdateFields. biz: + Found and fixed bugs related to parent/child relationships + Major improvements to transaction handling. General Framework: + dLocalize now converts strings into the given language. Set your language using dApp.setLanguage(). The locales have been added to Launchpad, and we'll regularly sync up with LP for our translations. + Fixed case mismatch in dLocalize (#1086). + Added dApp.makeDaboDirectories() and quickStart(), which set up a structure for dabo-based applications. Reporting: + Fixed the Show property to evaluate correctly at runtime. + BarGraph added, thanks to Gary. + Fixed a traceback when trying to start ReportDesigner. (#1106). =============================================================================== Dabo 0.8.1 (2007-07-13) (Revision 3251): + Added ScanRestorePosition property to dBizobj. Added optional parameter scanReverse to scan(). This fixes the fact that previously user code didn't have access to the __scanRestorePosition and __scanReverse attributes. + Refactored/fixed the case of an exception happening during scan: previously, another exception would happen because we tried to restore the row number even if we saved the PK value instead. (Ticket #1064) + The "Preferences" menu item in dBaseMenuBar's Edit menu used a hotkey of "P", which conflicted with Paste. Checked around and other apps use the "e" for the hotkey instead. Fixed in trunk and stable. + Fixed a problem where textboxes would lose their selection when moving focus. + Fixed a KeyError in dTreeView's makeDirTree() function, thanks to a fix by hraban in ticket #1076. + Fixed some unicode issues in paths in 3 places in the framework, thanks to Wolfram Hinderer in ticket #1083. + Fixed copy/paste in dShell. Ticket #1039. =============================================================================== Dabo 0.8 (2007-05-09) (Revision 3111): Enhancements: ===== General Stuff ===== + Improved a lot of the handling of paths. It is now possible to correctly resolve a relative path when the source file and the contained file are in different directories, while the app is running from a third directory. + Added datanav2; deprecated datanav. datanav2 no longer supports fieldSpecs, relationSpecs, and other things. The general theme is that the generated code is meant to be taken as boilerplate to be edited by the developer to achieve the desired results. + Began work on new unit testing harness, with Nate Lowrie at the helm. + Added/enhanced unit tests for dCursor, dBizobj, dTextBox, and dForm. + Big fixes and enhancements, as always, to runtime cdxml instantiation, including much better inheritance of properties. + General move away from accepting specific keyword arguments to class constructors, in favor of accepting property values instead. ===== UI Tier ===== + Began work getting grid cell properties set up. IOW, being able to set the ForeColor of a specific row in a column (a single cell), including dynamic cell properties. Currently, it works, but the only property I've added yet is CellForeColor and DynamicCellForeColor. + Removed the requirement that objects used as DataSources have to inherit from dObject. Thanks Carl for pointing out the limitation. + Added dDockForm to the main trunk, which is Dabo's wrapper for wxAUI. + Added the option of passing complex filter expressions to setAll(). This function now accepts a tuple of filter expressions of the format 'att comp val', which will be eval'd with the child objects inn order to determine if the filter applies. Each expression in the tuple is ANDed with the others; all the tuple elements must evaluate to True for the value to be set. + Added the dHtmlBox.HtmlLinkClicked event. + Added the HatchStyle property to draw objects. This gives you the option of specifying that the fill for drawn objects can be one of the following hatch patterns: Solid (default) Transparent Cross Horizontal Vertical Diagonal ReverseDiagonal CrossDiagonal + EasyDialogBuilder - minor improvements by Nate Lowrie. + Added ensureLineVisible() method in dEditor, which even unfolds if needed. + Added WordWrap to dGrid columns while in edit mode. + Enhanced dShell to have Dabo property access, including Font properties. + Improved dDateTextBox. + Coerce dMessageBox messages into strings, which is convenient. + dGrid's navigation now traps and responds to business rule violations, with mediation by the form if possible. + dTreeView supported in ClassDesigner-designed files. + Added Icon property to dApp, which will become the default Icon for all forms and dialogs, if not overridden at the form level. + Simplified drag/drop in dabo.ui. + Added dabo.ui.getChoice() and getChoices(), which present a list of choices to the user, and return the user's selection(s). + Added TextLength property to dTextBox, to limit the number of characters that can be typed in by the user. Courtesy Nate Lowrie. + Improved font zooming. Improved handling of resizing fonts for different platforms (Mac), so that you have cross-platform consistency. Thanks to Dj Gilcrease for help in working this out. + Added Continuous property to dSlider, which determines whether Hit is raised while the slider is being changed, or only after the user has finished sliding. + Improved autocompletion in dEditor. + Added AutoAutoCompletion option to dEditor. + Added methods to dabo.ui: isMouseLeftDown(), isMouseRightDown(), and isMouseMiddleDown(). + Added tango icon theme and changed our toolbars/menus to reference the new icons. (Ticket # 1037) + Added Modal property to dForm, settable only by sending the property to the constructor. When Modal, a dialog instead of a form will be instantiated. + dEditor now properly syntax-colors dabo-based xml files such as .cdxml and .rfxml. Previously, it displayed these files using Python coloring. + Removed IconBundle property from dFormMixin. Added the ability to set Form.Icon to a sequence of filenames which Dabo will convert to a wx.IconBundle automatically. + Added property WordWrap to dEditBox. Default is True. ===== Data Tier ===== + Added the option of passing additional keyword arguments to db.dConnection. Thanks Uwe for noting the limitation. + dbFirebird - Minor improvements by Uwe Grauer. + dbPostgreSQL - Improvements by John Fabiani, including some missing data types and support for schemas. + Added support for SQL-JOIN clauses in the sql builder. + Added database logging, an optional feature. + Improved SQLite by providing DictCursors. + Added enclosing of table, field, and other names in the appropriate quote character for the database backend in use. This allows for cases such as spaces in field names. Control whether quoting happens automatically using the dBizobj.AutoQuoteNames property. ===== Bizobj Tier ===== + Added the concept of VirtualFields to dBizobj, which provides a simple, flexible interface to reference calculated fields on the fly. + Added the 'SaveNewUnchanged' property to dBizobj. When this is True, new records that have not been modified from their defaults are saved; the default remains to not insert such records. + Improved data binding to bizobjs on a parent form. + Added dBizobj.deleteAllChildren() + Added ability to set parameters to pass to default values in dBizobj. + Added oldVal() method to dBizobj, which takes a field name and returns the value of the field at the time of the last requery. + Added moveToPK() method in dBizobj Bug Fixes: + dRadioList.ButtonSpacing wasn't able to be set from initProperties() or as an argument to the constructor. Fixed. + Starting in wxPython 2.7, our dialogs weren't giving focus to the first control. Fixed. + More wxPython 2.8 bugfixes in dMenu, dPageFrame + Fixed dConnection and dConnectInfo to raise exceptions if improper arguments are passed. Ditto for dSizer*. + Fixed dBorderSizer's box to stay in back of the controls contained within it. + Fixed ForeColor to work immediately on Gtk. + Controls were flushing their value, and raising ValueChanged events, too many times. Fixed. + Dialogs and forms weren't able to set things like whether they have a close box, from within initProperties. Fixed. + Message dialogs invoked like dabo.ui.areYouSure() weren't getting attached to the appropriate parent form, so that the message displayed wouldn't activate the form that it applied to first. Fixed. + Fixed rapid flashing in a sorted dGrid when an editable column was selected. + Fixed bug that prevented adding new records when child bizobjs existed. (Ticket #1027). Thanks to Larry Long and John Fabiani for continued assistance in tracking these problems down. + setWhereClause() method missing in dBizobj. Fixed. + Fixed dCursor.getChangedRows() to not take into account new records that have no changes. + Fixed the dBizobj.save() process to not scan all child bizobj's repeatedly. This fixes some problems, and speeds up save() considerably. + Fixed a problem where canceling a bizobj that had no records caused an exception that was being displayed with notifyUser(). Normally, a bizobj with no records does not need canceling, so raising such an error is not appropriate. You can still have the old behavior by calling cancel() with 'ignoreNoRecords = False'. + Fixed a bug reported by Larry Long and John Fabiani that involved requerying one bizobj resulted in checking for pending changes in other bizobjs that were not involved in the requery. + Descending sorts created infinite loop with duplicate values. Fixed. (Ticket #1041). Thanks Jussi. + Fixed status text to clear the old field validation failed message when the user fixes the value and the field now passes validation. + Fixed the geometry persistence to only restore the size of the form from user settings if BorderResizable is set to True. + Fixed dGrid's AlternateRowColoring to be settable from the constructor or initProperties (previously, it was only settable in afterInit() or later). + Dynamic props on dColumn were not working: fixed. + Fixed a bug that confused the string 'None' with the null value None when setting BorderStyle from a cdxml. Thanks to Miguel for catching this one. + Fixed a couple of bugs related to the dSizer.BorderSides property. Previously it was not retrieving that property correctly from the internal wx flag. =============================================================================== Dabo 0.7.2 (2007-01-18) (Revision 2716): Additions, all minor, backported to stable only to keep compatibility with the stable versions of daboide and/or dabodemo: + Enhanced the getImagePath() function to work better with Windows pathing. + Refactored dPanel into a common mixin class. + Added getBaseNodeClass() function to dTreeView. Bug Fixes: + Fixed the stable branch to work with wxPython 2.7 and 2.8, which was a fairly large backport of relevant changes from the development trunk. + Fixed a form activation problem that would happen in some cases on Windows, particularly with the Class Designer. + Fixed incremental search in dGrid, which was broken by earlier unicode fixes. + dBizobj.onSaveNew() user hook never being called. Fixed. + Fixed but in dUserSettingProvider if setting/retrieving nested settings. + dForm not updating field values after a save(), which is sometimes needed. Fixed. + Fixed dForm to explicitly cancel bizobj changes if the user answers "no" to the "do you wish to save?" message. Otherwise, the application would never finish. + Fixed dGrid and dImage's attProperties. + Fixed bug in dGrid.HeaderHeight resulting in a traceback if you tried to set it in initProperties() or as a kwarg to the constructor. + Fixed dabo.ui.busyInfo() to actually show the specified text instead of just an ugly grey box on Gtk. + Fixed a bug in dbFirebird that was caused by initializing more than once. + Fixed a problem with the date textbox in the datanav select page adding 1 to each month, resulting in an incorrect select statement. + Fixed some minor wording and behavior problems with the Quick Report option in AppWizard apps, thanks to Ted Roche. + Fixed htmlAbout to not return the html tags to the clipboard. + Fixed dToggleButton to always flush its data, not just on LostFocus. =============================================================================== Dabo 0.7.1 (2006-11-21) (Revision 2490): Bugfixes: + Segfault in dSplitter when dragging the sash. Fixed. + __init__() of the wx classes happening twice. Fixed. + Setting Caption sometimes required a subsequent refresh(). Fixed. =============================================================================== Dabo 0.7 (2006-11-16) (Revision 2464): It has sure been a while, but we haven't been resting. Lots of new stuff as we move one step forward to Dabo 1.0. Here are the most important things to mention. Notable things: + SQLite is now required. + wxPython 2.7 and 2.8 DO NOT WORK yet, but will soon, so stick with 2.6 for now. + Dabo preferences are no longer saved in .ini files, but as sqlite databases. + The old shortcut of referencing fields in bizobjs like: fname = biz.first_name no longer works. You need to change all such code to read: fname = biz.Record.first_name Known Issues: + FireBird Requery problem (see http://dabodev.com/tracker/0229) Bug Fixes: + Replace function in dTextBox and dEditBox causing traceback. Fixed. + Incremental search in dGrid now works with unicode data. + Double select page on Mac and Win. Fixed. + Datanav select page scrollbar doesn't show. Fixed. + Ignore Tab and Shift+Tab in grid searching, so they can navigate. + Setting AutoPopulatePK on the bizobj doesn't propagate to cursor. Fixed. + Entering a unicode character in a dTextBox set up with a str value doesn't stick. Fixed. + Fixed unicode problems in dEditor. + Fixed problem where fast cpu's could generate non-unique object names. + Fixed showModal() to reactivate previously deactivated windows accordingly. + dCursor's initProperties() called twice. Fixed. + Spacers not working correctly in class designer generated files. Fixed. + Fixed dabo.ui.getMouseObject() to always return the dabo object, not the wx one. This would happen with grids, for example. + Border sizer caption not showing. Fixed. + Connection information not properly escaped in default.cnxml. Fixed. + Fixed layout of nested sizers. + Fixed running class-within-a-class (class designer generated). + Fixed paged controls to work when generated from the Class Designer. + Grid mouse events duplicated. Fixed. + Can't set RegID from within initProperties(). Fixed. + stderr and stdout not restored if intellisense processing caused exception. Fixed. + Fixed login form to look okay at low resolutions. + Removed old, lingering requirement for mx.DateTime. + dSpinner doesn't work correctly unless initialized to '0'. Fixed. + dForm.ActiveControl would return controls in other forms, if they were the current active control with keyboard focus, when clearly we want the active control of *this* form. Fixed. + Fixed function in dbSQLite to find and set the pk field. + Fixed __version__.py to work outside the expected directory naming structure. + Report writer wasn't initializing report variables before starting the iteration of the cursor, resulting in errors if you referred to the variables from inside the page header, for example. Fixed. + Setting the Value of a data-bound control programatically wasn't propagating to the underlying bizobj. Fixed. + New reportlab can only handle utf-8, causing errors otherwise. Added a friendly message in case this happens to you when running the Quick Report option in AppWizard-generated apps. Enhancements: + Added Visible property to grid dColumns. + Added column information to the EventData of grid events. + Removed RequeryOnLoad property from datanav.Form to dabo.ui.dForm. + Can now send kwargs to grid.addColumn(), which get sent to the column's constructor. + Added self.super() to replace cls.doDefault, thanks to Timothy Delaney. + Added exception handling to requerying. If exception happens, the transaction will be rolled back. + Enhanced the process used to determine field types. In addition to better automatic deduction of types, you can now explicitly set the DataStructure property of dBizobj and Dabo will respect that. + Added Alt+Up and Alt+Down to AppWizard Apps, which bring you to first and last records, respectively. + Added properties for getting/setting the selection and insertion point for text controls. These are InsertionPosition, SelectedText, SelectionEnd, SelectionLength, and SelectionStart. + Compound primary keys can now be used. + Dabo icon now has an alpha channel and looks much better. Thanks to Kenneth Ismert for doing a great job of this. + Added Expanded property for treeview nodes. + Can now set PageClass property of dPageFrame to a cdxml file. + Added dRadioList to replace dRadioGroup. Pure Dabo control. + Added ability to set a bizobj LinkField property to a table.field reference. + Added RequeryWithParent property to dBizobj, True by default. Allows for user code to determine when to requery the child, for performance reasons. + Added Selection property to dGrid, which returns the list of selected rows or columns. + Added AutoBizobj, thanks to Echo. + Added Count property to dMenu, to return the number of child menus. + Changed most initial dEditor settings into configurable properties. + Drag/Drop for tree nodes begun. + Added getCurrentRecord() that returns the actual record data. + Added dPref for managing application preferences, and switched the default way to save/restore settings to use this class. Your application can define whatever hierarchy you see fit. See also the new BasePrefKey and PreferenceManager properties of dObject. + Added ForceCase property to dTextBox and dEditBox. Forces to upper, lower, or title case as the user types. + Added getTempCursor() to facilitate ad-hoc data queries. + Added dApp.Encoding property, a single place to get the unicode encoding. To set the default encoding, use dabo.defaultEncoding = "latin-1", for example. + Added clear() method to sizers, to remove all items from the sizer, and to optionally destroy the items as well. + Added Precision property to dColumn, which specifies the number of places to show for float columns. + Added preliminary support for BLOB fields. Works at least with MySQL. + Added GridBeforeSort and GridAfterSort events. + Added itemNode entry to the eventData for Tree events. + dToggleButton now uses GenBitmapTextToggleButton, allowing for text and images. + Added some filtering functions to dDataSet, for selecting which records to return. + Added transparency and drawGradient to drawing objects. Thanks to Andrea Galvana for the gradient code. + Added WordWrap property to dColumn, which will wrap the text appropriately. + Added cut/copy/paste hooks at the grid level. + Added dabo.ui.getFormMousePosition (position relative to active form) + Added DrawMode property, the logical function to use for draw operations. + Added ability for About dialog subclasses to add their own version info. + Added helper functions to dabo.ui: isControlDown(), isShiftDown(), isAltDown(), and isCommandDown() which will return True/False depending on whether the key is down while the call is made. + Added containerCoordinates() and formCoordinates() method, to get the current mouse position relative to the container or form. + Added objectCoordinates(), which is relative to the object. + Made dForm.ActiveForm settable as well as gettable. + Added isContainedBy() function, returning True if the object is contained inside the passed container. + Made dEditor a data-aware control (cool!) + Added Encoding property to dDataSet. Thanks to Simen Haugen. + Can now send extra keyword args to bindKey(), which will get included in the eventData dictionary, just like it works with bindEvent(). + Added Dabo data type code "L" for blobs, "G" for longs, and "F" for floats. + Added 'sort none' option to dGrid. Now, the third mouse click on the header will be 'no sort'. + Added accelerator keys to the datanav Actions menu. Added Select All to the Edit menu. + Added dabo/ui/uiwx/concordance.py, which shows a listing of all the Dabo ui classes, and the wx Class from which they descend. Then, it shows the wx classes, and the list of Dabo classes that descend from it. Should help people with questions like "where is wx.TextCtrl in Dabo? (dTextBox). + Added MultipleSelection property to dGrid. + Improved dPageList, allowing setting the spacing of the list items with ListSpacing, and catching right-clicks smartly (the correct item gets referenced). + Added function dabo.lib.getRandomUUID(). Thanks to Ka-Ping Yee. + Added method afterInitAll(), which gets called after all child objects have been initialized and are live. + Added helpful treeFromStructure() method to dTreeView, which takes a hierarchy (in list or tuple form) and constructs the tree nodes accordingly. + Added ability to send sequences of 3-sequences to the ok/cancel dialog to automatically construct labels and controls on the dialog. + Couldn't use the same RegID for objects, even if the prior object was destroyed. Relaxed the requirements to allow for this. + Added dHtmlBox, which wraps wx.html.HtmlWindow, for displaying formatted text simply. Thanks to Nate Lowrie. + Added showContainingPage() method to all ui controls, which will recursively show any pages in any pageframes that contain this control. + Added showCurrentLine() to dEditor. Does what it says. + Datanav forms (AppWizard-generated) now look better as they have a bigger default size. Thanks to Bill Anderson for bringing up lots of such issues. + Added AddChildEditPages property to datanav apps. Set it to False and you stop getting the annoying edit pages for the child bizobjs. + Previously, you could only set page sizes in reports to strings like "letter", "a4", etc. Now, you can also set explicit sizes such as (100, 75) or ("1.75 in", "1 in"). + Added preliminary support for Microsoft SQL Server. This isn't usable yet for any but the most tenacious developers, and likely quite buggy. If you want to try it out or help develop it, please post a message to the dabo developer's list (dabo-dev@leafe.com). =============================================================================== Dabo 0.6 (2006-03-27) (Revision 2043): + Fixed a problem when switching to the Browse page of the datanav grid without first running a query. Also, there was an error being thrown if a previous query had results, and a subsequent query had no results. + Modified the code in _setCurrentRow() of dGrid so that it wasn't calling SetGridCursor() unless the position had actually changed. I had recorded up to 10 calls to this function, all with the exact same values each time I switched to the Browse page. + Removed the code that lower-cased field names, as it was preventing the code from working with case-sensitive backends and columns containing capital letters. Fixed a problem where str values were not able to be properly converted to unicode. + Added a parameter to the promptForFileName() method to specify the default path for the dialog. + Added the TreeItemContextMenu event. This differs from the normal ContextMenuEvent in that it returns the itemID of the node that was right-clicked. + Added code in the event data gathering code to store the tree item ID for these events in EventData.itemID. + Changed all the names '_id' in the dTreeView.py file to the clearer 'itemID'. + Fixed an oversight in the dSizerMixin that didn't remove the Box for a dBorderSizer when the sizer was released. + The double-Activate on Windows is really getting in the way. I haven't heard anything from my bug report yet, so I added workaround code to ignore the first Activate. + Cleaned up the order of releasing child objects for sizers. Also fixed problem with releasing the box for border sizers. + Added getFunctionList() method to return a list of all 'class' and 'def' statements in the current file. + First pass at integrating the dTable class into the dabo.db framework. Right now, if this works at all, it only works for SQLite. + Fixed a bug wherein multiply-nested sizers might not release all of their content when release(True) is called. + Added a 'setInactive()' method that will hide the auto-complete popup if one is visible. + Disabled the fillGrid()'s setting of focus to the grid, as it causes problems with stealing focus away from another active form, at least on Windows. Also, it seems that such code really doesn't belong inside the function to build the grid, but perhaps we'll find it belongs somewhere else. + The xml header wasn't being converted to native line endings. Fixed. + No need to explicitly do the unicode conversion in the report fields, as that is done in the report writer. + Added a Refresh event. This is raised when dForm.refresh() is called. All dPemMixin classes will receive it, and fire their refresh() hook method. + Added dynamic properties to most normal static properties. Example: given a label and a function 'currTime()' in a form that returns the current time, issuing the following: label.DynamicCaption = label.Form.currTime will result in the label's Caption property being updated every time label.Form.refresh() is called. + Added two methods to dabo.ui for converting image data back to bitmaps and images. These were necessary because I noticed that when Editor.py was called from locations other than its own directory, the image file for the function button was not found. The solution was to convert the .png file to a data stream using wx.tools.img2py.py, and store that in Editor.py. + Can now set dApp.UI=None, and setup() won't try to load a UI. You have to do it explicitly, though, such as: app = dabo.dApp() app.UI = None app.setup() --or-- app = dabo.dApp(UI=None) app.setup() + First crack at creating a double-buffered drawing surface. The new class, 'dDrawPanel', is a subclass of dPanel, but has its repainting handled through the double-buffer techniques outlined on the wxPython wiki. + Bookmarks in dEditor now persist when you save the file. If you re-open a saved file with bookmarks, they are restored. + Refactored dUserSettingProvider a little bit. Fixed a bug in getUserSettingKeys() that resulted in it always returning an empty list. Added deleteUserSetting() and deleteAllUserSettings(); these do just what you think they would. + Changed a couple exec() calls to setattr() calls instead, which may be safer if not faster, but definitely more explicit and easier to understand. + Implemented the handling of RowSpan/ColSpan for grid sizers. Added a GridSizerSpanException class that is raised if an attempt to set the span to a location that is already occupied. + Revamped the entire flow for transactions. These changes have been tested on MySQL and SQLite, but still need to be tested with Firebird and PostgreSQL. + Changed the default for bizobjs, cursors, etc., to not autocommit. The AutoCommit property of the bizobj is simply a pass-through to the cursor's AutoCommit property. + Also cleaned up some inconsistent spacing and method ordering. + Modified datanav to allow for manual setups that don't use fieldSpecs or relationSpecs. I'll be committing a change to the AppWizard that allows for this option soon. + Moved SelectPageClass, BrowsePageClass, and EditPageClass from PageFrame to Form, since that is a better central location for these properties. + Added a splash screen to the Dabo app startup. This is based on Andrea Gavana's AdvancedSplash class, and allows for cool shaped windows, etc. + Added the ability to set the DataSource to an object, rather than just a string that can be eval'd to an object. + Changed the 'getMaxRow/Col' methods to 'getHighRow/Col' in order to avoid confusion with the MaxRows/Cols props in dGridSizer. + Modified both sizer classes to accept windows and not just SizerItems when setting/getting prop values. + Added the movePage() method, which takes either a page reference or a page index, and moves the page to the specified position. The page is then selected, unless the third parameter 'selecting' is False. + Added a getInt() method to dabo.ui.uiwx. + Fixed the splashscreen display on Windows. + Added the ability to set the font face and size for the editor. + Added the setCheck() method to dMenu. Given a caption, it will check any menus whose captions match. By default it will uncheck any that don't match; you can pass False as the second argument and leave non-matchers alone. Also added clearChecks() to uncheck all menu items in a menu. + Exposed the FileName and FilePath properties in dEditor. + Added some syntax sugar for referring to fields and variables in reports. Where you used to have to refer to self.Record["clientname"], you can now do self.clientname. Same with self.Variables. + Added the 'callEvery' function to dabo.ui. This function accepts an interval (in milliseconds), and callable reference, and optional arguments to that callable. It then creates a timer that fires the callable every milliseconds, passing along any optionally included arguments. The timer reference is then returned, where it can be controlled by calling stop(), start() or release(). This is based on the dCallEvery class that Brandon Singer proposed. I made it a function in dabo.ui because I felt it was more consistent with the existing functions callAfter() and callAfterInterval(). + Changed the default for forms to not automatically show "Record 1 of 0" or similar meaningless database information in the status bar. Set it back to True for the datanav Form class, so all datanav apps should remain unchanged. All of the apps in the demo and IDE directories that don't query data, though, no longer show that message. + Creating an instance of dApp doesn't automatically create an instance of uiApp. Instead, it now asks dabo.ui to get it a reference, and dabo.ui either returns the current instance if one already exists, or creates one if not. This allows you to run wxPython apps from within wxPython apps. + Added some rudimentary support for file drag/drop. Right now, you can call 'createFileDropTarget' on an object to make it able to respond to files dropped on it. Pass in an optional handler object reference; otherwise, the handler is set to the object itself. The drop event is passed on to the handler by calling its 'processDroppedFiles' method, which should be overridden in the handler object to do the specific processing of the files. + Added a 'Column' property to dEditor; this represents the column position in the current line, and can be changed to move the cursor within the line. + Added option in getItemByRowCol() to return the sizer item in the given position instead of the object managed by that sizer item. + Added method 'isItemChecked()' to allow you to determine the checked status of any menu item. + Added dabo.ui.getMousePosition(), which returns the position of the mouse on the screen. This is in contrast to dPemMixin.getMousePosition(), which gets the position of the mouse inside the client window. + Update to allow execution of SQL statements without affecting the current data set. The bizobj has a new pass-through method named 'execute()', which takes a statement understood by the backend database and passes it to its cursor's execute method. + The cursor class has been modified to run all statements that don't begin with 'select' through its auxiliary cursor, thereby preserving its data set. Preliminary tests that I've run have confirmed that these are working correctly, but there should be a lot more testing done before I am confident that these changes are truly sound and can handle whatever we can toss at them. + You can now set the DataSource to an actual object, instead of having to set it to a string that could be resolved to an object. + Added basic support for storing lists/tuples in the user settings. + Added a simple way of persisting MRU lists in applications. A new dApp property, '_persistentMRUs' is a dict that contains the name of the menu as the key for the entry, and the function to bind the items to as the value. The framework will then handle saving and restoring MRU lists upon app startup and closing. + Modified the uiApp to accept just the menu caption as an identifier instead of requiring the actual menu. This is necessary to create MRU lists for context menus, or for restoring menus at app startup. + Updated the requirement that a bizobj be found for all data sources. Since that was written, Dabo's use of data binding has expanded to lots of non-bizobj uses. + Completed the majority of the work needed to implement saved classes that can be used in other class designs; it was working from the Designer, but not when you ran the form. These changes implement the whole inheritance structure so that if you change the underlying class, any changes not explicitly overridden in the design that uses that class are reflected. This works for both property changes as well as code changes. + Switched the default order of arguments in callAfterInterval(). It makes more sense to specify the interval first, followed by the function and its arguments. Sticking the interval between the function and its arguments seems very awkward. I added code to callAfterInterval() to check if it received a call in which the interval is the second argument (i.e., the original style) and switch them around in that event. + Removed dDrawPanel as a class. Turns out that adding double-buffering to panels doesn't affect their performance noticeably, so it made sense to turn this on for all dPanel objects by default. However, if you run into a situation where this adversely affects your app, there is a new property named 'Buffered' that will turn this behavior off (i.e., make it work like it used to) when set to False. *IF YOU USED dDrawPanel IN YOUR CODE, THIS WILL BREAK IT!* You must update by changing all references to dDrawPanel to simply dPanel. + Removed the old syntax for begin/commit/rollbackTransaction. The default for these actions in dBackendObject is to call the appropriate method on the connection, not to execute a command on the cursor. + Removed the call to cursor.connection.begin() in the beginTransaction() method. This does not seem to be needed for most backends; in fact, it is typically used to override autocommit to create temporary explicit transactions. + Table creation now works for MySQL also. The class dAutoBizobj is a bizobj that has a dTable. The function AutoCreateTables() will try to create all the tables that have been setup with dAutoBizobj objects. If it can't create the tables, a message pops up for the user and the db admin. The db admin can enter the username and password for access to create tables or the db admin can manualy execute the queries in the queries.sql. + Converted the dTimer from a bitmap to a non-visible control based directly on wx.Timer. This makes it fit in much better with dabo.ui.callEvery(), which is much more convenient to use in many cases. + Began coding for the Hover property, which will allow for easier visual coding of MouseOver events. It isn't fully implemented yet, so don't try working with it. + Implemented the Hover property in dPemMixin. The reason for this rather than relying on MouseLeave to terminate the effect is that there are many time when it seems that the mouse leaves the area without triggering the MouseLeave event. The Hover mechanism employs a timer to check for mouse position, and fire the MouseLeave code if it detects that the mouse position is outside of the control. + Added a CustomSQL property to the datanav form. If set, the settings in the select page will be ignored and the contents of CustomSQL used instead. + Added defaults to dGrid.getValue(). If no row or col is specified, it defaults to the current row/column, respectively. + Added fontMetricFromDrawObject() to dabo.ui. This enables simple calculation of the width/height of a drawn text object. + Added a fitToSizer() method to dPemMixin. This will resize the object to fit the size required by the sizer represented in its Sizer property. You can also pass in extraWidth and extraHeight values to adjust the size further. + Added 'Alignment' to the pre-init properties of dCheckBox. Cleaned up the property methods and definitions to make them alphabetized, and to make the strings localized. Also relaxed the values accepted for the Alignment property. + Added an option to dEditor.changeFontSize() to accept strings in the format "+n" or "-n". These will increment or decrement the font size by 'n' points. + Moved the _addCode() method out of dFormMixin, since it really is more generic than that. It now lives in dObject._addCodeAsMethod(), which takes a dict of method name/code pairs and adds them as methods of the object. dPemMixin now looks for a keyword argument called 'srcCode', and if found, adds it to the object. + You can now call addObject() and pass a cdxml file instead of a Dabo class reference, and the class defined in the cdxml will be added to the parent. + Cleaned up the dynamic code creation routines in dObject and DesignerXmlConverter. + Modified xmltodict to handle property declarations. + Added setAfter() and setAfterInterval() to dabo.ui. These work the same as callAfter() and callAfterInterval(), except you use them to set properties to particular values. + Added the following properties to dGrid: MovableColumns, ResizableColumns, and ResizableRows. When any of these are set to False, the user cannot move/resize the column or row. + Changed the keyboard datanav navigation from Ctrl+, and Ctrl+. to Ctrl+LEFT and Ctrl+RIGHT on Mac, and Alt+LEFT and Alt+RIGHT on Linux and Windows. I've The original configuration, in addition to being nonintuitive, didn't work on Windows. + Added the ability to save screenshots in one of several graphics formats. While this was part of the Bubblet demo originally, it could have uses elsewhere. For example, combining this with dabo.ui.callAfterInterval() would enable timed screen shots. + Hacked a bit to get getCaptureBitmap() to work well on GTTK, but it's still a bit of a mess. GTK doesn't capture the title bar, menu bar or frame decorations of a window, and I tried to compensate the sizing accordingly. Individual controls don't seem to work at all. I don't have more time to play around with this now, but this is hardly a show-stopper for release. =============================================================================== Dabo 0.5.1 (2006-01-25) (Revision 1860): + Additional MDI/SDI improvements and fixes. By default, dForm on Windows will be a MDI child, which is what most Windows users will expect. + Fixed PageFrame background color to take the background color from the form, not unconditional white. Only on Windows - Gtk and Mac do the right thing by default. + Fixed various issues with getting icon files and converting them to bitmaps. + Set the default grid font to Arial,9 on Windows, as the wx-default was just plain ugly. + Added getPositionInSizer() method to sizers, since they may also be contained within sizers. + Reworked dShell. Now it appears as a split window, with the standard command area on the top, and the output in the lower pane. + Changed dGridSizer to raise an exception if the insert method is called instead of just returning False. + Added SashPositionChanged event. Updated dSplitter to raise this event when the sash position changes. + Added scrollToBeginning() and scrollToEnd() methods to dEditBox. + Added pass-through properties for dSplitForm's splitter's panels. + Added the property 'SplitState' to the dShell class. By right-clicking on the shell, you can toggle between the new split behavior and the "traditional" single pane behavior. + Added a right-click menu to the output pane. Right now all it can do is clear itself, but we could add other stuff such as font selection, etc. + Fixed a bug in uiApp that prevented Cut(), Copy() and Paste() from working in the shell (and other non-Daboized controls that only have wx versions of these methods). + Added a menu command to the shell to clear the output window using Ctrl-Backspace. + Added the MenuOpen event to dEvents. This allows us to create dynamic menus by intercepting this event and updating the prompts of the menu items as needed. Added the event data code to save the prompt and menu object that triggered the event. + Added 'deadObjectException' as an alias to wx._core.PyDeadObjectError to the dabo.ui.uiwx module. This will enable Dabo code to handle this condition without having to use wx code. + Added a bunch on internationalization to the dShell script. + Made the dMessageBox titles come from Application.getAppInfo(appName) by default. + Added handling for situations where a bizobj is used with a data connection. + Added a sizeToColumns() method. This will set the width of the grid equal to that of its component Columns. + Fixed copy to clipboard in about.py to use CRLF on Windows. + Added new properties to grid: HorizontalScrolling VerticalScrolling ShowColumnLables ShowCellBorders The scrolling properties are booleans, and will hide/show the scrollbars. + Fixed some problems with setting the column's Width. For a number of reasons, when you created a grid from scratch and then added columns using addColumn, the columns widths you'd specify weren't being respected. Fixed. + Moved the code for the dEditor class from ide/dEditor.py into its own uiwx-level class. This will allow other apps (I'm thinking Designer here!) to instantiate code editors where they need. + Revamped the layout of the dOkCancelDialog class to create the panel and sizer that is needed in addControls(). + Cleaned up some of the default spacing so that with AutoSize=True, the form still looks OK. + Removed the split sash code from the dEditor. That stuff belongs in the form the editor is located, not in the editor itself. + Fixed a bug in dGrid that only seemed to pop up when the grid was located on a form with a bizobj but that wasn't a dForm. The presets dialog in minesweeper fit that description, and it was throwing errors when you navigated through the grid. + Added methods for getting/setting the back color of individual items. + Added property CellHighlightWidth to dGrid, and used that property in the about dialog. + Made dPanel.addControls() better behaved. + Reworked/improved the Quick Report dialog in datanav. + Updated dPageFrameNoTabs to raise the same events as the 'tabbed' versions do. Added a 'getPageNumber()' method. + Added PNG files for rotating images clockwise and counter-clockwise. + Improved dImage to support 90 degree rotation in either direction. Added rotation to the the demo. + Fixed a bug in dListControl's StringValue prop, and any other place where the framework was trying to call the control's GetString() method, since it doesn't have one. + Added SearchDelay property to dApp, which becomes the default SearchDelay for dGrid. The dGrid SearchDelay can get set to any int but that won't override the dApp setting. If dGrid.SearchDelay is set to None (the default), that is when the dApp setting gets used. Set the default SearchDelay to 300 - better than the previous 600 IMO but still not too fast. Eventually, when we provide a default system preference screen, we should expose this property for the user to tweak how they like. + Cleaned up and consolidated lots of stuff in dGrid, which shouldn't have any effect on runtime performance. Made SameSizeRows into an actual property. + Using the standard button sizer in the okay/cancel dialog is good, because it lets wx handle the platform-convention rules. However, even though it handles rearranging the order of the buttons as needed, it doesn't rearrange tab order. So I added code to do that. + Reworked the login dialog to subclass from dOkCancelDialog. + Reworked dGrid to sync the rowcount in refresh() calls. Fixed bug in syncing of column counts. + The entire populate() cycle was happening every time you entered the browse page in datanav apps, when in reality the only thing you need to do in current dGrids when the dataset has been requeried is a simple refresh(). + Added an initial call to _clearDocument(), which is where all the defaults are set for the editor. The DesignerEditor would not indent properly without this. + Added moveToBeginning() and moveToEnd() methods to position the pointer at the beginning and end of the document, respectively. + Added functions to dBizobj, dCursor, and dBackend to get the data structure from the cursor description, instead of querying the backend based on a table name. This is more likely to contain correct information, but will need work for other backends besides MySQL. Also, getting the pkid is still problematic - but IMO it isn't a big deal to just have the user tell us which field to use as the PK. + Fixed dGrid's buildFromDataSet() to use the new function so it will work even if the bizobj has no records at the time of creation. + Fixed dGrid.sort() to not care if sort is done on an empty bizobj. Added the logic to restore code saved in the Designer so that it functions properly in the re-created form. + This is big - really big. For the first time, you can create a form in the Designer, add code to be bound to events, or create custom methods, and that code will work in the form created from the .cdxml file exactly the same as if you had written those methods in a regular .py script. + Improved the card deck pictures. + Fixed some problems in the Icon setter that would cause errors if None was passed, or if the icon path didn't exist, as would be the case if you were running with py2exe and didn't include the icon files as resources. + Added a significant change to eventMixin.py's auto event binding logic. The code now first looks at the object itself before looking up its family tree. This is critical for the event binding when running a cdxml file, where methods are added to the object at runtime, and are not present in the class definition. + Cleaned up some spacing in dEvents; also fixed some "appliesToClass" logic that had events 'applying' to incorrect classses. There are still some anomalies, I'm sure; the event listing in the Designer will reveal these. + Modified the dynamic code binding to fix the problem with modifying the object's class definition in the current namespace. Also fixed a problem where code for dPage objects was not getting assigned. + Fixed a bug in the dListControl's _getValue() method when there were no items in the list. + Added alias 'dragging' for 'mouseDown' in the EventData for mouse events. + Added method 'getMousePosition()' to dPemMixin. This returns the mouse position in relative coordinates to the object that called it. + Added 'drawBitmap()' method to dPemMixin. Like the other wx.DC drawing methods, this wraps the wx.DC.DrawBitmap() method into an object interface that Dabo objects can use. + Changed getSQL() so that if no FROM clause has been specified, it defaults to a FROM clause using the cursor's Table. + Added properties SettingsFileName and SettingsDirectoryName to the app's UserSettingProvider. The defaults for both come from app.getAppInfo("appShortName"), and determine the name of the directory and file name of the user settings file. The directory name will be lower()'d and have a '.' prepended automatically. + Created the dFoldPanel and dFoldPanelBar classes, which wrap the built-in wx.lib.FoldPanel classes. Modified __init__.py to include these, and added some hacks to dPemMixin to enable them to work with the event structure. + Added the dCalendar control. This wraps the wx.calendar.CalendarCtrl, making it simpler and more Pythonic to work with. + Added a setting 'firstDayOfWeek' to dabo.settings + Moved the method _getWxColour() from dFoldPanelBar into dPemMixin, as it is needed in both dFoldPanelBar as well as dCalendar, and possibly other wx controls that expect a wx.Colour object instead of a color tuple. + Added the calendar events and their processing. + Added a form subclass named 'dBorderlessForm'. This creates a form with no visible border or title bar. Renamed the base form class in dForm.py from 'dFormBase' to 'BaseForm'. I felt that the 'd' prefix was misleading, as it isn't meant to be a Dabo base class at all. + Updated dDateTextBox to use regular datetime values internally instead of wx.DateTime. Updated the calendar to use the new Dabo dCalendar instead of the raw wx version. + Added row and column highlighting to the dGrid class. Default is to only show the selected cell, but that can be changed by setting the SelectionMode property to either "rows" or "columns". The color used to highlight the selected row/col is controlled by the new SelectionBackColor and SelectionForeColor properties; defaults are yellow background and black text. + Added a GridRangeSelected event to dEvents, and added the code to raise it to dGrid. + Changed the default SelectionMode for the datanav grid to 'row'. + Added some additional properties and functionality to the dFoldPanelBar class. First is the 'Singleton' property, which controls a behavior in which one and only one panel is open at any time. Expanding a different panel collapses the currently open one, and attempting to collapse the expanded panel does nothing. Second, there is a 'SingleClick' property that controls whether you need to double-click on a panel's caption bar (default behavior) to toggle it, or whether a single click will suffice. Finally, the 'CollapseToBottom' property determines whether any collapsed panels are positioned at the bottom of the control, or whether they remain in their natural position. I added the FoldPanelCaptionClick and FoldPanelChange events to dEvents in order to implement these features. They are available to instances of the dFoldPanelBar class for hooking additional behaviors to these events. I updated the test form for dFoldPanelBar to enable you to play with these settings. + Fixed a bug in dGrid's new SelectionMode property. I had previously checked for only 'r' or 'c' at the beginning of the setting, forgetting that 'cells' is a valid setting, so I fixed that to check the first two letters. + Added the property 'AlternateRowColoring' to dGrid. When True, rows in the grid will be colored depending on the RowColorOdd and RowColorEven properties. + Changed the datanav grid to use alternate row coloring. + Added some changes to the column Width setting that were necessary for working correctly in the Designer. + Fixed a bug with MultipleSelect in the dTreeView class. Added some navigation methods for returning adjacent nodes. Fixed a selection bug when working with MultipleSelect=True. + Added code to properly escape characters that should not be in XML attributes. Also cleaned up some uneven spacing in the created XML. + Fixed a bug in dGrid that didn't allow the ColumnCount to be reduced. + Fixed a bug in dPage that happened when the page was instantiated separately from the pageframe, since it wasn't yet in the Pages collection. + Added 'dEditableList', which is a wrapping of the wx.gizmos.EditableListBox. This control takes a list and allows the user to add/edit/delete items from the list, as well as re-order them. There are properties to enable/disable any of the following: edit, add, delete, order. All are enabled by default. + Fixed a bug in dGridSizer. Apparently, calling 'AddGrowableRow/Col' multiple times increments an internal counter, and a subsequent 'RemoveGrowableRow/Col' will only decrement it, and will not set it to be not growable unless the counter has dropped to zero. Now setting a row as growable won't do anything if it already is. + Added the drawText() method, along with the text draw objects. + Added columns to reportWriter. Added smarter sorting of elements in the xml output, for instance putting the report title up top instead of on bottom, and putting the bands in order that they appear and not alpha order. + Changed all the sizer routines to return the SizerItem managing the object that was just added to the sizer. + Sizer.Children now modified the SizerItem objects to include a 'ControllingSizer' attribute that references the parent sizer. + Modified the dFoldPanelBar class to better time its refreshes. It's still a bit funky, but does seem to work better. + Modified dFormMixin to handle the new Spacer panels correctly. + Added a 'Children' property to dFoldPanelBar that returns the child panels, instead of the layout panel that it uses to manage the visible panels. + Added a return value to setItemProp() in the sizers so that we can tell if a value was successfully applied. + Fixed the problem with propertyHelperMixin.getPropertyList(): it was caching the list of properties across the class hierarchy, instead of caching just for this one class definition. Good catch, Ed! + Wrapped the wx.CheckListBox for Dabo. + Changed the parameter to sizer for setting the sides that the Border property applies to from 'borderFlags' to 'borderSides', as this seems much more appropriate. Updated the sizers to properly get/set this prop from a list of values. + Changed all hard-coded "\n" in dicttoxml to the more crossplatform idiom "%s" % os.linesep. + Fixed a problem whereby nested sizers did not get their Parent property set. Thanks to Casey McGuire for catching this bug. + Added the GridCellEditBegin event, which is raised when a grid cell editor is shown. This allows you to record the value of a cell before it is modified by the user. + Added StayOnTop property to dFormMixin. + Added ShowMenuBar property, so I can avoid showing the Dabo menubar on my property sheet and object tree forms. + Added groups and variables elements to a newly created report form. + Changed the default position to (-1, -1), since (0, 0) places the form under the menu bar when running on OS X. + Fixed a problem with dGrid on Windows where the propsheet was stealing the focus + Added ForegroundColor and BackgroundColor to dColumn. These props apply to all cells in a column that don't have custom renderers. + Fleshed out the 'nextNode()' and 'priorNode()' methods to provide true flat navigation through the tree. Also cleaned up several other methods that dealt with nodes and their objects. + Added font properties to treeview nodes. + Wrapped the wx.Font object into dFont. This breaks the font editing on the PropSheet, and possibly a few other places that use the font prop, but we'll have to find those afterwards. All previous references to Font have to be changed to GetFont() instead; likewise, all assignments to Font must be replaced with calls to SetFont(). + Revamped the internals of dFont. + Added 'defaultFontSize' to settings.py + Updated the font handling in dGrid and dTreeView. + Cleaned up some spacing in dLabel. + Added the default wx IDs to the About and Quit menu items so that they appear in the proper place on OS X. + Updated the long-neglected BorderSizer class, which wraps the wx.StaticBoxSizer class. You can now pass either a pre-made dBox object to the constructor, or pass a parent object, and the constructor will create the box for you. + Added a Caption property to dBorderSizer. This will update the caption displayed on the sizer's box. + Refactored the getItemProp() method so that dBorderSizer will use the same functionality. + Added getAvailableFonts() method. Returns a list of all font faces installed on the current system. + Updated dFormMixin to handle dBorderSizer objects in .cdxml files + Changed the prompt and shortcut for the 'Quit' item in dBaseMenuBar to be 'Quit' and 'Ctrl-Q' on all platforms. + Added additional properties to dBorderSizer that are basically proxies to the box's caption. + Added a Dabo wrapper for wx._core._wxPyDeadObject. + Added a couple helper functions for converting between 0-255 rgb format and 0-1 format. + Added basic MRU (Most Recently Used) capabilities to Dabo. I had looked at the wx.FileHistory class, but it seemed a bit too rigid to work with our design. To use MRU in a menu, the menu should be created by passing 'MRU=True' in the constructor. + Added Variables, Groups, and Objects as ReportObjectCollections. + Changed dEvents.ContextMenu to derive from Event instead of MenuEvent, since the contextmenu event is a request for a context menu to be displayed, and not generated from any existing menu. + Added an addObject() function to report objects. Changed the sorting of report elements so that Variables appears before Groups. Fixed a bug which sometimes kept variables and groups from getting their xml generated. + Modified xmltodict to properly escape any internal ampersands. + Modified the Quick Report (list format) to generate the report form not by crafting the XML by hand, but by using the object interface and then finally having the report writer return the XML. This results in quick reports getting the same XML format as if the Designer were used. + Added the dHyperLink control. This is a wrapped version of the wx.lib.hyperlink.HyperLinkCtrl. + Added a new function to dabo.ui, callAfterInterval(func, interval). It will call the passed function after the interval has elapsed. Additionally, if callAfterInterval() is called again with the same function before the original timer had elapsed, the old timer is destroyed and the new one instantiated, making the function only run once, after a timer finally reaches the interval. + Added 'removePage()' and 'cyclePages()' functions to the dPageFrameMixin class. The former allow for a specific page to be removed, while the latter accepts an integer value and cycles the selected page forward (positive) or backwards (negative). + Added a clear() function to dMenu() for removing all current items. + Thanks to Brandon Singer, I've fixed a problem where passing kwargs to the constructor of any dObject subclass would silently pass any unhandled kwargs. The fix to the base problem was easy, but it turns out lots of our code was relying on this. I fixed the obvious places (code that gets run from dabo/ui /uiwx/test.py) but I suspect I've missed a few. If you get the exception: TypeError: __init__() got an unexpected keyword argument '' then it is due to this fix. + The minesweeper demo uses dabo.fastNameSet when creating the squares, and it turns out that when fastNameSet is True, autoBindEvents() doesn't run. Fixed. + Fixed dApp to raise the Activate/Deactivate events properly. Fixed dApp to raise Key events. The app gets key events if no window has stopped the event along the way. So now we can dApp.bindEvent(dEvents.KeyChar, func). Fixed dApp to autoBindEvents(). + The menutype keyword can now be used to specifiy about, exit and preferences menu item. Dabo will then automatically use the correct wxID, so the menu items are automatically moved to the MacOS application menu. + Modified colorTupleFromName() to also attempt to interpret strings as HTML-style hex values. =============================================================================== Dabo-0.5 (2005-11-30) (Revision 1610): Added a new class, DataSet, which lets you issue sql queries against local Dabo data, not just against the backend. You can query, sort, and update individual DataSets, and even join multiple DataSets - all without making a call to the backend database server. Began the work of making an embedded, internal, database engine (SQLite). Starting with future releases, SQLite will be an integral part of Dabo. Improved the autoBindEvents() to bind to matching methods in all parent containers, not just the form. Auto-binding of events now works so well that it is the default; you no longer have to manually call it. This is now *really cool*. Added a basic framework for drawing shapes on any window. Once created, the shapes are accessible with an object reference. This should make dealing with DC's a thing of the past for most uses. Way cool! Sorted out MDI/SDI issues. By default, dForm on Windows MDI children and dFormMain on Windows will be MDI parents. On other platforms, both dForm and dFormMain will be SDI by default. The above statement is true for datanav applications (ones generated by the AppWizard). The pure-Dabo default is for SDI forms. In any case, you may change this by setting dabo.MDI. Improved the datanav Quick Report feature, which can print a list of the current records, mimicing the browse page, or a whole page of information on one record, mimicing the edit page. Added the ability for the user to save the generated report form for editing with the Report Designer or editing the rfxml directly. Improved showContextMenu(), and sorted out the difference between MouseRightClick and ContextMenu events. Fixed bug in Find dialog which would segfault on Windows and Mac. Added replace functionality. dCheckBox now supports 3 state mode, (True, False and None). Fixed bug in dbMySQL that would interpret longtext or longblob fields as ints. Fixed dBackend to properly send Python None values as NULLs. dForms now know how to read in cdxml files, created by the upcoming UI Designer. Fixed a bug in colorTupleFromString() that failed to return the correct value. Fixed some encoding issues with dReportWriter. Added some handling for broken database connections. Added some useful properties to dTreeView that improve its display and editability. Fixed some problems with the Hit event and dSpinner. Improved report writer's paragraph handling. Further removed user code from direct wx access in a few places. User code can still get at the wx structures though, just not quite as easily. Fixed mixed indentation problems, made some code cleaner, and added/edited lots of docstrings. Added some useful functions to dMenu to remove items and get references to menu items. Added a DynamicEnabled property to dMenuItem. Set this to a function which will get run when the parent menu is shown to determine whether the menu item is enabled or not. Menu.Children will now contain object references to Dabo menus and menu items. Improved dToolbar somewhat, in anticipation of fully objectifying the individual toolbar items. The ultimate goal is for the interface to a dToolbar to be similar to that of dMenu. Fixed some problems in dBizobj that make working with multi-table select statements more sane. Fixed a bug in dGrid which resulted in very slow deletion of rows, for instance after requerying the recordset and getting fewer rows that were in the grid before. Added properties ShowInTaskBar and FloatOnParent to dForm, and actually made the following properties work: ShowMinButton, ShowMaxButton, ShowCloseButton, ShowSystemMenu, TinyTitleBar. Added a picklist mode to datanav Forms, showing only the select and browse pages for a user to pick a record. The form dismisses on escape, and returns the selected row's pk on enter. Handling of None values in many UI controls, the bizobj, and the database is much improved. Added middle button and scroll mouse events. Added some hooks to datanav.Form that allow developers to control the select options for given fields. This would allow you to put, for example, a radiogroup with a few choices instead of the default textbox. Added connection manager to dApp, which maintains a set of open database connections that your forms can reference by name. Added Connection property to dForm. Fixed bugs in and improved dSplitter, dListControl, dControlItemMixin, and dListBox. Phwew! All that in 7 weeks. =============================================================================== Dabo-0.4.2 (2005-10-07) (Revision 1418): Added PrimaryBizobj property to dForm, which can replace calls to getPrimaryBizobj(). Added Accepted property to dOkCancelDialog, which gets set automatically if the user pressed "OK". Added AutoSQL, UserSQL, CurrentSQL, LastSQL properties to dCursor and dBizobj. When time to requery, the SQL will come from UserSQL if set, or AutoSQL will be regenerated. Fixed a bug that kept changes to a new record from getting committed. Added DefaultValues property to bizobj. Added ListSelection and ListDeselection events to dListControl. Added properties MultipleSelect, HitIndex, LastSelectedIndex, HeaderVisible, HorizontalRules, and VerticalRules. Changed the behavior of both dListControl and dListBox so that merely selecting an item doesn't raise the Hit event; instead, it raises a ListSelection event, and if another item had been previously selected, it raises a ListDeselection event. Hit is only raised from double-clicking on an item, or by pressing Enter. Added new property to dTextBox: StrictDateEntry. Changed the code for interpreting dates entered by the user to allow for some less explicit formats (YYYYMMDD, YYMMDD, and MMDD). If StrictDateEntry is False (the default), these other formats will be used when interpreting dates entered by the user. Added field-level validation to the framework. Improved support for decimal.Decimal, both at the database level and in dTextBox. Added new auto event binding, which automatically binds events based on any defined callback functions. For example, if you have a method onMouseEnter() defined, the dEvents.MouseEnter will automatically be bound to that method. Inspired by PythonCard. Added RegID property to forms, that allows for object registration with the form. Not all objects require RegIDs, but if they have one, they must be unique among all objects in a form. A reference to that object can then be gotten from any other object by calling 'self.Form.getObjectByRegID()'. Linked RegID to the auto event binding, so that if a form has a method of onHit_cmdOK(), and has a button with a RegID of 'cmdOK', the cmdOk's Hit will get bound to the form's callback, automatically. Improved dGrid and dColumn. Many properties added, and you are now in much finer control over the display of grid column headers, grid cell attributes, grid cell editors and renderers, and the grid itself. Began work of allowing case-insensitive property values for properties that take string values, and for properties that take a limited number of values where the first letter is unique, you can set the property by just using the first letter. dTextBox.Alignment = "c" sets the property to "Center", for example. Modified dBizobj, dCursorMixin, and dBackend so that the user can specify the Unicode Encoding to use. Changed the default encoding from latin-1 to utf-8. Added feature to optionally draw sizer outlines on any form that uses dSizers. This is currently accessible via an option in the View menu when the base menu bar is in use, or you can turn it on/off programatically. Grids now remember the column that is sorted, and resort when next instantiated. Added support in dReportWriter for report groups and report variables, and dynamic band heights (based on the height of contained objects). Added showExpr, which is an expression that evaluates at runtime and if true, shows the object in the report, and not if false. Improved the automatic print preview report format in datanav. It now: + prints column headers + mirrors the font size, column width, cell vertical and horizontal alignment, and column height of the grid + mirrors the font size, header height, vertical and horizontal alignment of the grid headers + automatically reorients to landscape if the detail flows beyond the width of portrait + stops printing more columns if doing so would result in overflowing the right margin Key bindings are now case-insensitive. Improved docstrings and API documentation. =============================================================================== Dabo-0.4.1 (2005-08-30) (Revision 1226): Improved test framework for uiwx. Now you can run ui/uiwx/test.py and get almost all of the dabo controls in one form, and they are the same tests that you get when you run an individual control directly. Factored out the saving/restoring of user settings out of dApp into the separate dUserSettingProvider class, which can be subclassed or overridded by the developers. Added properties UserSettingProvider and UserSettingProviderClass to dApp. Dabo user settings are no longer saved to .userSettings.ini in the app directory, but are saved to the user's home directory (in ~.dabo/) or if on Windows, in /Application Data/Dabo/. Support for SQLite added. As of this moment, Dabo supports several major open-source database backends: MySQL, PostgreSQL, Firebird, and SQLite. Next on the list should be Oracle, Sybase, and MS-SQL. Started work implementing a Quick Report in the datanav library, which replaces the old HTML Print Preview. This uses the fledgling Dabo Report Writer to create a PDF rendition of the dataset. Added new property for all controls: StatusText. When set, and when the form has a status bar, that text will show in the form's status bar when the mouse enters the control. Expanded the dabo.ui.strToBmp() function to accept an optional scale factor or width/height values. If they are passed, the returned bitmap image is sized to those values. Added an optional parameter to the bizobj and cursor's getDataSet() method. If you send a list of field names, only those fields are returned. Fixed some lingering bugs in the dabo.ui.uiwx package and the datanav lib. dWizard works better now. Improved dGauge, dLine, dBox, dRadioBox, dListBox, dToolBar, and dSizers. Added simple decimal support to dTextBox. Work continues on dGrid, specifically dColumn is now better worked into the "Dabo Way". Added dabo.trace() function, that will drop you into pdb. dConnectInfo reworked to have better property names. Removed dependency on PIL and reportlab from Dabo. These are dependencies still, but only if you try to run a report. Added dabo.lib.StopWatch.StopWatch class, which is a light Python stopwatch with start(), stop(), reset() methods and Value property. This is a partial list. Both Ed and Paul have been very busy with Dabo since 0.4 a few weeks ago. Lots of bugfixes and enhancements were made, and we encourage everyone to upgrade. =============================================================================== Dabo-0.4 (2005-08-08) (Revision 1132): Cleaned up the initialization of properties. No more initStyleProperties(); user code just puts their props in initProperties() or sends them to the constructor in the properties arg or as separate named arguments. The framework sorts out when the properties need to be set in the object construction cycle. Improved sizers by separating out the Halign and Valign properties, eliminating the need to use the 'alignment' flags parameter. Added the 'Parent' property, making it easy to reference the control that 'owns' the sizer. Also added the convenience method 'append1x(item)', which is shorthand for writing 'append(item, 1, "expand")', since it is used so frequently. The grid sizers now have 'isRowGrowable()' and 'isColGrowable()' methods for checking the status of any row/column. New dGrid, with dColumn and Header objects available for reference. Lots of convenience functions written, such as those designed for simplified access to common dialogs, are now built into the dabo.ui module. Examples: getFile(), getColor(), getBitmap(), and the getString() functions, which all create, show and destroy the required dialog window, and then return the result. So, to present the user with a font selection dialog, just call dabo.ui.getFont(), and the selected font will be returned (or None if they canceled). Similarly, to show a common messagebox and get the response, just use dabo.ui.info(), dabo.ui.stop(), or dabo.ui.areYouSure(). doDefault() much faster now (thanks to Alex Martelli) Support for decimal.Decimal. New classes: dColorDialog, dToolBar. Work on the report writer and report designer progresses. The report designer is now in the daboide project, not here in dabo anymore. We finally have distutils support. To install Dabo, do the standard "python setup.py install". Thanks to limodou for submitting the patch. Dabo-0.3.2 (2005-03-21) (Revision 959): Work continued on the Dabo report writer and report designer. The writer will now read and write the rfxml file format, and will do some simple reports. The designer will edit the rfxml files, again, with simple formats. This isn't ready to use yet but the foundation is in place. cursorToXML() added. Encoding property added to databases. dBitmap introduced. dWizard introduced. dTreeView introduced. dGrid is being refactored, and is almost done. For a short time, it can be found as dGridX. We worked hard trying to get window closing not to segfault on Windows, to get icons to display correctly on Mac, and to optimize Dabo in some key bottleneck areas. We've greatly improved Dabo's performance on all platforms, and Dabo now behaves less differently on each platform. Improved data binding: controls don't need to bind to a bizobj, but to any object expression. Improved Firebird and PostgreSQL support. Lots of improvements and bug fixes, in all three tiers. =============================================================================== Dabo-0.3.1 (2005-02-16) (Revision 802): Separated creation of dCursor from dBizobj. Added option to automatically create a dPanel in dForm. Further Daboized dListControl. Fixed display of a few of our icons on Mac. Added bindKey() method, which binds a keycombo like "Ctrl+D" to a function. Daboized dMenu, dMenuItem, and dMenuBar. Minimal Tkinter (dCheckbox) working again (testing only). Added ActiveControl property to dForm. Various dSizer improvements were made. We moved various things to better places in the source tree. Connection info now saved in XML format. Localization framework added. Courtesy Vladimir Sekissov. Added Children property, which contains a list of a container's children. dCommandButton is now known as dButton. =============================================================================== Dabo-0.3 (2005-01-10): New UI controls added: dFileDialog.py dListBox.py dListControl.py dSplitForm.py dSplitter.py GridSizer added. Method calls to all sizers greatly simplified. Menus simplified, removing wx-specific calls. My favorite UI debugging tool: getMouseObject() Framework classes now consistently use the standard initialization methods: initProperties, initEvents, etc. Child requeries and transaction support added to bizobj Bizobjs now support the relationSpecs.rsxml format for adding child relations. Support for fulltext-type searches by word added. Auxiliary (one-shot) cursors added to main cursors for better support of different backends. Improved unicode support in cursors. Added support for PostgreSQL. Added template to ease creation of new backend support scripts. appWizard: added support for parent/child/grandchild/... relationships; improved FieldSpecEditor. appWizard/dDataNav* classes: + changed all wx.Sizers to dSizers + added "-ignore-" to visually indicate search criteria to ignore + added save/restore of values on search page. + added 'Matches Words' option for fulltext searches + fixed bugs with searches for boolean values Controls: + Now auto-name themselves. Unique name enforcement added. + Added _IsContainer attribute to distinguish controls that can add other controls to themselves. + Added support for setting colors by name instead of RGB tuple. + Fixed resizing bug that would not allow a resized object to be made smaller. =============================================================================== Dabo-0.2 (2004-09-20): Continued improving FireBird database support, improved MySQL support. Added preliminary SQLite support. Save passwords encrypted. Added logger objects to send program output to, instead of directly to stdout. Began abstraction of Tkinter at purely an experimental level. Added some new controls, such as a better date control and a combo box. Brought in some Foxpro string functions from the openfox project. New event model, greatly simplifying the binding of events, the raising of events, and the subclassing of events to define new events. Added preliminary unicode support to the cursor level. =============================================================================== Dabo-0.1.1 (2004-06-13): =============================================================================== Dabo-0.1 (2004-05-10):