root/tags/dabo-0.8/ChangeLog

Revision 3110, 74.5 kB (checked in by paul, 2 years ago)

0.8s change notes and release.

  • Property svn:eol-style set to native
Line 
1 See the Subversion log for all the details.
2
3 ===============================================================================
4 Dabo 0.8 (2007-05-09) (Revision 3111):
5
6 Enhancements:
7
8     ===== General Stuff =====
9 + Improved a lot of the handling of paths. It is now possible to correctly
10   resolve a relative path when the source file and the contained file are in
11   different directories, while the app is running from a third directory.
12
13 + Added datanav2; deprecated datanav. datanav2 no longer supports fieldSpecs,
14   relationSpecs, and other things. The general theme is that the generated
15   code is meant to be taken as boilerplate to be edited by the developer to
16   achieve the desired results.
17
18 + Began work on new unit testing harness, with Nate Lowrie at the helm.
19
20 + Added/enhanced unit tests for dCursor, dBizobj, dTextBox, and dForm.
21
22 + Big fixes and enhancements, as always, to runtime cdxml instantiation,
23   including much better inheritance of properties.
24
25 + General move away from accepting specific keyword arguments to class
26   constructors, in favor of accepting property values instead.
27
28     ===== UI Tier =====
29 + Began work getting grid cell properties set up. IOW, being able to set the
30   ForeColor of a specific row in a column (a single cell), including
31   dynamic cell properties. Currently, it works, but the only property
32   I've added yet is CellForeColor and DynamicCellForeColor.
33
34 + Removed the requirement that objects used as DataSources have to inherit
35   from dObject. Thanks Carl for pointing out the limitation.
36
37 + Added dDockForm to the main trunk, which is Dabo's wrapper for wxAUI.
38
39 + Added the option of passing complex filter expressions to setAll(). This
40   function now accepts a tuple of filter expressions of the format
41   'att comp val', which will be eval'd with the child objects inn order to
42   determine if the filter applies. Each expression in the tuple is ANDed
43   with the others; all the tuple elements must evaluate to True for the
44   value to be set.
45
46 + Added the dHtmlBox.HtmlLinkClicked event.
47
48 + Added the HatchStyle property to draw objects. This gives you the option
49   of specifying that the fill for drawn objects can be one of the following
50   hatch patterns:
51
52     Solid (default)
53     Transparent
54     Cross
55     Horizontal
56     Vertical
57     Diagonal
58     ReverseDiagonal
59     CrossDiagonal
60
61 + EasyDialogBuilder - minor improvements by Nate Lowrie.
62
63 + Added ensureLineVisible() method in dEditor, which even unfolds if needed.
64
65 + Added WordWrap to dGrid columns while in edit mode.
66
67 + Enhanced dShell to have Dabo property access, including Font properties.
68
69 + Improved dDateTextBox.
70
71 + Coerce dMessageBox messages into strings, which is convenient.
72
73 + dGrid's navigation now traps and responds to business rule violations, with
74   mediation by the form if possible.
75
76 + dTreeView supported in ClassDesigner-designed files.
77
78 + Added Icon property to dApp, which will become the default Icon for all
79   forms and dialogs, if not overridden at the form level.
80
81 + Simplified drag/drop in dabo.ui.
82
83 + Added dabo.ui.getChoice() and getChoices(), which present a list of choices
84   to the user, and return the user's selection(s).
85
86 + Added TextLength property to dTextBox, to limit the number of characters
87   that can be typed in by the user. Courtesy Nate Lowrie.
88
89 + Improved font zooming. Improved handling of resizing fonts for different
90   platforms (Mac), so that you have cross-platform consistency. Thanks to
91   Dj Gilcrease for help in working this out.
92
93 + Added Continuous property to dSlider, which determines whether Hit is
94   raised while the slider is being changed, or only after the user has
95   finished sliding.
96
97 + Improved autocompletion in dEditor.
98
99 + Added AutoAutoCompletion option to dEditor.
100
101 + Added methods to dabo.ui: isMouseLeftDown(), isMouseRightDown(),
102   and isMouseMiddleDown().
103
104 + Added tango icon theme and changed our toolbars/menus to reference the new
105   icons. (Ticket # 1037)
106
107 + Added Modal property to dForm, settable only by sending the property to the
108   constructor. When Modal, a dialog instead of a form will be instantiated.
109
110 + dEditor now properly syntax-colors dabo-based xml files such as .cdxml
111   and .rfxml. Previously, it displayed these files using Python coloring.
112
113 + Removed IconBundle property from dFormMixin. Added the ability to set Form.Icon
114   to a sequence of filenames which Dabo will convert to a wx.IconBundle
115   automatically.
116
117 + Added property WordWrap to dEditBox. Default is True.
118
119     ===== Data Tier =====
120 + Added the option of passing additional keyword arguments to db.dConnection.
121   Thanks Uwe for noting the limitation.
122
123 + dbFirebird - Minor improvements by Uwe Grauer.
124
125 + dbPostgreSQL - Improvements by John Fabiani, including some missing data
126   types and support for schemas.
127
128 + Added support for SQL-JOIN clauses in the sql builder.
129
130 + Added database logging, an optional feature.
131
132 + Improved SQLite by providing DictCursors.
133
134 + Added enclosing of table, field, and other names in the appropriate quote
135   character for the database backend in use. This allows for cases such as
136   spaces in field names. Control whether quoting happens automatically using
137   the dBizobj.AutoQuoteNames property.
138
139     ===== Bizobj Tier =====
140 + Added the concept of VirtualFields to dBizobj, which provides a simple,
141   flexible interface to reference calculated fields on the fly.
142
143 + Added the 'SaveNewUnchanged' property to dBizobj. When this is True, new
144   records that have not been modified from their defaults are saved; the
145   default remains to not insert such records.
146
147 + Improved data binding to bizobjs on a parent form.
148
149 + Added dBizobj.deleteAllChildren()
150
151 + Added ability to set parameters to pass to default values in dBizobj.
152
153 + Added oldVal() method to dBizobj, which takes a field name and returns the
154   value of the field at the time of the last requery.
155
156 + Added moveToPK() method in dBizobj
157
158
159 Bug Fixes:
160 + dRadioList.ButtonSpacing wasn't able to be set from initProperties() or
161   as an argument to the constructor. Fixed.
162
163 + Starting in wxPython 2.7, our dialogs weren't giving focus to the first
164   control. Fixed.
165
166 + More wxPython 2.8 bugfixes in dMenu, dPageFrame
167
168 + Fixed dConnection and dConnectInfo to raise exceptions if improper
169   arguments are passed. Ditto for dSizer*.
170
171 + Fixed dBorderSizer's box to stay in back of the controls contained within it.
172
173 + Fixed ForeColor to work immediately on Gtk.
174
175 + Controls were flushing their value, and raising ValueChanged events, too
176   many times. Fixed.
177
178 + Dialogs and forms weren't able to set things like whether they have a
179   close box, from within initProperties. Fixed.
180
181 + Message dialogs invoked like dabo.ui.areYouSure() weren't getting attached
182   to the appropriate parent form, so that the message displayed wouldn't
183   activate the form that it applied to first. Fixed.
184
185 + Fixed rapid flashing in a sorted dGrid when an editable column was selected.
186
187 + Fixed bug that prevented adding new records when child bizobjs existed.
188   (Ticket #1027). Thanks to Larry Long and John Fabiani for continued
189   assistance in tracking these problems down.
190
191 + setWhereClause() method missing in dBizobj. Fixed.
192
193 + Fixed dCursor.getChangedRows() to not take into account new records that
194   have no changes.
195
196 + Fixed the dBizobj.save() process to not scan all child bizobj's repeatedly.
197   This fixes some problems, and speeds up save() considerably.
198
199 + Fixed a problem where canceling a bizobj that had no records caused an
200   exception that was being displayed with notifyUser(). Normally, a bizobj
201   with no records does not need canceling, so raising such an error is not
202   appropriate. You can still have the old behavior by calling cancel() with
203   'ignoreNoRecords = False'.
204
205 + Fixed a bug reported by Larry Long and John Fabiani that involved requerying
206   one bizobj resulted in checking for pending changes in other bizobjs that
207   were not involved in the requery.
208
209 + Descending sorts created infinite loop with duplicate values. Fixed.
210   (Ticket #1041). Thanks Jussi.
211
212 + Fixed status text to clear the old field validation failed message when the
213   user fixes the value and the field now passes validation.
214
215 + Fixed the geometry persistence to only restore the size of the form from
216   user settings if BorderResizable is set to True.
217
218 + Fixed dGrid's AlternateRowColoring to be settable from the constructor
219   or initProperties (previously, it was only settable in afterInit() or
220   later).
221
222 + Dynamic props on dColumn were not working: fixed.
223
224 + Fixed a bug that confused the string 'None' with the null value None when
225   setting BorderStyle from a cdxml. Thanks to Miguel for catching this one.
226
227 + Fixed a couple of bugs related to the dSizer.BorderSides property.
228   Previously it was not retrieving that property correctly from the internal
229   wx flag.
230
231
232 ===============================================================================
233 Dabo 0.7.2 (2007-01-18) (Revision 2716):
234
235 Additions, all minor, backported to stable only to keep compatibility with the
236 stable versions of daboide and/or dabodemo:
237 + Enhanced the getImagePath() function to work better with Windows pathing.
238 + Refactored dPanel into a common mixin class.
239 + Added getBaseNodeClass() function to dTreeView.
240
241 Bug Fixes:
242 + Fixed the stable branch to work with wxPython 2.7 and 2.8, which was a fairly
243   large backport of relevant changes from the development trunk.
244 + Fixed a form activation problem that would happen in some cases on Windows,
245   particularly with the Class Designer.
246 + Fixed incremental search in dGrid, which was broken by earlier unicode fixes.
247 + dBizobj.onSaveNew() user hook never being called. Fixed.
248 + Fixed but in dUserSettingProvider if setting/retrieving nested settings.
249 + dForm not updating field values after a save(), which is sometimes needed.
250   Fixed.
251 + Fixed dForm to explicitly cancel bizobj changes if the user answers "no" to
252   the "do you wish to save?" message. Otherwise, the application would never
253   finish.
254 + Fixed dGrid and dImage's attProperties.
255 + Fixed bug in dGrid.HeaderHeight resulting in a traceback if you tried to set
256   it in initProperties() or as a kwarg to the constructor.
257 + Fixed dabo.ui.busyInfo() to actually show the specified text instead of just
258   an ugly grey box on Gtk.
259 + Fixed a bug in dbFirebird that was caused by initializing more than once.
260 + Fixed a problem with the date textbox in the datanav select page adding 1
261   to each month, resulting in an incorrect select statement.
262 + Fixed some minor wording and behavior problems with the Quick Report option
263   in AppWizard apps, thanks to Ted Roche.
264 + Fixed htmlAbout to not return the html tags to the clipboard.
265 + Fixed dToggleButton to always flush its data, not just on LostFocus.
266
267
268 ===============================================================================
269 Dabo 0.7.1 (2006-11-21) (Revision 2490):
270
271 Bugfixes:
272 + Segfault in dSplitter when dragging the sash. Fixed.
273 + __init__() of the wx classes happening twice. Fixed.
274 + Setting Caption sometimes required a subsequent refresh(). Fixed.
275
276
277 ===============================================================================
278 Dabo 0.7 (2006-11-16) (Revision 2464):
279
280 It has sure been a while, but we haven't been resting. Lots of new stuff
281 as we move one step forward to Dabo 1.0. Here are the most important
282 things to mention.
283
284 Notable things:
285 + SQLite is now required.
286 + wxPython 2.7 and 2.8 DO NOT WORK yet, but will soon, so stick with 2.6
287   for now.
288 + Dabo preferences are no longer saved in .ini files, but as sqlite databases.
289 + The old shortcut of referencing fields in bizobjs like:
290     fname = biz.first_name
291   no longer works. You need to change all such code to read:
292     fname = biz.Record.first_name
293
294 Known Issues:
295 + FireBird Requery problem (see http://dabodev.com/tracker/0229)
296
297
298 Bug Fixes:
299 + Replace function in dTextBox and dEditBox causing traceback. Fixed.
300 + Incremental search in dGrid now works with unicode data.
301 + Double select page on Mac and Win. Fixed.
302 + Datanav select page scrollbar doesn't show. Fixed.
303 + Ignore Tab and Shift+Tab in grid searching, so they can navigate.
304 + Setting AutoPopulatePK on the bizobj doesn't propagate to cursor. Fixed.
305 + Entering a unicode character in a dTextBox set up with a str value doesn't
306   stick. Fixed.
307 + Fixed unicode problems in dEditor.
308 + Fixed problem where fast cpu's could generate non-unique object names.
309 + Fixed showModal() to reactivate previously deactivated windows accordingly.
310 + dCursor's initProperties() called twice. Fixed.
311 + Spacers not working correctly in class designer generated files. Fixed.
312 + Fixed dabo.ui.getMouseObject() to always return the dabo object, not the
313   wx one. This would happen with grids, for example.
314 + Border sizer caption not showing. Fixed.
315 + Connection information not properly escaped in default.cnxml. Fixed.
316 + Fixed layout of nested sizers.
317 + Fixed running class-within-a-class (class designer generated).
318 + Fixed paged controls to work when generated from the Class Designer.
319 + Grid mouse events duplicated. Fixed.
320 + Can't set RegID from within initProperties(). Fixed.
321 + stderr and stdout not restored if intellisense processing caused exception.
322   Fixed.
323 + Fixed login form to look okay at low resolutions.
324 + Removed old, lingering requirement for mx.DateTime.
325 + dSpinner doesn't work correctly unless initialized to '0'. Fixed.
326 + dForm.ActiveControl would return controls in other forms, if they were the
327   current active control with keyboard focus, when clearly we want the active
328   control of *this* form. Fixed.
329 + Fixed function in dbSQLite to find and set the pk field.
330 + Fixed __version__.py to work outside the expected directory naming
331   structure.
332 + Report writer wasn't initializing report variables before starting the
333   iteration of the cursor, resulting in errors if you referred to the
334   variables from inside the page header, for example. Fixed.
335 + Setting the Value of a data-bound control programatically wasn't propagating
336   to the underlying bizobj. Fixed.
337 + New reportlab can only handle utf-8, causing errors otherwise. Added a
338   friendly message in case this happens to you when running the Quick Report
339   option in AppWizard-generated apps.
340
341 Enhancements:
342 + Added Visible property to grid dColumns.
343 + Added column information to the EventData of grid events.
344 + Removed RequeryOnLoad property from datanav.Form to dabo.ui.dForm.
345 + Can now send kwargs to grid.addColumn(), which get sent to the column's
346   constructor.
347 + Added self.super() to replace cls.doDefault, thanks to Timothy Delaney.
348 + Added exception handling to requerying. If exception happens, the
349   transaction will be rolled back.
350 + Enhanced the process used to determine field types. In addition to better
351   automatic deduction of types, you can now explicitly set the DataStructure
352   property of dBizobj and Dabo will respect that.
353 + Added Alt+Up and Alt+Down to AppWizard Apps, which bring you to first and
354   last records, respectively.
355 + Added properties for getting/setting the selection and insertion point for
356   text controls. These are InsertionPosition, SelectedText, SelectionEnd,
357   SelectionLength, and SelectionStart.
358 + Compound primary keys can now be used.
359 + Dabo icon now has an alpha channel and looks much better. Thanks to Kenneth
360   Ismert for doing a great job of this.
361 + Added Expanded property for treeview nodes.
362 + Can now set PageClass property of dPageFrame to a cdxml file.
363 + Added dRadioList to replace dRadioGroup. Pure Dabo control.
364 + Added ability to set a bizobj LinkField property to a table.field reference.
365 + Added RequeryWithParent property to dBizobj, True by default. Allows for
366   user code to determine when to requery the child, for performance reasons.
367 + Added Selection property to dGrid, which returns the list of selected rows
368   or columns.
369 + Added AutoBizobj, thanks to Echo.
370 + Added Count property to dMenu, to return the number of child menus.
371 + Changed most initial dEditor settings into configurable properties.
372 + Drag/Drop for tree nodes begun.
373 + Added getCurrentRecord() that returns the actual record data.
374 + Added dPref for managing application preferences, and switched the default
375   way to save/restore settings to use this class. Your application can define
376   whatever hierarchy you see fit. See also the new BasePrefKey and
377   PreferenceManager properties of dObject.
378 + Added ForceCase property to dTextBox and dEditBox. Forces to upper, lower,
379   or title case as the user types.
380 + Added getTempCursor() to facilitate ad-hoc data queries.
381 + Added dApp.Encoding property, a single place to get the unicode encoding. To
382   set the default encoding, use dabo.defaultEncoding = "latin-1", for example.
383 + Added clear() method to sizers, to remove all items from the sizer, and to
384   optionally destroy the items as well.
385 + Added Precision property to dColumn, which specifies the number of places to
386   show for float columns.
387 + Added preliminary support for BLOB fields. Works at least with MySQL.
388 + Added GridBeforeSort and GridAfterSort events.
389 + Added itemNode entry to the eventData for Tree events.
390 + dToggleButton now uses GenBitmapTextToggleButton, allowing for text and
391   images.
392 + Added some filtering functions to dDataSet, for selecting which records
393   to return.
394 + Added transparency and drawGradient to drawing objects. Thanks to Andrea
395   Galvana for the gradient code.
396 + Added WordWrap property to dColumn, which will wrap the text appropriately.
397 + Added cut/copy/paste hooks at the grid level.
398 + Added dabo.ui.getFormMousePosition (position relative to active form)
399 + Added DrawMode property, the logical function to use for draw operations.
400 + Added ability for About dialog subclasses to add their own version info.
401 + Added helper functions to dabo.ui: isControlDown(), isShiftDown(),
402   isAltDown(), and isCommandDown() which will return True/False depending
403   on whether the key is down while the call is made.
404 + Added containerCoordinates() and formCoordinates() method, to get the
405   current mouse position relative to the container or form.
406 + Added objectCoordinates(), which is relative to the object.
407 + Made dForm.ActiveForm settable as well as gettable.
408 + Added isContainedBy() function, returning True if the object is contained
409   inside the passed container.
410 + Made dEditor a data-aware control (cool!)
411 + Added Encoding property to dDataSet. Thanks to Simen Haugen.
412 + Can now send extra keyword args to bindKey(), which will get included in
413   the eventData dictionary, just like it works with bindEvent().
414 + Added Dabo data type code "L" for blobs, "G" for longs, and "F" for floats.
415 + Added 'sort none' option to dGrid. Now, the third mouse click on the header
416   will be 'no sort'.
417 + Added accelerator keys to the datanav Actions menu. Added Select All to the
418   Edit menu.
419 + Added dabo/ui/uiwx/concordance.py, which shows a listing of all the Dabo
420   ui classes, and the wx Class from which they descend. Then, it shows the
421   wx classes, and the list of Dabo classes that descend from it. Should help
422   people with questions like "where is wx.TextCtrl in Dabo? (dTextBox).
423 + Added MultipleSelection property to dGrid.
424 + Improved dPageList, allowing setting the spacing of the list items with
425   ListSpacing, and catching right-clicks smartly (the correct item gets
426   referenced).
427 + Added function dabo.lib.getRandomUUID(). Thanks to Ka-Ping Yee.
428 + Added method afterInitAll(), which gets called after all child objects have
429   been initialized and are live.
430 + Added helpful treeFromStructure() method to dTreeView, which takes a
431   hierarchy (in list or tuple form) and constructs the tree nodes accordingly.
432 + Added ability to send sequences of 3-sequences to the ok/cancel dialog to
433   automatically construct labels and controls on the dialog.
434 + Couldn't use the same RegID for objects, even if the prior object was
435   destroyed. Relaxed the requirements to allow for this.
436 + Added dHtmlBox, which wraps wx.html.HtmlWindow, for displaying formatted
437   text simply. Thanks to Nate Lowrie.
438 + Added showContainingPage() method to all ui controls, which will recursively
439   show any pages in any pageframes that contain this control.
440 + Added showCurrentLine() to dEditor. Does what it says.
441 + Datanav forms (AppWizard-generated) now look better as they have a bigger
442   default size. Thanks to Bill Anderson for bringing up lots of such issues.
443 + Added AddChildEditPages property to datanav apps. Set it to False and you
444   stop getting the annoying edit pages for the child bizobjs.
445 + Previously, you could only set page sizes in reports to strings like
446   "letter", "a4", etc. Now, you can also set explicit sizes such as
447   (100, 75) or ("1.75 in", "1 in").
448 + Added preliminary support for Microsoft SQL Server. This isn't usable yet
449   for any but the most tenacious developers, and likely quite buggy. If you
450   want to try it out or help develop it, please post a message to the dabo
451   developer's list (dabo-dev@leafe.com).
452
453
454 ===============================================================================
455 Dabo 0.6 (2006-03-27) (Revision 2043):
456
457 + Fixed a problem when switching to the Browse page of the datanav grid without
458   first running a query. Also, there was an error being thrown if a previous
459   query had results, and a subsequent query had no results.
460
461 + Modified the code in _setCurrentRow() of dGrid so that it wasn't calling
462   SetGridCursor() unless the position had actually changed. I had recorded up to
463   10 calls to this function, all with the exact same values each time I switched
464   to the Browse page.
465
466 + Removed the code that lower-cased field names, as it was preventing the code
467   from working with case-sensitive backends and columns containing capital
468   letters.
469
470   Fixed a problem where str values were not able to be properly converted to
471   unicode.
472
473 + Added a parameter to the promptForFileName() method to specify the default
474   path for the dialog.
475
476 + Added the TreeItemContextMenu event. This differs from the normal
477   ContextMenuEvent in that it returns the itemID of the node that was
478   right-clicked.
479
480 + Added code in the event data gathering code to store the tree item ID for
481   these events in EventData.itemID.
482
483 + Changed all the names '_id' in the dTreeView.py file to the clearer 'itemID'.
484
485 + Fixed an oversight in the dSizerMixin that didn't remove the Box for a
486   dBorderSizer when the sizer was released.
487
488 + The double-Activate on Windows is really getting in the way. I haven't heard
489   anything from my bug report yet, so I added workaround code to ignore the
490   first Activate.
491
492 + Cleaned up the order of releasing child objects for sizers. Also fixed problem
493   with releasing the box for border sizers.
494
495 + Added getFunctionList() method to return a list of all 'class' and 'def'
496   statements in the current file.
497
498 + First pass at integrating the dTable class into the dabo.db framework. Right
499   now, if this works at all, it only works for SQLite.
500
501 + Fixed a bug wherein multiply-nested sizers might not release all of their
502   content when release(True) is called.
503
504 + Added a 'setInactive()' method that will hide the auto-complete popup if one
505   is visible.
506
507 + Disabled the fillGrid()'s setting of focus to the grid, as it causes problems
508   with stealing focus away from another active form, at least on Windows. Also,
509   it seems that such code really doesn't belong inside the function to build the
510   grid, but perhaps we'll find it belongs somewhere else.
511
512 + The xml header wasn't being converted to native line endings. Fixed.
513
514 + No need to explicitly do the unicode conversion in the report fields, as that
515   is done in the report writer.
516
517 + Added a Refresh event. This is raised when dForm.refresh() is called. All
518   dPemMixin classes will receive it, and fire their refresh() hook method.
519
520 + Added dynamic properties to most normal static properties. Example: given a
521   label and a function 'currTime()' in a form that returns the current time,
522   issuing the following:
523     label.DynamicCaption = label.Form.currTime
524   will result in the label's Caption property being updated every time
525   label.Form.refresh() is called.
526
527 + Added two methods to dabo.ui for converting image data back to bitmaps and
528   images. These were necessary because I noticed that when Editor.py was called
529   from locations other than its own directory, the image file for the function
530   button was not found. The solution was to convert the .png file to a data
531   stream using wx.tools.img2py.py, and store that in Editor.py.
532
533 + Can now set dApp.UI=None, and setup() won't try to load a UI. You have to do
534   it explicitly, though, such as:
535     app = dabo.dApp()
536     app.UI = None
537     app.setup()
538   --or--
539     app = dabo.dApp(UI=None)
540     app.setup()
541
542 + First crack at creating a double-buffered drawing surface. The new class,
543   'dDrawPanel', is a subclass of dPanel, but has its repainting handled through
544   the double-buffer techniques outlined on the wxPython wiki.
545
546 + Bookmarks in dEditor now persist when you save the file. If you re-open a
547   saved file with bookmarks, they are restored.
548
549 + Refactored dUserSettingProvider a little bit. Fixed a bug in
550   getUserSettingKeys() that resulted in it always returning an empty list. Added
551   deleteUserSetting() and deleteAllUserSettings(); these do just what you think
552   they would.
553
554 + Changed a couple exec() calls to setattr() calls instead, which may be safer
555   if not faster, but definitely more explicit and easier to understand.
556
557 + Implemented the handling of RowSpan/ColSpan for grid sizers.  Added a
558   GridSizerSpanException class that is raised if an attempt to set the span to a
559   location that is already occupied.
560
561 + Revamped the entire flow for transactions. These changes have been tested on
562   MySQL and SQLite, but still need to be tested with Firebird and PostgreSQL.
563
564 + Changed the default for bizobjs, cursors, etc., to not autocommit. The
565   AutoCommit property of the bizobj is simply a pass-through to the cursor's
566   AutoCommit property.
567
568 + Also cleaned up some inconsistent spacing and method ordering.
569
570 + Modified datanav to allow for manual setups that don't use fieldSpecs or
571   relationSpecs. I'll be committing a change to the AppWizard that allows
572   for this option soon.
573
574 + Moved SelectPageClass, BrowsePageClass, and EditPageClass from PageFrame
575   to Form, since that is a better central location for these properties.
576
577 + Added a splash screen to the Dabo app startup. This is based on Andrea
578   Gavana's AdvancedSplash class, and allows for cool shaped windows, etc.
579
580 + Added the ability to set the DataSource to an object, rather than just a
581   string that can be eval'd to an object.
582
583 + Changed the 'getMaxRow/Col' methods to 'getHighRow/Col' in order to avoid
584   confusion with the MaxRows/Cols props in dGridSizer.
585
586 + Modified both sizer classes to accept windows and not just SizerItems when
587   setting/getting prop values.
588
589 + Added the movePage() method, which takes either a page reference or a page
590   index, and moves the page to the specified position. The page is then
591   selected, unless the third parameter 'selecting' is False.
592
593 + Added a getInt() method to dabo.ui.uiwx.
594
595 + Fixed the splashscreen display on Windows.
596
597 + Added the ability to set the font face and size for the editor.
598
599 + Added the setCheck() method to dMenu. Given a caption, it will check any menus
600   whose captions match. By default it will uncheck any that don't match; you can
601   pass False as the second argument and leave non-matchers alone. Also added
602   clearChecks() to uncheck all menu items in a menu.
603
604 + Exposed the FileName and FilePath properties in dEditor.
605
606 + Added some syntax sugar for referring to fields and variables in reports.
607   Where you used to have to refer to self.Record["clientname"], you can now do
608   self.clientname. Same with self.Variables.
609
610 + Added the 'callEvery' function to dabo.ui. This function accepts an interval
611   (in milliseconds), and callable reference, and optional arguments to that
612   callable. It then creates a timer that fires the callable every <interval>
613   milliseconds, passing along any optionally included arguments. The timer
614   reference is then returned, where it can be controlled by calling stop(),
615   start() or release(). This is based on the dCallEvery class that Brandon
616   Singer proposed. I made it a function in dabo.ui because I felt it was more
617   consistent with the existing functions callAfter() and callAfterInterval().
618
619 + Changed the default for forms to not automatically show "Record 1 of 0" or
620   similar meaningless database information in the status bar. Set it back to
621   True for the datanav Form class, so all datanav apps should remain unchanged.
622   All of the apps in the demo and IDE directories that don't query data, though,
623   no longer show that message.
624
625 + Creating an instance of dApp doesn't automatically create an instance of
626   uiApp. Instead, it now asks dabo.ui to get it a reference, and dabo.ui either
627   returns the current instance if one already exists, or creates one if not.
628   This allows you to run wxPython apps from within wxPython apps.
629
630 + Added some rudimentary support for file drag/drop. Right now, you can call
631   'createFileDropTarget' on an object to make it able to respond to files
632   dropped on it. Pass in an optional handler object reference; otherwise, the
633   handler is set to the object itself. The drop event is passed on to the
634   handler by calling its 'processDroppedFiles' method, which should be
635   overridden in the handler object to do the specific processing of the files.
636
637 + Added a 'Column' property to dEditor; this represents the column position in
638   the current line, and can be changed to move the cursor within the line.
639
640 + Added option in getItemByRowCol() to return the sizer item in the given
641   position instead of the object managed by that sizer item.
642
643 + Added method 'isItemChecked()' to allow you to determine the checked status of
644   any menu item.
645
646 + Added dabo.ui.getMousePosition(), which returns the position of the mouse
647   on the screen. This is in contrast to dPemMixin.getMousePosition(), which
648   gets the position of the mouse inside the client window.
649
650 + Update to allow execution of SQL statements without affecting the current data
651   set. The bizobj has a new pass-through method named 'execute()', which takes a
652   statement understood by the backend database and passes it to its cursor's
653   execute method.
654
655 + The cursor class has been modified to run all statements that don't begin with
656   'select' through its auxiliary cursor, thereby preserving its data set.
657   Preliminary tests that I've run have confirmed that these are working
658   correctly, but there should be a lot more testing done before I am confident
659   that these changes are truly sound and can handle whatever we can toss at them.
660
661 + You can now set the DataSource to an actual object, instead of having to set
662   it to a string that could be resolved to an object.
663
664 + Added basic support for storing lists/tuples in the user settings.
665
666 + Added a simple way of persisting MRU lists in applications. A new dApp
667   property, '_persistentMRUs' is a dict that contains the name of the menu as
668   the key for the entry, and the function to bind the items to as the value. The
669   framework will then handle saving and restoring MRU lists upon app startup and
670   closing.
671
672 + Modified the uiApp to accept just the menu caption as an identifier instead of
673   requiring the actual menu. This is necessary to create MRU lists for context
674   menus, or for restoring menus at app startup.
675
676 + Updated the requirement that a bizobj be found for all data sources. Since
677   that was written, Dabo's use of data binding has expanded to lots of
678   non-bizobj uses.
679
680 + Completed the majority of the work needed to implement saved classes that can
681   be used in other class designs; it was working from the Designer, but not when
682   you ran the form. These changes implement the whole inheritance structure so
683   that if you change the underlying class, any changes not explicitly overridden
684   in the design that uses that class are reflected. This works for both property
685   changes as well as code changes.
686
687 + Switched the default order of arguments in callAfterInterval(). It makes more
688   sense to specify the interval first, followed by the function and its
689   arguments. Sticking the interval between the function and its arguments seems
690   very awkward. I added code to callAfterInterval() to check if it received a
691   call in which the interval is the second argument (i.e., the original style)
692   and switch them around in that event.
693
694 + Removed dDrawPanel as a class. Turns out that adding double-buffering to
695   panels doesn't affect their performance noticeably, so it made sense to turn
696   this on for all dPanel objects by default. However, if you run into a
697   situation where this adversely affects your app, there is a new property named
698   'Buffered' that will turn this behavior off (i.e., make it work like it used
699   to) when set to False.
700
701   *IF YOU USED dDrawPanel IN YOUR CODE, THIS WILL BREAK IT!* You must update by
702   changing all references to dDrawPanel to simply dPanel.
703
704 + Removed the old syntax for begin/commit/rollbackTransaction. The default for
705   these actions in dBackendObject is to call the appropriate method on the
706   connection, not to execute a command on the cursor.
707
708 + Removed the call to cursor.connection.begin() in the beginTransaction()
709   method. This does not seem to be needed for most backends; in fact, it is
710   typically used to override autocommit to create temporary explicit
711   transactions.
712
713 + Table creation now works for MySQL also. The class dAutoBizobj is a bizobj
714   that has a dTable. The function AutoCreateTables() will try to create all the
715   tables that have been setup with dAutoBizobj objects. If it can't create the
716   tables, a message pops up for the user and the db admin. The db admin can
717   enter the username and password for access to create tables or the db admin
718   can manualy execute the queries in the queries.sql.
719
720 + Converted the dTimer from a bitmap to a non-visible control based directly on
721   wx.Timer. This makes it fit in much better with dabo.ui.callEvery(), which is
722   much more convenient to use in many cases.
723
724 + Began coding for the Hover property, which will allow for easier visual coding
725   of MouseOver events. It isn't fully implemented yet, so don't try working with
726   it.
727
728 + Implemented the Hover property in dPemMixin. The reason for this rather than
729   relying on MouseLeave to terminate the effect is that there are many time when
730   it seems that the mouse leaves the area without triggering the MouseLeave
731   event. The Hover mechanism employs a timer to check for mouse position, and
732   fire the MouseLeave code if it detects that the mouse position is outside of
733   the control.
734
735 + Added a CustomSQL property to the datanav form. If set, the settings in the
736   select page will be ignored and the contents of CustomSQL used instead.
737
738 + Added defaults to dGrid.getValue(). If no row or col is specified, it defaults
739   to the current row/column, respectively.
740
741 + Added fontMetricFromDrawObject() to dabo.ui. This enables simple calculation
742   of the width/height of a drawn text object.
743
744 + Added a fitToSizer() method to dPemMixin. This will resize the object to fit
745   the size required by the sizer represented in its Sizer property. You can also
746   pass in extraWidth and extraHeight values to adjust the size further.
747
748 + Added 'Alignment' to the pre-init properties of dCheckBox. Cleaned up the
749   property methods and definitions to make them alphabetized, and to make the
750   strings localized. Also relaxed the values accepted for the Alignment
751   property.
752
753 + Added an option to dEditor.changeFontSize() to accept strings in the format
754   "+n" or "-n". These will increment or decrement the font size by 'n' points.
755
756 + Moved the _addCode() method out of dFormMixin, since it really is more generic
757   than that. It now lives in dObject._addCodeAsMethod(), which takes a dict of
758   method name/code pairs and adds them as methods of the object. dPemMixin now
759   looks for a keyword argument called 'srcCode', and if found, adds it to the
760   object.
761
762 + You can now call addObject() and pass a cdxml file instead of a Dabo class
763   reference, and the class defined in the cdxml will be added to the parent.
764
765 + Cleaned up the dynamic code creation routines in dObject and
766   DesignerXmlConverter.
767
768 + Modified xmltodict to handle property declarations.
769
770 + Added setAfter() and setAfterInterval() to dabo.ui. These work the same as
771   callAfter() and callAfterInterval(), except you use them to set properties to
772   particular values.
773
774 + Added the following properties to dGrid: MovableColumns, ResizableColumns, and
775   ResizableRows. When any of these are set to False, the user cannot move/resize
776   the column or row.
777
778 + Changed the keyboard datanav navigation from Ctrl+, and Ctrl+. to Ctrl+LEFT
779   and Ctrl+RIGHT on Mac, and Alt+LEFT and Alt+RIGHT on Linux and Windows. I've
780   The original configuration, in addition to being nonintuitive, didn't work on
781   Windows.
782
783 + Added the ability to save screenshots in one of several graphics formats.
784   While this was part of the Bubblet demo originally, it could have uses
785   elsewhere. For example, combining this with dabo.ui.callAfterInterval() would
786   enable timed screen shots.
787
788 + Hacked a bit to get getCaptureBitmap() to work well on GTTK, but it's still
789   a bit of a mess. GTK doesn't capture the title bar, menu bar or frame
790   decorations of a window, and I tried to compensate the sizing accordingly.
791   Individual controls don't seem to work at all. I don't have more time to
792   play around with this now, but this is hardly a show-stopper for release.
793
794
795 ===============================================================================
796 Dabo 0.5.1 (2006-01-25) (Revision 1860):
797
798 + Additional MDI/SDI improvements and fixes. By default, dForm on Windows will
799   be a MDI child, which is what most Windows users will expect.
800
801 + Fixed PageFrame background color to take the background color from the form,
802   not unconditional white. Only on Windows - Gtk and Mac do the right thing by
803   default.
804
805 + Fixed various issues with getting icon files and converting them to bitmaps.
806
807 + Set the default grid font to Arial,9 on Windows, as the wx-default was just
808   plain ugly.
809
810 + Added getPositionInSizer() method to sizers, since they may also be contained
811   within sizers.
812
813 + Reworked dShell. Now it appears as a split window, with the standard command
814   area on the top, and the output in the lower pane.
815
816 + Changed dGridSizer to raise an exception if the insert method is called
817   instead of just returning False.
818
819 + Added SashPositionChanged event. Updated dSplitter to raise this event when
820   the sash position changes.
821
822 + Added scrollToBeginning() and scrollToEnd() methods to dEditBox.
823
824 + Added pass-through properties for dSplitForm's splitter's panels.
825
826 + Added the property 'SplitState' to the dShell class. By right-clicking on the
827   shell, you can toggle between the new split behavior and the "traditional"
828   single pane behavior.
829
830 + Added a right-click menu to the output pane. Right now all it can do is clear
831   itself, but we could add other stuff such as font selection, etc.
832
833 + Fixed a bug in uiApp that prevented Cut(), Copy() and Paste() from working in
834   the shell (and other non-Daboized controls that only have wx versions of these
835   methods).
836
837 + Added a menu command to the shell to clear the output window using
838   Ctrl-Backspace.
839
840 + Added the MenuOpen event to dEvents. This allows us to create dynamic menus by
841   intercepting this event and updating the prompts of the menu items as needed.
842   Added the event data code to save the prompt and menu object that triggered
843   the event.
844
845 + Added 'deadObjectException' as an alias to wx._core.PyDeadObjectError to the
846   dabo.ui.uiwx module. This will enable Dabo code to handle this condition
847   without having to use wx code.
848
849 + Added a bunch on internationalization to the dShell script.
850
851 + Made the dMessageBox titles come from Application.getAppInfo(appName) by
852   default.
853
854 + Added handling for situations where a bizobj is used with a data connection.
855
856 + Added a sizeToColumns() method. This will set the width of the grid equal to
857   that of its component Columns.
858
859 + Fixed copy to clipboard in about.py to use CRLF on Windows.
860
861 + Added new properties to grid:
862     HorizontalScrolling
863     VerticalScrolling
864     ShowColumnLables
865     ShowCellBorders
866   The scrolling properties are booleans, and will hide/show the scrollbars.
867
868 + Fixed some problems with setting the column's Width. For a number of reasons,
869   when you created a grid from scratch and then added columns using addColumn,
870   the columns widths you'd specify weren't being respected. Fixed.
871
872 + Moved the code for the dEditor class from ide/dEditor.py into its own
873   uiwx-level class. This will allow other apps (I'm thinking Designer here!) to
874   instantiate code editors where they need.
875
876 + Revamped the layout of the dOkCancelDialog class to create the panel and sizer
877   that is needed in addControls().
878
879 + Cleaned up some of the default spacing so that with AutoSize=True, the form
880   still looks OK.
881
882 + Removed the split sash code from the dEditor. That stuff belongs in the form
883   the editor is located, not in the editor itself.
884
885 + Fixed a bug in dGrid that only seemed to pop up when the grid was located on a
886   form with a bizobj but that wasn't a dForm. The presets dialog in minesweeper
887   fit that description, and it was throwing errors when you navigated through
888   the grid.
889
890 + Added methods for getting/setting the back color of individual items.
891
892 + Added property CellHighlightWidth to dGrid, and used that property in the
893   about dialog.
894
895 + Made dPanel.addControls() better behaved.
896
897 + Reworked/improved the Quick Report dialog in datanav.
898
899 + Updated dPageFrameNoTabs to raise the same events as the 'tabbed' versions do.
900   Added a 'getPageNumber()' method.
901
902 + Added PNG files for rotating images clockwise and counter-clockwise.
903
904 + Improved dImage to support 90 degree rotation in either direction. Added
905   rotation to the the demo.
906
907 + Fixed a bug in dListControl's StringValue prop, and any other place where the
908   framework was trying to call the control's GetString() method, since it
909   doesn't have one.
910
911 + Added SearchDelay property to dApp, which becomes the default SearchDelay for
912   dGrid. The dGrid SearchDelay can get set to any int but that won't override
913   the dApp setting. If dGrid.SearchDelay is set to None (the default), that is
914   when the dApp setting gets used. Set the default SearchDelay to 300 - better
915   than the previous 600 IMO but still not too fast. Eventually, when we provide
916   a default system preference screen, we should expose this property for the
917   user to tweak how they like.
918
919 + Cleaned up and consolidated lots of stuff in dGrid, which shouldn't have any
920   effect on runtime performance. Made SameSizeRows into an actual property.
921
922 + Using the standard button sizer in the okay/cancel dialog is good, because it
923   lets wx handle the platform-convention rules. However, even though it handles
924   rearranging the order of the buttons as needed, it doesn't rearrange tab
925   order. So I added code to do that.
926
927 + Reworked the login dialog to subclass from dOkCancelDialog.
928
929 + Reworked dGrid to sync the rowcount in refresh() calls. Fixed bug in syncing
930   of column counts.
931
932 + The entire populate() cycle was happening every time you entered the browse
933   page in datanav apps, when in reality the only thing you need to do in current
934   dGrids when the dataset has been requeried is a simple refresh().
935
936 + Added an initial call to _clearDocument(), which is where all the defaults are
937   set for the editor. The DesignerEditor would not indent properly without this.
938
939 + Added moveToBeginning() and moveToEnd() methods to position the pointer at the
940   beginning and end of the document, respectively.
941
942 + Added functions to dBizobj, dCursor, and dBackend to get the data structure
943   from the cursor description, instead of querying the backend based on a table
944   name. This is more likely to contain correct information, but will need work
945   for other backends besides MySQL. Also, getting the pkid is still problematic
946   - but IMO it isn't a big deal to just have the user tell us which field to use
947   as the PK.
948
949 + Fixed dGrid's buildFromDataSet() to use the new function so it will work even
950   if the bizobj has no records at the time of creation.
951
952 + Fixed dGrid.sort() to not care if sort is done on an empty bizobj. Added the
953   logic to restore code saved in the Designer so that it functions properly in
954   the re-created form.
955
956 + This is big - really big. For the first time, you can create a form in the
957   Designer, add code to be bound to events, or create custom methods, and that
958   code will work in the form created from the .cdxml file exactly the same as if
959   you had written those methods in a regular .py script.
960
961 + Improved the card deck pictures.
962
963 + Fixed some problems in the Icon setter that would cause errors if None was
964   passed, or if the icon path didn't exist, as would be the case if you were
965   running with py2exe and didn't include the icon files as resources.
966
967 + Added a significant change to eventMixin.py's auto event binding logic. The
968   code now first looks at the object itself before looking up its family tree.
969   This is critical for the event binding when running a cdxml file, where
970   methods are added to the object at runtime, and are not present in the class
971   definition.
972
973 + Cleaned up some spacing in dEvents; also fixed some "appliesToClass" logic
974   that had events 'applying' to incorrect classses. There are still some
975   anomalies, I'm sure; the event listing in the Designer will reveal these.
976
977 + Modified the dynamic code binding to fix the problem with modifying the
978   object's class definition in the current namespace. Also fixed a problem where
979   code for dPage objects was not getting assigned.
980
981 + Fixed a bug in the dListControl's _getValue() method when there were no items
982   in the list.
983
984 + Added alias 'dragging' for 'mouseDown' in the EventData for mouse events.
985
986 + Added method 'getMousePosition()' to dPemMixin. This returns the mouse
987   position in relative coordinates to the object that called it.
988
989 + Added 'drawBitmap()' method to dPemMixin. Like the other wx.DC drawing
990   methods, this wraps the wx.DC.DrawBitmap() method into an object interface
991   that Dabo objects can use.
992
993 + Changed getSQL() so that if no FROM clause has been specified, it defaults to
994   a FROM clause using the cursor's Table.
995
996 + Added properties SettingsFileName and SettingsDirectoryName to the app's
997   UserSettingProvider. The defaults for both come from
998   app.getAppInfo("appShortName"), and determine the name of the directory and
999   file name of the user settings file. The directory name will be lower()'d and
1000   have a '.' prepended automatically.
1001
1002 + Created the dFoldPanel and dFoldPanelBar classes, which wrap the built-in
1003   wx.lib.FoldPanel classes. Modified __init__.py to include these, and added
1004   some hacks to dPemMixin to enable them to work with the event structure.
1005
1006 + Added the dCalendar control. This wraps the wx.calendar.CalendarCtrl, making
1007   it simpler and more Pythonic to work with.
1008
1009 + Added a setting 'firstDayOfWeek' to dabo.settings
1010
1011 + Moved the method _getWxColour() from dFoldPanelBar into dPemMixin, as it is
1012   needed in both dFoldPanelBar as well as dCalendar, and possibly other wx
1013   controls that expect a wx.Colour object instead of a color tuple.
1014
1015 + Added the calendar events and their processing.
1016
1017 + Added a form subclass named 'dBorderlessForm'. This creates a form with no
1018   visible border or title bar. Renamed the base form class in dForm.py from
1019   'dFormBase' to 'BaseForm'. I felt that the 'd' prefix was misleading, as it
1020   isn't meant to be a Dabo base class at all.
1021
1022 + Updated dDateTextBox to use regular datetime values internally instead of
1023   wx.DateTime. Updated the calendar to use the new Dabo dCalendar instead of the
1024   raw wx version.
1025
1026 + Added row and column highlighting to the dGrid class. Default is to only show
1027   the selected cell, but that can be changed by setting the SelectionMode
1028   property to either "rows" or "columns". The color used to highlight the
1029   selected row/col is controlled by the new SelectionBackColor and
1030   SelectionForeColor properties; defaults are yellow background and black text.
1031
1032 + Added a GridRangeSelected event to dEvents, and added the code to raise it to
1033   dGrid.
1034
1035 + Changed the default SelectionMode for the datanav grid to 'row'.
1036
1037 + Added some additional properties and functionality to the dFoldPanelBar class.
1038   First is the 'Singleton' property, which controls a behavior in which one and
1039   only one panel is open at any time. Expanding a different panel collapses the
1040   currently open one, and attempting to collapse the expanded panel does
1041   nothing.
1042
1043   Second, there is a 'SingleClick' property that controls whether you need to
1044   double-click on a panel's caption bar (default behavior) to toggle it, or
1045   whether a single click will suffice.
1046
1047   Finally, the 'CollapseToBottom' property determines whether any collapsed
1048   panels are positioned at the bottom of the control, or whether they remain in
1049   their natural position.
1050
1051   I added the FoldPanelCaptionClick and FoldPanelChange events to dEvents in
1052   order to implement these features. They are available to instances of the
1053   dFoldPanelBar class for hooking additional behaviors to these events.
1054
1055   I updated the test form for dFoldPanelBar to enable you to play with these
1056   settings.
1057
1058 + Fixed a bug in dGrid's new SelectionMode property. I had previously checked
1059   for only 'r' or 'c' at the beginning of the setting, forgetting that 'cells'
1060   is a valid setting, so I fixed that to check the first two letters.
1061
1062 + Added the property 'AlternateRowColoring' to dGrid. When True, rows in the
1063   grid will be colored depending on the RowColorOdd and RowColorEven properties.
1064
1065 + Changed the datanav grid to use alternate row coloring.
1066
1067 + Added some changes to the column Width setting that were necessary for working
1068   correctly in the Designer.
1069
1070 + Fixed a bug with MultipleSelect in the dTreeView class. Added some navigation
1071   methods for returning adjacent nodes. Fixed a selection bug when working with
1072   MultipleSelect=True.
1073
1074 + Added code to properly escape characters that should not be in XML attributes.
1075   Also cleaned up some uneven spacing in the created XML.
1076
1077 + Fixed a bug in dGrid that didn't allow the ColumnCount to be reduced.
1078
1079 + Fixed a bug in dPage that happened when the page was instantiated separately
1080   from the pageframe, since it wasn't yet in the Pages collection.
1081
1082 + Added 'dEditableList', which is a wrapping of the wx.gizmos.EditableListBox.
1083   This control takes a list and allows the user to add/edit/delete items from
1084   the list, as well as re-order them. There are properties to enable/disable any
1085   of the following: edit, add, delete, order. All are enabled by default.
1086
1087 + Fixed a bug in dGridSizer. Apparently, calling 'AddGrowableRow/Col' multiple
1088   times increments an internal counter, and a subsequent 'RemoveGrowableRow/Col'
1089   will only decrement it, and will not set it to be not growable unless the
1090   counter has dropped to zero. Now setting a row as growable won't do anything
1091   if it already is.
1092
1093 + Added the drawText() method, along with the text draw objects.
1094
1095 + Added columns to reportWriter. Added smarter sorting of elements in the xml
1096   output, for instance putting the report title up top instead of on bottom, and
1097   putting the bands in order that they appear and not alpha order.
1098
1099 + Changed all the sizer routines to return the SizerItem managing the object
1100   that was just added to the sizer.
1101
1102 + Sizer.Children now modified the SizerItem objects to include a
1103   'ControllingSizer' attribute that references the parent sizer.
1104
1105 + Modified the dFoldPanelBar class to better time its refreshes. It's still a
1106   bit funky, but does seem to work better.
1107
1108 + Modified dFormMixin to handle the new Spacer panels correctly.
1109
1110 + Added a 'Children' property to dFoldPanelBar that returns the child panels,
1111   instead of the layout panel that it uses to manage the visible panels.
1112
1113 + Added a return value to setItemProp() in the sizers so that we can tell if a
1114   value was successfully applied.
1115
1116 + Fixed the problem with propertyHelperMixin.getPropertyList(): it was caching
1117   the list of properties across the class hierarchy, instead of caching just for
1118   this one class definition. Good catch, Ed!
1119
1120 + Wrapped the wx.CheckListBox for Dabo.
1121
1122 + Changed the parameter to sizer for setting the sides that the Border property
1123   applies to from 'borderFlags' to 'borderSides', as this seems much more
1124   appropriate. Updated the sizers to properly get/set this prop from a list of
1125   values.
1126
1127 + Changed all hard-coded "\n" in dicttoxml to the more crossplatform idiom
1128   "%s" % os.linesep.
1129
1130 + Fixed a problem whereby nested sizers did not get their Parent property set.
1131   Thanks to Casey McGuire for catching this bug.
1132
1133 + Added the GridCellEditBegin event, which is raised when a grid cell editor is
1134   shown. This allows you to record the value of a cell before it is modified by
1135   the user.
1136
1137 + Added StayOnTop property to dFormMixin.
1138
1139 + Added ShowMenuBar property, so I can avoid showing the Dabo menubar on my
1140   property sheet and object tree forms.
1141
1142 + Added groups and variables elements to a newly created report form.