root/tags/dabo-0.8.3/ChangeLog

Revision 3792, 80.7 kB (checked in by paul, 1 year ago)

Bumped version to 0.8.3 and added more changelog entries.

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