[Top][All Lists]
[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
# ---------------------------------------------------------------
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [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,
jcater <=