commit-gnue
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gnue] r8389 - in trunk/gnue-designer: . scripts src src/app src/base sr


From: jcater
Subject: [gnue] r8389 - in trunk/gnue-designer: . scripts src src/app src/base src/base/tools src/forms src/forms/LayoutEditor src/forms/PagePainter/skins src/navigator src/reports src/reports/Char src/reports/Standard src/schema src/schema/DiaEditor src/ui/wx/uihelpers/doccanvas
Date: Thu, 6 Apr 2006 21:44:24 -0500 (CDT)

Author: jcater
Date: 2006-04-06 21:44:20 -0500 (Thu, 06 Apr 2006)
New Revision: 8389

Added:
   trunk/gnue-designer/src/app/
   trunk/gnue-designer/src/app/__init__.py
   trunk/gnue-designer/src/app/designer.py
   trunk/gnue-designer/src/app/documents.py
   trunk/gnue-designer/src/forms/document.py
Removed:
   trunk/gnue-designer/src/Designer.py
   trunk/gnue-designer/src/base/ModuleSupport.py
   trunk/gnue-designer/src/forms/Document.py
Modified:
   trunk/gnue-designer/scripts/gnue-designer
   trunk/gnue-designer/setup.cvs
   trunk/gnue-designer/src/__init__.py
   trunk/gnue-designer/src/base/Config.py
   trunk/gnue-designer/src/base/Document.py
   trunk/gnue-designer/src/base/Incubator.py
   trunk/gnue-designer/src/base/MenuBar.py
   trunk/gnue-designer/src/base/PopupMenu.py
   trunk/gnue-designer/src/base/UndoManager.py
   trunk/gnue-designer/src/base/tools/DataSourceEditor.py
   trunk/gnue-designer/src/base/tools/EventEditor.py
   trunk/gnue-designer/src/base/tools/PropertyEditor.py
   trunk/gnue-designer/src/base/tools/SchemaNavigator.py
   trunk/gnue-designer/src/base/tools/SchemaViewer.py
   trunk/gnue-designer/src/base/tools/TreeView.py
   trunk/gnue-designer/src/base/tools/TriggerEditor.py
   trunk/gnue-designer/src/forms/LayoutEditor/LayoutEditor.py
   trunk/gnue-designer/src/forms/LayoutEditor/PropertyBar.py
   trunk/gnue-designer/src/forms/LayoutEditor/Workspace.py
   trunk/gnue-designer/src/forms/PagePainter/skins/default.py
   trunk/gnue-designer/src/forms/PropertyEditor.py
   trunk/gnue-designer/src/forms/TreeView.py
   trunk/gnue-designer/src/forms/__init__.py
   trunk/gnue-designer/src/navigator/LayoutEditor.py
   trunk/gnue-designer/src/reports/Char/FilterSupport.py
   trunk/gnue-designer/src/reports/Char/LayoutEditor.py
   trunk/gnue-designer/src/reports/Standard/FilterSupport.py
   trunk/gnue-designer/src/reports/Standard/GroupEditor.py
   trunk/gnue-designer/src/reports/Standard/LayoutEditor.py
   trunk/gnue-designer/src/reports/TreeView.py
   trunk/gnue-designer/src/schema/DiaEditor/VisualEditor.py
   trunk/gnue-designer/src/schema/LayoutEditor.py
   trunk/gnue-designer/src/schema/TableEditor.py
   trunk/gnue-designer/src/schema/TreeView.py
   trunk/gnue-designer/src/ui/wx/uihelpers/doccanvas/canvas.py
Log:
* Started on a property editor that shows common attributes if multiple objects 
are selected

* Separated base/ into base/ and app/, the latter being for anything used 
internally and not by the document classes (FormDefinition, etc)

* Changed the document support into a registration-style interface instead of 
being hardcoded, allowing us to add external document types without having to 
hack the main gnue-designer code

* Lots of code cleanup




Modified: trunk/gnue-designer/scripts/gnue-designer
===================================================================
--- trunk/gnue-designer/scripts/gnue-designer   2006-04-07 02:03:25 UTC (rev 
8388)
+++ trunk/gnue-designer/scripts/gnue-designer   2006-04-07 02:44:20 UTC (rev 
8389)
@@ -22,13 +22,21 @@
 # - Suite 330, Boston, MA 02111-1307, USA.
 #
 # $Id: gnue-designer,v 1.2 2003/10/05 18:05:05 btami Exp $
-
-import os, sys
-if hasattr(sys, 'frozen'):
-  sys.path.append(os.path.abspath(os.path.dirname(sys.argv[0])))
 
-from gnue.designer import Designer
+import os
+import sys
 
+if hasattr(sys, 'frozen'):
+    sys.path.append(os.path.abspath(os.path.dirname(sys.argv[0])))
+
+try: 
+    import gnue.common
+except: 
+    print "ERROR: You must first install GNUe Common"
+    sys.exit(1)
+    
+from gnue.designer.app.designer import Designer
+
 if __name__ == '__main__':
-  designer = Designer.Designer ()
-  designer.run ()
+    designer = Designer()
+    designer.run()

Modified: trunk/gnue-designer/setup.cvs
===================================================================
--- trunk/gnue-designer/setup.cvs       2006-04-07 02:03:25 UTC (rev 8388)
+++ trunk/gnue-designer/setup.cvs       2006-04-07 02:44:20 UTC (rev 8389)
@@ -16,7 +16,7 @@
 # write to the Free Software Foundation, Inc., 59 Temple Place
 # - Suite 330, Boston, MA 02111-1307, USA.
 #
-# Copyright 2001-2003 Free Software Foundation
+# Copyright 2001-2006 Free Software Foundation
 #
 # ********************
 # NOTE:

Deleted: trunk/gnue-designer/src/Designer.py
===================================================================
--- trunk/gnue-designer/src/Designer.py 2006-04-07 02:03:25 UTC (rev 8388)
+++ trunk/gnue-designer/src/Designer.py 2006-04-07 02:44:20 UTC (rev 8389)
@@ -1,452 +0,0 @@
-# GNU Enterprise Designer
-#
-# Copyright 2001-2006 Free Software Foundation
-#
-# This file is part of GNU Enterprise.
-#
-# GNU Enterprise is free software; you can redistribute it
-# and/or modify it under the terms of the GNU General Public
-# License as published by the Free Software Foundation; either
-# version 2, or (at your option) any later version.
-#
-# GNU Enterprise is distributed in the hope that it will be
-# useful, but WITHOUT ANY WARRANTY; without even the implied
-# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-# PURPOSE. See the GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public
-# License along with program; see the file COPYING. If not,
-# write to the Free Software Foundation, Inc., 59 Temple Place
-# - Suite 330, Boston, MA 02111-1307, USA.
-#
-# $Id$
-
-"""
-Main Designer class
-"""
-
-import sys, os, string
-from gnue.common.apps import RuntimeSettings
-
-from StringIO import StringIO
-#import wx
-from gnue.common.apps.GClientApp import GClientApp
-from gnue.common.apps import GDebug
-from gnue.common.utils.FileUtils import dyn_import
-from gnue.designer import VERSION, PACKAGE
-from base.ModuleSupport import SupportedModules
-from base import TemplateParser, TemplateChooser, MRUManager
-from gnue.forms.GFConfig import ConfigOptions
-from base.Config import ConfigOptions as DesignerConfigOptions
-
-import time
-
-try:
-    from xml.sax import saxlib
-except ImportError:
-    print """
-     This GNUe tool requires PyXML package to be installed.
-     Typically this is the case, however some GNU/Linux distro's
-     like Debian distribute this in another seperate package
-
-     To install this package...
-       On Debian: apt-get install python-xml
-
-  """
-    sys.exit()
-
-
-class Designer(GClientApp):
-
-    # GClientApp stuff...
-    NAME = PACKAGE
-    VERSION = VERSION
-    COMMAND = "gnue-designer"
-    SUMMARY = u_("A graphical tool for the rapid deployment of " + \
-                 "GNU Enterprise forms and reports.")
-    COMMAND_OPTIONS = [
-        [ 'new', 'n', 'new', 1, None, 'module',
-            u_('Starts up opening a new instance of <module>, ' + \
-               'where module can be forms, reports, schema, etc.') ],
-        ]
-    USAGE = GClientApp.USAGE + " [file] [file] ..."
-    USE_DATABASE_OPTIONS = 1
-
-    def __init__(self):
-        GClientApp.__init__(self, application="forms",defaults=ConfigOptions)
-
-        self._instances = []
-
-        # Load the configuration information
-        self.configurationManager.loadApplicationConfig(section="designer",
-                  defaults=DesignerConfigOptions)
-        self.configurationManager.registerAlias('gConfigNav', 'navigator')
-        self.configurationManager.registerAlias('gConfigForms', 'forms')
-        self.configurationManager.registerAlias('gConfigReports', 'reports')
-
-    # ================================================================
-    # Startup functions
-    # ================================================================
-    def run(self):
-        """
-        Startup logic for Designer.
-        """
-        print "Running"
-
-        # TODO: make a startup/GConfig parameter, and/or do auto-detection
-        from gnue.designer.ui.wx.Base import UIBase
-
-        self.ui = UIBase(self)
-
-
-        # Setup the Most Recently Used URL manager
-        self.mru = MRUManager.MRUManager(self)
-
-        # get list of available modules
-        self.loadModuleInformation()
-
-        self.ui.run()
-
-
-    def init(self):
-        """
-        Called by the UI Driver after the graphics subsystem is ready.
-        At this point, we can start loading/drawing.
-        """
-
-        print "Init'ing"
-        # Init the splashscreen
-#    self.ui.createStartupSplash()
-        gStartupStatus(u_('Initializing Client Library'))
-        print gStartupStatus
-
-        # Load the specified file, a requested new
-        # instance, or the default empty instance
-        if len(self.ARGUMENTS):
-            for arg in self.ARGUMENTS:
-                #self.SetTopWindow(self.load(arg))
-                self.load(arg)
-
-        elif self.OPTIONS['new']:
-            try:
-                #self.SetTopWindow(self.newDocument(self.OPTIONS['new']))
-                self.newDocument(self.OPTIONS['new'])
-            except ImportError:
-                raise
-                self.handleStartupError(
-                  '"%s" is not a valid option for --new' % (
-                    self.OPTIONS['new']))
-
-        else:
-            # TODO: What to do when no object is specified on command line?
-            # TODO: jcater thinks of some task selector like kword uses,
-            # TODO: or, restore the session to the way it was (same files, etc)
-
-            #self.SetTopWindow(self.newDocument('forms'))
-            self.newDocument('forms')
-
-        # Close startup screen
-#    self.ui.closeStartupSplash()
-        return True
-
-    def loadModuleInformation(self):
-        """
-        Loads all the available editor modules into memory and
-        extracts from them a list of file types/extensions
-        that they support
-        """
-        gStartupStatus(u_('Loading available tool modules'))
-
-        self.supportedModuleObjects = []  # (supported modules, "nickname")
-        self.supportedOpenWildcard = ""   #
-        self.moduleExtensionMapping = {}  # {file extension: designer module}
-
-        wildcard = []
-        alltypes = []
-
-        # TODO: wxWidgets currently doesn't consistently support multiple file
-        # TODO: extension wildcards (e.g., "All GNUe Form Files 
(*.gfd,*.gfl)").
-        # TODO: However, the code is left commented out in case some day it 
does.
-
-
-        for module in SupportedModules:
-            self.supportedModuleObjects.append(
-                     (module.properties.nickname, module))
-
-
-        ##  if len(module.properties.fileExtensions.keys()) > 1:
-        ##
-        ##    wildcard += "%s Files (*.%s)|*.%s|" % \
-        ##             ( module.properties.application,
-        ##               
string.join(module.properties.fileExtensions.keys(),',*.'),
-        ##               
string.join(module.properties.fileExtensions.keys(),';*.') )
-
-
-            # Make the "default" file extension for a module
-            # appear before the other extensions.
-            wildcard += [
-             ( module.properties.defaultFileExtension,
-               module.properties.fileExtensions[
-                    module.properties.defaultFileExtension]) ]
-
-            for type in module.properties.fileExtensions.keys():
-                if type != module.properties.defaultFileExtension:
-                    wildcard += [
-                       ( type, module.properties.fileExtensions[type]) ]
-                alltypes.append(type)
-
-                # Keep a dict of Extension::Handler mappings
-                self.moduleExtensionMapping[type] = module.properties.module
-
-
-        ##  self.supportedOpenWildcard = "All Supported Files (*.%s)|*.%s|" % \
-        ##              ( string.join(alltypes,',*.'),
-        ##              string.join(alltypes,';*.') ) \
-        ##            + wildcard \
-        ##            + "All Files (*.*)|*.*"
-            self.supportedOpenWildcard = wildcard + [('*',"All Files")]
-
-
-    # ================================================================
-    # Document functions
-    # ================================================================
-    def load(self, file):
-        """
-        Loads the requested file into a new instance of the appropriate
-        designer module if the extension is recognized.
-
-        @type file: string
-        @param file: The url of the file to open.
-        @rtype: designer editor instance
-        @return: An instance of the appropriate editor module or None if
-                 an error is encountered
-        """
-        gStartupStatus(u_('Loading document'))
-
-        extension = string.lower(os.path.splitext(file)[1][1:])
-
-        if not self.moduleExtensionMapping.has_key(extension):
-
-            # TODO: This should try to figure out what kind of file this is.
-            # TODO: We maintain a list of opening xml elements in the
-            # TODO: (gnue.designer.SupportedModules).properties object.
-            # TODO: [gnue.designer.SupportedModules is a list]
-
-            # TODO: Shouldn't this display graphically?
-            print "I do not know what to do with a .%s file!" % extension
-            return None
-
-        return self.newDocument(self.moduleExtensionMapping[extension], file)
-
-
-    def newDocument(self, module, *args, **parms):
-        """
-        Creates an instance of the appropriate designer editor module
-        """
-        c = dyn_import("gnue.designer.%s.Document" % module).Document(
-                         self, *args, **parms)
-        return c
-
-    def addDocument(self, instance):
-        """
-        Adds a newly created instance to the list of open instances
-        Sets several event handlers in the instance to point back to
-        this class so it can proxy the events for the instance.
-
-        @type instance: Designer Editor Module
-        @param instance: An instance of a designer module
-        """
-        self._instances.append(instance)
-        instance.registerEventListeners({
-                           # Proxy for the main app
-                           'RequestNew'          : self.OnNew,
-                           'RequestSaveAll'      : self.OnSaveAll,
-                           'RequestAbout'        : self.OnAbout,
-                           'RequestNewWizard'    : self.OnWizard,
-                           'RequestOpen'         : self.OnOpen,
-                           'RequestOpenRecent'   : self.OnOpenRecent,
-                           'RequestExit'         : self.OnExit
-                        })
-
-    def removeDocument(self, instance):
-        """
-        Removes an instance from the list of open instances
-
-        @type instance: Designer Editor Module
-        @param instance: An instance of a designer module
-        """
-        self._instances.remove(instance)
-
-
-    # ================================================================
-    # Proxy event functions
-    # ================================================================
-    def OnWizard(self, event):
-        """
-        Handles the request to display the wizard selection dialog
-
-        type event: GNUe Event
-        param event: The event request
-        """
-        wizard = TemplateChooser.TemplateChooser(self).run()
-        if wizard != None:
-            self.RunWizard(wizard)
-
-    def OnOpen(self, event):
-        """
-        Handles the request to open a file
-
-        type event: GNUe Event
-        param event: The event request
-        """
-
-        path = self.ui.dialogOpenFile(u_("Open GNUe File..."),
-                               wildcards = self.supportedOpenWildcard)
-
-        if path:
-            if self.isFileOpened(path):
-                self.ui.dialogOk( u_("File is already opened."), u_("Notice"))
-            else:
-                self.load(path)
-
-
-    def OnOpenRecent(self, event):
-        """
-        Handles the request to open a recent opened URL
-
-        type event: GNUe Event
-        param event: The event request
-        """
-        location = self.mru.mruMenuMap[event.GetId()]
-        if not self.isFileOpened(location):
-            self.load(location )
-
-
-    def OnExit(self, event=None):
-        """
-        Handles the request for application exit
-
-        type event: GNUe Event
-        param event: The event request
-        """
-        for instance in self._instances[:]:
-            # TODO: this should be an event
-            instance._OnClose(event)
-            #
-            # If this Close() causes issues you can replace
-            # with the following.
-            #
-            #RuntimeSettings.saveRuntimeSettings(instance)
-            #instance.Destroy()
-
-    def OnSaveAll(self, event):
-        """
-        Handles the request for all instances to save their files
-
-        type event: GNUe Event
-        param event: The event request
-        """
-        for instance in self._instances:
-            if instance.isDirty():
-                instance.OnSave(event)
-
-    def OnAbout(self, event):
-        """
-        Handles the request for an about box
-
-        type event: GNUe Event
-        param event: The event request
-        """
-
-        imports = []
-        for f in ('common','forms','reports','appserver','navigator'):
-            try:
-                v = {}
-                exec 'from gnue.%s import __version__, PACKAGE' % f in v
-                imports.append('%s Version %s' % (v['PACKAGE'],
-                               v['__version__']))
-            except:
-                pass
-
-        from wxPython import __version__ as v
-        imports.append('wxPython Version %s' % v)
-
-        from sys import version as v
-        imports.append('Python Version %s' % v.replace('\n','\n    '))
-
-
-        self.ui.dialogOk(
-            self.NAME + " " +
-            u_("Version  ") + self.VERSION + "\n\n" +
-            u_("Copyright 2001-2006 Free Software Foundation\n\n") +
-            u_("Environment:\n  %s\n\n") % string.join(imports,'\n  ') +
-            u_("For help, email address@hidden"),
-            u_("About ") + self.NAME)
-
-    def OnNew(self, event):
-        """
-        Handles the request when for a new
-        instance of a designer editor module
-
-        type event: GNUe Event
-        param event: The event request
-        """
-        self.newDocument(event.type)
-
-
-    # ================================================================
-    # Support functions
-    # ================================================================
-
-    def isDirty(self):
-        """
-        Determines if all instances currently have unsaved edits.
-
-        @rtype: boolean
-        @return: True if any instance contains unsaved information
-                 False if all instances are saved
-        """
-        isdirty = False
-        for instance in self._instances:
-            if instance.isDirty():
-                isdirty = True
-                break
-        return isdirty
-
-    def isFileOpened(self, location):
-        """
-        Determines if an instance already has the requested file open.
-
-        TODO: Currently this function is not implemented.  It always
-              returns False.
-
-        @rtype: boolean
-        @return: True if any instance contains the requested file
-                 False if the file is not currently loaded
-        """
-
-        return False
-
-    def RunWizard(self, templateInformation):
-        """
-
-        """
-        product = templateInformation['Product']
-        templateSupport = dyn_import(
-                'gnue.designer.%s.TemplateSupport' % product)
-
-        try:
-            style = templateInformation['ProductStyle']
-        except:
-            style = None
-
-        instance = self.newDocument(product, style=style)
-
-        if not TemplateParser.TemplateParser(
-              instance, instance.rootObject,
-              instance.ui, templateInformation).run():
-            instance.ui.close()
-
-
-if __name__ == '__main__':
-    Designer().run()

Modified: trunk/gnue-designer/src/__init__.py
===================================================================
--- trunk/gnue-designer/src/__init__.py 2006-04-07 02:03:25 UTC (rev 8388)
+++ trunk/gnue-designer/src/__init__.py 2006-04-07 02:44:20 UTC (rev 8389)
@@ -61,6 +61,10 @@
 __version__ = VERSION
 __hexversion__ = HEXVERSION
 
-
 PACKAGE='GNUe-Designer'
 TITLE = 'GNUe Designer'
+
+from app.documents import register_document_type
+
+# This is to make the old runtime scripts work :(
+from app import designer as Designer

Added: trunk/gnue-designer/src/app/__init__.py
===================================================================

Copied: trunk/gnue-designer/src/app/designer.py (from rev 8383, 
trunk/gnue-designer/src/Designer.py)
===================================================================
--- trunk/gnue-designer/src/Designer.py 2006-04-06 01:08:13 UTC (rev 8383)
+++ trunk/gnue-designer/src/app/designer.py     2006-04-07 02:44:20 UTC (rev 
8389)
@@ -0,0 +1,465 @@
+# GNU Enterprise Designer
+#
+# Copyright 2001-2006 Free Software Foundation
+#
+# This file is part of GNU Enterprise.
+#
+# GNU Enterprise is free software; you can redistribute it
+# and/or modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2, or (at your option) any later version.
+#
+# GNU Enterprise is distributed in the hope that it will be
+# useful, but WITHOUT ANY WARRANTY; without even the implied
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+# PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with program; see the file COPYING. If not,
+# write to the Free Software Foundation, Inc., 59 Temple Place
+# - Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+
+"""
+Main Designer class
+"""
+
+import sys
+import os
+import string
+import time
+from StringIO import StringIO
+
+from gnue.common.apps import RuntimeSettings
+from gnue.common.apps.GClientApp import GClientApp
+from gnue.common.utils.FileUtils import dyn_import
+
+from gnue.designer import VERSION, PACKAGE
+from gnue.designer.app.documents import document_types, document_types_valid
+from gnue.designer.base import TemplateParser, TemplateChooser, MRUManager
+from gnue.designer.base.Config import ConfigOptions
+
+try:
+    from xml.sax import saxlib
+except ImportError:
+    print """
+     This GNUe tool requires PyXML package to be installed.
+     Typically this is the case, however some GNU/Linux distro's
+     like Debian distribute this in another seperate package
+
+     To install this package...
+       On Debian: apt-get install python-xml
+
+  """
+    sys.exit()
+
+
+class Designer(GClientApp):
+
+    # GClientApp stuff...
+    NAME = PACKAGE
+    VERSION = VERSION
+    COMMAND = "gnue-designer"
+    SUMMARY = u_("A graphical tool for the rapid deployment of " + \
+                 "GNU Enterprise forms and reports.")
+    COMMAND_OPTIONS = [
+        [ 'new', 'n', 'new', 1, None, 'document-type',
+            u_('Starts up opening a new instance of <document-type>, ' + \
+               'where document-type can be forms, reports, schema, etc.') ],
+        ]
+    USAGE = GClientApp.USAGE + " [file] [file] ..."
+    USE_DATABASE_OPTIONS = 1
+
+    def __init__(self):
+        GClientApp.__init__(self, application="forms",
+              defaults=ConfigOptions)
+
+        self._instances = []
+
+        # Load the configuration information
+        self.configurationManager.loadApplicationConfig(section="designer",
+                  defaults=ConfigOptions)
+        self.configurationManager.registerAlias('gConfigNav', 'navigator')
+        self.configurationManager.registerAlias('gConfigForms', 'forms')
+        self.configurationManager.registerAlias('gConfigReports', 'reports')
+
+    # ================================================================
+    # Startup functions
+    # ================================================================
+    def run(self):
+        """
+        Startup logic for Designer.
+        """
+        print "Running"
+
+        # TODO: make a startup/GConfig parameter, and/or do auto-detection
+        from gnue.designer.ui.wx.Base import UIBase
+
+        self.ui = UIBase(self)
+
+
+        # Setup the Most Recently Used URL manager
+        self.mru = MRUManager.MRUManager(self)
+
+        # get list of available modules
+        self.loadModuleInformation()
+
+        self.ui.run()
+
+
+    def init(self):
+        """
+        Called by the UI Driver after the graphics subsystem is ready.
+        At this point, we can start loading/drawing.
+        """
+
+        print "Init'ing"
+        # Init the splashscreen
+#    self.ui.createStartupSplash()
+        gStartupStatus(u_('Initializing Client Library'))
+
+        # Load the specified file, a requested new
+        # instance, or the default empty instance
+        if len(self.ARGUMENTS):
+            for arg in self.ARGUMENTS:
+                #self.SetTopWindow(self.load(arg))
+                self.load(arg)
+
+        elif self.OPTIONS['new']:
+            try:
+                #self.SetTopWindow(self.newDocument(self.OPTIONS['new']))
+                self.newDocument(self.OPTIONS['new'])
+            except ImportError:
+                raise
+                self.handleStartupError(
+                  '"%s" is not a valid option for --new' % (
+                    self.OPTIONS['new']))
+
+        else:
+            # TODO: What to do when no object is specified on command line?
+            # TODO: jcater thinks of some task selector like kword uses,
+            # TODO: or, restore the session to the way it was (same files, etc)
+
+            #self.SetTopWindow(self.newDocument('forms'))
+            self.newDocument('forms')
+
+        # Close startup screen
+#    self.ui.closeStartupSplash()
+        return True
+
+    def loadModuleInformation(self):
+        """
+        Loads all the available editor modules into memory and
+        extracts from them a list of file types/extensions
+        that they support
+        """
+        gStartupStatus(u_('Loading available tool modules'))
+
+        # Load the primary editor modules. Their __init__.py
+        # should register themselves
+        import gnue.designer.forms
+        import gnue.designer.reports
+        import gnue.designer.navigator
+        import gnue.designer.schema
+        
+        
+        self.supportedModuleObjects = []  # (supported modules, "nickname")
+        self.supportedOpenWildcard = ""   #
+        self.moduleExtensionMapping = {}  # {file extension: designer module}
+
+        wildcard = []
+        alltypes = []
+
+        # TODO: wxWidgets currently doesn't consistently support multiple file
+        # TODO: extension wildcards (e.g., "All GNUe Form Files 
(*.gfd,*.gfl)").
+        # TODO: However, the code is left commented out in case some day it 
does.
+
+
+        for module in document_types_valid:
+            self.supportedModuleObjects.append(
+                     (module.nickname, module))
+
+
+        ##  if len(module.fileExtensions.keys()) > 1:
+        ##
+        ##    wildcard += "%s Files (*.%s)|*.%s|" % \
+        ##             ( module.application,
+        ##               string.join(module.fileExtensions.keys(),',*.'),
+        ##               string.join(module.fileExtensions.keys(),';*.') )
+
+
+            # Make the "default" file extension for a module
+            # appear before the other extensions.
+            wildcard += [
+             ( module.defaultFileExtension,
+               module.fileExtensions[
+               module.defaultFileExtension]) ]
+
+            for type in module.fileExtensions.keys():
+                if type != module.defaultFileExtension:
+                    wildcard += [
+                       ( type, module.fileExtensions[type]) ]
+                alltypes.append(type)
+
+                # Keep a dict of Extension::Handler mappings
+                self.moduleExtensionMapping[type] = module.nickname
+
+
+        ##  self.supportedOpenWildcard = "All Supported Files (*.%s)|*.%s|" % \
+        ##              ( string.join(alltypes,',*.'),
+        ##              string.join(alltypes,';*.') ) \
+        ##            + wildcard \
+        ##            + "All Files (*.*)|*.*"
+            self.supportedOpenWildcard = wildcard + [('*',"All Files")]
+        
+
+
+    # ================================================================
+    # Document functions
+    # ================================================================
+    def load(self, file):
+        """
+        Loads the requested file into a new instance of the appropriate
+        designer module if the extension is recognized.
+
+        @type file: string
+        @param file: The url of the file to open.
+        @rtype: designer editor instance
+        @return: An instance of the appropriate editor module or None if
+                 an error is encountered
+        """
+        gStartupStatus(u_('Loading document'))
+
+        extension = string.lower(os.path.splitext(file)[1][1:])
+
+        if not self.moduleExtensionMapping.has_key(extension):
+
+            # TODO: This should try to figure out what kind of file this is.
+            # TODO: We maintain a list of opening xml elements in the
+            # TODO: (gnue.designer.document_types_valid).properties object.
+            # TODO: [gnue.designer.document_types_valid is a list]
+
+            # TODO: Shouldn't this display graphically?
+            print u_("I do not know what to do with a .%s file!") % extension
+            return None
+
+        return self.newDocument(self.moduleExtensionMapping[extension], 
+              buffer=file)
+
+
+    def newDocument(self, module, *args, **parms):
+        """
+        Creates an instance of the appropriate designer editor module
+        """
+        for dtype in document_types:
+          module = dtype.instance
+          if isinstance(module, basestring): 
+            module = dyn_import(module)
+        parms['properties'] = dtype
+        c = module(self, *args, **parms) 
+        return c
+
+    def addDocument(self, instance):
+        """
+        Adds a newly created instance to the list of open instances
+        Sets several event handlers in the instance to point back to
+        this class so it can proxy the events for the instance.
+
+        @type instance: Designer Editor Module
+        @param instance: An instance of a designer module
+        """
+        self._instances.append(instance)
+        instance.registerEventListeners({
+                           # Proxy for the main app
+                           'RequestNew'          : self.OnNew,
+                           'RequestSaveAll'      : self.OnSaveAll,
+                           'RequestAbout'        : self.OnAbout,
+                           'RequestNewWizard'    : self.OnWizard,
+                           'RequestOpen'         : self.OnOpen,
+                           'RequestOpenRecent'   : self.OnOpenRecent,
+                           'RequestExit'         : self.OnExit
+                        })
+
+    def removeDocument(self, instance):
+        """
+        Removes an instance from the list of open instances
+
+        @type instance: Designer Editor Module
+        @param instance: An instance of a designer module
+        """
+        self._instances.remove(instance)
+
+
+    # ================================================================
+    # Proxy event functions
+    # ================================================================
+    def OnWizard(self, event):
+        """
+        Handles the request to display the wizard selection dialog
+
+        type event: GNUe Event
+        param event: The event request
+        """
+        wizard = TemplateChooser.TemplateChooser(self).run()
+        if wizard != None:
+            self.RunWizard(wizard)
+
+    def OnOpen(self, event):
+        """
+        Handles the request to open a file
+
+        type event: GNUe Event
+        param event: The event request
+        """
+
+        path = self.ui.dialogOpenFile(u_("Open GNUe File..."),
+                               wildcards = self.supportedOpenWildcard)
+
+        if path:
+            if self.isFileOpened(path):
+                self.ui.dialogOk( u_("File is already opened."), u_("Notice"))
+            else:
+                self.load(path)
+
+
+    def OnOpenRecent(self, event):
+        """
+        Handles the request to open a recent opened URL
+
+        type event: GNUe Event
+        param event: The event request
+        """
+        location = self.mru.mruMenuMap[event.GetId()]
+        if not self.isFileOpened(location):
+            self.load(location )
+
+
+    def OnExit(self, event=None):
+        """
+        Handles the request for application exit
+
+        type event: GNUe Event
+        param event: The event request
+        """
+        for instance in self._instances[:]:
+            # TODO: this should be an event
+            instance._OnClose(event)
+            #
+            # If this Close() causes issues you can replace
+            # with the following.
+            #
+            #RuntimeSettings.saveRuntimeSettings(instance)
+            #instance.Destroy()
+
+    def OnSaveAll(self, event):
+        """
+        Handles the request for all instances to save their files
+
+        type event: GNUe Event
+        param event: The event request
+        """
+        for instance in self._instances:
+            if instance.isDirty():
+                instance.OnSave(event)
+
+    def OnAbout(self, event):
+        """
+        Handles the request for an about box
+
+        type event: GNUe Event
+        param event: The event request
+        """
+
+        imports = []
+        for f in ('common','forms','reports','appserver','navigator'):
+            try:
+                v = {}
+                exec 'from gnue.%s import __version__, PACKAGE' % f in v
+                imports.append('%s Version %s' % (v['PACKAGE'],
+                               v['__version__']))
+            except:
+                pass
+
+        from wxPython import __version__ as v
+        imports.append('wxPython Version %s' % v)
+
+        from sys import version as v
+        imports.append('Python Version %s' % v.replace('\n','\n    '))
+
+
+        self.ui.dialogOk(
+            self.NAME + " " +
+            u_("Version  ") + self.VERSION + "\n\n" +
+            u_("Copyright 2001-2006 Free Software Foundation\n\n") +
+            u_("Environment:\n  %s\n\n") % string.join(imports,'\n  ') +
+            u_("For help, email address@hidden"),
+            u_("About ") + self.NAME)
+
+    def OnNew(self, event):
+        """
+        Handles the request when for a new
+        instance of a designer editor module
+
+        type event: GNUe Event
+        param event: The event request
+        """
+        self.newDocument(event.type)
+
+
+    # ================================================================
+    # Support functions
+    # ================================================================
+
+    def isDirty(self):
+        """
+        Determines if all instances currently have unsaved edits.
+
+        @rtype: boolean
+        @return: True if any instance contains unsaved information
+                 False if all instances are saved
+        """
+        isdirty = False
+        for instance in self._instances:
+            if instance.isDirty():
+                isdirty = True
+                break
+        return isdirty
+
+    def isFileOpened(self, location):
+        """
+        Determines if an instance already has the requested file open.
+
+        TODO: Currently this function is not implemented.  It always
+              returns False.
+
+        @rtype: boolean
+        @return: True if any instance contains the requested file
+                 False if the file is not currently loaded
+        """
+
+        return False
+
+    def RunWizard(self, templateInformation):
+        """
+
+        """
+        product = templateInformation['Product']
+        templateSupport = dyn_import(
+                'gnue.designer.%s.TemplateSupport' % product)
+
+        try:
+            style = templateInformation['ProductStyle']
+        except:
+            style = None
+
+        instance = self.newDocument(product, style=style)
+
+        if not TemplateParser.TemplateParser(
+              instance, instance.rootObject,
+              instance.ui, templateInformation).run():
+            instance.ui.close()
+
+
+if __name__ == '__main__':
+    Designer().run()

Copied: trunk/gnue-designer/src/app/documents.py (from rev 8383, 
trunk/gnue-designer/src/base/ModuleSupport.py)
===================================================================
--- trunk/gnue-designer/src/base/ModuleSupport.py       2006-04-06 01:08:13 UTC 
(rev 8383)
+++ trunk/gnue-designer/src/app/documents.py    2006-04-07 02:44:20 UTC (rev 
8389)
@@ -0,0 +1,69 @@
+# GNU Enterprise Designer - Basic Framework
+#
+# Copyright 2001-2006 Free Software Foundation
+#
+# This file is part of GNU Enterprise.
+#
+# GNU Enterprise is free software; you can redistribute it
+# and/or modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2, or (at your option) any later version.
+#
+# GNU Enterprise is distributed in the hope that it will be
+# useful, but WITHOUT ANY WARRANTY; without even the implied
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+# PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with program; see the file COPYING. If not,
+# write to the Free Software Foundation, Inc., 59 Temple Place
+# - Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+
+"""
+Loads all modules available to designer.
+Modules are only loaded once
+"""
+
+__all__ = ['document_types_valid','document_types_invalid',
+           'document_types','register_document_type']
+
+
+document_types_valid = []
+document_types_invalid = []
+document_types = []
+
+
+class Properties: 
+    """ 
+    A container class to hold our property values
+    """
+    pass
+
+
+def register_document_type(instance, name, title, 
+           fileExtensions, defaultFileExtension="", 
+           description="", nickname="", xmlOpeningTag=""):
+    """
+    Register a new document handler. 
+    """           
+    properties = Properties()
+    properties.instance = instance
+    properties.name = name
+    properties.title = title
+    properties.nickname = nickname or title
+    properties.description = description or (title + u_(' Document'))
+    properties.fileExtensions = fileExtensions
+    properties.defaultFileExtension = defaultFileExtension or \
+                   fileExtensions.keys()[0]
+    properties.xmlOpeningTag = xmlOpeningTag
+    
+    document_types.append(properties)
+    if instance: 
+        document_types_valid.append(properties)
+    else: 
+        document_types_invalid.append(properties)
+        
+    return properties
+

Modified: trunk/gnue-designer/src/base/Config.py
===================================================================
--- trunk/gnue-designer/src/base/Config.py      2006-04-07 02:03:25 UTC (rev 
8388)
+++ trunk/gnue-designer/src/base/Config.py      2006-04-07 02:44:20 UTC (rev 
8389)
@@ -72,12 +72,12 @@
     'Comment'    : 'Location of "Insert" toolbar icon (PNG format)',
     'Description': 'Location of "Insert" toolbar icon (PNG format)',
     'Typecast'   : GTypecast.text,
-    'Default'    : '%(prefix)s/shared/images/designer/tb_new.png' },
+    'Default'    : '/tb_new.png' },
   { 'Name'       : 'tb_delete',
     'Type'       : 'Setting',
     'Comment'    : 'Location of "Delete" toolbar icon (PNG format)',
     'Description': 'Location of "Delete" toolbar icon (PNG format)',
     'Typecast'   : GTypecast.text,
-    'Default'    : '%(prefix)s/shared/images/designer/tb_trash.png' },
+    'Default'    : 'tb_trash.png' },
 
 )

Modified: trunk/gnue-designer/src/base/Document.py
===================================================================
--- trunk/gnue-designer/src/base/Document.py    2006-04-07 02:03:25 UTC (rev 
8388)
+++ trunk/gnue-designer/src/base/Document.py    2006-04-07 02:44:20 UTC (rev 
8389)
@@ -54,7 +54,7 @@
 from gnue.designer.base.TemplateParser import WizardRunner
 from gnue.designer import VERSION, PACKAGE as TITLE
 
-from ModuleSupport import SupportedModules
+from gnue.designer.app.documents import document_types_valid
 
 
 # ===================================================================
@@ -334,17 +334,20 @@
     # Private functions
     # ================================================================
 
-    def __init__(self, app, location=None, buffer=None, style=None):
+    def __init__(self, app, properties, location=None, 
+                 buffer=None, style=None):
         EventController.__init__(self)
 
         self.app = app
-        self.ui = app.ui.createInstance(self)
+        self.properties = properties
 
         # During startup, we will cache all events
         # so we can execute them when everything has
         # been initialized.
         self.startCachingEvents()
 
+        self.ui = app.ui.createInstance(self)
+        
         # Local variables
         self.wizardName = ""
         self._isdirty = False
@@ -374,10 +377,10 @@
                            'RequestClose'        : self._OnClose,
 
                            # Object stuff
-                           'ObjectSelected'      : self.__onSetCurrentObject,
-                           'ObjectCreated'       : self.__onCreateObject,
-                           'ObjectModified'      : self.__onModifyObject,
-                           'ObjectDeleted'       : self.__onDeleteObject,
+                           'ObjectSelected'      : 
self.__object_selected_event,
+                           'ObjectCreated'       : self.__object_created_event,
+                           'ObjectModified'      : 
self.__object_modified_event,
+                           'ObjectDeleted'       : self.__object_deleted_event,
                           })
 
 
@@ -554,12 +557,12 @@
                             icon=None, hotkey=hotkey, help=help)
 
         # Add supported tools to File|New
-        for tool in SupportedModules:
+        for tool in document_types_valid:
             self.menubar.addAction(
-                'File|New', '&%s' % tool.properties.nickname,
+                'File|New', '&%s' % tool.nickname,
                 'RequestNew', 100,
-                help=u_('Create a new %s') % tool.properties.nickname.lower(),
-                eventdata={'type': tool.properties.module})
+                help=u_('Create a new %s') % tool.description,
+                eventdata={'type': tool.instance})
 
         # Add connections
         for conn in self.connections.getAllConnectionParameters().keys():
@@ -643,7 +646,7 @@
 
             # Assign an ID if none exists
             if hasattr(object, 'name'):
-                if object.name == None or object.name[:3] == "__G":
+                if object.name == None or object.name.startswith(object._type):
                     object.name = self.getNextGenericName(object._type[2:])
                 self.nameMappings[object.name.lower()] = object
                 self.usedNames.append(object.name.lower())
@@ -656,19 +659,20 @@
                       *self._editorMapping[object._type][1:])
 
         # Now, give the tool-specific instances a chance
+        object.dispatch_designer_event('InventoryObject')
         self.inventoryObject(object)
 
 
-    def __onSetCurrentObject (self, event):
+    def __object_selected_event (self, event):
         object = event.object
         handler = event.originator
         self._currentObject = object
 
-    def __onCreateObject (self, event):
+    def __object_created_event (self, event):
         self.__inventory(event.object)
         self.makeDirty()
 
-    def __onModifyObject (self, event):
+    def __object_modified_event (self, event):
         object = event.object
         # Check for any name dependencies
         # (i.e., GFEntry is dependent on GFBlock.name and GFField.name)
@@ -677,17 +681,12 @@
             for key in object._nameDependencies.keys():
                 masterattr, slaveattr = object._nameDependencies[key]
                 if masterattr in event.new.keys():
-                    oa = {slaveattr: key[slaveattr]}
-                    na = {slaveattr: object[masterattr]}
-                    key.__dict__.update(na)
-                    self.dispatchEvent( 'ObjectModified',
-                                        object=key,
-                                        originator=self,
-                                        old=oa, new=na )
+                    key[slaveattr] = object[masterattr]
+
         self.makeDirty()
 
 
-    def __onDeleteObject (self, event):
+    def __object_deleted_event (self, event):
         object = event.object
 
         # Delete the actual object from its parent
@@ -770,6 +769,7 @@
         self.app.mru.removeMenu(
              self.menubar.getMenu('File|Open Recent|'), self)
         self.app.removeDocument(self)
+        self.dispatchEvent('DocumentClosing')
         self.ui.close()
 
 
@@ -849,7 +849,10 @@
                                              object,
                                              object.__class__)
 
+    object.gparser_definition = \
+         document.incubator.elements[object._type[2:].lower()]
 
+
 def _gobject_dispatch_event(self, event, **params):
     params['object'] = self
     if not params.has_key('originator'):

Modified: trunk/gnue-designer/src/base/Incubator.py
===================================================================
--- trunk/gnue-designer/src/base/Incubator.py   2006-04-07 02:03:25 UTC (rev 
8388)
+++ trunk/gnue-designer/src/base/Incubator.py   2006-04-07 02:44:20 UTC (rev 
8389)
@@ -22,7 +22,7 @@
 # $Id$
 
 """
-Creates objects to be added to the object
+An object factory
 """
 
 from gnue.common.apps import GDebug
@@ -31,19 +31,19 @@
 class BaseIncubator:
     elements = {}
 
-    ##
-    ##  Reparent an object
-    ##
+    # ----------------------------------------------------------------------
+    # Reparent an object
+    # ----------------------------------------------------------------------
     def reparentObject(self, rootObject, object, newParent):
-        if object.getParent () == newParent:
+        if object.getParent() == newParent:
             return
 
         # TODO
 
 
-    ##
-    ##  Create a new object
-    ##
+    # ----------------------------------------------------------------------
+    # Create a new object
+    # ----------------------------------------------------------------------
     def createObject(self, rootObject, tag,
              parent, attributes={}, select=1):
 
@@ -92,38 +92,39 @@
         o.name = name
         self.document.nameMappings[o.name] = o
         o._buildObject()
-        self.document.dispatchEvent('ObjectCreated',object=o, 
originator=__name__)
+        o.dispatchEvent('ObjectCreated')
         if select:
-            self.document.dispatchEvent('ObjectSelected',object=o, 
originator=__name__)
+            o.dispatchEvent('ObjectSelected')
         return o
 
-    ##
-    ##  Delete an object
-    ##
-    def deleteObject(self, rootObject, object, newCurrentObject=None, 
firstRun=1):
+    # ----------------------------------------------------------------------
+    # Delete an object
+    # ----------------------------------------------------------------------
+    def deleteObject(self, rootObject, object, 
+                     newCurrentObject=None, firstRun=1):
 
         if firstRun:
-            newCurrentObject = parent = object.getParent ()
+            newCurrentObject = parent = object.getParent()
 
         for child in object._children:
             if not child._type == '_content_':
                 self.deleteObject(rootObject, child, firstRun=0)
 
-        self.document.dispatchEvent('ObjectDeleted',object=object, 
originator=__name__)
+        object.dispatchEvent('ObjectDeleted')
 
         if firstRun:
             o = parent
-            while o.getParent ():
+            while o.getParent():
                 o._buildObject()
-                o = o.getParent ()
+                o = o.getParent()
 
             if newCurrentObject:
-                self.document.dispatchEvent('ObjectSelected',object=object, 
originator=__name__)
+                object.dispatchEvent('ObjectSelected')
 
 
-    ##
-    ##  Internal stuff
-    ##
+    # ----------------------------------------------------------------------
+    # Internal stuff
+    # ----------------------------------------------------------------------
 
     def __init__(self, instance):
         self.document = instance
@@ -156,5 +157,6 @@
                     except KeyError:
                         elementMapping[parent] = [tag]
 
+
     def _handleUnknownAttribute(self, tag, object, attr, value):
         return

Modified: trunk/gnue-designer/src/base/MenuBar.py
===================================================================
--- trunk/gnue-designer/src/base/MenuBar.py     2006-04-07 02:03:25 UTC (rev 
8388)
+++ trunk/gnue-designer/src/base/MenuBar.py     2006-04-07 02:44:20 UTC (rev 
8389)
@@ -24,10 +24,11 @@
 """
 """
 
-import sys, os, string
-from gnue.common.apps import GDebug
+import sys
+import os
+import string
+
 import MRUManager
-from ModuleSupport import SupportedModules
 
 #
 #

Deleted: trunk/gnue-designer/src/base/ModuleSupport.py
===================================================================
--- trunk/gnue-designer/src/base/ModuleSupport.py       2006-04-07 02:03:25 UTC 
(rev 8388)
+++ trunk/gnue-designer/src/base/ModuleSupport.py       2006-04-07 02:44:20 UTC 
(rev 8389)
@@ -1,47 +0,0 @@
-# GNU Enterprise Designer - Basic Framework
-#
-# Copyright 2001-2006 Free Software Foundation
-#
-# This file is part of GNU Enterprise.
-#
-# GNU Enterprise is free software; you can redistribute it
-# and/or modify it under the terms of the GNU General Public
-# License as published by the Free Software Foundation; either
-# version 2, or (at your option) any later version.
-#
-# GNU Enterprise is distributed in the hope that it will be
-# useful, but WITHOUT ANY WARRANTY; without even the implied
-# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-# PURPOSE. See the GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public
-# License along with program; see the file COPYING. If not,
-# write to the Free Software Foundation, Inc., 59 Temple Place
-# - Suite 330, Boston, MA 02111-1307, USA.
-#
-# $Id$
-
-"""
-Loads all modules available to designer.
-Modules are only loaded once
-"""
-
-from gnue.common.apps import GDebug as _GDebug
-from gnue.common.utils.FileUtils import dyn_import
-
-SupportedModules = []
-UnsupportedModules = []
-Modules = (  'forms',
-           'reports',
-           'schema',
-##           'navigator',
-)
-
-for module in Modules:
-    try:
-        SupportedModules.append(dyn_import("gnue.designer.%s" % module))
-        _GDebug.printMesg(1,'Loaded Designer support for %s' % module)
-    except ImportError, mesg:
-        UnsupportedModules.append(module)
-        _GDebug.printMesg(1,'Cannot load Designer support for %s' % module)
-        _GDebug.printMesg(2,'  Error: %s' % mesg)

Modified: trunk/gnue-designer/src/base/PopupMenu.py
===================================================================
--- trunk/gnue-designer/src/base/PopupMenu.py   2006-04-07 02:03:25 UTC (rev 
8388)
+++ trunk/gnue-designer/src/base/PopupMenu.py   2006-04-07 02:44:20 UTC (rev 
8389)
@@ -162,7 +162,7 @@
                 object._popupMenu.OnReorderLayout(event)
                 object.__savedChildren = object._children[:]
                 for o2 in object.__savedChildren:
-                    self.document.onDeleteObject(o2, __name__)
+                    self.document.object_deleted_event(o2, __name__)
 
                 oid = "%5d.%5d.%5d" % (object._upperY, object._upperX, unqId)
                 unqId = unqId + 1
@@ -182,34 +182,34 @@
                     navObjects[oid] = object
 
             # Notify everyone that this object was deleted
-            self.document.onDeleteObject(object, __name__)
+            self.document.object_deleted_event(object, __name__)
 
         self._object._children = []
 
         # First, add back triggers
         for object in triggerObjects:
             self._object._children.append(object)
-            self.document.onCreateObject(object, __name__)
+            self.document.object_created_event(object, __name__)
 
 
         # Next, add back hidden objects
         for object in hiddenObjects:
             self._object._children.append(object)
-            self.document.onCreateObject(object, __name__)
+            self.document.object_created_event(object, __name__)
 
         # Now, add hidden objects
         boxes = boxObjects.keys()
         boxes.sort()
         for box in boxes:
             self._object._children.append(boxObjects[box])
-            self.document.onCreateObject(boxObjects[box], __name__)
+            self.document.object_created_event(boxObjects[box], __name__)
 
         # The rest of the objects (other than blocks) go here
         nav = navObjects.keys()
         nav.sort()
         for n in nav:
             self._object._children.append(navObjects[n])
-            self.document.onCreateObject(navObjects[n], __name__)
+            self.document.object_created_event(navObjects[n], __name__)
 
         # And, finally, any child blocks
         blocks = blockObjects.keys()
@@ -217,10 +217,10 @@
         for block in blocks:
             children = blockObjects[block].__savedChildren[:]
             self._object._children.append(blockObjects[block])
-            self.document.onCreateObject(blockObjects[block], __name__)
+            self.document.object_created_event(blockObjects[block], __name__)
             for child in children:
                 blockObjects[block]._children.append(child)
-                self.document.onCreateObject(child,__name__)
+                self.document.object_created_event(child,__name__)
 
 
 class CreateObjectMenu(ActionMenu):

Modified: trunk/gnue-designer/src/base/UndoManager.py
===================================================================
--- trunk/gnue-designer/src/base/UndoManager.py 2006-04-07 02:03:25 UTC (rev 
8388)
+++ trunk/gnue-designer/src/base/UndoManager.py 2006-04-07 02:44:20 UTC (rev 
8389)
@@ -121,8 +121,8 @@
     def __init__(self, manager, event):
         self.event = event
         if event.__event__ == 'ObjectDeleted':
-            self.parentindex = event.object.getParent 
()._children.index(event.object)
-            self.parent = id(event.object.getParent ())
+            self.parentindex = 
event.object.getParent()._children.index(event.object)
+            self.parent = id(event.object.getParent())
 
     def reverse(self, manager):
         orig = self.event
@@ -146,7 +146,7 @@
             for key, val in object.__dict__.items():
                 if key[0] != '_' and type(val) != types.MethodType:
                     attrs[key] = val
-            parent = manager.getCurrObject(object.getParent ())
+            parent = manager.getCurrObject(object.getParent())
             obj = object.__class__(parent)
             obj.__dict__.update(attrs)
             obj._buildObject()
@@ -154,8 +154,8 @@
 
             # Move the child to its old, relative position
             # in the parent's child list
-            obj.getParent ()._children.pop()
-            obj.getParent ()._children.insert(self.parentindex, obj)
+            obj.getParent()._children.pop()
+            obj.getParent()._children.insert(self.parentindex, obj)
 
             # Notify our peeps...
             manager.document.dispatchEvent('ObjectCreated', 
originator=__name__,

Modified: trunk/gnue-designer/src/base/tools/DataSourceEditor.py
===================================================================
--- trunk/gnue-designer/src/base/tools/DataSourceEditor.py      2006-04-07 
02:03:25 UTC (rev 8388)
+++ trunk/gnue-designer/src/base/tools/DataSourceEditor.py      2006-04-07 
02:44:20 UTC (rev 8389)
@@ -76,10 +76,10 @@
 
         # EventAware provided by ToolBase
         self.registerEventListeners({
-                           'ObjectSelected'      : self.onSetCurrentObject,
-                           'ObjectCreated'       : self.onCreateObject,
-                           'ObjectModified'      : self.onModifyObject,
-                           'ObjectDeleted'       : self.onDeleteObject,
+                           'ObjectSelected'      : self.object_selected_event,
+                           'ObjectCreated'       : self.object_created_event,
+                           'ObjectModified'      : self.object_modified_event,
+                           'ObjectDeleted'       : self.object_deleted_event,
                           })
 
         wx.EVT_LIST_ITEM_SELECTED(self, self.list.GetId(), self.OnDSSelected)
@@ -178,7 +178,7 @@
 
 
 
-    def onSetCurrentObject (self, event):
+    def object_selected_event (self, event):
         object = event.object
         handler = event.originator
         self._currentObject = object
@@ -203,7 +203,7 @@
         self.schemaPanel.setCurrent(object)
 
 
-    def onCreateObject (self, event):
+    def object_created_event (self, event):
         object = event.object
         handler = event.originator
         self._currentSelection = {}
@@ -218,7 +218,7 @@
             self.fillList()
 
 
-    def onModifyObject (self, event):
+    def object_modified_event (self, event):
         object = event.object
         handler = event.originator
         if object == None:
@@ -235,7 +235,7 @@
                 self._setCurrent(object)
 
 
-    def onDeleteObject (self, event):
+    def object_deleted_event (self, event):
         object = event.object
         handler = event.originator
         if object == None:
@@ -471,7 +471,7 @@
         for field in self.current._fieldFkReferences.keys():
             for item in self.current._fieldFkReferences[field]:
                 addLine( self, "%s.%s" % (mastertable, field),
-                         "%s.%s" % (item.getParent ().name, item.name),
+                         "%s.%s" % (item.getParent().name, item.name),
                          u_("Dropdown Entry") )
 
 

Modified: trunk/gnue-designer/src/base/tools/EventEditor.py
===================================================================
--- trunk/gnue-designer/src/base/tools/EventEditor.py   2006-04-07 02:03:25 UTC 
(rev 8388)
+++ trunk/gnue-designer/src/base/tools/EventEditor.py   2006-04-07 02:44:20 UTC 
(rev 8389)
@@ -48,10 +48,10 @@
 
         # EventAware provided by ToolBase
         self.registerEventListeners({
-                           'ObjectSelected'      : self.onSetCurrentObject,
-                           'ObjectCreated'       : self.onCreateObject,
-                           'ObjectModified'      : self.onModifyObject,
-                           'ObjectDeleted'       : self.onDeleteObject,
+                           'ObjectSelected'      : self.object_selected_event,
+                           'ObjectCreated'       : self.object_created_event,
+                           'ObjectModified'      : self.object_modified_event,
+                           'ObjectDeleted'       : self.object_deleted_event,
                           })
 
         self.supplemental = []
@@ -62,7 +62,7 @@
     def createMainPage(self):
         return InspectorPanel(self, self.notebook)
 
-    def onSetCurrentObject (self, event):
+    def object_selected_event (self, event):
         object = event.object
         handler = event.originator
         if object == None:
@@ -91,14 +91,14 @@
         self.supplemental = []
 
 
-    def onCreateObject (self, event):
+    def object_created_event (self, event):
         object = event.object
         handler = event.originator
         for insp in [self.main] + self.supplemental:
-            insp.onCreateObject(event)
+            insp.object_created_event(event)
 
 
-    def onModifyObject (self, event):
+    def object_modified_event (self, event):
         object = event.object
         handler = event.originator
         if object == None:
@@ -106,10 +106,10 @@
         if handler != __name__ and self.object == object:
             self.setCurrent(object)
         for insp in [self.main] + self.supplemental:
-            insp.onModifyObject(event)
+            insp.object_modified_event(event)
 
 
-    def onDeleteObject (self, event):
+    def object_deleted_event (self, event):
         object = event.object
         handler = event.originator
         if object == None:
@@ -117,7 +117,7 @@
         if handler != __name__:
             pass
         for insp in [self.main] + self.supplemental:
-            insp.onDeleteObject(event)
+            insp.object_deleted_event(event)
 
 
 
@@ -212,10 +212,7 @@
 
         # Redraw the grid
         self.grid.EndBatch()
-        try:
-            self.grid.ForceRefresh()  # Added in 2.3.1
-        except AttributeError:
-            pass
+        self.grid.ForceRefresh()
 
         #
         # If the first cell has a trigger, select it
@@ -237,10 +234,10 @@
     def getPageText(self):
         return self.object._type[2:]
 
-    def onCreateObject (self, event):
+    def object_created_event (self, event):
         self.inventoryObject(event.object)
 
-    def onModifyObject (self, event):
+    def object_modified_event (self, event):
         object = event.object
         handler = event.originator
         if object == None:
@@ -262,7 +259,7 @@
             pass
 
 
-    def onDeleteObject (self, event):
+    def object_deleted_event (self, event):
         object = event.object
         handler = event.originator
         if object == None:
@@ -289,7 +286,7 @@
 
 
     def _generateName(self, object):
-        parent = object.getParent ()
+        parent = object.getParent()
         name = '%s.%s (%s-Level Trigger)' % (parent.name, 
parent._validTriggers[object.type.upper()], parent._type[2:].capitalize())
         return name
 

Modified: trunk/gnue-designer/src/base/tools/PropertyEditor.py
===================================================================
--- trunk/gnue-designer/src/base/tools/PropertyEditor.py        2006-04-07 
02:03:25 UTC (rev 8388)
+++ trunk/gnue-designer/src/base/tools/PropertyEditor.py        2006-04-07 
02:44:20 UTC (rev 8389)
@@ -25,29 +25,238 @@
 
 __all__ = ['PropertyEditor']
 
-import sys, os, string
+import sys
+
 import wx
-from wx.grid import *
+import wx.lib.mixins.listctrl as mixins
+
+
 from gnue.common.apps import GDebug
 from gnue.common.formatting import GTypecast
-from gnue.designer.base.ToolBase import ToolNotebook
+from gnue.designer.base.ToolBase import ToolBase
 from gnue.forms.uidrivers.wx.common import wxEncode
 
-class PropertyEditor (ToolNotebook):
 
+class PropertyEditor(ToolBase):
     runtime_section = 'PropertyEditor'
     default_dock = 'left-1'
 
     def init(self):
 
+        # EventAware provided by ToolBase
+        self.registerEventListeners({
+                           'ObjectSelected'      : self.object_selected_event,
+#                           'ObjectCreated'       : self.object_created_event,
+#                           'ObjectModified'      : self.object_modified_event,
+#                           'ObjectDeleted'       : self.object_deleted_event,
+                          })
+                          
+        self.listctrl = listctrl = PropertyEditorListCtrl(self)
+        sizer = wx.BoxSizer(wx.VERTICAL)
+        sizer.Add(listctrl, 1, wx.EXPAND|wx.ALL, 0)
+        self.SetAutoLayout(True)
+        self.SetSizer(sizer)
+
+
+    def object_selected_event (self, event):
+        """
+        Called on the ObjectSelected event. 
+        
+        Display all properties of a widget, or the common 
+        properties of all selected widgets, if multiple 
+        widgets are selected.
+        """
+
+        # Get selected objects, or the current object
+        try: 
+            objects = event.selection
+        except: 
+            objects = [event.object]
+
+        self.objects = objects
+
+        # Remove any previous entries
+        self.listctrl.ClearAll()
+        self.listctrl.InsertColumn(0,'Property')
+        self.listctrl.InsertColumn(1,'Value')
+        
+
+        for gobject in objects: 
+
+            definition_map = gobject.gparser_definition['Attributes']
+            
+            # Define our rows
+            self.row_list = row_list = []
+            add_row_list = row_list.append
+            for attribute_name, attributes in definition_map.items():
+
+                try:
+                    label = attributes['Label']
+                except KeyError:
+                    # This little tidbit does mixed case w/'_' as separators
+                    words = attribute_name.split(':',1)[-1].split('_')
+                    for index, text in iterate(words):
+                        words[index] = text.capitalize()
+                    label = " ".join(words)
+                    
+                    # Cache it so we don't have to do this each time
+                    attributes['Label'] = label
+                    
+                add_row_list((label, attribute_name))
+
+                index = self.listctrl.InsertStringItem(sys.maxint, label)
+                self.listctrl.SetStringItem(index, 0, label)
+                self.listctrl.SetStringItem(index, 1, "value")
+                #self.listctrl.SetItemData(index, attribute_name)
+            
+                print label
+                
+            row_list.sort()
+            
+            return 
+            
+                
+            # Only show properties for nondeprecated values (unless set)
+            i = 0
+            for index in iterate(row_list):
+                label, key = self.rowList[i]
+                xkey = key.replace(':','__')
+                if self.attributes[key].has_key ('Deprecated') and \
+                   self.attributes[key]['Deprecated'] and \
+                   (not hasattr(gobject, xkey) or \
+                      (self.attributes[key].has_key('Default') and \
+                       gobject.__dict__[xkey] == 
self.attributes[key]['Default'] ) ):
+                    self.rowList.pop(i)
+                else:
+                    i = i + 1
+
+        return 
+        y = 2
+        maxLabel = 0
+        for text, key in self.rowList:
+
+            xkey = key.replace(':','__')
+
+            # If an attribute has a "Label", use it;
+            # otherwise create one from its name.
+
+            if self.attributes[key]['Typecast'] == GTypecast.boolean:
+                text = u_('%s?') % text
+            else:
+                text = u_('%s:') % text
+
+            try:
+                label = wx.StaticText (self.labelPanel, -1, text)
+                label.SetFont(wx.SMALL_FONT)
+
+            except:
+                pass
+
+            # Determine the type of Cell Editor we want
+            # (Integer, Boolean, Dropdown, Char)
+            if self.attributes[key].has_key('ValueSet'):
+                field = LimitedSetEditor(self.fieldPanel,self.attributes[key])
+                wx.EVT_COMBOBOX(field, field.GetId(), self.__valueModified)
+            elif self.attributes[key].has_key('References'):
+                tag, attr = self.attributes[key]['References'].split('.')
+                objectList = self.editor.document.getObjectList(tag)
+                field = LinkedTextEditor(self.fieldPanel,
+                                         self.attributes[key],
+                                         objectList,
+                                         attr)
+                wx.EVT_COMBOBOX(field, field.GetId(), self.__valueModified)
+            elif self.attributes[key]['Typecast'] == GTypecast.boolean:
+                field = BoolEditor(self.fieldPanel,self.attributes[key])
+                wx.EVT_COMBOBOX(field, field.GetId(), self.__valueModified)
+            elif self.attributes[key]['Typecast'] in (GTypecast.integer,
+                    GTypecast.number, GTypecast.whole):
+                field = IntEditor(self.fieldPanel,self.attributes[key])
+                wx.EVT_SPINCTRL(field, field.GetId(), self.__valueModified)
+            else:
+                field = TextEditor(self.fieldPanel,self.attributes[key])
+            wx.EVT_TEXT(field, field.GetId(), self.__valueModified)
+
+            field.SetFont(wx.SMALL_FONT)
+
+            # Generate a tooltip from the description.
+            # Note that tooltips can have {Name} tokens
+            try:
+                tooltip = self.attributes[key]['Description']
+                try:
+                    for v, l in self.attributes[key]['ValueSet'].items():
+                        tooltip = tooltip.replace('{%s}' % v,
+                                                  '"%s"' % l['Label'])
+                except KeyError:
+                    pass
+                tooltip = tooltip.replace('{Y}','"True"')
+                tooltip = tooltip.replace('{N}','"False"')
+                tooltip = tooltip.replace('{','"')
+                tooltip = tooltip.replace('}','"')
+                field.SetToolTip(wx.ToolTip(tooltip))
+            except KeyError:
+                pass
+
+            # Align the centers of the field and label
+            fx, fy = field.GetSizeTuple()
+            lx, ly = label.GetSizeTuple()
+            maxy = max(fy, ly)
+            maxLabel = max(maxLabel, lx+4)
+            field.SetPosition((2, int((maxy - fy)/2) + y))
+            label.SetPosition((4, int((maxy - ly)/2) + y))
+
+            # Next y...
+            y += maxy
+
+            # Set the initial value of the cells to the current property values
+            if hasattr(object, xkey):
+                field.SetValue(object.__dict__[xkey])
+
+            self.fields.append(field)
+            self.labels.append(label)
+        
+
+
+class PropertyEditorListCtrl(wx.ListCtrl, #mixins.TextEditMixin, 
+                             mixins.ListCtrlAutoWidthMixin): 
+    def __init__(self, tool): 
+        wx.ListCtrl.__init__(self, tool,  -1, 
+            style=wx.LC_REPORT|wx.LC_HRULES|wx.LC_VRULES)
+        #mixins.TextEditMixin.__init__(self)
+        #mixins.ListCtrlAutoWidthMixin.__init__(self)
+        self.InsertColumn(0,'Property')
+        self.InsertColumn(1,'Value')
+        self.SetColumnWidth(0, wx.LIST_AUTOSIZE)
+        
+#    def SetStringItem(self, index, col, data):
+#        if col < 2:
+#            wx.ListCtrl.SetStringItem(self, index, col, data)
+#            wx.ListCtrl.SetStringItem(self, index, 2+col, str(len(data)))
+#        else:
+#            try:
+#                datalen = int(data)
+#            except:
+#                return#
+
+#            wx.ListCtrl.SetStringItem(self, index, col, data)
+
+#            data = self.GetItem(index, col-2).GetText()
+#            wx.ListCtrl.SetStringItem(self, index, col-2, data[0:datalen])
+        
+class PropertyEditorXXX: # (ToolNotebook):
+
+    runtime_section = 'PropertyEditor'
+    default_dock = 'left-1'
+
+    def init(self):
+
         self.object = None
 
         # EventAware provided by ToolBase
         self.registerEventListeners({
-                           'ObjectSelected'      : self.onSetCurrentObject,
-                           'ObjectCreated'       : self.onCreateObject,
-                           'ObjectModified'      : self.onModifyObject,
-                           'ObjectDeleted'       : self.onDeleteObject,
+                           'ObjectSelected'      : self.object_selected_event,
+                           'ObjectCreated'       : self.object_created_event,
+                           'ObjectModified'      : self.object_modified_event,
+                           'ObjectDeleted'       : self.object_deleted_event,
                           })
 
         self.supplemental = []
@@ -59,7 +268,8 @@
     def createMainPage(self):
         return InspectorPanel(self, self.notebook)
 
-    def onSetCurrentObject (self, event):
+    def object_selected_event (self, event):
+        return
         object = event.object
         handler = event.originator
         if object == None:
@@ -87,11 +297,11 @@
             self.notebook.DeletePage(1)
         self.supplemental = []
 
-    def onCreateObject (self, event):
+    def object_created_event (self, event):
         object = event.object
         handler = event.originator
 
-    def onModifyObject (self, event):
+    def object_modified_event (self, event):
         object = event.object
         if object == None:
             return
@@ -100,7 +310,7 @@
             for page in [self.main] + self.supplemental:
                 page.resetValues(object)
 
-    def onDeleteObject (self, event):
+    def object_deleted_event (self, event):
         object = event.object
         handler = event.originator
         if object == None:
@@ -143,9 +353,6 @@
             return {}
 
 
-    def setCurrent(self, object):
-        self._setCurrent(object)
-
     def _setCurrent(self, object):
         self.object = object
         self.attributes = self.getAttributes(object)
@@ -157,10 +364,10 @@
                 label = attributes['Label']
             except KeyError:
                 # This little tidbit does mixed case w/'_' as separators
-                words = string.split(key.split(':',1)[-1],'_')
-                for j in range(len(words)):
+                words = key.split(':',1)[-1].split('_')
+                for j in xrange(len(words)):
                     words[j] = words[j].capitalize()
-                label = string.join(words)
+                label = " ".join(words)
             self.rowList.append((label, key))
         self.rowList.sort()
 
@@ -195,9 +402,9 @@
             # otherwise create one from its name.
 
             if self.attributes[key]['Typecast'] == GTypecast.boolean:
-                text += u_('?')
+                text = u_('%s?') % text
             else:
-                text += ':'
+                text = u_('%s:') % text
 
             try:
                 label = wx.StaticText (self.labelPanel, -1, text)
@@ -317,7 +524,7 @@
         xkey = attr.replace(':','__')
         try:
             try:
-                ov = self.object.__dict__[xkey]
+                ov = self.object[attr]
             except KeyError:
                 ov = None
 

Modified: trunk/gnue-designer/src/base/tools/SchemaNavigator.py
===================================================================
--- trunk/gnue-designer/src/base/tools/SchemaNavigator.py       2006-04-07 
02:03:25 UTC (rev 8388)
+++ trunk/gnue-designer/src/base/tools/SchemaNavigator.py       2006-04-07 
02:44:20 UTC (rev 8389)
@@ -93,10 +93,10 @@
 
         # EventAware provided by ToolBase
 ##    self.registerEventListeners({
-##                       'ObjectSelected'      : self.onSetCurrentObject,
-##                       'ObjectCreated'       : self.onCreateObject,
-##                       'ObjectModified'      : self.onModifyObject,
-##                       'ObjectDeleted'       : self.onDeleteObject,
+##                       'ObjectSelected'      : self.object_selected_event,
+##                       'ObjectCreated'       : self.object_created_event,
+##                       'ObjectModified'      : self.object_modified_event,
+##                       'ObjectDeleted'       : self.object_deleted_event,
 ##                      })
 
         self.expanded = 1

Modified: trunk/gnue-designer/src/base/tools/SchemaViewer.py
===================================================================
--- trunk/gnue-designer/src/base/tools/SchemaViewer.py  2006-04-07 02:03:25 UTC 
(rev 8388)
+++ trunk/gnue-designer/src/base/tools/SchemaViewer.py  2006-04-07 02:44:20 UTC 
(rev 8389)
@@ -65,10 +65,10 @@
 
         # EventAware provided by ToolBase
         self.registerEventListeners({
-                           'ObjectSelected'      : self.onSetCurrentObject,
-                           'ObjectCreated'       : self.onCreateObject,
-                           'ObjectModified'      : self.onModifyObject,
-                           'ObjectDeleted'       : self.onDeleteObject,
+                           'ObjectSelected'      : self.object_selected_event,
+                           'ObjectCreated'       : self.object_created_event,
+                           'ObjectModified'      : self.object_modified_event,
+                           'ObjectDeleted'       : self.object_deleted_event,
                           })
 
 
@@ -168,19 +168,19 @@
 
 
 
-    def onSetCurrentObject (self, event):
+    def object_selected_event (self, event):
         object = event.object
         handler = event.originator
 
-    def onCreateObject (self, event):
+    def object_created_event (self, event):
         object = event.object
         handler = event.originator
 
-    def onModifyObject (self, event):
+    def object_modified_event (self, event):
         object = event.object
         handler = event.originator
 
-    def onDeleteObject (self, event):
+    def object_deleted_event (self, event):
         object = event.object
         handler = event.originator
 

Modified: trunk/gnue-designer/src/base/tools/TreeView.py
===================================================================
--- trunk/gnue-designer/src/base/tools/TreeView.py      2006-04-07 02:03:25 UTC 
(rev 8388)
+++ trunk/gnue-designer/src/base/tools/TreeView.py      2006-04-07 02:44:20 UTC 
(rev 8389)
@@ -50,10 +50,10 @@
 
         # EventAware provided by ToolBase
         self.registerEventListeners({
-                           'ObjectSelected'      : self.onSetCurrentObject,
-                           'ObjectCreated'       : self.onCreateObject,
-                           'ObjectModified'      : self.onModifyObject,
-                           'ObjectDeleted'       : self.onDeleteObject,
+                           'ObjectSelected'      : self.object_selected_event,
+                           'ObjectCreated'       : self.object_created_event,
+                           'ObjectModified'      : self.object_modified_event,
+                           'ObjectDeleted'       : self.object_deleted_event,
                           })
 
 
@@ -98,7 +98,7 @@
         rv = self.tree.AppendItem(parent, wxEncode(description))
         return rv
 
-    def onSetCurrentObject (self, event):
+    def object_selected_event (self, event):
         object = event.object
         handler = event.originator
         if object == None:
@@ -109,7 +109,7 @@
             self.tree.SelectItem(object._treeItem)
             self._handler = None
 
-    def onCreateObject (self, event):
+    def object_created_event (self, event):
         object = event.object
         handler = event.originator
         if object == None:
@@ -121,7 +121,7 @@
                 pass
             self.inventoryObject(object)
 
-    def onModifyObject (self, event):
+    def object_modified_event (self, event):
         object = event.object
         handler = event.originator
         if object == None:
@@ -132,7 +132,7 @@
                 if attribute == 'name' and object != self.rootObject:
                     self.tree.SetItemText(object._treeItem, 
object.getDescription())
 
-    def onDeleteObject (self, event):
+    def object_deleted_event (self, event):
         object = event.object
         handler = event.originator
         if object == None:

Modified: trunk/gnue-designer/src/base/tools/TriggerEditor.py
===================================================================
--- trunk/gnue-designer/src/base/tools/TriggerEditor.py 2006-04-07 02:03:25 UTC 
(rev 8388)
+++ trunk/gnue-designer/src/base/tools/TriggerEditor.py 2006-04-07 02:44:20 UTC 
(rev 8389)
@@ -87,11 +87,11 @@
         if trigger.type.upper() == 'NAMED':
             return trigger.name
         else:
-            parent = trigger.getParent ()
+            parent = trigger.getParent()
             #name = '%s.%s' % (parent.name, 
parent._validTriggers[trigger.type.upper()])
             name = '%s.%s' % (parent.name, trigger.type)
             try:
-                name = parent.getParent ().name + '.' + name
+                name = parent.getParent().name + '.' + name
             except:
                 pass
             return '('+name+')'

Deleted: trunk/gnue-designer/src/forms/Document.py
===================================================================
--- trunk/gnue-designer/src/forms/Document.py   2006-04-07 02:03:25 UTC (rev 
8388)
+++ trunk/gnue-designer/src/forms/Document.py   2006-04-07 02:44:20 UTC (rev 
8389)
@@ -1,430 +0,0 @@
-# GNU Enterprise Designer - Forms Support
-#
-# Copyright 2001-2006 Free Software Foundation
-#
-# This file is part of GNU Enterprise.
-#
-# GNU Enterprise is free software; you can redistribute it
-# and/or modify it under the terms of the GNU General Public
-# License as published by the Free Software Foundation; either
-# version 2, or (at your option) any later version.
-#
-# GNU Enterprise is distributed in the hope that it will be
-# useful, but WITHOUT ANY WARRANTY; without even the implied
-# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-# PURPOSE. See the GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public
-# License along with program; see the file COPYING. If not,
-# write to the Free Software Foundation, Inc., 59 Temple Place
-# - Suite 330, Boston, MA 02111-1307, USA.
-#
-# $Id$
-"""
-"""
-
-__all__ = ['Document']
-
-# ---------------------------------------------------------------------------
-# System imports
-# ---------------------------------------------------------------------------
-
-# ---------------------------------------------------------------------------
-# External imports
-# ---------------------------------------------------------------------------
-import wx
-
-# ---------------------------------------------------------------------------
-# GNUe Imports
-# ---------------------------------------------------------------------------
-from gnue.designer.forms import properties as formProperties
-from gnue.designer.base.Document import BaseDocument
-from gnue.designer.base import PopupMenu
-from gnue.designer.base.ObjectList import ObjectList
-from gnue.designer.base.PopupMenu import ObjectMenu
-
-from gnue.forms import GFInstance
-from gnue.forms import GFForm, GFParser, GFObjects, GFLibrary
-from gnue.forms.GFObjects.GFBlock import GFBlock
-
-from gnue.common.logic import GTrigger
-from gnue.common.apps import GDebug
-from gnue.common.datasources import GDataSource
-
-from Debugger import DebugSession
-from Incubator import Incubator
-from events.Events import registerEvents
-import wizards
-from WizardRunner import WizardRunner
-
-# Tool support...
-from PagePainter import PagePainter
-from LayoutEditor import LayoutEditor
-from TreeView import TreeView
-from PropertyEditor import PropertyEditor
-from EventEditor import EventEditor
-from BlockEditor import BlockEditor
-from gnue.designer.base.tools.DataSourceEditor import DataSourceEditor
-##from gnue.designer.base.tools.SchemaViewer import SchemaViewer
-from gnue.designer.base.tools.SchemaNavigator import SchemaNavigator
-
-
-
-#============================================================================
-# Document Instance class
-#============================================================================
-class Document(BaseDocument):
-    """
-    Designer's form editor document.
-    """
-
-    # =========================================================================
-    # Public methods
-    # =========================================================================
-
-    def init(self):
-        app = self.app
-        self.incubator = Incubator(self) # Incubator
-        self.properties = formProperties # List of the modules properties
-        self.wizardRunner = WizardRunner #
-        self.debugLevel = '1'            # The debug level used when running a 
form
-                                         # inside designer
-
-        # Create a GFInstance instance
-        self.gfinstance = GFInstance.GFInstance(app,
-                                       app.connections,
-                                       None, disableSplash=1)
-
-        # For GFInstance support, iirc
-        ##self._pages = []
-
-        # Build a list of positionable widgets
-        self._positionableList = []
-        elements = self.incubator.elements
-        for tag in elements.keys():
-            try:
-                if elements['Positionable']:
-                    self._positionableList.append(tag)
-            except KeyError:
-                pass
-
-        self.registerEventListeners({
-                           'ObjectModified' : self.__onModifyObject,
-                           'ObjectDeleted' :  self.__onDeleteObject,
-                           'Forms:RunForm': self.__onRunForm,
-                           'Forms:RequestDebugLevel': self.__onSetDebugLevel
-                          })
-
-        # Add our events/* stuff
-        registerEvents(self)
-
-    def finalize(self):
-        # Convenience list to keep track of datasources and blocks
-        # TODO: Anything that needs either of these two
-        # TODO: should call getObjectList directly.
-        # TODO: Left for historical reasons.
-        self.datasources = self.getObjectList('datasource')
-        self.blocks = self.getObjectList('block')
-
-
-
-    # -------------------------------------------------------------------------
-    # Load a form
-    # -------------------------------------------------------------------------
-    def loadBuffer(self, buffer):
-        form = GFParser.loadFile (buffer, self.gfinstance, initialize=0)
-        return form
-
-
-    def loadEmpty(self, style=None):
-        form = GFForm.GFForm()
-        options = GFObjects.GFOptions(form)
-        form.title = u_("Untitled Form")
-        form.height = 12
-        GFObjects.GFLogic(form)
-        layout = GFObjects.GFLayout(form)
-        layout.Char__width = 40
-        layout.Char__height = 12
-        GFObjects.GFPage(layout)
-        return form
-
-    # -------------------------------------------------------------------------
-    # Create the document tools/editors
-    # -------------------------------------------------------------------------
-    def createEditors(self):
-        # Associate our LayoutEditor with GFPage objects
-
-        self.registerEditor(LayoutEditor, 'GFPage')
-        self.registerEditor(PagePainter, 'GFPage')
-
-
-    def createTools(self):
-        self.addTool('propertyEditor', u_('Property Inspector'), 
PropertyEditor,
-                          hotkey='F10', menuGroup=301)
-        self.addTool('treeEditor',     u_('Object Navigator'), TreeView,
-                          hotkey='F8', menuGroup=311)
-
-        self.addTool('schemaNavigator',u_('Schema Navigator'), SchemaNavigator,
-                          menuGroup=301)
-        #self.addTool('datasourceEditor',u_('Data Source Editor'), 
DataSourceEditor,
-        #                  hotkey='F9', menuGroup=311)
-        #self.addTool('blockEditor',   u_('Block Editor'), BlockEditor,
-        #                  hotkey='F5', menuGroup=311)
-        #self.addTool('fieldEditor',   u_('Field Editor'), FieldEditor,
-        #                  hotkey='F6', menuGroup=201)
-        self.addTool('eventEditor',    u_('Trigger Mappings'), EventEditor,
-                          hotkey='F7', menuGroup=321)
-
-    def createWizards(self):
-        self.loadWizards(wizards)
-
-    # Instances can add to the primary toolbar
-    def initToolBar(self):
-        self.toolbar.addToolbarMapping(';Forms:RunForm,tb_exec;')
-
-
-    def initMenu(self):
-        # Add the [sub]menus
-        for location, text, grouping in (
-           ('Modify|Arrange Items',u_('&Arrange Items'), 501),):
-
-            self.menubar.addMenu(location, text, grouping)
-
-        for location, event, text, hotkey, help, grouping, canToggle in (
-           ('View', 'LayoutEditor:ZoomIn', u_("Zoom In"), None, u_("Zoom in"), 
11.1, 0),
-           ('View', 'LayoutEditor:ZoomOut', u_("Zoom Out"), None, u_("Zoom 
out"), 11.2, 0),
-           ('View', 'LayoutEditor:ShowFocus', u_("Show Focus Order"), None, 
u_("Show the navigation order on the layout editor"), 21, 1),
-
-           ('Tools','Forms:RunForm', u_("Run Form"), None, u_("Display and run 
the current form"), 101.1, 0),
-           ('Tools','Forms:RequestDebugLevel', u_("Change debugging 
level..."), None, u_("Change the debugging output level for the Run Form 
option"), 101.2, 0),
-
-           ('Modify|Align Items','Forms:AlignLeft', u_("&Align Left Edges"), 
None, u_("Horizontally align the currently selected items along their left 
edges"),101.1, 0),
-           ('Modify|Align Items','Forms:AlignRight', u_("&Align Right Edges"), 
None, u_("Horizontally align the currently selected items along their right 
edges"),101.2, 0),
-           ('Modify|Align Items','Forms:AlignHCenter', u_("&Align Horizontal 
Center"), None, u_("Horizontally align the currently selected items along their 
centers"),101.2, 0),
-           ('Modify|Align Items','Forms:AlignTop', u_("&Align Top Edges"), 
None, u_("Vertically align the currently selected items along their top 
edges"),111.1, 0),
-           ('Modify|Align Items','Forms:AlignBottom', u_("&Align Bottom 
Edges"), None, u_("Vertically align the currently selected items along their 
bottom edges"),111.2, 0),
-           ('Modify|Align Items','Forms:AlignVCenter', u_("&Align Vertical 
Center"), None, u_("Vertically align the currently selected items along their 
centers"),111.3, 0),
-           ('Modify|Align Items','Forms:SmartAlign', u_("&Smart Align 
Labels/Fields"), None, u_("Align Labels and fields into a block formation, with 
all fields left aligned and all labels left aligned."),121.1, 0),
-
-           ('Modify','LayoutEditor:FocusOrder', u_("&Set Focus Order 
Manually"), None, u_("Set the focus order by hand"),201.2, 0),
-           ('Modify','LayoutEditor:AutoArrange', u_("&Reset Focus Order by 
Position"), None, u_("Automatically set the focus order based on an items 
position"),201.3, 0)):
-            self.menubar.addAction(location, text, event,
-                            grouping, canDisable=1, canToggle=canToggle,
-                            icon=None, hotkey=hotkey, help=help)
-
-
-    # -------------------------------------------------------------------------
-    # Called by the base instance just before a save occurs, for cleanup
-    # -------------------------------------------------------------------------
-    def preSave(self):
-
-        # Get rid of form.name = '__main__'
-        try:
-            if self.rootObject.name == '__main__':
-                del self.rootObject.name
-        except AttributeError:
-            pass
-
-        # Do a little rearranging of objects
-
-        options = []
-        imports = []
-        databases = []
-        datasources = []
-        triggers = []
-        logic = []
-        layout = []
-        other = []
-
-        for child in self.rootObject._children:
-            if isinstance(child, GFObjects.GFOptions):
-                options.append(child)
-            elif isinstance(child, GFLibrary.GFImport):
-                imports.append(child)
-            elif isinstance(child, GDataSource.GConnection):
-                databases.append(child)
-            elif isinstance(child, GFObjects.GFDataSource) or \
-              (isinstance(child, GFLibrary.GFImportItem) and
-               child._type == 'GFimport-datasource'):
-                datasources.append(child)
-            elif isinstance(child, GTrigger.GTrigger) or \
-              (isinstance(child, GFLibrary.GFImportItem) and
-               child._type == 'GFimport-trigger'):
-                triggers.append(child)
-            elif isinstance(child, GFObjects.GFLayout) or \
-              (isinstance(child, GFLibrary.GFImportItem) and
-               child._type == 'GFimport-layout'):
-                layout.append(child)
-            elif isinstance(child, GFObjects.GFLogic) or \
-              (isinstance(child, GFLibrary.GFImportItem) and
-               child._type == 'GFimport-logic'):
-                logic.append(child)
-            else:
-                other.append(child)
-
-
-        # Do a little sanity check before saving...
-        if len(logic[0]._children):
-            valid = 1
-        else:
-            valid = 0  # No blocks! :(
-
-        if not valid:
-            if wx.MessageDialog(None,
-                u_('The form definition you are about to save\n' + \
-                'does not appear to be a workable definition.' + \
-                '\n\nIf you save an incomplete definition, you\n' + \
-                'may not be able to reopen it in Designer.\n\nSave anyway?'),
-                   u_("Incomplete Form Definition"), 
wx.YES_NO|wx.ICON_QUESTION ).ShowModal() == wx.ID_NO:
-                return 1
-
-        # Reorder the children so items of same class are grouped
-        self.rootObject._children = []
-        for child in options:
-            self.rootObject._children.append(child)
-        for child in imports:
-            self.rootObject._children.append(child)
-        for child in databases:
-            self.rootObject._children.append(child)
-        for child in datasources:
-            self.rootObject._children.append(child)
-        for child in triggers:
-            self.rootObject._children.append(child)
-        for child in logic:
-            self.rootObject._children.append(child)
-        for child in layout:
-            self.rootObject._children.append(child)
-        for child in other:
-            self.rootObject._children.append(child)
-
-    # -------------------------------------------------------------------------
-    # TemplateParser support
-    # -------------------------------------------------------------------------
-    # Used by TemplateParser to build a wizard.current dict
-    def buildWizardCurrentDict(self):
-        baseForm = self._currentObject.findParentOfType('GFForm')
-        return {'form': baseForm,
-                'logic': baseForm._logic,
-                'layout': baseForm._layout,
-                'page': self.visualEditor.page,
-                'block': self.visualEditor.block,
-                'object': self._currentObject}
-
-
-
-    # =========================================================================
-    # Public methods specific to a Forms document
-    # =========================================================================
-    def find_gflabel_for(self, name): 
-        labels = self.rootObject.findChildrenOfType('GFLabel', 
-                         allowAllChildren=True)
-                         
-        results = []
-        append = results.append
-        
-        for label in labels: 
-           if hasattr(label,'for') and label['for'] == name: 
-               append(label)
-        return results
-           
-    # =========================================================================
-    # Private methods
-    # =========================================================================
-
-    # -------------------------------------------------------------------------
-    # Object tracking
-    # -------------------------------------------------------------------------
-    def inventoryObject(self, object):
-        # TODO: wash me
-        if object._type == 'GFForm':
-            object._blockMap = {}
-        elif object._type == 'GFLogic':
-            object.getParent ()._logic = object
-        elif object._type == 'GFLayout':
-            object.getParent ()._layout = object
-            # Yes, you guessed it! More layout mgmt hackery...
-            object._xmlchildnamespaces = {'Char':'GNUe:Layout:Char'}
-        elif object._type == 'GFBlock':
-            if self.rootObject._blockMap.has_key(object.name):
-                raise "Warning: Multiple blocks with name %s" % 
o(str(object.name))
-            self.rootObject._blockMap[object.name] = object
-            object._fieldMap = {}
-        elif object._type == 'GFField':
-            object.findParentOfType('GFBlock')._fieldMap[object.name] = object
-        elif object._type == 'GFEntry':
-            object._block = self.rootObject._blockMap[object.block]
-            object._field = object._block._fieldMap[object.field]
-        elif isinstance(object, GFObjects.GFPage) and \
-            object.getParent () == self.rootObject:
-            self._pages.append(object)
-
-        object._popupMenu = ObjectMenu(self, object)
-
-
-    def __onModifyObject(self, event):
-
-        object = event.object
-
-        #
-        # Maintain all those fun dicts/lists created in inventoryObject()
-        #
-        old = event.old
-        if object._type == 'GFBlock':
-            try:
-                del self.rootObject._blockMap[old['name']]
-            except KeyError:
-                pass
-            self.rootObject._blockMap[object.name] = object
-
-        elif object._type == 'GFField':
-            block = object.findParentOfType('GFBlock')
-            try:
-                del block._fieldMap[old['name']]
-            except KeyError:
-                pass
-            block._fieldMap[object.name] = object
-
-
-    def __onDeleteObject(self, event):
-        object = event.object
-        if object._type == 'GFPage':
-            self._pages.remove(object)
-
-        # Maintain all those fun dicts/lists created in inventoryObject()
-        if object._type == 'GFBlock':
-            del self.rootObject._blockMap[object.name]
-        elif object._type == 'GFField':
-            del object.findParentOfType('GFBlock')._fieldMap[object.name]
-        elif isinstance(object, GFObjects.GFPage) and \
-            object.getParent () == self.rootObject:
-            del self._pages[object]
-
-        object._popupMenu = ObjectMenu(self, object)
-
-
-    # -------------------------------------------------------------------------
-    # Form Debugging support
-    # -------------------------------------------------------------------------
-    def __onSetDebugLevel(self, event):
-        """Opens a dialog to let the user set the debug level
-        before running a form inside Designer."""
-        tmpLevel = self.debugLevel
-        tmpRez = ''
-        tmpMessage = u_("Please enter debugging level - integer numbers 
[0..n]")
-        tmpCaption = u_("Choose debug level")
-        tmpRez = wx.GetTextFromUser(tmpMessage, tmpCaption, tmpLevel, None)
-        if (tmpRez != ''):
-            self.debugLevel = tmpRez
-
-
-    def __onRunForm (self, event):
-        #TODO: This does not work... But everyone tried this first...
-        #TODO: No, not just you. I mean EVERYONE!!!
-        GDebug.setDebug(str(self.debugLevel), "")
-        DebugSession(self)
-        #~ wx.MessageDialog(self,
-                    #~ u_('Running a form within GNUe Designer is\n' + \
-                    #~ 'not implemented yet.' + \
-                    #~ '\n\nPlease save the form and run it using\n' + \
-                    #~ 'the GNUe Forms tool (gnue-forms).'),
-                 #~ u_("NOT IMPLEMENTED"), wx.OK|wx.ICON_EXCLAMATION 
).ShowModal()

Modified: trunk/gnue-designer/src/forms/LayoutEditor/LayoutEditor.py
===================================================================
--- trunk/gnue-designer/src/forms/LayoutEditor/LayoutEditor.py  2006-04-07 
02:03:25 UTC (rev 8388)
+++ trunk/gnue-designer/src/forms/LayoutEditor/LayoutEditor.py  2006-04-07 
02:44:20 UTC (rev 8389)
@@ -115,10 +115,10 @@
 
         # EventAware provided by ToolBase
         self.registerEventListeners({
-                           'ObjectSelected'      : self.onSetCurrentObject,
-                           'ObjectCreated'       : self.onCreateObject,
-                           'ObjectModified'      : self.onModifyObject,
-                           'ObjectDeleted'       : self.onDeleteObject,
+                           'ObjectSelected'      : self.object_selected_event,
+                           'ObjectCreated'       : self.object_created_event,
+                           'ObjectModified'      : self.object_modified_event,
+                           'ObjectDeleted'       : self.object_deleted_event,
                            'LayoutEditor:ZoomIn' : self.zoomIn,
                            'LayoutEditor:ZoomOut': self.zoomOut,
                            'LayoutEditor:AutoArrange' : self.onAutoArrange,
@@ -173,7 +173,7 @@
             if not self.block:
                 self._setCurrentBlock(object)
 
-    def onSetCurrentObject (self, event):
+    def object_selected_event (self, event):
         object = event.object
         handler = event.originator
 
@@ -275,7 +275,7 @@
         self._currentSelection = objects[:]
 
 
-    def onCreateObject (self, event):
+    def object_created_event (self, event):
         object = event.object
         handler = event.originator
 ##    self._currentSelection = []
@@ -296,7 +296,7 @@
             self._rebuildBlockCombo()
 
 
-    def onModifyObject (self, event):
+    def object_modified_event (self, event):
         object = event.object
         handler = event.originator
 
@@ -312,7 +312,7 @@
                             # TODO: This should probably trigger a new 
ObjectModified event
                             event.new['Char:width'] = object.Char__width
 
-##    self.propBar.onModifyObject(object, event)
+##    self.propBar.object_modified_event(object, event)
 
             if object in (self.rootObject, self.page, self.rootObject._layout):
                 self.refreshPage(self.page)
@@ -327,7 +327,7 @@
         self._setFeedback()
 
 
-    def onDeleteObject (self, event):
+    def object_deleted_event (self, event):
 
         object = event.object
         handler = event.originator
@@ -682,8 +682,8 @@
             if event.ShiftDown():
                 object = self._currentObject
                 if hasattr(object,'_widgetHandler') and not object._type == 
'GFPage':
-                    i = object.getParent ()._children.index(object)
-                    lst = object.getParent ()._children[i:] + object.getParent 
()._children[:i]
+                    i = object.getParent()._children.index(object)
+                    lst = object.getParent()._children[i:] + 
object.getParent()._children[:i]
                 else:
                     lst = self.page._children[:]
                 lst.reverse()
@@ -696,8 +696,8 @@
             elif not event.ControlDown() and not event.AltDown():
                 object = self._currentObject
                 if hasattr(object,'_widgetHandler') and not object._type == 
'GFPage':
-                    i = object.getParent ()._children.index(object)
-                    lst = object.getParent ()._children[i+1:] + 
object.getParent ()._children[:i+1]
+                    i = object.getParent()._children.index(object)
+                    lst = object.getParent()._children[i+1:] + 
object.getParent()._children[:i+1]
                 else:
                     lst = self.page._children[:]
                 for newobj in lst:

Modified: trunk/gnue-designer/src/forms/LayoutEditor/PropertyBar.py
===================================================================
--- trunk/gnue-designer/src/forms/LayoutEditor/PropertyBar.py   2006-04-07 
02:03:25 UTC (rev 8388)
+++ trunk/gnue-designer/src/forms/LayoutEditor/PropertyBar.py   2006-04-07 
02:44:20 UTC (rev 8389)
@@ -92,7 +92,7 @@
 
     def OnNameUpdated(self, event):
         self.object.name = self.nameEditor.GetValue()
-#    self.parent._instance.onModifyObject(self.object, "Forms::LayoutEditor",
+#    self.parent._instance.object_modified_event(self.object, 
"Forms::LayoutEditor",
 
     def OnXUpdated(self, event):
         if hasattr(self.object, 'x'):
@@ -166,7 +166,7 @@
             self.nameEditor.SetValue(0)
             self.nameEditor.SetEditable(0)
 
-    def onModifyObject (self, event):
+    def object_modified_event (self, event):
         raise "I have not been fixed yet!"
         if object == None:
             return

Modified: trunk/gnue-designer/src/forms/LayoutEditor/Workspace.py
===================================================================
--- trunk/gnue-designer/src/forms/LayoutEditor/Workspace.py     2006-04-07 
02:03:25 UTC (rev 8388)
+++ trunk/gnue-designer/src/forms/LayoutEditor/Workspace.py     2006-04-07 
02:44:20 UTC (rev 8389)
@@ -107,10 +107,10 @@
 
         # EventAware provided by ToolBase
 ##    self.registerEventListeners({
-##                       'ObjectSelected'      : self.onSetCurrentObject,
-##                       'ObjectCreated'       : self.onCreateObject,
-##                       'ObjectModified'      : self.onModifyObject,
-##                       'ObjectDeleted'       : self.onDeleteObject,
+##                       'ObjectSelected'      : self.object_selected_event,
+##                       'ObjectCreated'       : self.object_created_event,
+##                       'ObjectModified'      : self.object_modified_event,
+##                       'ObjectDeleted'       : self.object_deleted_event,
 ##                       'LayoutEditor:ZoomIn' : self.zoomIn,
 ##                       'LayoutEditor:ZoomOut': self.zoomOut,
 ##                       'LayoutEditor:FocusOrder': self.beginFocusOrder,
@@ -238,7 +238,7 @@
         self._currentSelection = objects[:]
 
 
-    def onCreateObject (self, event):
+    def object_created_event (self, event):
         object = event.object
         handler = event.originator
 ##    self._currentSelection = []
@@ -261,7 +261,7 @@
             self._rebuildBlockCombo()
 
 
-    def onModifyObject (self, event):
+    def object_modified_event (self, event):
         object = event.object
         handler = event.originator
 
@@ -277,7 +277,7 @@
                             # TODO: This should probably trigger a new 
ObjectModified event
                             event.new['Char:width'] = object.Char__width
 
-##    self.propBar.onModifyObject(object, event)
+##    self.propBar.object_modified_event(object, event)
 
         if handler != "Forms::LayoutEditor":
             if object._type == 'GFPage':
@@ -299,7 +299,7 @@
         self._setFeedback()
 
 
-    def onDeleteObject (self, event):
+    def object_deleted_event (self, event):
 
         object = event.object
         handler = event.originator
@@ -596,8 +596,8 @@
             if event.ShiftDown():
                 object = self._currentObject
                 if hasattr(object,'_widgetHandler') and not object._type == 
'GFPage':
-                    i = object.getParent ()._children.index(object)
-                    lst = object.getParent ()._children[i:] + object.getParent 
()._children[:i]
+                    i = object.getParent()._children.index(object)
+                    lst = object.getParent()._children[i:] + 
object.getParent()._children[:i]
                 else:
                     lst = self.page._children[:]
                 lst.reverse()
@@ -610,8 +610,8 @@
             elif not event.ControlDown() and not event.AltDown():
                 object = self._currentObject
                 if hasattr(object,'_widgetHandler') and not object._type == 
'GFPage':
-                    i = object.getParent ()._children.index(object)
-                    lst = object.getParent ()._children[i+1:] + 
object.getParent ()._children[:i+1]
+                    i = object.getParent()._children.index(object)
+                    lst = object.getParent()._children[i+1:] + 
object.getParent()._children[:i+1]
                 else:
                     lst = self.page._children[:]
                 for newobj in lst:

Modified: trunk/gnue-designer/src/forms/PagePainter/skins/default.py
===================================================================
--- trunk/gnue-designer/src/forms/PagePainter/skins/default.py  2006-04-07 
02:03:25 UTC (rev 8388)
+++ trunk/gnue-designer/src/forms/PagePainter/skins/default.py  2006-04-07 
02:44:20 UTC (rev 8389)
@@ -115,14 +115,17 @@
         object = self.gobject
         x, y, width, height = self.draw_area.Get()
 
+        #target_dc.SetLogicalFunction(wx.AND)
         target_dc.SetPen(wx.Pen(color_map['widgetdark']))
         target_dc.SetBrush(wx.Brush(color_map['widgetdark'], style=wx.SOLID))
         target_dc.DrawRectangle(x+2, y+2, width, height)
 
+        #target_dc.SetLogicalFunction(wx.XOR)
         target_dc.SetPen(wx.Pen(color_map['widget']))
         target_dc.SetBrush(wx.Brush(color_map['panel'], style=wx.SOLID))
         target_dc.DrawRectangle(x, y, width, height)
 
+        #target_dc.SetLogicalFunction(wx.COPY)
 
     def move_from_canvas(self, delta_x, delta_y):
         """

Modified: trunk/gnue-designer/src/forms/PropertyEditor.py
===================================================================
--- trunk/gnue-designer/src/forms/PropertyEditor.py     2006-04-07 02:03:25 UTC 
(rev 8388)
+++ trunk/gnue-designer/src/forms/PropertyEditor.py     2006-04-07 02:44:20 UTC 
(rev 8389)
@@ -33,7 +33,7 @@
 from gnue.designer.base.ToolBase import *
 
 class PropertyEditor (BasePropertyEditor):
-    def reset(self):
+    def resetXXX(self):
         BasePropertyEditor.reset(self)
 
         #

Modified: trunk/gnue-designer/src/forms/TreeView.py
===================================================================
--- trunk/gnue-designer/src/forms/TreeView.py   2006-04-07 02:03:25 UTC (rev 
8388)
+++ trunk/gnue-designer/src/forms/TreeView.py   2006-04-07 02:44:20 UTC (rev 
8389)
@@ -82,34 +82,34 @@
         if object != self.rootObject:
             icon = 'properties'
             if isinstance(object, GFObjects.GFOptions) and \
-               object.getParent () == self.rootObject:
+               object.getParent() == self.rootObject:
                 object._treeItem = self.rootObject._treeItemFormProperties
                 icon = 'properties'
             elif object._type in ('GFLogic','GFLayout') and \
-                 object.getParent () == self.rootObject:
+                 object.getParent() == self.rootObject:
                 pass
             else:
-                parentTreeItem = object.getParent ()._treeItem
+                parentTreeItem = object.getParent()._treeItem
                 if isinstance(object, GTrigger.GTrigger) and \
                    object.type == 'NAMED':
                     parentTreeItem = self.rootObject._treeItemNamedTriggers
                     icon = 'trigger'
                 elif isinstance(object, GTrigger.GTrigger):
 
-                    if not hasattr(object.getParent (),'_treeItemTrigger'):
-                        object.getParent ()._treeItemTrigger = \
-                          self.AppendItem(object.getParent ()._treeItem, 
u_("Events"))
+                    if not hasattr(object.getParent(),'_treeItemTrigger'):
+                        object.getParent()._treeItemTrigger = \
+                          self.AppendItem(object.getParent()._treeItem, 
u_("Events"))
                         
#self.tree.SetItemImage(object._parent._treeItemTrigger, treeIconMap['trigger'])
 
 
-                    parentTreeItem = object.getParent ()._treeItemTrigger
+                    parentTreeItem = object.getParent()._treeItemTrigger
                     icon = 'trigger'
                 elif isinstance(object, GFObjects.GFDataSource) or \
                    isinstance(object, GDataSource.GConnection):
                     parentTreeItem = self.rootObject._treeItemDataSources
                     icon = 'datasource'
                 elif isinstance(object, GFObjects.GFPage) and \
-                     object.getParent () == self.rootObject:
+                     object.getParent() == self.rootObject:
                     icon = 'page'
                 elif object._type in ('GFBlock',):
                     icon = 'block'

Modified: trunk/gnue-designer/src/forms/__init__.py
===================================================================
--- trunk/gnue-designer/src/forms/__init__.py   2006-04-07 02:03:25 UTC (rev 
8388)
+++ trunk/gnue-designer/src/forms/__init__.py   2006-04-07 02:44:20 UTC (rev 
8389)
@@ -20,24 +20,34 @@
 # - Suite 330, Boston, MA 02111-1307, USA.
 #
 # $Id$
+
 """
 Various constants for the forms interface
 """
 
+from gnue.designer import register_document_type
+
+name = 'form'
+title = u_('GNUe Forms')
+
 # See if forms is installed
-import gnue.forms as _test
+try: 
+    from document import FormDocument
+except ImportError: 
+    FormDocument = None
+    raise
 
-class FormModuleProperties: #(_BaseInstance.ModuleProperties):
+print "Registering %s" % FormDocument
+properties = register_document_type(
+    instance=FormDocument,
+    name=name,
+    title=title,
+    nickname=u_('Form'),
+    description=u_('GNUe Form Definition'),
+    xmlOpeningTag='form',
 
-    module = 'forms'
-    application = 'GNUe Forms'
-    nickname = 'Form'
-    description = 'GNUe Form Definition'
-    xmlOpeningTag = 'form'
+    fileExtensions = { 'gfd': u_('GNUe Form Definition'),
+                       'gfl': u_('GNUe Form Library') },
 
-    fileExtensions = { 'gfd': 'GNUe Form Definition',
-                       'gfl': 'GNUe Form Library' }
+    defaultFileExtension = 'gfd')
 
-    defaultFileExtension = 'gfd'
-
-properties = FormModuleProperties()

Copied: trunk/gnue-designer/src/forms/document.py (from rev 8383, 
trunk/gnue-designer/src/forms/Document.py)
===================================================================
--- trunk/gnue-designer/src/forms/Document.py   2006-04-06 01:08:13 UTC (rev 
8383)
+++ trunk/gnue-designer/src/forms/document.py   2006-04-07 02:44:20 UTC (rev 
8389)
@@ -0,0 +1,428 @@
+# GNU Enterprise Designer - Forms Support
+#
+# Copyright 2001-2006 Free Software Foundation
+#
+# This file is part of GNU Enterprise.
+#
+# GNU Enterprise is free software; you can redistribute it
+# and/or modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2, or (at your option) any later version.
+#
+# GNU Enterprise is distributed in the hope that it will be
+# useful, but WITHOUT ANY WARRANTY; without even the implied
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+# PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with program; see the file COPYING. If not,
+# write to the Free Software Foundation, Inc., 59 Temple Place
+# - Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+"""
+"""
+
+__all__ = ['FormDocument']
+
+# ---------------------------------------------------------------------------
+# System imports
+# ---------------------------------------------------------------------------
+
+# ---------------------------------------------------------------------------
+# External imports
+# ---------------------------------------------------------------------------
+import wx
+
+# ---------------------------------------------------------------------------
+# GNUe Imports
+# ---------------------------------------------------------------------------
+from gnue.designer.base.Document import BaseDocument
+from gnue.designer.base import PopupMenu
+from gnue.designer.base.ObjectList import ObjectList
+from gnue.designer.base.PopupMenu import ObjectMenu
+
+from gnue.forms import GFInstance
+from gnue.forms import GFForm, GFParser, GFObjects, GFLibrary
+from gnue.forms.GFObjects.GFBlock import GFBlock
+
+from gnue.common.logic import GTrigger
+from gnue.common.apps import GDebug
+from gnue.common.datasources import GDataSource
+
+from Debugger import DebugSession
+from Incubator import Incubator
+from events.Events import registerEvents
+import wizards
+from WizardRunner import WizardRunner
+
+# Tool support...
+from PagePainter import PagePainter
+from LayoutEditor import LayoutEditor
+from TreeView import TreeView
+from PropertyEditor import PropertyEditor
+from EventEditor import EventEditor
+from BlockEditor import BlockEditor
+from gnue.designer.base.tools.DataSourceEditor import DataSourceEditor
+##from gnue.designer.base.tools.SchemaViewer import SchemaViewer
+from gnue.designer.base.tools.SchemaNavigator import SchemaNavigator
+
+
+
+#============================================================================
+# Document Instance class
+#============================================================================
+class FormDocument(BaseDocument):
+    """
+    Designer's form editor document.
+    """
+
+    # =========================================================================
+    # Public methods
+    # =========================================================================
+
+    def init(self):
+        app = self.app
+        self.incubator = Incubator(self) # Incubator
+        self.wizardRunner = WizardRunner #
+        self.debugLevel = '1'            # The debug level used when running a 
form
+                                         # inside designer
+
+        # Create a GFInstance instance
+        self.gfinstance = GFInstance.GFInstance(app,
+                                       app.connections,
+                                       None, disableSplash=1)
+
+        # For GFInstance support, iirc
+        ##self._pages = []
+
+        # Build a list of positionable widgets
+        self._positionableList = []
+        elements = self.incubator.elements
+        for tag in elements.keys():
+            try:
+                if elements['Positionable']:
+                    self._positionableList.append(tag)
+            except KeyError:
+                pass
+
+        self.registerEventListeners({
+                           'ObjectModified' : self.__object_modified_event,
+                           'ObjectDeleted' :  self.__object_deleted_event,
+                           'Forms:RunForm': self.__onRunForm,
+                           'Forms:RequestDebugLevel': self.__onSetDebugLevel
+                          })
+
+        # Add our events/* stuff
+        registerEvents(self)
+
+    def finalize(self):
+        # Convenience list to keep track of datasources and blocks
+        # TODO: Anything that needs either of these two
+        # TODO: should call getObjectList directly.
+        # TODO: Left for historical reasons.
+        self.datasources = self.getObjectList('datasource')
+        self.blocks = self.getObjectList('block')
+
+
+
+    # -------------------------------------------------------------------------
+    # Load a form
+    # -------------------------------------------------------------------------
+    def loadBuffer(self, buffer):
+        form = GFParser.loadFile (buffer, self.gfinstance, initialize=0)
+        return form
+
+
+    def loadEmpty(self, style=None):
+        form = GFForm.GFForm()
+        options = GFObjects.GFOptions(form)
+        form.title = u_("Untitled Form")
+        form.height = 12
+        GFObjects.GFLogic(form)
+        layout = GFObjects.GFLayout(form)
+        layout.Char__width = 40
+        layout.Char__height = 12
+        GFObjects.GFPage(layout)
+        return form
+
+    # -------------------------------------------------------------------------
+    # Create the document tools/editors
+    # -------------------------------------------------------------------------
+    def createEditors(self):
+        # Associate our LayoutEditor with GFPage objects
+
+        self.registerEditor(LayoutEditor, 'GFPage')
+        self.registerEditor(PagePainter, 'GFPage')
+
+
+    def createTools(self):
+        self.addTool('propertyEditor', u_('Property Inspector'), 
PropertyEditor,
+                          hotkey='F10', menuGroup=301)
+        self.addTool('treeEditor',     u_('Object Navigator'), TreeView,
+                          hotkey='F8', menuGroup=311)
+
+        self.addTool('schemaNavigator',u_('Schema Navigator'), SchemaNavigator,
+                          menuGroup=301)
+        #self.addTool('datasourceEditor',u_('Data Source Editor'), 
DataSourceEditor,
+        #                  hotkey='F9', menuGroup=311)
+        #self.addTool('blockEditor',   u_('Block Editor'), BlockEditor,
+        #                  hotkey='F5', menuGroup=311)
+        #self.addTool('fieldEditor',   u_('Field Editor'), FieldEditor,
+        #                  hotkey='F6', menuGroup=201)
+        self.addTool('eventEditor',    u_('Trigger Mappings'), EventEditor,
+                          hotkey='F7', menuGroup=321)
+
+    def createWizards(self):
+        self.loadWizards(wizards)
+
+    # Instances can add to the primary toolbar
+    def initToolBar(self):
+        self.toolbar.addToolbarMapping(';Forms:RunForm,tb_exec;')
+
+
+    def initMenu(self):
+        # Add the [sub]menus
+        for location, text, grouping in (
+           ('Modify|Arrange Items',u_('&Arrange Items'), 501),):
+
+            self.menubar.addMenu(location, text, grouping)
+
+        for location, event, text, hotkey, help, grouping, canToggle in (
+           ('View', 'LayoutEditor:ZoomIn', u_("Zoom In"), None, u_("Zoom in"), 
11.1, 0),
+           ('View', 'LayoutEditor:ZoomOut', u_("Zoom Out"), None, u_("Zoom 
out"), 11.2, 0),
+           ('View', 'LayoutEditor:ShowFocus', u_("Show Focus Order"), None, 
u_("Show the navigation order on the layout editor"), 21, 1),
+
+           ('Tools','Forms:RunForm', u_("Run Form"), None, u_("Display and run 
the current form"), 101.1, 0),
+           ('Tools','Forms:RequestDebugLevel', u_("Change debugging 
level..."), None, u_("Change the debugging output level for the Run Form 
option"), 101.2, 0),
+
+           ('Modify|Align Items','Forms:AlignLeft', u_("&Align Left Edges"), 
None, u_("Horizontally align the currently selected items along their left 
edges"),101.1, 0),
+           ('Modify|Align Items','Forms:AlignRight', u_("&Align Right Edges"), 
None, u_("Horizontally align the currently selected items along their right 
edges"),101.2, 0),
+           ('Modify|Align Items','Forms:AlignHCenter', u_("&Align Horizontal 
Center"), None, u_("Horizontally align the currently selected items along their 
centers"),101.2, 0),
+           ('Modify|Align Items','Forms:AlignTop', u_("&Align Top Edges"), 
None, u_("Vertically align the currently selected items along their top 
edges"),111.1, 0),
+           ('Modify|Align Items','Forms:AlignBottom', u_("&Align Bottom 
Edges"), None, u_("Vertically align the currently selected items along their 
bottom edges"),111.2, 0),
+           ('Modify|Align Items','Forms:AlignVCenter', u_("&Align Vertical 
Center"), None, u_("Vertically align the currently selected items along their 
centers"),111.3, 0),
+           ('Modify|Align Items','Forms:SmartAlign', u_("&Smart Align 
Labels/Fields"), None, u_("Align Labels and fields into a block formation, with 
all fields left aligned and all labels left aligned."),121.1, 0),
+
+           ('Modify','LayoutEditor:FocusOrder', u_("&Set Focus Order 
Manually"), None, u_("Set the focus order by hand"),201.2, 0),
+           ('Modify','LayoutEditor:AutoArrange', u_("&Reset Focus Order by 
Position"), None, u_("Automatically set the focus order based on an items 
position"),201.3, 0)):
+            self.menubar.addAction(location, text, event,
+                            grouping, canDisable=1, canToggle=canToggle,
+                            icon=None, hotkey=hotkey, help=help)
+
+
+    # -------------------------------------------------------------------------
+    # Called by the base instance just before a save occurs, for cleanup
+    # -------------------------------------------------------------------------
+    def preSave(self):
+
+        # Get rid of form.name = '__main__'
+        try:
+            if self.rootObject.name == '__main__':
+                del self.rootObject.name
+        except AttributeError:
+            pass
+
+        # Do a little rearranging of objects
+
+        options = []
+        imports = []
+        databases = []
+        datasources = []
+        triggers = []
+        logic = []
+        layout = []
+        other = []
+
+        for child in self.rootObject._children:
+            if isinstance(child, GFObjects.GFOptions):
+                options.append(child)
+            elif isinstance(child, GFLibrary.GFImport):
+                imports.append(child)
+            elif isinstance(child, GDataSource.GConnection):
+                databases.append(child)
+            elif isinstance(child, GFObjects.GFDataSource) or \
+              (isinstance(child, GFLibrary.GFImportItem) and
+               child._type == 'GFimport-datasource'):
+                datasources.append(child)
+            elif isinstance(child, GTrigger.GTrigger) or \
+              (isinstance(child, GFLibrary.GFImportItem) and
+               child._type == 'GFimport-trigger'):
+                triggers.append(child)
+            elif isinstance(child, GFObjects.GFLayout) or \
+              (isinstance(child, GFLibrary.GFImportItem) and
+               child._type == 'GFimport-layout'):
+                layout.append(child)
+            elif isinstance(child, GFObjects.GFLogic) or \
+              (isinstance(child, GFLibrary.GFImportItem) and
+               child._type == 'GFimport-logic'):
+                logic.append(child)
+            else:
+                other.append(child)
+
+
+        # Do a little sanity check before saving...
+        if len(logic[0]._children):
+            valid = 1
+        else:
+            valid = 0  # No blocks! :(
+
+        if not valid:
+            if wx.MessageDialog(None,
+                u_('The form definition you are about to save\n' + \
+                'does not appear to be a workable definition.' + \
+                '\n\nIf you save an incomplete definition, you\n' + \
+                'may not be able to reopen it in Designer.\n\nSave anyway?'),
+                   u_("Incomplete Form Definition"), 
wx.YES_NO|wx.ICON_QUESTION ).ShowModal() == wx.ID_NO:
+                return 1
+
+        # Reorder the children so items of same class are grouped
+        self.rootObject._children = []
+        for child in options:
+            self.rootObject._children.append(child)
+        for child in imports:
+            self.rootObject._children.append(child)
+        for child in databases:
+            self.rootObject._children.append(child)
+        for child in datasources:
+            self.rootObject._children.append(child)
+        for child in triggers:
+            self.rootObject._children.append(child)
+        for child in logic:
+            self.rootObject._children.append(child)
+        for child in layout:
+            self.rootObject._children.append(child)
+        for child in other:
+            self.rootObject._children.append(child)
+
+    # -------------------------------------------------------------------------
+    # TemplateParser support
+    # -------------------------------------------------------------------------
+    # Used by TemplateParser to build a wizard.current dict
+    def buildWizardCurrentDict(self):
+        baseForm = self._currentObject.findParentOfType('GFForm')
+        return {'form': baseForm,
+                'logic': baseForm._logic,
+                'layout': baseForm._layout,
+                'page': self.visualEditor.page,
+                'block': self.visualEditor.block,
+                'object': self._currentObject}
+
+
+
+    # =========================================================================
+    # Public methods specific to a Forms document
+    # =========================================================================
+    def find_gflabel_for(self, name): 
+        labels = self.rootObject.findChildrenOfType('GFLabel', 
+                         allowAllChildren=True)
+                         
+        results = []
+        append = results.append
+        
+        for label in labels: 
+           if hasattr(label,'for') and label['for'] == name: 
+               append(label)
+        return results
+           
+    # =========================================================================
+    # Private methods
+    # =========================================================================
+
+    # -------------------------------------------------------------------------
+    # Object tracking
+    # -------------------------------------------------------------------------
+    def inventoryObject(self, object):
+        # TODO: wash me
+        if object._type == 'GFForm':
+            object._blockMap = {}
+        elif object._type == 'GFLogic':
+            object.getParent()._logic = object
+        elif object._type == 'GFLayout':
+            object.getParent()._layout = object
+            # Yes, you guessed it! More layout mgmt hackery...
+            object._xmlchildnamespaces = {'Char':'GNUe:Layout:Char'}
+        elif object._type == 'GFBlock':
+            if self.rootObject._blockMap.has_key(object.name):
+                raise "Warning: Multiple blocks with name %s" % 
o(str(object.name))
+            self.rootObject._blockMap[object.name] = object
+            object._fieldMap = {}
+        elif object._type == 'GFField':
+            object.findParentOfType('GFBlock')._fieldMap[object.name] = object
+        elif object._type == 'GFEntry':
+            object._block = self.rootObject._blockMap[object.block]
+            object._field = object._block._fieldMap[object.field]
+        elif isinstance(object, GFObjects.GFPage) and \
+            object.getParent() == self.rootObject:
+            self._pages.append(object)
+
+        object._popupMenu = ObjectMenu(self, object)
+
+
+    def __object_modified_event(self, event):
+
+        object = event.object
+
+        #
+        # Maintain all those fun dicts/lists created in inventoryObject()
+        #
+        old = event.old
+        if object._type == 'GFBlock':
+            try:
+                del self.rootObject._blockMap[old['name']]
+            except KeyError:
+                pass
+            self.rootObject._blockMap[object.name] = object
+
+        elif object._type == 'GFField':
+            block = object.findParentOfType('GFBlock')
+            try:
+                del block._fieldMap[old['name']]
+            except KeyError:
+                pass
+            block._fieldMap[object.name] = object
+
+
+    def __object_deleted_event(self, event):
+        object = event.object
+        if object._type == 'GFPage':
+            self._pages.remove(object)
+
+        # Maintain all those fun dicts/lists created in inventoryObject()
+        if object._type == 'GFBlock':
+            del self.rootObject._blockMap[object.name]
+        elif object._type == 'GFField':
+            del object.findParentOfType('GFBlock')._fieldMap[object.name]
+        elif isinstance(object, GFObjects.GFPage) and \
+            object.getParent() == self.rootObject:
+            del self._pages[object]
+
+        object._popupMenu = ObjectMenu(self, object)
+
+
+    # -------------------------------------------------------------------------
+    # Form Debugging support
+    # -------------------------------------------------------------------------
+    def __onSetDebugLevel(self, event):
+        """Opens a dialog to let the user set the debug level
+        before running a form inside Designer."""
+        tmpLevel = self.debugLevel
+        tmpRez = ''
+        tmpMessage = u_("Please enter debugging level - integer numbers 
[0..n]")
+        tmpCaption = u_("Choose debug level")
+        tmpRez = wx.GetTextFromUser(tmpMessage, tmpCaption, tmpLevel, None)
+        if (tmpRez != ''):
+            self.debugLevel = tmpRez
+
+
+    def __onRunForm (self, event):
+        #TODO: This does not work... But everyone tried this first...
+        #TODO: No, not just you. I mean EVERYONE!!!
+        GDebug.setDebug(str(self.debugLevel), "")
+        DebugSession(self)
+        #~ wx.MessageDialog(self,
+                    #~ u_('Running a form within GNUe Designer is\n' + \
+                    #~ 'not implemented yet.' + \
+                    #~ '\n\nPlease save the form and run it using\n' + \
+                    #~ 'the GNUe Forms tool (gnue-forms).'),
+                 #~ u_("NOT IMPLEMENTED"), wx.OK|wx.ICON_EXCLAMATION 
).ShowModal()

Modified: trunk/gnue-designer/src/navigator/LayoutEditor.py
===================================================================
--- trunk/gnue-designer/src/navigator/LayoutEditor.py   2006-04-07 02:03:25 UTC 
(rev 8388)
+++ trunk/gnue-designer/src/navigator/LayoutEditor.py   2006-04-07 02:44:20 UTC 
(rev 8389)
@@ -52,16 +52,16 @@
 
         # EventAware provided by ToolBase
         self.registerEventListeners({
-                           'ObjectSelected'      : self.onSetCurrentObject,
-                           'ObjectCreated'       : self.onCreateObject,
-                           'ObjectModified'      : self.onModifyObject,
-                           'ObjectDeleted'       : self.onDeleteObject,
+                           'ObjectSelected'      : self.object_selected_event,
+                           'ObjectCreated'       : self.object_created_event,
+                           'ObjectModified'      : self.object_modified_event,
+                           'ObjectDeleted'       : self.object_deleted_event,
                           })
 
     def inventoryObject(self, object):
         self.tree.inventoryObject(object)
 
-    def onSetCurrentObject (self, event):
+    def object_selected_event (self, event):
         object = event.object
         handler = event.originator
         if object == None:
@@ -70,7 +70,7 @@
             pass
 
 
-    def onCreateObject (self, event):
+    def object_created_event (self, event):
         object = event.object
         handler = event.originator
         if object == None:
@@ -79,7 +79,7 @@
             pass
 
 
-    def onModifyObject (self, event):
+    def object_modified_event (self, event):
         object = event.object
         handler = event.originator
         modifications = event.modifications
@@ -89,7 +89,7 @@
             pass
 
 
-    def onDeleteObject (self, event):
+    def object_deleted_event (self, event):
         object = event.object
         handler = event.originator
         if object == None:
@@ -158,11 +158,11 @@
     def inventoryObject(self, object):
         if object._type == 'GNParameter':
             return
-        if object.getParent () != None:
+        if object.getParent() != None:
 
             description = self.getName(object, 1)
 
-            object._treeItem = self.AppendItem(object.getParent ()._treeItem, 
description)
+            object._treeItem = self.AppendItem(object.getParent()._treeItem, 
description)
             self.SetPyData(object._treeItem, object)
             if object._type == 'GNProcess':
                 self.SetItemBold(object._treeItem,1)
@@ -190,7 +190,7 @@
         object = self.GetPyData(event.GetItem())
         object.description = event.GetLabel()
         # TODO: Change to new struct
-##    self.editor.instance.onModifyObject(self, object, __name__)
+##    self.editor.instance.object_modified_event(self, object, __name__)
         self.SetItemText(object._treeItem, self.getName(object,1))
         event.Veto()
 

Modified: trunk/gnue-designer/src/reports/Char/FilterSupport.py
===================================================================
--- trunk/gnue-designer/src/reports/Char/FilterSupport.py       2006-04-07 
02:03:25 UTC (rev 8388)
+++ trunk/gnue-designer/src/reports/Char/FilterSupport.py       2006-04-07 
02:44:20 UTC (rev 8389)
@@ -35,9 +35,9 @@
     def init(self):
         # EventAware provided by ToolBase
         self.document.registerEventListeners({
-                           'ObjectCreated'       : self.onCreateObject,
-                           'ObjectModified'      : self.onModifyObject,
-                           'ObjectDeleted'       : self.onDeleteObject,
+                           'ObjectCreated'       : self.object_created_event,
+                           'ObjectModified'      : self.object_modified_event,
+                           'ObjectDeleted'       : self.object_deleted_event,
                           })
 
 
@@ -46,13 +46,13 @@
                           hotkey='F11', menuGroup=301)
 
 
-    def onCreateObject(self, event):
+    def object_created_event(self, event):
         pass
 
 
-    def onModifyObject(self, event):
+    def object_modified_event(self, event):
         pass
 
 
-    def onDeleteObject(self, event):
+    def object_deleted_event(self, event):
         pass

Modified: trunk/gnue-designer/src/reports/Char/LayoutEditor.py
===================================================================
--- trunk/gnue-designer/src/reports/Char/LayoutEditor.py        2006-04-07 
02:03:25 UTC (rev 8388)
+++ trunk/gnue-designer/src/reports/Char/LayoutEditor.py        2006-04-07 
02:44:20 UTC (rev 8389)
@@ -47,10 +47,10 @@
 
         # EventAware provided by ToolBase
         self.registerEventListeners({
-                           'ObjectSelected'      : self.onSetCurrentObject,
-                           'ObjectCreated'       : self.onCreateObject,
-                           'ObjectModified'      : self.onModifyObject,
-                           'ObjectDeleted'       : self.onDeleteObject,
+                           'ObjectSelected'      : self.object_selected_event,
+                           'ObjectCreated'       : self.object_created_event,
+                           'ObjectModified'      : self.object_modified_event,
+                           'ObjectDeleted'       : self.object_deleted_event,
                           })
 
         wx.EVT_SIZE(self, self.onSize)
@@ -59,20 +59,20 @@
     def inventoryObject(self, object):
         pass
 
-    def onSetCurrentObject (self, event):
+    def object_selected_event (self, event):
         object = event.object
         handler = event.originator
 
-    def onCreateObject (self, event):
+    def object_created_event (self, event):
         object = event.object
         handler = event.originator
 
-    def onModifyObject (self, event):
+    def object_modified_event (self, event):
         object = event.object
         handler = event.originator
 #    modifications = event.modifications
 
-    def onDeleteObject (self, event):
+    def object_deleted_event (self, event):
         object = event.object
         handler = event.originator
 

Modified: trunk/gnue-designer/src/reports/Standard/FilterSupport.py
===================================================================
--- trunk/gnue-designer/src/reports/Standard/FilterSupport.py   2006-04-07 
02:03:25 UTC (rev 8388)
+++ trunk/gnue-designer/src/reports/Standard/FilterSupport.py   2006-04-07 
02:44:20 UTC (rev 8389)
@@ -36,9 +36,9 @@
     def init(self):
         # EventAware provided by ToolBase
         self.document.registerEventListeners({
-                           'ObjectCreated'       : self.onCreateObject,
-                           'ObjectModified'      : self.onModifyObject,
-                           'ObjectDeleted'       : self.onDeleteObject,
+                           'ObjectCreated'       : self.object_created_event,
+                           'ObjectModified'      : self.object_modified_event,
+                           'ObjectDeleted'       : self.object_deleted_event,
                           })
 
 
@@ -54,13 +54,13 @@
 
 
 
-    def onCreateObject(self, event):
+    def object_created_event(self, event):
         pass
 
 
-    def onModifyObject(self, event):
+    def object_modified_event(self, event):
         pass
 
 
-    def onDeleteObject(self, event):
+    def object_deleted_event(self, event):
         pass

Modified: trunk/gnue-designer/src/reports/Standard/GroupEditor.py
===================================================================
--- trunk/gnue-designer/src/reports/Standard/GroupEditor.py     2006-04-07 
02:03:25 UTC (rev 8388)
+++ trunk/gnue-designer/src/reports/Standard/GroupEditor.py     2006-04-07 
02:44:20 UTC (rev 8389)
@@ -74,17 +74,17 @@
 
         # EventAware provided by ToolBase
         self.registerEventListeners({
-                           'ObjectSelected'      : self.onSetCurrentObject,
-                           'ObjectCreated'       : self.onCreateObject,
-                           'ObjectModified'      : self.onModifyObject,
-                           'ObjectDeleted'       : self.onDeleteObject,
+                           'ObjectSelected'      : self.object_selected_event,
+                           'ObjectCreated'       : self.object_created_event,
+                           'ObjectModified'      : self.object_modified_event,
+                           'ObjectDeleted'       : self.object_deleted_event,
                           })
 
         self.rootObject.walk(self.inventoryObject)
 
         self.saveRuntimeSettings()
 
-    def onSetCurrentObject (self, event):
+    def object_selected_event (self, event):
         object = event.object
         handler = event.originator
         table = object.findParentOfType('GSTable')
@@ -132,11 +132,11 @@
             pass
 
 
-    def onCreateObject (self, event):
+    def object_created_event (self, event):
         self.inventoryObject(event.object)
 
 
-    def onModifyObject (self, event):
+    def object_modified_event (self, event):
         object = event.object
         handler = event.originator
         if object == None:
@@ -155,7 +155,7 @@
 ##      self._setCurrent(object)
 
 
-    def onDeleteObject (self, event):
+    def object_deleted_event (self, event):
         object = event.object
         handler = event.originator
         if object == None:
@@ -189,7 +189,7 @@
 
 
     def _generateName(self, object):
-        parent = object.getParent ()
+        parent = object.getParent()
         name = '%s.%s (%s-Level Trigger)' % (parent.name, 
parent._validTriggers[object.type.upper()], parent._type[2:].capitalize())
         return name
 

Modified: trunk/gnue-designer/src/reports/Standard/LayoutEditor.py
===================================================================
--- trunk/gnue-designer/src/reports/Standard/LayoutEditor.py    2006-04-07 
02:03:25 UTC (rev 8388)
+++ trunk/gnue-designer/src/reports/Standard/LayoutEditor.py    2006-04-07 
02:44:20 UTC (rev 8389)
@@ -47,10 +47,10 @@
 
         # EventAware provided by ToolBase
         self.registerEventListeners({
-                           'ObjectSelected'      : self.onSetCurrentObject,
-                           'ObjectCreated'       : self.onCreateObject,
-                           'ObjectModified'      : self.onModifyObject,
-                           'ObjectDeleted'       : self.onDeleteObject,
+                           'ObjectSelected'      : self.object_selected_event,
+                           'ObjectCreated'       : self.object_created_event,
+                           'ObjectModified'      : self.object_modified_event,
+                           'ObjectDeleted'       : self.object_deleted_event,
                           })
 
         wx.EVT_SIZE(self, self.onSize)
@@ -59,20 +59,20 @@
     def inventoryObject(self, object):
         pass
 
-    def onSetCurrentObject (self, event):
+    def object_selected_event (self, event):
         object = event.object
         handler = event.originator
 
-    def onCreateObject (self, event):
+    def object_created_event (self, event):
         object = event.object
         handler = event.originator
 
-    def onModifyObject (self, event):
+    def object_modified_event (self, event):
         object = event.object
         handler = event.originator
         modifications = event.modifications
 
-    def onDeleteObject (self, event):
+    def object_deleted_event (self, event):
         object = event.object
         handler = event.originator
 

Modified: trunk/gnue-designer/src/reports/TreeView.py
===================================================================
--- trunk/gnue-designer/src/reports/TreeView.py 2006-04-07 02:03:25 UTC (rev 
8388)
+++ trunk/gnue-designer/src/reports/TreeView.py 2006-04-07 02:44:20 UTC (rev 
8389)
@@ -41,7 +41,7 @@
     def inventoryObject (self, object):
         if object != self.rootObject:
             icon = 'properties'
-            parentTreeItem = object.getParent ()._treeItem
+            parentTreeItem = object.getParent()._treeItem
             if isinstance(object, GRParameters.GRParameters):
                 icon = 'properties'
             elif isinstance(object, GRSortOptions.GRSortOptions):

Modified: trunk/gnue-designer/src/schema/DiaEditor/VisualEditor.py
===================================================================
--- trunk/gnue-designer/src/schema/DiaEditor/VisualEditor.py    2006-04-07 
02:03:25 UTC (rev 8388)
+++ trunk/gnue-designer/src/schema/DiaEditor/VisualEditor.py    2006-04-07 
02:44:20 UTC (rev 8389)
@@ -62,10 +62,10 @@
 
         # EventAware provided by ToolBase
         self.registerEventListeners({
-                           'ObjectSelected'      : self.onSetCurrentObject,
-                           'ObjectCreated'       : self.onCreateObject,
-                           'ObjectModified'      : self.onModifyObject,
-                           'ObjectDeleted'       : self.onDeleteObject,
+                           'ObjectSelected'      : self.object_selected_event,
+                           'ObjectCreated'       : self.object_created_event,
+                           'ObjectModified'      : self.object_modified_event,
+                           'ObjectDeleted'       : self.object_deleted_event,
                           })
 
 
@@ -113,7 +113,7 @@
             self.tables.append(VisualTable(object))
 
 
-    def onSetCurrentObject (self, event):
+    def object_selected_event (self, event):
         object = event.object
         handler = event.originator
         if object == None:
@@ -156,7 +156,7 @@
                                       self.panelheight / 20)
 
 
-    def onCreateObject (self, event):
+    def object_created_event (self, event):
         object = event.object
         handler = event.originator
         if object == None:
@@ -183,10 +183,10 @@
 
                 if object._type=="GSField":
                     self.hasNewObj=True
-                    self.onModifyObject(event)
+                    self.object_modified_event(event)
 
 
-    def onModifyObject (self, event):
+    def object_modified_event (self, event):
         self.refresh()
         return
         tbl=object.findParentOfType('GSTable')
@@ -205,7 +205,7 @@
     def refresh(self):
         self.diagram.Refresh(True)
 
-    def onDeleteObject (self, event):
+    def object_deleted_event (self, event):
         object = event.object
         handler = event.originator
         if object._type=="GSTable":
@@ -458,7 +458,7 @@
 
         if dialog.ShowModal() == wx.ID_OK:
             self.object.name=dialog.GetValue()
-            self.document.onModifyObject(self.object,"schema",
+            self.document.object_modified_event(self.object,"schema",
                                           [('name',self.object.name)])
             self.refresh()
 

Modified: trunk/gnue-designer/src/schema/LayoutEditor.py
===================================================================
--- trunk/gnue-designer/src/schema/LayoutEditor.py      2006-04-07 02:03:25 UTC 
(rev 8388)
+++ trunk/gnue-designer/src/schema/LayoutEditor.py      2006-04-07 02:44:20 UTC 
(rev 8389)
@@ -40,27 +40,27 @@
 
         # EventAware provided by ToolBase
         self.registerEventListeners({
-                           'ObjectSelected'      : self.onSetCurrentObject,
-                           'ObjectCreated'       : self.onCreateObject,
-                           'ObjectModified'      : self.onModifyObject,
-                           'ObjectDeleted'       : self.onDeleteObject,
+                           'ObjectSelected'      : self.object_selected_event,
+                           'ObjectCreated'       : self.object_created_event,
+                           'ObjectModified'      : self.object_modified_event,
+                           'ObjectDeleted'       : self.object_deleted_event,
                           })
 
     def inventoryObject(self, object):
         pass
 
-    def onSetCurrentObject (self, event):
+    def object_selected_event (self, event):
         object = event.object
         handler = event.originator
 
-    def onCreateObject (self, event):
+    def object_created_event (self, event):
         object = event.object
         handler = event.originator
 
-    def onModifyObject (self, event):
+    def object_modified_event (self, event):
         object = event.object
         handler = event.originator
 
-    def onDeleteObject (self, event):
+    def object_deleted_event (self, event):
         object = event.object
         handler = event.originator

Modified: trunk/gnue-designer/src/schema/TableEditor.py
===================================================================
--- trunk/gnue-designer/src/schema/TableEditor.py       2006-04-07 02:03:25 UTC 
(rev 8388)
+++ trunk/gnue-designer/src/schema/TableEditor.py       2006-04-07 02:44:20 UTC 
(rev 8389)
@@ -73,17 +73,17 @@
 
         # EventAware provided by ToolBase
         self.registerEventListeners({
-                           'ObjectSelected'      : self.onSetCurrentObject,
-                           'ObjectCreated'       : self.onCreateObject,
-                           'ObjectModified'      : self.onModifyObject,
-                           'ObjectDeleted'       : self.onDeleteObject,
+                           'ObjectSelected'      : self.object_selected_event,
+                           'ObjectCreated'       : self.object_created_event,
+                           'ObjectModified'      : self.object_modified_event,
+                           'ObjectDeleted'       : self.object_deleted_event,
                           })
 
         self.rootObject.walk(self.inventoryObject)
 
         self.saveRuntimeSettings()
 
-    def onSetCurrentObject (self, event):
+    def object_selected_event (self, event):
         object = event.object
         handler = event.originator
         table = object.findParentOfType('GSTable')
@@ -131,11 +131,11 @@
             pass
 
 
-    def onCreateObject (self, event):
+    def object_created_event (self, event):
         self.inventoryObject(event.object)
 
 
-    def onModifyObject (self, event):
+    def object_modified_event (self, event):
         object = event.object
         handler = event.originator
         if object == None:
@@ -154,7 +154,7 @@
 ##      self._setCurrent(object)
 
 
-    def onDeleteObject (self, event):
+    def object_deleted_event (self, event):
         object = event.object
         handler = event.originator
         if object == None:
@@ -188,7 +188,7 @@
 
 
     def _generateName(self, object):
-        parent = object.getParent ()
+        parent = object.getParent()
         name = '%s.%s (%s-Level Trigger)' % (parent.name, 
parent._validTriggers[object.type.upper()], parent._type[2:].capitalize())
         return name
 

Modified: trunk/gnue-designer/src/schema/TreeView.py
===================================================================
--- trunk/gnue-designer/src/schema/TreeView.py  2006-04-07 02:03:25 UTC (rev 
8388)
+++ trunk/gnue-designer/src/schema/TreeView.py  2006-04-07 02:44:20 UTC (rev 
8389)
@@ -39,7 +39,7 @@
         if object != self.rootObject:
             icon = 'properties'
             try:
-                parentTreeItem = object.getParent ()._treeItem
+                parentTreeItem = object.getParent()._treeItem
             except AttributeError:
                 parentTreeItem = None
                 # TODO:

Modified: trunk/gnue-designer/src/ui/wx/uihelpers/doccanvas/canvas.py
===================================================================
--- trunk/gnue-designer/src/ui/wx/uihelpers/doccanvas/canvas.py 2006-04-07 
02:03:25 UTC (rev 8388)
+++ trunk/gnue-designer/src/ui/wx/uihelpers/doccanvas/canvas.py 2006-04-07 
02:44:20 UTC (rev 8389)
@@ -502,7 +502,10 @@
                 if not new_action:
                     selected = self.select_hit_test(x, y)
                     if selected:
-                        self.selected_from_canvas([selected])
+                        if event.CmdDown() or event.ShiftDown(): 
+                            widgets = self.___merge_selections([selected])
+                        else: 
+                            self.selected_from_canvas([selected])
                         new_action = 'move'
 
                 # Finally, assume we're creating a rubberband selector
@@ -522,7 +525,6 @@
 
                 return True
 
-
     def __wx_mouse_left_up(self, event):
         """
         Left Button Released
@@ -543,7 +545,14 @@
                 else:
                     widget = self.select_hit_test(area.x, area.y)
                     widgets = widget and [widget] or []
-                self.selected_from_canvas(widgets)
+                    
+                if event.CmdDown() or event.ShiftDown(): 
+                    # If ctrl, cmd, or shift were pressed, 
+                    # then the user was adding or removing widgets
+                    # and not selecting a whole new set. 
+                    self.__merge_selections(widgets)
+                else: 
+                    self.selected_from_canvas(widgets)
 
             elif current_action == 'move':
                 self.__stop_moving(x, y)
@@ -698,7 +707,25 @@
 
         return results
 
+    def ___merge_selections(self, new_selection): 
+        """
+        Merge a new selection with an old selection, eliminating
+        any widgets in both. (This is used when Cmd+Click is used
+        to select a widget.
+        """
+        # If ctrl, cmd, or shift were pressed, 
+        # then the user was adding or removing widgets
+        # and not selecting a whole new set. 
+        selection = self.get_selected_widgets()
+        for widget in new_selection: 
+            if widget in selection:  
+                selection.remove(widget)
+            else: 
+                selection.append(widget)
 
+        self.selected_from_canvas(selection)
+
+
     # ---------------------------------------------------------------
     # Support for visual moving hints
     # ---------------------------------------------------------------





reply via email to

[Prev in Thread] Current Thread [Next in Thread]