Changeset 2470

Show
Ignore:
Timestamp:
11/17/06 11:22:52 (2 years ago)
Author:
paul
Message:

Made the formatting of the ChangeLog? more consistent in prior versions, and
slightly edited/summarized the 0.6 and 0.5 versions where we had merely
echoed the subversion log. Much more summarizing could be done if somebody
has a fever or something and wants to do something mindless for awhile. I'm
done with my tech support call now (lots of time spent on hold) so I'm done
editing these files for now as well. :)

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/stable/ChangeLog

    r2461 r2470  
    11See the Subversion log for all the details. 
    22 
    3 ======================================================================== 
     3 
     4=============================================================================== 
    45Dabo 0.7 (2006-11-16) (Revision 2464): 
    56 
     
    1617    fname = biz.first_name 
    1718  no longer works. You need to change all such code to read: 
    18      fname = biz.Record.first_name 
     19    fname = biz.Record.first_name 
    1920 
    2021Known Issues: 
     
    177178  developer's list (dabo-dev@leafe.com).  
    178179 
    179 ======================================================================== 
     180 
     181=============================================================================== 
    180182Dabo 0.6 (2006-03-27) (Revision 2043): 
    181 (for now, due to lack of time, I'm just echoing svn log. If someone wants to 
    182 summarize the changes --today!-- that would be *very much* appreciated.) 
    183  
    184 ------------------------------------------------------------------------ 
    185 r1863 | ed | 2006-01-25 18:41:44 -0800 (Wed, 25 Jan 2006) | 4 lines 
    186  
    187 Fixed a problem when switching to the Browse page of the datanav grid without first running a query. Also, there was an error being thrown if a previous query had results, and a subsequent query had no results. 
    188  
    189 Modified the code in _setCurrentRow() of dGrid so that it wasn't calling SetGridCursor() unless the position had actually changed. I had recorded up to 10 calls to this function, all with the exact same values each time I switched to the Browse page. 
    190  
    191 ------------------------------------------------------------------------ 
    192 r1864 | ed | 2006-01-26 09:34:20 -0800 (Thu, 26 Jan 2006) | 4 lines 
    193  
    194 Removed the code that lower-cased field names, as it was preventing the code from working with case-sensitive backends and columns containing capital letters. 
    195  
    196 Also fixed a problem where str values were not able to be properly converted to unicode. 
    197  
    198 ------------------------------------------------------------------------ 
    199 r1866 | ed | 2006-01-26 15:11:35 -0800 (Thu, 26 Jan 2006) | 2 lines 
    200  
    201 Added a parameter to the promptForFileName() method to specify the default path for the dialog. 
    202  
    203 ------------------------------------------------------------------------ 
    204 r1867 | ed | 2006-01-26 17:36:12 -0800 (Thu, 26 Jan 2006) | 9 lines 
    205  
    206 Added the TreeItemContextMenu event. This differs from the normal ContextMenuEvent in that it returns the itemID of the node that was right-clicked. 
    207  
    208 Added code in the event data gathering code to store the tree item ID for these events in EventData.itemID. 
    209  
    210 Changed all the names '_id' in the dTreeView.py file to the clearer 'itemID'. 
    211  
    212 Fixed an oversight in the dSizerMixin that didn't remove the Box for a dBorderSizer when the sizer was released. 
    213  
    214  
    215 ------------------------------------------------------------------------ 
    216 r1872 | paul | 2006-01-27 08:01:09 -0800 (Fri, 27 Jan 2006) | 1 line 
    217  
    218 The double-Activate on Windows is really getting in the way. I haven't heard anything from my bug report yet, so I added workaround code to ignore the first Activate. 
    219 ------------------------------------------------------------------------ 
    220 r1873 | ed | 2006-01-27 12:16:01 -0800 (Fri, 27 Jan 2006) | 2 lines 
    221  
    222 Cleaned up the order of releasing child objects for sizers. Also fixed problem with releasing the box for border sizers. 
    223  
    224 ------------------------------------------------------------------------ 
    225 r1875 | ed | 2006-01-28 15:32:34 -0800 (Sat, 28 Jan 2006) | 2 lines 
    226  
    227 Added getFunctionList() method to return a list of all 'class' and 'def' statements in the current file. 
    228  
    229 ------------------------------------------------------------------------ 
    230 r1876 | echo | 2006-01-29 12:50:27 -0800 (Sun, 29 Jan 2006) | 3 lines 
    231  
    232 First pass at integrating the dTable class into the dabo.db framework. Right now, if this works at all, it only works for SQLite. 
    233  
    234  
    235 ------------------------------------------------------------------------ 
    236 r1877 | ed | 2006-01-29 19:45:26 -0800 (Sun, 29 Jan 2006) | 2 lines 
    237  
    238 Fixed a bug wherein multiply-nested sizers might not release all of their content when release(True) is called. 
    239  
    240 ------------------------------------------------------------------------ 
    241 r1878 | ed | 2006-01-29 20:37:07 -0800 (Sun, 29 Jan 2006) | 2 lines 
    242  
    243 Added a 'setInactive()' method that will hide the auto-complete popup if one is visible. 
    244  
    245 ------------------------------------------------------------------------ 
    246 r1882 | paul | 2006-01-31 09:28:37 -0800 (Tue, 31 Jan 2006) | 1 line 
    247  
    248 Disabled the fillGrid()'s setting of focus to the grid, as it causes problems with stealing focus away from another active form, at least on Windows. Also, it seems that such code really doesn't belong inside the function to build the grid, but perhaps we'll find it belongs somewhere else. 
    249 ------------------------------------------------------------------------ 
    250 r1883 | paul | 2006-01-31 11:58:23 -0800 (Tue, 31 Jan 2006) | 1 line 
    251  
    252 The xml header wasn't being converted to native line endings. Fixed. 
    253 ------------------------------------------------------------------------ 
    254 r1884 | paul | 2006-01-31 16:09:18 -0800 (Tue, 31 Jan 2006) | 1 line 
    255  
    256 No need to explicitly do the unicode conversion in the report fields, as that is done in the report writer. 
    257 ------------------------------------------------------------------------ 
    258 r1885 | ed | 2006-01-31 16:25:28 -0800 (Tue, 31 Jan 2006) | 12 lines 
    259  
    260 Added a Refresh event. This is raised when dForm.refresh() is called. All dPemMixin classes will receive it, and fire their refresh() hook method. 
    261  
    262 Added dynamic properties. Every property can be made dynamic by prefixing it with 'Dynamic'. Dynamic props are set to any callable function; when the object receives a Refresh event, the function's return value is used to set the value of the underlying property. 
    263  
    264 [NOTE: The previous paragraph no longer applies.] 
    265  
    266 Example: given a label and a function 'currTime()' in a form that returns the current time, issuing the following: 
    267  
    268     label.DynamicCaption = label.Form.currTime 
    269      
    270 will result in the label's Caption property being updated every time label.Form.refresh() is called with the value of the current time. 
    271  
    272 Also added two methods to dabo.ui for converting image data back to bitmaps and images. These were necessary because I noticed that when Editor.py was called from locations other than its own directory, the image file for the function button was not found. The solution was to convert the .png file to a data stream using wx.tools.img2py.py, and store that in Editor.py. 
    273  
    274 ------------------------------------------------------------------------ 
    275 r1889 | paul | 2006-02-01 16:23:51 -0800 (Wed, 01 Feb 2006) | 13 lines 
    276  
    277 This commit lets you set dApp.UI=None, and setup() won't try to load a UI. 
    278 You have to do it explicitly, though, such as: 
    279  
    280 app = dabo.dApp() 
    281 app.UI = None 
    282 app.setup() 
    283  
    284 --or-- 
    285  
    286 app = dabo.dApp(UI=None) 
    287 app.setup() 
    288  
    289  
    290 ------------------------------------------------------------------------ 
    291 r1890 | ed | 2006-02-02 05:13:52 -0800 (Thu, 02 Feb 2006) | 10 lines 
    292  
    293 Major revamping of the whole refresh/update/dynamic design. 
    294  
    295 First, refresh() simply repaints the object and anything contained in it. It simply calls the wx.Refresh() method. 
    296  
    297 There is now a method named 'update()' which will update any dynamic aspects of a control, such as its Dynamic* properties, or its data bindings, if any. If the object is a form, calling update triggers a ValueUpdate event that all data-aware controls will receive. All objects with children will raise an Update event in order to propagate the update message. You can call update() on a specific object, and only that object and its children will be updated. 
    298  
    299 This clarifies the language we use: 'refresh' refers only to having the object repainted on the screen, while 'update' can change aspects of the object, such as its value or other properties. 
    300  
    301 Updated all the classes that referred to these events and methods by their old names.  
    302  
    303 ------------------------------------------------------------------------ 
    304 r1892 | ed | 2006-02-02 15:32:49 -0800 (Thu, 02 Feb 2006) | 3 lines 
    305  
    306 First crack at creating a double-buffered drawing surface. The new class, 'dDrawPanel', is a subclass of dPanel, but has its repainting handled through the double-buffer techniques outlined on the wxPython wiki. 
    307  
    308  
    309 ------------------------------------------------------------------------ 
    310 r1897 | ed | 2006-02-04 14:03:39 -0800 (Sat, 04 Feb 2006) | 4 lines 
    311  
    312 Bookmarks in dEditor now persist when you save the file. If you re-open a saved file with bookmarks, they are restored. 
    313  
    314 Refactored dUserSettingProvider a little bit. Fixed a bug in getUserSettingKeys() that resulted in it always returning an empty list. Added deleteUserSetting() and deleteAllUserSettings(); these do just what you think they would. 
    315  
    316 ------------------------------------------------------------------------ 
    317 r1902 | paul | 2006-02-06 08:32:50 -0800 (Mon, 06 Feb 2006) | 13 lines 
    318  
    319 Simplified dPemMixin's __getattr__ and __setattr__ somewhat. I still believe it 
    320 would be better to be explicit about dynamic properties, and will try to find 
    321 some time to make that happen. 
    322  
    323 Changed a couple exec() calls to setattr() calls instead, which may be safer  
    324 if not faster, but definitely more explicit and easier to understand. 
    325  
    326 Added back a needed test for deadObject that I removed from the onUpdate 
    327 callback, and changed the test in update() back to testing for the deadObject 
    328 instead of putting it in a try block. 
    329  
    330  
    331 ----------------------------------------------------------------------- 
    332 r1904 | paul | 2006-02-06 16:36:58 -0800 (Mon, 06 Feb 2006) | 54 lines 
    333  
    334 Added makeDynamicProperty() function to dabo.ui, which creates a dynamic 
    335 property definition for the passed normal property object. I wanted to put  
    336 this in propertyHelperMixin but it doesn't appear to me that dynamic  
    337 properties are really at all useful outside of a UI context (indeed,  
    338 everything else having to do with dynamic props is defined inside  
    339 dPemMixin...). 
    340  
    341 Explicitly defined Dynamic properties for most of the existing properties 
    342 defined in dPemMixin. Removed the automagical __getattr__/__setattr__  
    343 overrides. 
    344  
    345 This dynamism is really cool, and I'm sorry that we aren't seeing completely 
    346 eye-to-eye on it. But here are some things that "just work" with my 
    347 implementation: 
    348  
    349 1) Run SimpleFormWithBizobj, and in the command window type: 
    350 > def dfb(biz): 
    351 >    return biz.ccity.strip() == "Arecibo" 
    352      
    353 > self.PageFrame.Pages[2].setAll("DynamicFontBold", (dfb, self.getBizobj())) 
    354  
    355 Now, go to the edit page and scroll through. The setAll() call just worked without 
    356 any changes needed. Something is keeping it working with the original implementation 
    357 but I admit that I don't see why, at first glance. 
    358  
    359 2) Notice when you are typing in the command window, that the dynamic properties 
    360 show up in the list. This is really what I mean when I talk about things being 
    361 documented. 
    362  
    363 3) Passing dynamic props to the constructor is the same as defining them in the class 
    364 txt = dabo.ui.dTextBox(self, DynamicEnabled=myFunc) 
    365 txt.DynamicFontItalic = myFunc 
    366  
    367 Both of the above calls work as usual WRT the Dabo Property Interface. 
    368  
    369 Granted, there's more work involved when defining a new class (gotta remember to tell 
    370 Python about the dynamic props). But after all is said, done, and considered, it is  
    371 my genuine hope and belief that this was the right way to go. But I am still sorry for  
    372 stepping on toes. 
    373  
    374 I'll follow through with making other properties (those outside dPemMixin) dynamic as 
    375 well.  
    376  
    377 There are things to consider in the future, such as: 
    378  
    379 + Do we make a DynamicValue? 
    380 + If so, does it override the value gotten from FieldSource, if set? 
    381 + What bearing does this have on the dynamism already present in, e.g., 
    382 the setting of dynamic values from non-bizobj data bindings? 
    383  
    384 Anyway, thanks for putting in the Dynamic stuff, Ed. Once we take care of the refresh 
    385 overhead - perhaps by using the timer/observer-based approach I talked about this  
    386 morning - this is really going to be killer. 
    387  
    388 ------------------------------------------------------------------------ 
    389 r1907 | ed | 2006-02-07 07:32:34 -0800 (Tue, 07 Feb 2006) | 2 lines 
    390  
    391 Implemented the handling of RowSpan/ColSpan for grid sizers.  Added a GridSizerSpanException class that is raised if an attempt to set the span to a location that is already occupied. 
    392  
    393 ------------------------------------------------------------------------ 
    394 r1909 | paul | 2006-02-07 12:43:44 -0800 (Tue, 07 Feb 2006) | 16 lines 
    395  
    396 Sorted out some problems and redundancies in the update() cycle: 
    397  
    398 + Removed the update delays, as they caused other problems. 
    399  
    400 + Because of the recursive nature of the update() function, both ValueUpdate 
    401   and Update events were triggering the controls to update themselves. Removed 
    402   ValueUpdate event and consolidated into the update() cycle. 
    403  
    404 + The Refresh() call inside update() was being called way too much. In testing 
    405   different ways to limit this refreshing, I discovered that for all the cases 
    406   I tested, the Refresh() wasn't needed at all. So I removed it. If you need 
    407     a refresh() you need to call that explicitly now. I think this may be better 
    408     anyway because they are different concepts. 
    409          
    410 Performance still isn't stellar, but it does seem much better now. 
    411  
    412 ------------------------------------------------------------------------ 
    413 r1912 | ed | 2006-02-08 14:44:41 -0800 (Wed, 08 Feb 2006) | 6 lines 
    414  
    415 Revamped the entire flow for transactions. These changes have been tested on MySQL and SQLite, but still need to be tested with Firebird and PostgreSQL. 
    416  
    417 Changed the default for bizobjs, cursors, etc., to not autocommit. The AutoCommit property of the bizobj is simply a pass-through to the cursor's AutoCommit property. 
    418  
    419 Also cleaned up some inconsistent spacing and method ordering. 
    420  
    421 ------------------------------------------------------------------------ 
    422 r1917 | paul | 2006-02-09 11:48:33 -0800 (Thu, 09 Feb 2006) | 8 lines 
    423  
    424 Modified datanav to allow for manual setups that don't use fieldSpecs or 
    425 relationSpecs. I'll be committing a change to the AppWizard that allows 
    426 for this option soon. 
    427  
    428 Moved SelectPageClass, BrowsePageClass, and EditPageClass from PageFrame 
    429 to Form, since that is a better central location for these properties. 
    430  
    431  
    432 ------------------------------------------------------------------------ 
    433 r1919 | ed | 2006-02-09 21:17:46 -0800 (Thu, 09 Feb 2006) | 7 lines 
    434  
    435 EXPERIMENTAL! 
    436 Added a splash screen to the Dabo app startup. This is based on Andrea Gavana's AdvancedSplash class, and allows for cool shaped windows, etc. 
    437  
    438 Right now on the Mac there is a noticeable delay from when the splash screen shaped frame appears and when the bitmap is drawn in the Paint event. I'm hoping to be able to figure out why, and also hope that this is just a Mac thing, as Andrea says he's tested this on WinXP and Gtk. 
    439  
    440 If this works, we may want to consider better artwork for our default splash screen, but this transparent 'dabo' lettering will do for now. 
    441  
    442 ------------------------------------------------------------------------ 
    443 r1922 | ed | 2006-02-10 14:39:15 -0800 (Fri, 10 Feb 2006) | 7 lines 
    444  
    445 Turned off the default for showing the splash screen. You can now pass the splash screen settings as parameters to the constructor of dApp, since that's the only practical way to override them. 
    446  
    447 Changed the bulk of initialization to the constructor of uiApp. Previously the uiApp object was created, and then things like platform, app reference, etc., weren't established until setup(). dApp now passes a callback to uiApp that is used to continue the startup process once the uiApp has finished initializing. 
    448  
    449 Many changes to the SplashScreen class. It now works decently on OS X and Windows, and still looks like crap on Gtk.  
    450  
    451  
    452 ------------------------------------------------------------------------ 
    453 1924 | ed | 2006-02-10 18:23:33 -0800 (Fri, 10 Feb 2006) | 2 lines 
    454  
    455 Added the ability to set the DataSource to an object, rather than just a string that can be eval'd to an object. 
    456  
    457 ------------------------------------------------------------------------ 
    458 r1926 | ed | 2006-02-11 10:29:20 -0800 (Sat, 11 Feb 2006) | 4 lines 
    459  
    460 Changed the 'getMaxRow/Col' methods to 'getHighRow/Col' in order to avoid confusion with the MaxRows/Cols props in dGridSizer. 
    461  
    462 Modified both sizer classes to accept windows and not just SizerItems when setting/getting prop values. 
    463  
    464 ------------------------------------------------------------------------ 
    465 r1929 | ed | 2006-02-12 07:12:14 -0800 (Sun, 12 Feb 2006) | 2 lines 
    466  
    467 Added the movePage() method, which takes either a page reference or a page index, and moves the page to the specified position. The page is then selected, unless the third parameter 'selecting' is False. 
    468  
    469 ------------------------------------------------------------------------ 
    470 r1933 | ed | 2006-02-12 15:36:46 -0800 (Sun, 12 Feb 2006) | 6 lines 
    471  
    472 Added a getInt() method to dabo.ui.uiwx. 
    473  
    474 Fixed the splashscreen display on Windows. 
    475  
    476 Added the ability to set the font face and size for the editor. 
    477  
    478 ------------------------------------------------------------------------ 
    479 r1938 | ed | 2006-02-13 15:51:36 -0800 (Mon, 13 Feb 2006) | 4 lines 
    480  
    481 Added the setCheck() method to dMenu. Given a caption, it will check any menus whose captions match. By default it will uncheck any that don't match; you can pass False as the second argument and leave non-matchers alone. Also added clearChecks() to uncheck all menu items in a menu. 
    482  
    483 Exposed the FileName and FilePath properties in dEditor. 
    484  
    485 ------------------------------------------------------------------------ 
    486 r1939 | paul | 2006-02-13 16:32:28 -0800 (Mon, 13 Feb 2006) | 4 lines 
    487  
    488 Added some syntax sugar for referring to fields and variables. Where you 
    489 used to have to refer to self.Record["clientname"], you can now do 
    490 self.clientname. Same with self.Variables. 
    491  
    492 ------------------------------------------------------------------------ 
    493 r1940 | ed | 2006-02-14 07:21:27 -0800 (Tue, 14 Feb 2006) | 4 lines 
    494  
    495 Added the 'callEvery' function to dabo.ui. This function accepts an interval (in milliseconds), and callable reference, and optional arguments to that callable. It then creates a timer that fires the callable every <interval> milliseconds, passing along any optionally included arguments. The timer reference is then returned, where it can be controlled by calling stop(), start() or release(). 
    496  
    497 This is based on the dCallEvery class that Brandon Singer proposed. I made it a function in dabo.ui because I felt it was more consistent with the existing functions callAfter() and callAfterInterval(). 
    498  
    499 ------------------------------------------------------------------------ 
    500 r1941 | ed | 2006-02-14 18:06:00 -0800 (Tue, 14 Feb 2006) | 2 lines 
    501  
    502 Changed the default for forms to not automatically show "Record 1 of 0" or similar meaningless database information in the status bar. Set it back to True for the datanav Form class, so all datanav apps should remain unchanged. All of the apps in the demo and IDE directories that don't query data, though, no longer show that message. 
    503  
    504 ------------------------------------------------------------------------ 
    505 r1942 | ed | 2006-02-14 18:35:24 -0800 (Tue, 14 Feb 2006) | 2 lines 
    506  
    507 Creating an instance of dApp doesn't automatically create an instance of uiApp. Instead, it now asks dabo.ui to get it a reference, and dabo.ui either returns the current instance if one already exists, or creates one if not. This allows you to run wxPython apps from within wxPython apps. 
    508  
    509 ------------------------------------------------------------------------ 
    510 r1943 | ed | 2006-02-15 14:13:29 -0800 (Wed, 15 Feb 2006) | 5 lines 
    511  
    512 Added some rudimentary support for file drag/drop. Right now, you can call 'createFileDropTarget' on an object to make it able to respond to files dropped on it. Pass in an optional handler object reference; otherwise, the handler is set to the object itself. The drop event is passed on to the handler by calling its 'processDroppedFiles' method, which should be overridden in the handler object to do the specific processing of the files. 
    513  
    514 Added a 'Column' property to dEditor; this represents the column position in the current line, and can be changed to move the cursor within the line. 
    515  
    516  
    517 ------------------------------------------------------------------------ 
    518 r1944 | ed | 2006-02-16 06:21:47 -0800 (Thu, 16 Feb 2006) | 2 lines 
    519  
    520 Added option in getItemByRowCol() to return the sizer item in the given position instead of the object managed by that sizer item. 
    521  
    522 ------------------------------------------------------------------------ 
    523 r1945 | ed | 2006-02-16 07:32:33 -0800 (Thu, 16 Feb 2006) | 2 lines 
    524  
    525 Added method 'isItemChecked()' to allow you to determine the checked status of any menu item. 
    526  
    527 ------------------------------------------------------------------------ 
    528 r1946 | paul | 2006-02-16 08:36:49 -0800 (Thu, 16 Feb 2006) | 4 lines 
    529  
    530 Added dabo.ui.getMousePosition(), which returns the position of the mouse 
    531 on the screen. This is in contrast to dPemMixin.getMousePosition(), which  
    532 gets the position of the mouse inside the client window. 
    533  
    534 ------------------------------------------------------------------------ 
    535 r1951 | ed | 2006-02-16 14:06:06 -0800 (Thu, 16 Feb 2006) | 4 lines 
    536  
    537 Update to allow execution of SQL statements without affecting the current data set. The bizobj has a new pass-through method named 'execute()', which takes a statement understood by the backend database and passes it to its cursor's execute method. 
    538  
    539 The cursor class has been modified to run all statements that don't begin with 'select' through its auxiliary cursor, thereby preserving its data set. Preliminary tests that I've run have confirmed that these are working correctly, but there should be a lot more testing done before I am confident that these changes are truly sound and can handle whatever we can toss at them. 
    540  
    541 ------------------------------------------------------------------------ 
    542 r1954 | ed | 2006-02-16 17:12:17 -0800 (Thu, 16 Feb 2006) | 2 lines 
    543  
    544 You can now set the DataSource to an actual object, instead of having to set it to a string that could be resolved to an object.  
    545  
    546 ------------------------------------------------------------------------ 
    547 r1958 | ed | 2006-02-17 18:13:28 -0800 (Fri, 17 Feb 2006) | 6 lines 
    548  
    549 Added basic support for storing lists/tuples in the user settings.  
    550  
    551 Added a simple way of persisting MRU lists in applications. A new dApp property, '_persistentMRUs' is a dict that contains the name of the menu as the key for the entry, and the function to bind the items to as the value. The framework will then handle saving and restoring MRU lists upon app startup and closing. 
    552  
    553 Modified the uiApp to accept just the menu caption as an identifier instead of requiring the actual menu. This is necessary to create MRU lists for context menus, or for restoring menus at app startup. 
    554  
    555 ------------------------------------------------------------------------ 
    556 r1959 | ed | 2006-02-18 12:55:23 -0800 (Sat, 18 Feb 2006) | 2 lines 
    557  
    558 Updated the requirement that a bizobj be found for all data sources. SInce that was written, Dabo's use of data binding has expanded to lots of non-bizobj uses. 
    559  
    560 ------------------------------------------------------------------------ 
    561 r1962 | ed | 2006-02-20 14:22:40 -0800 (Mon, 20 Feb 2006) | 2 lines 
    562  
    563 Completed the majority of the work needed to implement saved classes that can be used in other class designs; it was working from the Designer, but not when you ran the form. These changes implement the whole inheritance structure so that if you change the underlying class, any changes not explicitly overridden in the design that uses that class are reflected. This works for both property changes as well as code changes.  
    564  
    565 ------------------------------------------------------------------------ 
    566 r1963 | ed | 2006-02-21 06:11:12 -0800 (Tue, 21 Feb 2006) | 8 lines 
    567  
    568 Switched the default order of arguments in callAfterInterval(). It makes more sense to specify the interval first, followed by the function and its arguments. Sticking the interval between the function and its arguments seems very awkward. I added code to callAfterInterval() to check if it received a call in which the interval is the second argument (i.e., the original style) and switch them around in that event. 
    569  
    570 Removed dDrawPanel as a class. Turns out that adding double-buffering to panels doesn't affect their performance noticeably, so it made sense to turn this on for all dPanel objects by default. However, if you run into a situation where this adversely affects your app, there is a new property named 'Buffered' that will turn this behavior off (i.e., make it work like it used to) when set to False. 
    571  
    572 *IF YOU USED dDrawPanel IN YOUR CODE, THIS WILL BREAK IT!* 
    573  
    574 You must update by changing all references to dDrawPanel to simply dPanel. 
    575  
    576 ------------------------------------------------------------------------ 
    577 r1964 | ed | 2006-02-21 11:05:01 -0800 (Tue, 21 Feb 2006) | 2 lines 
    578  
    579 Changed the default for double buffering back to off. Seems that it wasn't as transparently simple as I thought. 
    580  
    581 ------------------------------------------------------------------------ 
    582 r1969 | ed | 2006-02-25 11:37:56 -0800 (Sat, 25 Feb 2006) | 2 lines 
    583  
    584 Removed the old syntax for begin/commit/rollbackTransaction. The default for these actions in dBackendObject is to call the appropriate method on the connection, not to execute a command on the cursor. 
    585  
    586 ------------------------------------------------------------------------ 
    587 r1971 | ed | 2006-02-26 14:38:48 -0800 (Sun, 26 Feb 2006) | 2 lines 
    588  
    589 Removed the call to cursor.connection.begin() in the beginTransaction() method. This does not seem to be needed for most backends; in fact, it is typically used to override autocommit to create temporary explicit transactions. 
    590  
    591 ------------------------------------------------------------------------ 
    592 r1972 | echo | 2006-02-28 10:51:19 -0800 (Tue, 28 Feb 2006) | 7 lines 
    593  
    594 Table creation now works for MySQL also. 
    595  
    596 The class dAutoBizobj is a bizobj that has a dTable. 
    597  
    598 The function AutoCreateTables() will try to create all the tables that have been setup with dAutoBizobj objects. If it can't create the tables, a message pops up for the user and the db admin. The db admin can enter the username and password for access to create tables or the db admin can manualy execute the queries in the queries.sql. 
    599  
    600 Also, having autotables for more than database or even more than one host does not messup or crash, it is handled. 
    601 ------------------------------------------------------------------------ 
    602 r1975 | ed | 2006-03-01 13:43:52 -0800 (Wed, 01 Mar 2006) | 9 lines 
    603  
    604 Converted the dTimer from a bitmap to a non-visible control based directly on wx.Timer. This makes it fit in much better with dabo.ui.callEvery(), which is much more convenient to use in many cases. 
    605  
    606 Began coding for the Hover property, which will allow for easier visual coding of MouseOver events. It isn't fully implemented yet, so don't try working with it. 
    607  
    608 ------------------------------------------------------------------------ 
    609 r1977 | ed | 2006-03-01 16:34:12 -0800 (Wed, 01 Mar 2006) | 2 lines 
    610  
    611 Implemented the Hover property in dPemMixin. The reason for this rather than relying on MouseLeave to terminate the effect is that there are many time when it seems that the mouse leaves the area without triggering the MouseLeave event. The Hover mechanism employs a timer to check for mouse position, and fire the MouseLeave code if it detects that the mouse position is outside of the control. 
    612  
    613 ------------------------------------------------------------------------ 
    614 r1981 | paul | 2006-03-03 09:53:18 -0800 (Fri, 03 Mar 2006) | 6 lines 
    615  
    616 Added a CustomSQL property to the datanav form. If set, the settings in the  
    617 select page will be ignored and the contents of CustomSQL used instead. 
    618  
    619 ------------------------------------------------------------------------ 
    620 r1983 | ed | 2006-03-05 08:42:35 -0800 (Sun, 05 Mar 2006) | 15 lines 
    621  
    622 Added defaults to dGrid.getValue(). If no row or col is specified, it defaults to the current row/column, respectively. 
    623  
    624 Added fontMetricFromDrawObject() to dabo.ui. This enables simple calculation of the width/height of a drawn text object. 
    625  
    626 Added a fitToSizer() method to dPemMixin. This will resize the object to fit the size required by the sizer represented in its Sizer property. You can also pass in extraWidth and extraHeight values to adjust the size further. 
    627  
    628 Added 'Alignment' to the pre-init properties of dCheckBox. Cleaned up the property methods and definitions to make them alphabetized, and to make the strings localized. Also relaxed the values accepted for the Alignment property. 
    629  
    630 Added an option to dEditor.changeFontSize() to accept strings in the format "+n" or "-n". These will increment or decrement the font size by 'n' points. 
    631  
    632 ------------------------------------------------------------------------ 
    633 r1985 | ed | 2006-03-06 17:42:06 -0800 (Mon, 06 Mar 2006) | 2 lines 
    634  
    635 Moved the _addCode() method out of dFormMixin, since it really is more generic than that. It now lives in dObject._addCodeAsMethod(), which takes a dict of method name/code pairs and adds them as methods of the object. dPemMixin now looks for a keyword argument called 'srcCode', and if found, adds it to the object. 
    636  
    637 ------------------------------------------------------------------------ 
    638 r1986 | ed | 2006-03-09 13:47:29 -0800 (Thu, 09 Mar 2006) | 6 lines 
    639  
    640 This class handles the conversion of cdxml text to a class object. It has one main method: classFromXml(), which takes a cdxml file and returns the main class stored in that file. This class can then be instantiated as part of a live app. 
    641  
    642 It is working for most simple classes. You can create layouts using sizers, panels, and add code to any object, and it will work. However, support for GRIDS and PAGEFRAMES is not completed yet. ANY SAVED DESIGN WITH GRIDS OR PAGEFRAMES WILL BE BROKEN NOW. 
    643  
    644 This will, of course, be temporary, until I can add that logic to this class. 
    645  
    646 ------------------------------------------------------------------------ 
    647 r1987 | ed | 2006-03-09 13:49:16 -0800 (Thu, 09 Mar 2006) | 2 lines 
    648  
    649 Updated dabo.ui to use the new cdxml converter in createForm(). 
    650  
    651 ------------------------------------------------------------------------ 
    652 r1988 | ed | 2006-03-10 16:20:42 -0800 (Fri, 10 Mar 2006) | 4 lines 
    653  
    654 Added support for grids and pageframes. These are now re-created as they appeared in the design. 
    655  
    656 This is now ready for testing and bug reports. 
    657  
    658 ------------------------------------------------------------------------ 
    659 r1992 | ed | 2006-03-11 17:56:25 -0800 (Sat, 11 Mar 2006) | 2 lines 
    660  
    661 You can now call addObject() and pass a cdxml file instead of a Dabo class reference, and the class defined in the cdxml will be added to the parent. 
    662  
    663 ------------------------------------------------------------------------ 
    664 r1998 | ed | 2006-03-14 17:17:06 -0800 (Tue, 14 Mar 2006) | 4 lines 
    665  
    666 Cleaned up the dynamic code creation routines in dObject and DesignerXmlConverter. 
    667  
    668 Modified xmltodict to handle property declarations. After 0.6 is out, we really need to move to a more automatic way of doing this. I'd like to look into things such as cElementTree, which is supposed to be incorporated into the next verison of Python. Our files are not so huge that we couldn't parse them into DOM trees. 
    669  
    670 ------------------------------------------------------------------------ 
    671 r1999 | ed | 2006-03-15 04:29:28 -0800 (Wed, 15 Mar 2006) | 8 lines 
    672  
    673 Added setAfter() and setAfterInterval() to dabo.ui. These work the same as callAfter() and callAfterInterval(), except you use them to set properties to particular values. 
    674  
    675 Added the following properties to dGrid: MovableColumns, ResizableColumns, and ResizableRows. When any of these are set to False, the user cannot move/resize the column or row. 
    676  
    677 ------------------------------------------------------------------------ 
    678 r2013 | paul | 2006-03-21 08:59:43 -0800 (Tue, 21 Mar 2006) | 1 line 
    679  
    680 Changed the keyboard datanav navigation from Ctrl+, and Ctrl+. to Alt+LEFT and Alt+RIGHT. I've confirmed this works on Win and Gtk. Will test Mac next. The original configuration, in addition to being nonintuitive, didn't work on Windows. 
    681 ------------------------------------------------------------------------ 
    682 r2017 | paul | 2006-03-21 09:41:51 -0800 (Tue, 21 Mar 2006) | 1 line 
    683  
    684 Changed the nav keys to Ctrl+LEFT/Ctrl+Right because Alt+arrow on Mac translates to the Option+Arrow which is used for keyboard navigation of text entry fields. Note that because of a separate problem, only forward keyboard navigation is possible on Mac currently. 
    685 ------------------------------------------------------------------------ 
    686 r2018 | paul | 2006-03-21 09:49:06 -0800 (Tue, 21 Mar 2006) | 4 lines 
    687  
    688 Ok, using Ctrl+Arrow on Win and Lin causes the same problem that using 
    689 Alt+Arrow causes on Mac. Therefore, I've added code to use the best alt 
    690 key on the running platform. 
    691  
    692 ------------------------------------------------------------------------ 
    693 r2023 | ed | 2006-03-21 17:41:20 -0800 (Tue, 21 Mar 2006) | 6 lines 
    694  
    695 Added the ability to save screenshots in one of several graphics formats. While this was part of the Bubblet demo originally, it could have uses elsewhere. For example, combining this with dabo.ui.callAfterInterval() would enable timed screen shots. 
    696  
    697 Screenshots can be of any object. If no object is specified, the active form is used. 
    698  
    699 In order to detect which graphic format was selected, the various file dialog methods have been augmented with similarly-named methods that also return the type selected by the user. For example, calling getFile("jpg", "png") simply returns the path to the selected file. But calling getFileAndType("jpg", "png") returns a 2-tuple: the first element is the path, and the second would be either "jpg" or "png", depending on which of the wildcard types was selected by the user. 
    700  
    701 ------------------------------------------------------------------------ 
    702 r2027 | ed | 2006-03-22 11:18:56 -0800 (Wed, 22 Mar 2006) | 9 lines 
    703  
    704 Hacked a bit to get getCaptureBitmap() to work well on GTTK, but it's still 
    705 a bit of a mess. GTK doesn't capture the title bar, menu bar or frame 
    706 decorations of a window, and I tried to compensate the sizing accordingly. 
    707 Individual controls don't seem to work at all. I don't have more time to 
    708 play around with this now, but this is hardly a show-stopper for release. 
    709  
    710 ------------------------------------------------------------------------ 
    711  
    712  
     183 
     184+ Fixed a problem when switching to the Browse page of the datanav grid without 
     185  first running a query. Also, there was an error being thrown if a previous 
     186  query had results, and a subsequent query had no results. 
     187 
     188+ Modified the code in _setCurrentRow() of dGrid so that it wasn't calling 
     189  SetGridCursor() unless the position had actually changed. I had recorded up to 
     190  10 calls to this function, all with the exact same values each time I switched 
     191  to the Browse page. 
     192 
     193+ Removed the code that lower-cased field names, as it was preventing the code 
     194  from working with case-sensitive backends and columns containing capital 
     195  letters. 
     196 
     197  Fixed a problem where str values were not able to be properly converted to 
     198  unicode. 
     199 
     200+ Added a parameter to the promptForFileName() method to specify the default 
     201  path for the dialog. 
     202 
     203+ Added the TreeItemContextMenu event. This differs from the normal 
     204  ContextMenuEvent in that it returns the itemID of the node that was  
     205  right-clicked. 
     206 
     207+ Added code in the event data gathering code to store the tree item ID for 
     208  these events in EventData.itemID. 
     209 
     210+ Changed all the names '_id' in the dTreeView.py file to the clearer 'itemID'. 
     211 
     212+ Fixed an oversight in the dSizerMixin that didn't remove the Box for a 
     213  dBorderSizer when the sizer was released. 
     214 
     215+ The double-Activate on Windows is really getting in the way. I haven't heard 
     216  anything from my bug report yet, so I added workaround code to ignore the 
     217  first Activate. 
     218 
     219+ Cleaned up the order of releasing child objects for sizers. Also fixed problem 
     220  with releasing the box for border sizers. 
     221 
     222+ Added getFunctionList() method to return a list of all 'class' and 'def' 
     223  statements in the current file. 
     224 
     225+ First pass at integrating the dTable class into the dabo.db framework. Right 
     226  now, if this works at all, it only works for SQLite. 
     227 
     228+ Fixed a bug wherein multiply-nested sizers might not release all of their 
     229  content when release(True) is called. 
     230 
     231+ Added a 'setInactive()' method that will hide the auto-complete popup if one 
     232  is visible. 
     233 
     234+ Disabled the fillGrid()'s setting of focus to the grid, as it causes problems 
     235  with stealing focus away from another active form, at least on Windows. Also, 
     236  it seems that such code really doesn't belong inside the function to build the 
     237  grid, but perhaps we'll find it belongs somewhere else. 
     238 
     239+ The xml header wasn't being converted to native line endings. Fixed. 
     240 
     241+ No need to explicitly do the unicode conversion in the report fields, as that 
     242  is done in the report writer. 
     243 
     244+ Added a Refresh event. This is raised when dForm.refresh() is called. All 
     245  dPemMixin classes will receive it, and fire their refresh() hook method. 
     246 
     247+ Added dynamic properties to most normal static properties. Example: given a 
     248  label and a function 'currTime()' in a form that returns the current time, 
     249  issuing the following: 
     250    label.DynamicCaption = label.Form.currTime 
     251  will result in the label's Caption property being updated every time 
     252  label.Form.refresh() is called. 
     253 
     254+ Added two methods to dabo.ui for converting image data back to bitmaps and 
     255  images. These were necessary because I noticed that when Editor.py was called 
     256  from locations other than its own directory, the image file for the function 
     257  button was not found. The solution was to convert the .png file to a data 
     258  stream using wx.tools.img2py.py, and store that in Editor.py. 
     259 
     260+ Can now set dApp.UI=None, and setup() won't try to load a UI. You have to do 
     261  it explicitly, though, such as: 
     262    app = dabo.dApp() 
     263    app.UI = None 
     264    app.setup() 
     265  --or-- 
     266    app = dabo.dApp(UI=None) 
     267    app.setup() 
     268 
     269+ First crack at creating a double-buffered drawing surface. The new class, 
     270  'dDrawPanel', is a subclass of dPanel, but has its repainting handled through 
     271  the double-buffer techniques outlined on the wxPython wiki. 
     272 
     273+ Bookmarks in dEditor now persist when you save the file. If you re-open a 
     274  saved file with bookmarks, they are restored. 
     275 
     276+ Refactored dUserSettingProvider a little bit. Fixed a bug in  
     277  getUserSettingKeys() that resulted in it always returning an empty list. Added 
     278  deleteUserSetting() and deleteAllUserSettings(); these do just what you think 
     279  they would. 
     280 
     281+ Changed a couple exec() calls to setattr() calls instead, which may be safer  
     282  if not faster, but definitely more explicit and easier to understand. 
     283 
     284+ Implemented the handling of RowSpan/ColSpan for grid sizers.  Added a 
     285  GridSizerSpanException class that is raised if an attempt to set the span to a 
     286  location that is already occupied. 
     287 
     288+ Revamped the entire flow for transactions. These changes have been tested on 
     289  MySQL and SQLite, but still need to be tested with Firebird and PostgreSQL. 
     290 
     291+ Changed the default for bizobjs, cursors, etc., to not autocommit. The 
     292  AutoCommit property of the bizobj is simply a pass-through to the cursor's 
     293  AutoCommit property. 
     294 
     295+ Also cleaned up some inconsistent spacing and method ordering. 
     296 
     297+ Modified datanav to allow for manual setups that don't use fieldSpecs or 
     298  relationSpecs. I'll be committing a change to the AppWizard that allows 
     299  for this option soon. 
     300 
     301+ Moved SelectPageClass, BrowsePageClass, and EditPageClass from PageFrame 
     302  to Form, since that is a better central location for these properties. 
     303 
     304+ Added a splash screen to the Dabo app startup. This is based on Andrea  
     305  Gavana's AdvancedSplash class, and allows for cool shaped windows, etc. 
     306 
     307+ Added the ability to set the DataSource to an object, rather than just a 
     308  string that can be eval'd to an object. 
     309 
     310+ Changed the 'getMaxRow/Col' methods to 'getHighRow/Col' in order to avoid 
     311  confusion with the MaxRows/Cols props in dGridSizer. 
     312 
     313+ Modified both sizer classes to accept windows and not just SizerItems when 
     314  setting/getting prop values. 
     315 
     316+ Added the movePage() method, which takes either a page reference or a page 
     317  index, and moves the page to the specified position. The page is then 
     318  selected, unless the third parameter 'selecting' is False. 
     319 
     320+ Added a getInt() method to dabo.ui.uiwx. 
     321 
     322+ Fixed the splashscreen display on Windows. 
     323 
     324+ Added the ability to set the font face and size for the editor. 
     325 
     326+ Added the setCheck() method to dMenu. Given a caption, it will check any menus 
     327  whose captions match. By default it will uncheck any that don't match; you can 
     328  pass False as the second argument and leave non-matchers alone. Also added 
     329  clearChecks() to uncheck all menu items in a menu. 
     330 
     331+ Exposed the FileName and FilePath properties in dEditor. 
     332 
     333+ Added some syntax sugar for referring to fields and variables in reports. 
     334  Where you used to have to refer to self.Record["clientname"], you can now do 
     335  self.clientname. Same with self.Variables. 
     336 
     337+ Added the 'callEvery' function to dabo.ui. This function accepts an interval 
     338  (in milliseconds), and callable reference, and optional arguments to that 
     339  callable. It then creates a timer that fires the callable every <interval> 
     340  milliseconds, passing along any optionally included arguments. The timer 
     341  reference is then returned, where it can be controlled by calling stop(),  
     342  start() or release(). This is based on the dCallEvery class that Brandon 
     343  Singer proposed. I made it a function in dabo.ui because I felt it was more 
     344  consistent with the existing functions callAfter() and callAfterInterval(). 
     345 
     346+ Changed the default for forms to not automatically show "Record 1 of 0" or 
     347  similar meaningless database information in the status bar. Set it back to 
     348  True for the datanav Form class, so all datanav apps should remain unchanged. 
     349  All of the apps in the demo and IDE directories that don't query data, though, 
     350  no longer show that message. 
     351 
     352+ Creating an instance of dApp doesn't automatically create an instance of 
     353  uiApp. Instead, it now asks dabo.ui to get it a reference, and dabo.ui either 
     354  returns the current instance if one already exists, or creates one if not. 
     355  This allows you to run wxPython apps from within wxPython apps. 
     356 
     357+ Added some rudimentary support for file drag/drop. Right now, you can call 
     358  'createFileDropTarget' on an object to make it able to respond to files 
     359  dropped on it. Pass in an optional handler object reference; otherwise, the 
     360  handler is set to the object itself. The drop event is passed on to the 
     361  handler by calling its 'processDroppedFiles' method, which should be 
     362  overridden in the handler object to do the specific processing of the files. 
     363 
     364+ Added a 'Column' property to dEditor; this represents the column position in 
     365  the current line, and can be changed to move the cursor within the line. 
     366 
     367+ Added option in getItemByRowCol() to return the sizer item in the given 
     368  position instead of the object managed by that sizer item. 
     369 
     370+ Added method 'isItemChecked()' to allow you to determine the checked status of 
     371  any menu item. 
     372 
     373+ Added dabo.ui.getMousePosition(), which returns the position of the mouse 
     374  on the screen. This is in contrast to dPemMixin.getMousePosition(), which  
     375  gets the position of the mouse inside the client window. 
     376 
     377+ Update to allow execution of SQL statements without affecting the current data 
     378  set. The bizobj has a new pass-through method named 'execute()', which takes a 
     379  statement understood by the backend database and passes it to its cursor's 
     380  execute method. 
     381 
     382+ The cursor class has been modified to run all statements that don't begin with 
     383  'select' through its auxiliary cursor, thereby preserving its data set. 
     384  Preliminary tests that I've run have confirmed that these are working 
     385  correctly, but there should be a lot more testing done before I am confident 
     386  that these changes are truly sound and can handle whatever we can toss at them. 
     387 
     388+ You can now set the DataSource to an actual object, instead of having to set 
     389  it to a string that could be resolved to an object.  
     390 
     391+ Added basic support for storing lists/tuples in the user settings.  
     392 
     393+ Added a simple way of persisting MRU lists in applications. A new dApp 
     394  property, '_persistentMRUs' is a dict that contains the name of the menu as 
     395  the key for the entry, and the function to bind the items to as the value. The 
     396  framework will then handle saving and restoring MRU lists upon app startup and 
     397  closing. 
     398 
     399+ Modified the uiApp to accept just the menu caption as an identifier instead of 
     400  requiring the actual menu. This is necessary to create MRU lists for context 
     401  menus, or for restoring menus at app startup. 
     402 
     403+ Updated the requirement that a bizobj be found for all data sources. Since 
     404  that was written, Dabo's use of data binding has expanded to lots of  
     405  non-bizobj uses. 
     406 
     407+ Completed the majority of the work needed to implement saved classes that can 
     408  be used in other class designs; it was working from the Designer, but not when 
     409  you ran the form. These changes implement the whole inheritance structure so 
     410  that if you change the underlying class, any changes not explicitly overridden 
     411  in the design that uses that class are reflected. This works for both property 
     412  changes as well as code changes.  
     413 
     414+ Switched the default order of arguments in callAfterInterval(). It makes more 
     415  sense to specify the interval first, followed by the function and its 
     416  arguments. Sticking the interval between the function and its arguments seems 
     417  very awkward. I added code to callAfterInterval() to check if it received a 
     418  call in which the interval is the second argument (i.e., the original style) 
     419  and switch them around in that event. 
     420 
     421+ Removed dDrawPanel as a class. Turns out that adding double-buffering to 
     422  panels doesn't affect their performance noticeably, so it made sense to turn 
     423  this on for all dPanel objects by default. However, if you run into a 
     424  situation where this adversely affects your app, there is a new property named 
     425  'Buffered' that will turn this behavior off (i.e., make it work like it used 
     426  to) when set to False. 
     427 
     428  *IF YOU USED dDrawPanel IN YOUR CODE, THIS WILL BREAK IT!* You must update by 
     429  changing all references to dDrawPanel to simply dPanel. 
     430 
     431+ Removed the old syntax for begin/commit/rollbackTransaction. The default for 
     432  these actions in dBackendObject is to call the appropriate method on the 
     433  connection, not to execute a command on the cursor. 
     434 
     435+ Removed the call to cursor.connection.begin() in the beginTransaction() 
     436  method. This does not seem to be needed for most backends; in fact, it is 
     437  typically used to override autocommit to create temporary explicit 
     438  transactions. 
     439 
     440+ Table creation now works for MySQL also. The class dAutoBizobj is a bizobj 
     441  that has a dTable. The function AutoCreateTables() will try to create all the 
     442  tables that have been setup with dAutoBizobj objects. If it can't create the 
     443  tables, a message pops up for the user and the db admin. The db admin can 
     444  enter the username and password for access to create tables or the db admin 
     445  can manualy execute the queries in the queries.sql. 
     446 
     447+ Converted the dTimer from a bitmap to a non-visible control based directly on 
     448  wx.Timer. This makes it fit in much better with dabo.ui.callEvery(), which is 
     449  much more convenient to use in many cases. 
     450 
     451+ Began coding for the Hover property, which will allow for easier visual coding 
     452  of MouseOver events. It isn't fully implemented yet, so don't try working with 
     453  it. 
     454 
     455+ Implemented the Hover property in dPemMixin. The reason for this rather than 
     456  relying on MouseLeave to terminate the effect is that there are many time when 
     457  it seems that the mouse leaves the area without triggering the MouseLeave 
     458  event. The Hover mechanism employs a timer to check for mouse position, and 
     459  fire the MouseLeave code if it detects that the mouse position is outside of 
     460  the control. 
     461 
     462+ Added a CustomSQL property to the datanav form. If set, the settings in the  
     463  select page will be ignored and the contents of CustomSQL used instead. 
     464 
     465+ Added defaults to dGrid.getValue(). If no row or col is specified, it defaults 
     466  to the current row/column, respectively. 
     467 
     468+ Added fontMetricFromDrawObject() to dabo.ui. This enables simple calculation 
     469  of the width/height of a drawn text object. 
     470 
     471+ Added a fitToSizer() method to dPemMixin. This will resize the object to fit 
     472  the size required by the sizer represented in its Sizer property. You can also 
     473  pass in extraWidth and extraHeight values to adjust the size further. 
     474 
     475+ Added 'Alignment' to the pre-init properties of dCheckBox. Cleaned up the 
     476  property methods and definitions to make them alphabetized, and to make the 
     477  strings localized. Also relaxed the values accepted for the Alignment  
     478  property. 
     479 
     480+ Added an option to dEditor.changeFontSize() to accept strings in the format 
     481  "+n" or "-n". These will increment or decrement the font size by 'n' points. 
     482 
     483+ Moved the _addCode() method out of dFormMixin, since it really is more generic 
     484  than that. It now lives in dObject._addCodeAsMethod(), which takes a dict of 
     485  method name/code pairs and adds them as methods of the object. dPemMixin now 
     486  looks for a keyword argument called 'srcCode', and if found, adds it to the 
     487  object. 
     488 
     489+ You can now call addObject() and pass a cdxml file instead of a Dabo class 
     490  reference, and the class defined in the cdxml will be added to the parent. 
     491 
     492+ Cleaned up the dynamic code creation routines in dObject and 
     493  DesignerXmlConverter. 
     494 
     495+ Modified xmltodict to handle property declarations. 
     496 
     497+ Added setAfter() and setAfterInterval() to dabo.ui. These work the same as 
     498  callAfter() and callAfterInterval(), except you use them to set properties to 
     499  particular values. 
     500 
     501+ Added the following properties to dGrid: MovableColumns, ResizableColumns, and 
     502  ResizableRows. When any of these are set to False, the user cannot move/resize 
     503  the column or row. 
     504 
     505+ Changed the keyboard datanav navigation from Ctrl+, and Ctrl+. to Ctrl+LEFT  
     506  and Ctrl+RIGHT on Mac, and Alt+LEFT and Alt+RIGHT on Linux and Windows. I've 
     507  The original configuration, in addition to being nonintuitive, didn't work on 
     508  Windows. 
     509 
     510+ Added the ability to save screenshots in one of several graphics formats. 
     511  While this was part of the Bubblet demo originally, it could have uses 
     512  elsewhere. For example, combining this with dabo.ui.callAfterInterval() would 
     513  enable timed screen shots. 
     514 
     515+ Hacked a bit to get getCaptureBitmap() to work well on GTTK, but it's still 
     516  a bit of a mess. GTK doesn't capture the title bar, menu bar or frame 
     517  decorations of a window, and I tried to compensate the sizing accordingly. 
     518  Individual controls don't seem to work at all. I don't have more time to 
     519  play around with this now, but this is hardly a show-stopper for release. 
     520 
     521 
     522=============================================================================== 
    713523Dabo 0.5.1 (2006-01-25) (Revision 1860): 
    714 Additional MDI/SDI improvements and fixes. By default, dForm on Windows will be a MDI child. 
    715  
    716 Fixed PageFrame background color to take the background color from the form, not unconditional white. Only on Windows - Gtk and Mac do the right thing by default. 
    717  
    718 Fixed various issues with getting icon files and converting them to bitmaps. 
    719  
    720 Set the default grid font to Arial,9 on Windows, as the wx-default was just plain ugly. 
    721  
    722 Added getPositionInSizer() method to sizers, since they may also be contained within sizers. 
    723  
    724 Reworked dShell. Now it appears as a split window, with the standard command area on the top, and the output in the lower pane. 
    725  
    726 Changed dGridSizer to raise an exception if the insert method is called instead of just returning False. 
    727  
    728 Added SashPositionChanged event. Updated dSplitter to raise this event when the sash position changes. 
    729  
    730 Added scrollToBeginning() and scrollToEnd() methods to dEditBox. 
    731  
    732 Added pass-through properties for dSplitForm's splitter's panels. 
    733  
    734 Added the property 'SplitState' to the dShell class. By right-clicking on the shell, you can toggle between the new split behavior and the "traditional" single pane behavior. 
    735  
    736 Added a right-click menu to the output pane. Right now all it can do is clear itself, but we could add other stuff such as font selection, etc. 
    737  
    738 Fixed a bug in uiApp that prevented Cut(), Copy() and Paste() from working in the shell (and other non-Daboized controls that only have wx versions of these methods). 
    739  
    740 Added a menu command to the shell to clear the output window using Ctrl-Backspace. 
    741  
    742 Added the MenuOpen event to dEvents. This allows us to create dynamic menus by intercepting this event and updating the prompts of the menu items as needed. Added the event data code to save the prompt and menu object that triggered the event. 
    743  
    744 Added 'deadObjectException' as an alias to wx._core.PyDeadObjectError to the dabo.ui.uiwx module. This will enable Dabo code to handle this condition without having to use wx code. 
    745  
    746 Added a bunch on internationalization to the dShell script. 
    747  
    748 Made the dMessageBox titles come from Application.getAppInfo(appName) by default. 
    749  
    750 Added handling for situations where a bizobj is used with a data connection. 
    751  
    752 Added a sizeToColumns() method. This will set the width of the grid equal to that of its component Columns. 
    753  
    754 Fixed copy to clipboard in about.py to use CRLF on Windows. 
    755  
    756 Added new properties to grid: 
    757     HorizontalScrolling 
    758     VerticalScrolling 
    759     ShowColumnLables 
    760     ShowCellBorders 
    761  
    762 The scrolling properties are booleans, and will hide/show the scrollbars. 
    763  
    764 Fixed some problems with setting the column's Width. For a number of reasons, when you created a grid from scratch and then added columns using addColumn, the columns widths you'd specify weren't being respected. Fixed. 
    765  
    766 Moved the code for the dEditor class from ide/dEditor.py into its own uiwx-level class. This will allow other apps (I'm thinking Designer here!) to instantiate code editors where they need. 
    767  
    768 Revamped the layout of the dOkCancelDialog class to create the panel and sizer that is needed in addControls(). 
    769  
    770 Cleaned up some of the default spacing so that with AutoSize=True, the form still looks OK. 
    771  
    772 Removed the split sash code from the dEditor. That stuff belongs in the form the editor is located, not in the editor itself. 
    773  
    774 Fixed a bug in dGrid that only seemed to pop up when the grid was located on a form with a bizobj but that wasn't a dForm. The presets dialog in minesweeper fit that description, and it was throwing errors when you navigated through the grid. 
    775  
    776 Added methods for getting/setting the back color of individual items. 
    777  
    778 Added property CellHighlightWidth to dGrid, and used that property in the about dialog. 
    779  
    780 Made dPanel.addControls() better behaved. 
    781  
    782 Reworked/improved the Quick Report dialog in datanav. 
    783  
    784 Updated dPageFrameNoTabs to raise the same events as the 'tabbed' versions do. Added a 'getPageNumber()' method. 
    785  
    786 Added PNG files for rotating images clockwise and counter-clockwise. 
    787  
    788 Improved dImage to support 90 degree rotation in either direction. Added rotation to the the demo. 
    789  
    790 Fixed a bug in dListControl's StringValue prop, and any other place where the framework was trying to call the control's GetString() method, since it doesn't have one. 
    791  
    792 Added SearchDelay property to dApp, which becomes the default SearchDelay for dGrid. The dGrid SearchDelay can get set to any int but that won't override the dApp setting. If dGrid.SearchDelay is set to None (the default), that is when the dApp setting gets used. Set the default SearchDelay to 300 - better than the previous 600 IMO but still not too fast. Eventually, when we provide a default system preference screen, we should expose this property for the user to tweak how they like. 
    793  
    794 Cleaned up and consolidated lots of stuff in dGrid, which shouldn't have any effect on runtime performance. Made SameSizeRows into an actual property. 
    795  
    796 Using the standard button sizer in the okay/cancel dialog is good, because it lets wx handle the platform-convention rules. However, even though it handles rearranging the order of the buttons as needed, it doesn't rearrange tab order. So I added code to do that. 
    797  
    798 Reworked the login dialog to subclass from dOkCancelDialog. 
    799  
    800 Reworked dGrid to sync the rowcount in refresh() calls. Fixed bug in syncing of column counts. 
    801  
    802 The entire populate() cycle was happening every time you entered the browse page in datanav apps, when in reality the only thing you need to do in current dGrids when the dataset has been requeried is a simple refresh(). 
    803  
    804 Added an initial call to _clearDocument(), which is where all the defaults are set for the editor. The DesignerEditor would not indent properly without this. 
    805  
    806 Added moveToBeginning() and moveToEnd() methods to position the pointer at the beginning and end of the document, respectively. 
    807  
    808 Added functions to dBizobj, dCursor, and dBackend to get the data structure from the cursor description, instead of querying the backend based on a table name. This is more likely to contain correct information, but will need work for other backends besides MySQL. Also, getting the pkid is still problematic - but IMO it isn't a big deal to just have the user tell us which field to use as the PK. 
    809  
    810 Fixed dGrid's buildFromDataSet() to use the new function so it will work even if the bizobj has no records at the time of creation. 
    811  
    812 Fixed dGrid.sort() to not care if sort is done on an empty bizobj. Added the logic to restore code saved in the Designer so that it functions properly in the re-created form. 
    813  
    814 This is big - really big. For the first time, you can create a form in the Designer, add code to be bound to events, or create custom methods, and that code will work in the form created from the .cdxml file exactly the same as if you had written those methods in a regular .py script. 
    815  
    816 Improved the card deck pictures. 
    817  
    818 Fixed some problems in the Icon setter that would cause errors if None was passed, or if the icon path didn't exist, as would be the case if you were running with py2exe and didn't include the icon files as resources. 
    819  
    820 Added a significant change to eventMixin.py's auto event binding logic. The code now first looks at the object itself before looking up its family tree. This is critical for the event binding when running a cdxml file, where methods are added to the object at runtime, and are not present in the class definition. 
    821  
    822 Cleaned up some spacing in dEvents; also fixed some "appliesToClass" logic that had events 'applying' to incorrect classses. There are still some anomalies, I'm sure; the event listing in the Designer will reveal these. 
    823  
    824 Modified the dynamic code binding to fix the problem with modifying the object's class definition in the current namespace. Also fixed a problem where code for dPage objects was not getting assigned. 
    825  
    826 Fixed a bug in the dListControl's _getValue() method when there were no items in the list. 
    827  
    828 Added alias 'dragging' for 'mouseDown' in the EventData for mouse events. 
    829  
    830 Added method 'getMousePosition()' to dPemMixin. This returns the mouse position in relative coordinates to the object that called it. 
    831  
    832 Added 'drawBitmap()' method to dPemMixin. Like the other wx.DC drawing methods, this wraps the wx.DC.DrawBitmap() method into an object interface that Dabo objects can use. 
    833  
    834 Changed getSQL() so that if no FROM clause has been specified, it defaults to a FROM clause using the cursor's Table. 
    835  
    836 Addedproperties SettingsFileName and SettingsDirectoryName to the app's UserSettingProvider. The defaults for both come from app.getAppInfo("appShortName"), and determine the name of the directory and file name of the user settings file. The directory name will be lower()'d and have a '.' prepended automatically. 
    837  
    838 Created the dFoldPanel and dFoldPanelBar classes, which wrap the built-in wx.lib.FoldPanel classes. Modified __init__.py to include these, and added some hacks to dPemMixin to enable them to work with the event structure. 
    839  
    840 Added the dCalendar control. This wraps the wx.calendar.CalendarCtrl, making it simpler and more Pythonic to work with. 
    841  
    842 Added a setting 'firstDayOfWeek' to dabo.settings 
    843  
    844 Moved the method _getWxColour() from dFoldPanelBar into dPemMixin, as it is needed in both dFoldPanelBar as well as dCalendar, and possibly other wx controls that expect a wx.Colour object instead of a color tuple. 
    845  
    846 Added the calendar events and their processing. 
    847&n