dabo Commit
Revision 4815
Date: 2008-12-10 08:39:40 -0800 (Wed, 10 Dec 2008)
Author: Ed
Trac: http://trac.dabodev.com/dabo/changeset/4815

Changed:
U   trunk/ChangeLog

Log:
Updated the ChangeLog file with the 0.9 changes

Diff:
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog     2008-12-10 16:30:02 UTC (rev 4814)
+++ trunk/ChangeLog     2008-12-10 16:39:40 UTC (rev 4815)
@@ -1,5 +1,333 @@
 See the Subversion log for all the details.
 
+Dabo 0.9.0 (2008-12-10) Revision 4816):
+===============================================================================
++ Removed the conditional import on the decimal module, as we are now 
requiring Python 2.4.
+
++ Removed bare 'except:' from the code. Errors are now explicitly caught and 
handled. This allowed us to identify and fix several insidious bugs that were 
suppressed by these bare exception handlers.
+
++ Major re-write to the dDialog subclasses. Specifically, there is now a 
subclass called 'dStandardButtonDialog' that can accept one or more of the 
following parameters when it is created:
+       OK
+       Cancel
+       Yes
+       No
+       Help
+It uses the wx standard button sizer methods to create the buttons following 
platform-specific layout guidelines. Each button has a corresponding on* (e.g., 
onYes, onHelp) handler which is called when the button is clicked.
+
++ There are two subclasses of dStandardButtonDialog included: dOkCancelDialog, 
and dYesNoDialog. dOkCancelDialog is pretty much the same as before; while 
dYesNoDialog is like dOkCancelDialog, except with Yes/No buttons. If you call 
dStandardButtonDialog without passing any parameters, a single OK button will 
be displayed.
+
++ Removed the ReleaseOnEscape property from dDialog. Added the CancelOnEscape 
property to dStandardButtonDialog; when this is True (default), pressing the 
Escape key will be handled by the appropriate standard button handler.
+
++ Re-instituted the ButtonSizerPosition property.
+
++ Deprecated onOK() and onCancel(). The methods that will be used by 
developers to react to standard buttons being clicked are now named run*; e.g., 
runOK(), runHelp().
+
++ Fixed a bug that has been around in dDialog for years. It used to be that 
pressing the Escape key destroyed the dialog if ReleaseOnEscape was True; the 
code in the class would still try to access the now-destroyed object, throwing 
an error. Now dialogs are never destroyed in these classes; if you create them, 
you have to manually call their release() method.
+
++ Changed the default for output to not print all the infoLog messages to 
stdout. Instead, infoLog messages are ignored unless the dabo.verboseLogging 
setting is set to False. The errorLog still prints to stderr, of course.
+
++ Added the FloatingPanel property. This references a borderless dialog that 
can be used similarly to a context menu, but which can contain any controls you 
want. Additionally, it will guarantee that it is displayed completely within 
the available screen real estate. 
+It has two properties itself:
+       Above: by default the dialog is positioned below its owning control. 
This changes the behavior so that it is positioned above the control.
+       Owner: this is the control used to position the dialog.
+Typical usage (written in a custom control):
+       fp = self.Form.FloatingPanel
+       fp.clear()
+       # Add controls
+       ctrl = dabo.ui.dTextBox(fp, ...)
+       ctrl2 = ...
+       # Set the Owner to the control
+       fp.Owner = self
+       fp.show()
+The controls in the FloatingPanel should hide or release it, depending on 
whether you expect to re-use it. See the update to dDateTextBox for an 
implementation of it.
+
++ Re-write the way that the calendar is displayed. It now is contained by the 
FloatingPanel of the form, and thus is not bound by panels or other container. 
+
++ Also added the ExtendedCalendar property. When True, the larger version of 
the calendar control is used. This version has additional controls for quickly 
moving to any date.
+
++ Added the method 'resolvePathAndUpdate()' to dabo.ui. This introduces much 
more robust path resolution, especially in cases where files are within a 
project structure. It also allows to dynamically updated files via the changes 
in dApp.
+
++ Changed several of the creation routines to use resolvePathAndUpdate().
+
++ Changed several 'has_key()' calls to try/except structures. Profiling showed 
has_key() to be very slow. It is also deprecated for Python 3.0
+
++ Changed the way 'special' items are handled in menus. Previously, the only 
way that the About and Preference menu items were handled on OS X was some 
special code inserted in dBaseMenuBar. That code is now abstracted out to dMenu 
and dMenuItem; there is now an additional parameter that can be included called 
'special': right now, the only special item is 'pref', indicating the 
Preferences menu. The About menu is keyed off of the id of wx.ID_ABOUT. If 
either of these two cases are found, the appropriate Mac-specific menu handling 
will occur.
+
++ Added 'scrollVertically()' and 'scrollHorizontally()' methods to 
dScrollPanel, allowing for external scrolling.
+
++ Added the 'SourceURL' property to dApp, along with the 'urlFetch()' method. 
The main idea behind this is that if this property is filled in, calls to 
dabo.ui.resolvePathAndUpdate() will also check the URL specified in SourceURL 
for updates to the file, enabling more dynamic deployments. This feature is 
largely untested and should be considered experimental for the time being.
+
++ Added a call to resolvePathAndUpdate() to the DesignerXmlConverter.
+
++ Removed all the deprecated code for 0.9.
+
++ Added a property entry for ShowColumnLabels for a dGrid in the ClassDesigner.
+
++ Moved the Transparency property from dFormMixin to dPemMixin, as it is 
possible to set it for individual controls. This doesn't break any existing 
uses at the form level, but enables control-by-control adjustment of 
transparency.
+
++ Added pageUp, pageDown, pageLeft and pageRight methods to dScrollPanel.
+
++ Changed the 'LineNumber' property in dEditor to be one-based, to match the 
displayed line numbers in the editor. Added the '_ZeroBasedLineNumber' property 
that does the actual communication with the wx layer. 
+
++ Added the TransparencyDelay property. It is simply eye candy; it smooths out 
changes in transparency over the time specified in this property (default=0.25 
sec.). 
+
++ Changed strToBmp() to use app.HomeDirectory as the cwd, if there's an app 
defined, as app.HomeDirectory always refers to the app's root directory, even 
if the cwd is somewhere else, even if the app is frozen with py2exe.
+
++ Added the 'afterFinish()' hook method. This fires after the app has 
terminated, allowing you to do cleanup stuff in the app instead of in the 
calling program.
+
++ Moved the 'getPositionInSizer()' method to the module level, allowing it to 
be called for any object, even a non-Dabo item. Changed the version in 
dPemMixin to call the module method.
+
++ Fixed an error when using a bizobj without a data connection.
+
++ Added VisibleOnScreen property to all ui controls. This is a read-only 
property that tells you if the object is actually visible or not, taking into 
account visibility of parent objects and sizers.
+
++ Fixed the datanav2 Grid to only process the double-click if it happened in 
an actual cell. Prior to this, I was getting NoRecordsException from my app 
when the user double-clicked an empty grid. Also, clicking in an area of a grid 
with no cells will no longer do the processEditRecord(), which is what we 
really expect.
+
++ Enabled skipping the dialog-ending behavior by returning False from the 
runOK/Cancel/Yes/No methods.
+
++ Added before- and after- hooks to the onEditPreferences() handler, enabling 
you to hook into preference changes and fire any appropriate update code.
+
++ Added the Borderless property. When True, the dialog will have no title bar 
or border.
+
++ Updated dApp to optionall raise a 404 Not Found error if a requested file is 
not found from urlFetch(). Also fixed a potential bug in which setting the 
SourceURL property could get erased by the init code in dApp.
+
++ Updated the resolvePathAndUpdate() method of dabo.ui to also check for code 
files when updating a .cdxml file.
+
++ Added the 'webHeaderFormat()' method that takes a datetime value and returns 
a formatted string that conforms with the standard expected by HTTP headers.
+
++ Extended the handling of attProperties to all classes, not just those that 
inherit from dPemMixin. This was the cause of the problems reported by Nate 
Lowrie regarding grids created in the ClassDesigner, since dColumn is 
subclassed directly from dObject, and setting the properties of dColumn objects 
from attProperties was not being handled.
+
++ Added an EOLMode property.  The property the is stored as a string and 
allows you to set the EOLMode of the file to CRLF, LF, or CR standards.  If not 
explicitly set by the user, the standard will default to the OS standard.  Upon 
setting the EOLMode, all end of line markers are automatically converted to the 
new standard.
+
++ Tracked down and found the errors associated with the dMenu problems I was 
having.  The main problem was that in the mnxml files, a Caption and Hotkey 
would be specified separately, but they would be combined into the Caption 
property by createMenuBar and that would cause a slew of problems.  In 
addition, if you had a Caption w/ a hotkey in it and then specified the hotkey 
property, wx would have a conniption fit.  I added a check to the Caption 
property to raise an error if the Caption has a HotKey in it.
+
++ Removed the raising of the ValueError if you set a menu item Caption in the 
form of "Open\tCtrl+O". Instead, simply override any existing HotKey with the 
hotkey provided in the string, and only set the caption part to the Caption 
property.
+The only potential problem with this is in this example:
+item.Caption = "Open\tCtrl+O"
+...
+item.Caption = "Close"
+In this case, the item will still have the Ctrl+O hotkey, and if you didn't 
want a hotkey, you'd have to then set it explicitly with:
+item.HotKey = None
+
++ Added explicit setting of Accepted to False to the _onCancel() and _onNo() 
methods. If a dialog was re-used, and Accepted was set to True in the first 
use, clicking Cancel the second time resulted in Accepted=True again, which is 
not correct.
+
++ Added features similar to the bash history and reverse-i-search to the 
shell. Pressing Ctrl-R will bring up a dialog containing your previous 
commands; you can type to filter only those containing your search string. You 
can then press Enter or double-click on the command, and it will be entered 
into the shell.
+
++ For some reason, the dShell form was intercepting key characters with 
"Ctrl+Character" and stopping the KeyDown event from firing on Windows.  Now, 
instead of catching the KeyDown event and looking for the specific sequence, 
the form's bindKey method is used instead.  This works on Windows.  I have 
bound cmd+R to Mac, but I need someone to test the changes.
+
++ Fixed a typo in _LookupPanel's onListKey.  dKeys.arrows should be 
dKeys.arrowKeys.  arrowKeys is a dict, so we need to reference values. Again, 
test the changes on Mac.
+
++ Changed the key binding for the history search to be Ctrl-R on all 
platforms. On the Mac, Cmd-R is the 'Redo' command, and anyways, the Mac 
Terminal works just like Linux terminals, in that Ctrl-R is what is used to 
bring up command history searching.
+
++ Added a new class dDropTarget.  The drop target using the 
wx.DataObjectComposite class to be able to handle both files and text drops.  
The class is built to allow for easy interfacing with the DroppedTextHandler 
and DroppedFileHandler properties in dPemMixin.
+
++ Modified the DroppedTextHandler and DroppedFileHandler properties to support 
the new drop target.  User code shouldn't need to change.
+
++ Revamped the code for how file extension limits are handled in the getFile 
classes. Instead of hardcoding the allowed types into the 
dabo.ui.uiwx.__init__.py file, I've moved them to a dict in dabo.settings. I've 
also added an empty dict named 'custom_extensions' to dabo.settings that can be 
used by developers in case they want to add additional extensions with custom 
descriptions.
+
++ Added code to prevent saving a file that has been modified on disk since it 
was opened in the editor.
+
++ Added the method checkForDiskUpdate(). This will return True or False, 
depending on whether the file on disk has been modified since it was opened in 
the editor.
+
++ Added the isChanged() method as a wrapper around the wxPython GetModify().
+
++ Moved the dDropTarget class definition into dPemMixin.py, and renamed it 
_DropTarget. The reason is that this is a wxPython-specific implementation 
detail, and we don't want to expose this as a Dabo base class to users.
+
++ Added the 'colorNameFromTuple()' method. Given an RGB color tuple, it will 
return a list of the common names for that tuple, or an empty list if there is 
no match. If the 'firstOnly' parameter is passed as True, only the first 
element in the list will be returned as a simple string value, or an empty 
string if there are no matches.
+
++ I found the filt argument to setAll() to be hard to use: the expression has 
to be written so that the leftmost word is a member of the current child object 
being evaluated, and any names in the expression need to be local to dPemMixin, 
not the caller. So the simple case in the docstring works, but how to evaluate 
if the child is an instance of my special subclass?
+I couldn't do filt="'TxtFraction' in str(BaseClass)" because of the 
requirement that the left-most word must be an attribute or member of the child 
being evaluated.
+I couldn't do filt="BaseClass == TxtFraction" because TxtFraction doesn't 
exist in dPemMixin's namespace.
+So, I added a instancesOf argument, that accepts a single or sequence of 
class(es), and added logic to setAll() to handle this. It shouldn't have any 
effect on current uses of filt, but I feel this better satisfies the common 
case of wanting to call setAll() only on instances of specific classes.
+Perhaps an improvement to filt would be to add a placeholder, instead of it 
being fixed to the left. Another improvement could be to pass in the locals 
and/or globals to setAll(), so the eval() takes place in the environment of the 
caller.
+
++ I added two user level hooks to dDialog called beforeAddControls and 
afterAddControls.  If you design a dialog in the ClassDesigner, addControls is 
already used internally by the framework to add the controls.  So, both these 
hooks make it possible to add controls afterward and set the dialog's sizer 
properties before.
+
++ This commit fixes some problems with the menu hot key editor in the 
preference pages.  First, fixed the issue where the clear key button wasn't 
getting updated after clear and set events.  Second, if you cleared a key using 
the clear key button, that key wasn't clear from the hotkey map so if you tried 
to set a control with the cleared key combo, it would give you an erroneous 
warning.  Fixed that.  Last, if you clicked the cancel button, you menu changes 
were not rolled back.  Fixed that.
+
++ Fixed the submenu display problem when using mnxml format.  Instead of 
creating a dMenu with no parent, we would create a menu with the menubar as the 
parent and that would lead to trying to set the top label upon setting the 
caption which we don't want.
+
++ Finally fixed the bug in the Mac font scaling logic. The problem is that 
when *any* font property changed, the font would be re-set, and the scaling 
factory re-applied, making the font size shrink. Now it keeps track of when it 
applies the scaling, and only re-applies it if a different FontSize value is 
passed.
+
++ Made it simple to create custom grid editors using Dabo controls.
+To create the editor, just pass the control that you want to use to 
dabo.ui.makeGridEditor(). It will return a class that you can then assign to a 
column's CustomEditorClass property.
+Since editors by default will be sized to the grid cell they are editing, I 
added two optional parameters to makeGridEditor(). You can pass 'minWidth' and 
'minHeight' values; the class will then ensure that the editor is displayed 
with at least those dimensions.
+
++ Renamed the dFoldPanelBar/dFoldPanel classes to 
dSlidePanelControl/dSlidePanel, repectively. Added deprecation warnings if the 
old names are used.
+
++ dColors adds randomColorName(), which returns a random color name instead of 
a random color tuple. dEvents has been updated to use the dSlidePanelControl 
naming.
+
++ The setDefaults method of dEditor was interfering with the setting of the 
FontFace and FontSize properties from application.  It would override the 
settings on the Wx level.  So, I pulled the setting of the font out of 
setDefaults and merged it with the setting of the font from the preference 
setting.  If there is a preference setting, it will be used.  Else, the face 
and size used are the defaults specified in the module level variables fontFace 
and fontSize.
+
++ Fixed a long-standing bug in this composite control. There were several 
situations where it appeared that the spin buttons stopped responding to 
clicks, even though the displayed value was within range. The problem turns out 
to be that while we were correctly setting the textbox's value, we were not 
setting the spinner's value; instead, it was incrementing by +1/-1 for each 
click. This commit fixes that problem by eliminating the spinner's settings 
from the mix; instead, we govern min/max/wrap through our own code.
+
++ I also fixed the problem with the collision between float and Decimal 
values. All values in the comparisons are now cast to the type of the edited 
value when there is a conflict.
+
++ Fixed the missing docstring for the class, and added some other docstrings 
to methods.
+
++ Renamed dSpinButton to _dSpinButton, as it is not meant to be a public 
class, and is not available in dabo.ui.uiwx.__init__.py.
+
++ Fixed up the setting of KeyValue in dControlItemMixin, so that if KeyValue 
is getting set to a non-existent key, the control will have nothing selected 
and the Value will be None. This I believe was the intent all along but 
visually, at least dDropdownList wasn't doing it, and confusing infoLog 
messages were being generated.
+
++ Changed KeyValue in subclasses of dControlItemMixin to raise a ValueError if 
you try to set the Value to a non-existent key.
+
++ Changed the name of dCheckListBox to dCheckList, which is consistent with 
dRadioList. Deprecated the old name, and fixed all references.
+
++ Created a decorator to detect dead objects so that we no longer encounter 
wx._core.PyDeadObjectError exceptions. I created it in the dabo.ui module, as 
it needs to be able to be referenced during loadUI().
+
++ Replaced the dead object trapping code in dGrid.py and decorated the 
affected methods instead.
+
++ Fixed much of the flickering problems with dGrid on Windows, which had to do 
with the way we were painting the grid header. Reworked it to be called from 
EVT_PAINT instead. Played around with various options such as using a PaintDC 
or a BufferedPaintDC, and overriding EVT_ERASE_BACKGROUND, but the tradeoffs 
weren't worth it. As it is, I don't know if I haven't harmed Linux or Mac.
+
++ Changed the "Please wait... requerying dataset" busyinfo to just push it to 
the StatusText.
+
++ [3996] and [3998] added property TabStop, which when True allows focus to 
the control (the default). However, I've run into oddities when creating panels 
with some controls with TabStop=False. Turns out, I was calling Navigate() 
without a needed argument, the event needs to be skipped, and the Navigate() 
needs to be done in a callAfter().
+
++ Implemented a basic debugging output window. It's fairly simple now, but can 
be customized further based on feedback.
+
++ There is a new menu item in the base menubar class "Debug Output Window". 
It's designed to be a checked menu item, but the check always appears to be out 
of sync with the debug window. Selecting that menu shows/hides the debug output 
window.
+To add debug output, add this line to your app where you want to record 
information:
+       debugout("Some stuff")
+You can add multiple items, much like the print command, and they will be 
output with a space separator
+       debugout("Status", self.status)
+
++ Fixed the issue with AutoIndent not working.  The issue was that 
GetLineIndentation wanted wx's zero based line number instead of the 1 based 
line number we use.  We were using the 1 based line number, and the indentation 
level of the new blank line was returned and always zero.  This fixes that.
+
++ Added a new property to the dEditor widget which exposes the ability to show 
indentation guides.  The property is called ShowIndentationGuides.
+
++ Improved VirtualFields by adding the option to set a given VirtualField to a 
dict instead of a function. Currently, this dict has one required key, "func", 
that stores the function object, and an optional key, "requery_children", that 
determines whether or not child records are requeried before the virtual field 
function is run.
+
++ Changed default behavior to *not run* the child requeries, as this was a 
performance hog for an uncommon case. If your VirtualFields function requires 
that child records have been requeried before running, then you can either 
requery them inside the function itself, or define the VirtualFields like the 
following:
+old:
+  self.VirtualFields["myfield"] = myFunc
+new:
+  self.VirtualFields["myfield"] = {"func": myFunc, "requery_children": True}
+
++ Worked around a substantial source of the flickering of dGrid on Windows, by 
caching the cell values for 10 seconds to avoid unneccesary calls to 
biz.getFieldVal(). This will probably improve performance on Mac and Lin as 
well, even though those platforms didn't exhibit the flickering. Now, the 
windows grid will flicker at most once every 10 seconds. Call grid.update() or 
grid.refresh() will clear all cached values immediately.
+
++ Added the deleteByValue() method to dPref. This enables you to delete all 
pref entries that contain the passed value.
+
++ Updated dShell so that if you re-use a command from its history, the old 
entry for the command is deleted. The effect is that the history only contains 
one instance of each command, with the most recent usage at the top.
+
++ When calling getPrefs(), you can now indicate a key that is relative to the 
current pref by prefixing it with a period.
+
++ Deprecated the SQL property. It now issues a deprecation warning, and then 
passes the values through to the UserSQL prop.
+
++ Added 2 new properties to the dEditor widget.  They are ShowEdgeGuide and 
EdgeGuideColumn.  Basically, ShowEdgeGuide will display a line at the specified 
column position.  Note that if the editor has a variable spaced font set, wx 
uses the average of the characters' widths to determine where to put the line.  
Also note that wx will only allow for either HiliteCharsBeyondLimit or 
ShowEdgeGuide to be True, not both.  So, when one is set to True, the other is 
set to False.
+
++ Removed the setting of UserSQL when setSql() called without arguments. 
Removed setting the SQL property, and instead set UserSQL directly.
+
++ Changed the superclass of dEvent from dObject to the base Python object 
class.
+
++ Fixed the goNextBookMark and goPrevBookMark function.  The mask trouble was 
that the marker identifier is really a bit in a marker mask.  Since, _bmkPos 
was 5, it was the 5th bit which corresponds to the integer value 32.  So, by 
doing a left shift on the marker, we can get the proper mask.
+
++ Also, fixed the issue with zero based line numbers and the line number being 
off by one.  Furthermore, if there was a marker on the line, we had to move to 
the next line to search otherwise MarkerNext would return the line to search 
from.
+
++ Wrapped the wx.Toolbook class.  It's another dPageFrame like widget, only it 
uses a ToolBar instead of tabs.  Things to note:
+
++ Images must be 32x32 or they fail to add (same as the other page frame 
widgets except they are 16x16).  Also, images cannot be changed after a page is 
created.
+
++ Wrapped the wx PlateButton widget into Dabo.  Everything works and is 
tested.  I did a minimalist wrap for the things I needed.  If somebody wants 
another feature wrapped, let me know.  I called it dBorderlessButton because it 
seemed to fit well.
+
++ Fixed the bug that failed to discern that a new record with a 
manually-populated PK was in fact new. Thanks to Dr. Sibylle Koczian for 
reporting this and working with me to help track it down.
+
++ Tracked down and fixed the problem that caused all those 'GTK-Critical' 
messages. 
+
++ Added an 'OK' button to make it clear how to dismiss the dialog when running 
under a window manager that does not have a title bar present.
+
++ Refactored the imports to better catch cases where simplejson is not 
installed.
+
++ Changed the way that 'IsAdding' is determined to take into account 
manually-entered PKs.
+
++ Added a fix to dSizerMixin when setting the Spacing property - sometimes the 
value can come from the edited grid cell in the Property sheet as a string 
instead of an int. I think I fixed the prop sheet, but I left this fix in just 
in case.
+
++ Fixed a problem when running designs containing unfilled LayoutPanels. The 
default settings of the panel were being ignored, resulting in a zero-sized 
panel in the runtime.
+
++ Worked around an apparent bug with MDI Child Windows on Mac, where calling 
Maximize(False) will maximize instead of restore the window.
+
++ Fixed the status bar displaying "Record 1/0" when there are no records.
+
++ Fixed status text to still go to the MDI child form on Mac, instead of the 
MDI parent. On Mac, the MDI parent frame isn't shown and the children are still 
fully SDI so the whole MDI thing is kind of a misnomer.
+
++ Fixed dGrid.addColumn() to accept not just a custom dColumn instance, but 
also a custom dColumn subclass, which it'll instantiate with any passed 
property settings. If an instance is passed, the properties will be applied to 
the instance.
+
++ Added [Dynamic]CellBackColor property to dColumn.
+
++ Commented out the code that allows for an optional main panel to be added to 
a form upon creation. I left the code in while we test existing code, but I 
haven't found anything in the framework that uses this. Trac issue #1033.
+
++ Modified the firing of the Hit event when the slider is set to 
Continuous=True. Now it will only fire if the underlying value changes. This 
may be what was responsible for Trac Issue #1054, in which multiple events were 
recorded.
+
++ Fixes the issues noted in Trac #1114: WordWrap was not showing properly on 
Mac and Windows when a label was initially shown.
+
++ Changed the order that the update() steps are carried out. I had noticed a 
bug in some of my Dynamic* properties that depended on the control's Value. The 
cause was that the dynamic props are evaluated *before* the Value gets updated.
+
++ Moved the sizer default logic into the DesignerUtils script. 
+
++ Enhanced the getDefaultSizerProps() method to handle the mangled names that 
the Class Designer sometimes creates.
+
++ Changed the way that the import statement block is handled in the .cdxml. 
This *should* be backwards-compatible, but may require re-creating your import 
statements in your design. 
+
++ The change was required because the previous code sometimes resulted in 
import statements not being run before code that depended on those names was 
called.
+
++ Added the dabo.ui.spawnProcess() method. This allows to to run another 
application in a completely independent process.
+
++ Added the method 'appendDataSet()'. 
+
++ This fixes the issue with the Font property and dMaskedTextBox. We were only 
checking for the existence of a '_font' attribute, and apparently the masked 
classes defined that att themselves.
+
++ Changed the field validation so that it is triggered by any call to 
flushValue(). Previously it only fired on LostFocus events, meaning that you 
could set the Value directly in code without validation.
+
++ Fixed the call to activeControlValid() to only be made if there is an active 
control, and it's not the current control.
+
++ added support to allow the retrieval of un-masked values or masked values 
for the dMaskTextBox.
+
++ dApp wasn't allowing the setting of a custom Crypto instance in 
initProperties, because it was reinitializing self._cryptoProvider to None 
*after* the custom Crypto was already set by the user. Fixed, by taking away 
the unneeded assignment in __init__, and adding a getattr() wrapper in 
_getCrypto().
+
++ Changed the default for SQLite to not create the database file if it doesn't 
already exist. This setting is controlled by dabo.createDbFiles, which defaults 
to False.
+
++ Added dException.DBFileDoesNotExistException class. This is raised if you 
try to connect to an SQLite file that does not exist and dabo.createDbFiles is 
False. This exception can be caught in the calling routines and handled 
appropriately. dConnection now takes an optional constructor parameter 
'forceCreate'; if that is True (default=False), the db file will be created no 
matter what the system setting is. dbSQLite.getConnection() takes that same 
parameter, and passes it to the connection constructor. dPref, which is 
supposed to create the DaboPreferences.db file no matter what, has been 
modified to pass  forceCreate=True to the connection.
+
++ Added the improvement provided by 'cowo' for proper importing of project 
subdirectory modules. Added the method 'getStandardAppDirectory()'. This takes 
one of the following standard Dabo directory names and returns the path to that 
directory. It takes an optional path location to start looking from; it will 
also search the app's HomeDirectory. The standard directory names are:
+"biz", "cache", "db", "main.py", "reports", "resources", "test", "ui"
+If the user requests a non-standard directory, a message is printed to the 
errorLog and None is returned. 
+If the specified standard directory cannot be found, None is returned.
+
++ Removing the deprecated first datanav classes.
+
++ Moved the datanav2 code into 'datanav'. Modified the datanav2 __init__.py to 
import datanav classes so as not to break existing references to datanav2.
+
++ Improved the handling of empty datasets. No longer will exceptions be 
raised; instead, None will be returned on an execute against an empty dataset, 
and the original will be returned on a filter on an empty dataset.
+
++ Added an afterSetup() hook method at the suggestion of Henning Hraban Ramm.
+
++ Added the ValueMode property to dMaskedTextBox. This will control whether 
the Value property returns the masked value or the plain value. Default is 
plain.
+
++ Improved the import logic in test.py. Also fixed the import of 
dBorderlessButton so that when it is run inside of test.py it doesn't break the 
test.
+
++ Added a check for non-date values in dDateTextBox to prevent the errors 
reported earlier this week.
+
++ Reworked the column.Visible functionality, and as of now it displays the 
test correctly in dGrid, although I'm sure I've missed some things. I tested on 
Linux.
+
++ Changed the way that the Visible property works with columns. Now the column 
is not removed from the grid's Columns collection; instead, its Visible status 
is taken into account when drawing the grid.
+
++ Added the 'addSizerDefaults()' method. This is to be used by external tools 
to set defaults for controls that are not part of dabo.ui. 
+
++ Found a case where a Designer tool (the view palette) had controls that were 
bound to properties that not all the controls they were modifying had. This may 
be related to some of the abends encountered when using the View Palette on 
Windows and Linux.
+
++ Improved the drag/drop behavior of grids.
+
++ Fixed Bottom and Right properties to get set after the wx object is fully 
instantiated. Thanks to Alex Tweedly for reporting the issue.
+
++ Implemented the ResetPageNumber property of reportwriter group objects. If 
it evaluates to True, the page number will be reset when the group expr 
evaluates differently.
+
++ Added PageNumber read-only (runtime) property of the Report object, 
accessible from report designs by 'self.PageNumber'. For example, put this in 
an expr for a string object:
+       "Page %s" % self.PageNumber
+This is just the first step. The PageNumber at this point will just keep 
incrementing with no way to reset it during the report run.
+
++ Added handlers in the UI layer for some of wxPython's AppleEvent handler 
methods. These catch the methods and propagate them to the dApp layer, where 
they can be overridden in an app subclass.
+
+
+
 Dabo 0.8.4 (2008-06-03) Revision 4111):
 ===============================================================================
 Dabo:




_______________________________________________
Post Messages to: [email protected]
Subscription Maintenance: http://leafe.com/mailman/listinfo/dabo-dev
Searchable Archives: http://leafe.com/archives/search/dabo-dev
This message: http://leafe.com/archives/byMID/[EMAIL PROTECTED]

Reply via email to