root/branches/carl2/ChangeLog

Revision 2748, 65.9 kB (checked in by carl, 2 years ago)

merged with trunk

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