root/tags/dabo-0.8.2/ChangeLog

Revision 3588, 78.9 kB (checked in by ed, 1 year ago)

Corrected some wording about Web Update, and noted the new PictureIndex? property of dImage.

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