commit-gnue
[Top][All Lists]
Advanced

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

gnue common/src/events/EventController.py desig...


From: Jason Cater
Subject: gnue common/src/events/EventController.py desig...
Date: Mon, 25 Nov 2002 00:41:43 -0500

CVSROOT:        /home/cvs
Module name:    gnue
Changes by:     Jason Cater <address@hidden>    02/11/25 00:41:42

Modified files:
        common/src/events: EventController.py 
        designer/doc/technotes: 00003.txt 
        designer/src   : DataSourceEditor.py EventEditor.py Instance.py 
                         MenuBar.py PropertyEditor.py SchemaViewer.py 
                         ToolFrame.py ToolPanel.py TreeView.py 
                         TriggerEditor.py 
        designer/src/forms: Incubator.py Instance.py TreeView.py 
        designer/src/forms/LayoutEditor: LayoutEditor.py PropertyBar.py 
                                         WidgetHandler.py 
        designer/src/navigator: LayoutEditor.py 
        designer/src/reports: Incubator.py LayoutEditor.py 
        designer/src/schema: Incubator.py LayoutEditor.py 
                             VisualEditor.py 
Added files:
        designer/src   : ToolDock.py 

Log message:
        * Implemented a docking system for forms
        * Started on HotKey support (F10 ==> Property Editor, etc)
        * Moved from the old listener support to common's events model
        * More work to get Designer working with new GFD format
        * Start of Trigger Inspector

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/common/src/events/EventController.py.diff?cvsroot=OldCVS&tr1=1.2&tr2=1.3&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/designer/doc/technotes/00003.txt.diff?cvsroot=OldCVS&tr1=1.2&tr2=1.3&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/designer/src/ToolDock.py?cvsroot=OldCVS&rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/designer/src/DataSourceEditor.py.diff?cvsroot=OldCVS&tr1=1.26&tr2=1.27&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/designer/src/EventEditor.py.diff?cvsroot=OldCVS&tr1=1.1&tr2=1.2&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/designer/src/Instance.py.diff?cvsroot=OldCVS&tr1=1.68&tr2=1.69&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/designer/src/MenuBar.py.diff?cvsroot=OldCVS&tr1=1.33&tr2=1.34&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/designer/src/PropertyEditor.py.diff?cvsroot=OldCVS&tr1=1.29&tr2=1.30&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/designer/src/SchemaViewer.py.diff?cvsroot=OldCVS&tr1=1.8&tr2=1.9&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/designer/src/ToolFrame.py.diff?cvsroot=OldCVS&tr1=1.13&tr2=1.14&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/designer/src/ToolPanel.py.diff?cvsroot=OldCVS&tr1=1.1&tr2=1.2&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/designer/src/TreeView.py.diff?cvsroot=OldCVS&tr1=1.25&tr2=1.26&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/designer/src/TriggerEditor.py.diff?cvsroot=OldCVS&tr1=1.21&tr2=1.22&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/designer/src/forms/Incubator.py.diff?cvsroot=OldCVS&tr1=1.2&tr2=1.3&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/designer/src/forms/Instance.py.diff?cvsroot=OldCVS&tr1=1.17&tr2=1.18&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/designer/src/forms/TreeView.py.diff?cvsroot=OldCVS&tr1=1.4&tr2=1.5&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/designer/src/forms/LayoutEditor/LayoutEditor.py.diff?cvsroot=OldCVS&tr1=1.34&tr2=1.35&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/designer/src/forms/LayoutEditor/PropertyBar.py.diff?cvsroot=OldCVS&tr1=1.3&tr2=1.4&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/designer/src/forms/LayoutEditor/WidgetHandler.py.diff?cvsroot=OldCVS&tr1=1.4&tr2=1.5&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/designer/src/navigator/LayoutEditor.py.diff?cvsroot=OldCVS&tr1=1.5&tr2=1.6&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/designer/src/reports/Incubator.py.diff?cvsroot=OldCVS&tr1=1.2&tr2=1.3&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/designer/src/reports/LayoutEditor.py.diff?cvsroot=OldCVS&tr1=1.1&tr2=1.2&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/designer/src/schema/Incubator.py.diff?cvsroot=OldCVS&tr1=1.3&tr2=1.4&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/designer/src/schema/LayoutEditor.py.diff?cvsroot=OldCVS&tr1=1.1&tr2=1.2&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/designer/src/schema/VisualEditor.py.diff?cvsroot=OldCVS&tr1=1.4&tr2=1.5&r1=text&r2=text

Patches:
Index: gnue/common/src/events/EventController.py
diff -c gnue/common/src/events/EventController.py:1.2 
gnue/common/src/events/EventController.py:1.3
*** gnue/common/src/events/EventController.py:1.2       Mon Oct  7 19:13:29 2002
--- gnue/common/src/events/EventController.py   Mon Nov 25 00:41:41 2002
***************
*** 30,35 ****
--- 30,36 ----
  import string
  
  from EventAware import EventAware
+ from Event import Event
  
  class EventController(EventAware):
  
***************
*** 49,55 ****
          self.__incomingEvents[event] = [events[event]]
  
  
!   def dispatchEvent(self, event):
      #GDebug.printMesg(0, "Event: %s" % (event.__event__))
      try:
        handlers = self.__incomingEvents[event.__event__]
--- 50,66 ----
          self.__incomingEvents[event] = [events[event]]
  
  
!   def dispatchEvent(self, event, *args, **parms):
! 
!     # Hackery so dispatchEvent can be passed 
!     # either an Event() object, or a text string 
!     # identifying the type of event.  If the
!     # latter, an event is created on the fly.
!     try:
!       event.__event__
!     except:
!       event = Event(event, *args, **parms)
! 
      #GDebug.printMesg(0, "Event: %s" % (event.__event__))
      try:
        handlers = self.__incomingEvents[event.__event__]
Index: gnue/designer/doc/technotes/00003.txt
diff -c gnue/designer/doc/technotes/00003.txt:1.2 
gnue/designer/doc/technotes/00003.txt:1.3
*** gnue/designer/doc/technotes/00003.txt:1.2   Mon Oct  7 22:24:26 2002
--- gnue/designer/doc/technotes/00003.txt       Mon Nov 25 00:41:41 2002
***************
*** 6,14 ****
  ObjectModified
  ObjectDeleted
  ObjectCreated
  
  MakeDirty -- Called after a document has been modified
  MakeClean -- Called after a document has been saved
  
  BeginWizard -- Called whenever a wizard has been selected to run
! EndWizard -- Called whenever a wizard has finished running
\ No newline at end of file
--- 6,15 ----
  ObjectModified
  ObjectDeleted
  ObjectCreated
+ ObjectSelected
  
  MakeDirty -- Called after a document has been modified
  MakeClean -- Called after a document has been saved
  
  BeginWizard -- Called whenever a wizard has been selected to run
! EndWizard -- Called whenever a wizard has finished running
Index: gnue/designer/src/DataSourceEditor.py
diff -c gnue/designer/src/DataSourceEditor.py:1.26 
gnue/designer/src/DataSourceEditor.py:1.27
*** gnue/designer/src/DataSourceEditor.py:1.26  Fri Nov 22 20:48:02 2002
--- gnue/designer/src/DataSourceEditor.py       Mon Nov 25 00:41:41 2002
***************
*** 30,36 ****
  import sys, os, cPickle, traceback, StringIO
  from wxPython.wx import *
  from gnue.common import GDebug, GDataSource, GConfig
! from gnue.common import RuntimeSettings
  from ToolPanel import ToolPanel
  
  class DataSourceEditor(ToolPanel):
--- 30,36 ----
  import sys, os, cPickle, traceback, StringIO
  from wxPython.wx import *
  from gnue.common import GDebug, GDataSource, GConfig
! from gnue.common import RuntimeSettings, events
  from ToolPanel import ToolPanel
  
  class DataSourceEditor(ToolPanel):
***************
*** 75,88 ****
      self.instance.rootObject.walk (self.inventoryObject)
      self.fillList()
  
      EVT_LIST_ITEM_SELECTED(self, self.list.GetId(), self.OnDSSelected)
!     self.onSetCurrentObject(self.current, "")
  
      self.finalized = 0
      self.splitter.SetSize(self.GetSize())
  
  
- 
    def fillList(self):
  
      self.list.DeleteAllItems()
--- 75,95 ----
      self.instance.rootObject.walk (self.inventoryObject)
      self.fillList()
  
+     # EventAware provided by ToolPanel
+     self.registerEventListeners({
+                        'ObjectSelected'      : self.onSetCurrentObject,
+                        'ObjectCreated'       : self.onCreateObject,
+                        'ObjectModified'      : self.onModifyObject,
+                        'ObjectDeleted'       : self.onDeleteObject,
+                       })
+ 
      EVT_LIST_ITEM_SELECTED(self, self.list.GetId(), self.OnDSSelected)
!     self._setCurrent(self.current)
  
      self.finalized = 0
      self.splitter.SetSize(self.GetSize())
  
  
    def fillList(self):
  
      self.list.DeleteAllItems()
***************
*** 172,199 ****
  
  
  
!   def onSetCurrentObject (self, object, handler):
! 
      self._currentObject = object
      if object == None:
        return
  
      if handler != __name__:
!       if isinstance(object, GDataSource.GDataSource):
  
!         self.current = object
!         self.list.SetItemState ( object.__listIndex,
!                                  wxLIST_STATE_SELECTED,
!                                  wxLIST_STATE_SELECTED)
  
!         self.list.EnsureVisible(object.__listIndex)
  
!     self.propertyPanel.onSetCurrentObject(object, handler)
!     self.referencesPanel.onSetCurrentObject(object, handler)
!     self.schemaPanel.onSetCurrentObject(object, handler)
  
  
!   def onCreateObject (self, object, handler):
      self._currentSelection = {}
      if object == None:
        return
--- 179,212 ----
  
  
  
!   def onSetCurrentObject (self, event):
!     object = event.object
!     handler = event.originator
      self._currentObject = object
      if object == None:
        return
  
      if handler != __name__:
!       self._setCurrent(object)
  
!   def _setCurrent(self, object):
!     if isinstance(object, GDataSource.GDataSource):
! 
!       self.current = object
!       self.list.SetItemState ( object.__listIndex,
!                                wxLIST_STATE_SELECTED,
!                                wxLIST_STATE_SELECTED)
  
!       self.list.EnsureVisible(object.__listIndex)
  
!     self.propertyPanel.setCurrent(object)
!     self.referencesPanel.setCurrent(object)
!     self.schemaPanel.setCurrent(object)
  
  
!   def onCreateObject (self, event):
!     object = event.object
!     handler = event.originator
      self._currentSelection = {}
      if object == None:
        return
***************
*** 206,212 ****
        self.fillList()
  
  
!   def onModifyObject (self, object, handler, modifications):
      if object == None:
        return
  
--- 219,227 ----
        self.fillList()
  
  
!   def onModifyObject (self, event):
!     object = event.object
!     handler = event.originator
      if object == None:
        return
  
***************
*** 218,227 ****
  
        # Dirty way to rebuild all our lists
        if object == self.current:
!         self.onSetCurrentObject(object, __name__)
  
  
!   def onDeleteObject (self, object, handler):
      if object == None:
        return
  
--- 233,244 ----
  
        # Dirty way to rebuild all our lists
        if object == self.current:
!         self._setCurrent(object)
  
  
!   def onDeleteObject (self, event):
!     object = event.object
!     handler = event.originator
      if object == None:
        return
  
***************
*** 314,320 ****
    # A Datasource was selected in the menu
    def OnDSSelected(self, event):
      self.current = self.datasourceMap[event.GetData()]
!     self.instance.onSetCurrentObject(self.current, __name__)
  
  
    def OnAddDSSelected(self, event):
--- 331,337 ----
    # A Datasource was selected in the menu
    def OnDSSelected(self, event):
      self.current = self.datasourceMap[event.GetData()]
!     
self.instance.dispatchEvent(events.Event('ObjectSelected',object=self.current, 
originator=__name__))
  
  
    def OnAddDSSelected(self, event):
***************
*** 380,386 ****
      EVT_SIZE(self, self.OnSize)
  
  
!   def onSetCurrentObject(self, object, controller):
      if isinstance(object, GDataSource.GDataSource):
        self.current = object
  
--- 397,403 ----
      EVT_SIZE(self, self.OnSize)
  
  
!   def setCurrent(self, object):
      if isinstance(object, GDataSource.GDataSource):
        self.current = object
  
***************
*** 414,420 ****
  
      EVT_SIZE(self, self.OnSize)
  
!   def onSetCurrentObject(self, object, controller):
      if isinstance(object, GDataSource.GDataSource):
        self.current = object
        self.fillList()
--- 431,437 ----
  
      EVT_SIZE(self, self.OnSize)
  
!   def setCurrent(self, object):
      if isinstance(object, GDataSource.GDataSource):
        self.current = object
        self.fillList()
***************
*** 589,595 ****
       GDebug.printMesg(5,"%s"%buffer.getvalue())
       buffer.close()
  
!   def onSetCurrentObject(self, object, controller):
      if isinstance(object, GDataSource.GDataSource):
        self.current = object
        self.fillList()
--- 606,612 ----
       GDebug.printMesg(5,"%s"%buffer.getvalue())
       buffer.close()
  
!   def setCurrent(self, object):
      if isinstance(object, GDataSource.GDataSource):
        self.current = object
        self.fillList()
Index: gnue/designer/src/EventEditor.py
diff -c gnue/designer/src/EventEditor.py:1.1 
gnue/designer/src/EventEditor.py:1.2
*** gnue/designer/src/EventEditor.py:1.1        Fri Nov 22 20:48:02 2002
--- gnue/designer/src/EventEditor.py    Mon Nov 25 00:41:41 2002
***************
*** 19,127 ****
  # Copyright 2001-2002 Free Software Foundation
  #
  # FILE:
! # EventEditor.py
  #
  # DESCRIPTION:
  #
  # NOTES:
  #
  
  import sys, os, string
  from wxPython.wx import *
  from wxPython.grid import *
  from gnue.common import GDebug, GTypecast
  from ToolPanel import *
  
- #
- #
- #
  class EventEditor (ToolPanel):
  
!   runtime_section = "DataSourceEditor"
  
    def init(self):
      self.objectList = []
      self.objectMap = {}
!     self.object = None
!     self.grid = wxGrid(self, -1, pos=wxPoint(0,0))
      self.grid.CreateGrid(1,1)
      EVT_SIZE(self, self.onSize)
  
!   def onSetCurrentObject (self, object, handler):
  
-     if object == None:
-       return
-     if handler != __name__:
        self.object = object
-       elements = self.instance.incubator.elements
        try:
!         self.attributes = 
elements[string.lower(object._type[2:])]['Attributes']
!       except KeyError:
!         self.attributes = {}
  
!       self.elements = elements[string.lower(object._type[2:])]
  
!       # This is a nasty temporary way of refreshing grid
!       if self.grid:
!         self.grid.Destroy()
!       self.grid = wxGrid(self, -1, pos=wxPoint(0,0))
! 
!       self.grid.CreateGrid(len(self.attributes.keys()),1)
!       self.grid.SetColLabelSize(0)
!       self.rowList = self.attributes.keys()
        self.rowList.sort()
        i = 0
!       for key in self.rowList: 
!         self.grid.SetRowLabelValue(i, string.upper(key[0]) + 
string.lower(key[1:]))
!         if hasattr(object, key):
!           self.grid.SetCellValue(i,0,"%s" % object.__dict__[key])
          i = i + 1
-       self.onSize(None)
-       EVT_GRID_CELL_CHANGE(self.grid, self.OnCellChange)
  
-   def onCreateObject (self, object, handler):
  
!     # Until this works!
!     return
  
-     pass
  
!   def onModifyObject (self, object, handler, modifications):
  
-     # Until this works!
-     return
  
!     if object == None: 
        return
!     if handler != __name__ and self.object == object:
! #      for modification in modifications: 
  #        attribute, value = modification
!       self.onSetCurrentObject(object, handler)
! 
!   def onDeleteObject (self, object, handler):
  
-     # Until this works!
-     return
  
!     if object == None: 
        return
      if handler != __name__:
        pass
  
!   def onSize(self, event): 
      x,y = self.GetClientSizeTuple()
!     self.SetSize((x-12,y-12))
!     self.grid.SetSize(self.GetClientSizeTuple())
      w,h = self.grid.GetClientSizeTuple()
      self.grid.SetColSize(0, w - self.grid.GetRowLabelSize())
  
    def OnCellChange(self, evt):
      attr = self.rowList[evt.GetRow()]
      value = self.grid.GetCellValue(evt.GetRow(), evt.GetCol())
  
!     try: 
!       self.object.__dict__[attr] = self.attributes[attr][2](value)
!       self.instance.onModifyObject(self.object, __name__, ((attr, 
self.object.__dict__[attr]),))
        evt.Skip()
      except ValueError:
        wxBell()
--- 19,444 ----
  # Copyright 2001-2002 Free Software Foundation
  #
  # FILE:
! # PropertyEditor.py
  #
  # DESCRIPTION:
  #
  # NOTES:
  #
  
+ 
  import sys, os, string
  from wxPython.wx import *
  from wxPython.grid import *
  from gnue.common import GDebug, GTypecast
  from ToolPanel import *
  
  class EventEditor (ToolPanel):
  
!   runtime_section = 'EventEditor'
!   uses_feedback_header = 1
  
    def init(self):
+     self.panel = wxPanel(self,-1,style=wxSIMPLE_BORDER, pos=wxPoint(6,6))
+ 
+     self.object = None
      self.objectList = []
      self.objectMap = {}
! 
!     # Set up our grid
!     self.grid = wxGrid(self.panel, -1, pos=wxPoint(0,0))
      self.grid.CreateGrid(1,1)
+     self.grid.SetColLabelSize(0)
+ 
+     EVT_GRID_CELL_CHANGE(self.grid, self.OnCellChange)
+     EVT_GRID_CELL_LEFT_DCLICK(self.grid, self.OnLeftDClick)
      EVT_SIZE(self, self.onSize)
  
!     # EventAware provided by ToolPanel
!     self.registerEventListeners({
!                        'ObjectSelected'      : self.onSetCurrentObject,
!                        'ObjectCreated'       : self.onCreateObject,
!                        'ObjectModified'      : self.onModifyObject,
!                        'ObjectDeleted'       : self.onDeleteObject,
!                       })
! 
!   def onSetCurrentObject (self, event):
!     object = event.object
!     handler = event.originator
!     if object and handler != self:
!       self._setCurrent(object)
! 
!   def _setCurrent(self, object):
!       try:
!         text  = "%s Triggers (%s)" % 
(object._type[2:].capitalize(),object.name)
!       except:
!         text = object.getDescription()
!       self.setHeaderText(text)
  
        self.object = object
        try:
!         self.triggerList = object._validTriggers
!       except AttributeError: 
!         self.triggerList = {}
  
!       # Speed up the process by not refreshing the grid yet
!       self.grid.BeginBatch()
  
! 
!       # Delete any old rows from a previous object
!       nr = self.grid.GetNumberRows()
!       if nr:
!         self.grid.DeleteRows(0,nr)
! 
! 
!       self.rowList = self.triggerList.keys()
        self.rowList.sort()
+ 
+       # Create the number of rows we'll need
+       self.grid.InsertRows(0,len(self.rowList))
+       self.triggerTypes = {'NONE':'<None>',
+                            'CUSTOM':'<Custom Trigger>',
+                            'NAMED':'Named Trigger'}
+ 
        i = 0
! 
!       for key in self.rowList:
!         self.grid.SetRowLabelValue(i,self.triggerList[key])
!         self.grid.SetCellEditor(i, 0, 
RestrictedCellEditor(self.grid,self.triggerTypes))
!         self.grid.SetCellValue(i,0, "%s" % 'CUSTOM')
          i = i + 1
  
  
!       # Redraw the grid
!       self.grid.EndBatch()
!       try:
!         self.grid.ForceRefresh()  # Added in 2.3.1
!       except AttributeError:
!         pass
  
  
!   def onCreateObject (self, event):
!     object = event.object
!     handler = event.originator
  
  
!   def onModifyObject (self, event):
!     object = event.object
!     handler = event.originator
!     if object == None:
        return
!     if handler != self and self.object == object:
! #      for modification in modifications:
  #        attribute, value = modification
!       self._setCurrent(object)
  
  
!   def onDeleteObject (self, event):
!     object = event.object
!     handler = event.originator
!     if object == None:
        return
      if handler != __name__:
        pass
  
! 
!   def onSize(self, event):
      x,y = self.GetClientSizeTuple()
!     self.panel.SetSize((x-12,y-12))
!     self.grid.SetSize(self.panel.GetClientSizeTuple())
      w,h = self.grid.GetClientSizeTuple()
      self.grid.SetColSize(0, w - self.grid.GetRowLabelSize())
+     try:
+       self.grid.ForceRefresh()  # Added in 2.3.1
+     except AttributeError:
+       pass
+ 
+ 
+ 
+   # Force a grid cell into Edit mode when Double-Clicked
+   def OnLeftDClick(self,evt): 
+     if self.grid.CanEnableCellControl(): 
+       self.grid.EnableCellEditControl()
  
    def OnCellChange(self, evt):
      attr = self.rowList[evt.GetRow()]
      value = self.grid.GetCellValue(evt.GetRow(), evt.GetCol())
  
!     try:
!       try:
!         oldVal = {attr: self.object.__dict__[attr]}
!       except KeyError:
!         oldVal = {attr: None}
!       self.object.__dict__[attr] = self.attributes[attr]['Typecast'](value)
!       newVal = {attr: self.object.__dict__[attr]}
!       self.dispatchEvent('ObjectModified',
!                          object=self.object,
!                          originator=self,
!                          old=oldVal,
!                          new=newVal)
        evt.Skip()
      except ValueError:
        wxBell()
+ 
+ #
+ #
+ #
+ class CharCellEditor (wxPyGridCellEditor):
+   def __init__(self, grid, attributes): 
+     wxPyGridCellEditor.__init__(self)
+     self.grid = grid
+     self.attributes = attributes
+     self.__created = 0
+ 
+ 
+   def Create(self, parent, id, evtHandler):
+     self.__created = 1
+     GDebug.printMesg(10,'Creating CharCellEditor')
+     self._tc = wxTextCtrl(parent, id, "")
+     self._tc.SetInsertionPoint(0)
+     self.SetControl(self._tc)
+     if evtHandler:
+       self._tc.PushEventHandler(evtHandler)
+ 
+   def SetSize(self, rect):
+     self._tc.SetDimensions(rect.x, rect.y, rect.width+2, rect.height+2)
+ 
+   def Show(self, show, attr):
+     self.base_Show(show, attr)
+ 
+   def PaintBackground(self, rect, attr):
+     pass
+ 
+   def BeginEdit(self, row, col, grid):
+     self.startValue = grid.GetTable().GetValue(row, col)
+     self._tc.SetValue(self.startValue)
+     self._tc.SetInsertionPointEnd()
+     self._tc.SetFocus()
+ 
+     # For this example, select the text
+     self._tc.SetSelection(0, self._tc.GetLastPosition())
+ 
+ 
+   def EndEdit(self, row, col, grid):
+     changed = false
+ 
+     val = self._tc.GetValue()
+     if val != self.startValue:
+        changed = true
+        grid.GetTable().SetValue(row, col, val) # update the table
+ 
+     self.startValue = ''
+     self._tc.SetValue('')
+     return changed
+ 
+ 
+   def Reset(self):
+     self._tc.SetValue(self.startValue)
+     self._tc.SetInsertionPointEnd()
+ 
+ 
+   def IsAcceptedKey(self, evt):
+     return (not (evt.ControlDown() or evt.AltDown()) and
+             evt.GetKeyCode() != WXK_SHIFT)
+ 
+ 
+   def StartingKey(self, evt):
+     GDebug.printMesg(10, "Starting Key; created=%s" % self.__created)
+     key = evt.GetKeyCode()
+     ch = None
+     if key in [WXK_NUMPAD0, WXK_NUMPAD1, WXK_NUMPAD2, WXK_NUMPAD3, 
WXK_NUMPAD4,
+                WXK_NUMPAD5, WXK_NUMPAD6, WXK_NUMPAD7, WXK_NUMPAD8, 
WXK_NUMPAD9]:
+         ch = ch = chr(ord('0') + key - WXK_NUMPAD0)
+ 
+     elif key < 256 and key >= 0 and chr(key):
+       ch = chr(key)
+       if not evt.ShiftDown():
+         ch = string.lower(ch)
+ 
+     if ch is not None:
+       # For this example, replace the text.  Normally we would append it.
+       #self._tc.AppendText(ch)
+ #      self._tc.SetValue(ch)
+  #     self._tc.SetInsertionPointEnd()
+       pass
+     else:
+       evt.Skip()
+ 
+ 
+   def StartingClick(self):
+     pass
+ 
+   def Destroy(self):
+     self.base_Destroy()
+ 
+   def Clone(self): 
+     return CharCellEditor(self.attributes)
+ 
+ 
+ class IntCellEditor (CharCellEditor):
+   def __init__(self, grid, attributes): 
+     CharCellEditor.__init__(self, grid, attributes)
+ 
+   def Create(self, parent, id, evtHandler):
+     CharCellEditor.Create(self, parent, id, evtHandler)
+     EVT_CHAR(self._tc, self.OnKeyPressed)
+ 
+   def OnKeyPressed(self, evt): 
+     if (ord('0') <= evt.KeyCode() <= ord('9') or \
+         evt.KeyCode() in (ord('-'), ord('+')) or \
+         evt.KeyCode() < 32 or evt.KeyCode() > 126): 
+       evt.Skip()
+ 
+   def StartingKey(self, evt):
+     key = evt.GetKeyCode()
+     ch = None
+     if key in [WXK_NUMPAD0, WXK_NUMPAD1, WXK_NUMPAD2, WXK_NUMPAD3, 
WXK_NUMPAD4,
+                WXK_NUMPAD5, WXK_NUMPAD6, WXK_NUMPAD7, WXK_NUMPAD8, 
WXK_NUMPAD9]:
+         ch = ch = chr(ord('0') + key - WXK_NUMPAD0)
+ 
+     elif key < 256 and key >= 0 and chr(key):
+       ch = chr(key)
+       if not evt.ShiftDown():
+         ch = string.lower(ch)
+ 
+     if '0' <= ch <= '9':
+       # For this example, replace the text.  Normally we would append it.
+       #self._tc.AppendText(ch)
+       pass
+ #      self._tc.SetValue(ch)
+ #      self._tc.SetInsertionPointEnd()
+     else:
+       evt.Skip()
+ 
+ 
+ class RestrictedCellEditor (CharCellEditor):
+   def __init__(self, grid, attributes):
+     CharCellEditor.__init__(self, grid, attributes)
+     self.valueList = attributes.keys()
+ 
+     self.valueList.sort()
+     self.selectionList = []
+     self.valueMap = {}
+ 
+     i = 0
+     for v in self.valueList:
+       self.valueMap[v] = i
+       self.selectionList.append("%s" % (attributes[v] or v))
+       i = i + 1
+ 
+ ##    self.valueList.insert(0, '')
+ 
+   def Create(self, parent, id, evtHandler):
+     GDebug.printMesg(10,'Creating CharCellEditor')
+     self._tc = wxComboBox(parent, id, "", style=wxCB_READONLY, 
+                           choices=self.selectionList)
+     self.SetControl(self._tc)
+     if evtHandler:
+       self._tc.PushEventHandler(evtHandler)
+ 
+   def BeginEdit(self, row, col, grid):
+     self.startValue = grid.GetTable().GetValue(row, col)
+     self._tc.SetSelection(self.valueMap[self.startValue])
+     self._tc.SetFocus()
+ 
+   def EndEdit(self, row, col, grid):
+     changed = false
+ 
+     val = self.valueList[self._tc.GetSelection()]
+     if val != self.startValue:
+        changed = true
+        grid.GetTable().SetValue(row, col, "%s" % val) # update the table
+ 
+     self.startValue = ''
+     self._tc.SetSelection(0)
+     return changed
+ 
+ 
+   def Reset(self):
+     self._tc.SetSelection(self.valueMap[self.startValue])
+     #self._tc.SetInsertionPointEnd()
+ 
+ 
+   def StartingKey(self, evt):
+     key = evt.GetKeyCode()
+     ch = None
+     if key in [WXK_NUMPAD0, WXK_NUMPAD1, WXK_NUMPAD2, WXK_NUMPAD3, 
WXK_NUMPAD4,
+                WXK_NUMPAD5, WXK_NUMPAD6, WXK_NUMPAD7, WXK_NUMPAD8, 
WXK_NUMPAD9]:
+         ch = ch = chr(ord('0') + key - WXK_NUMPAD0)
+ 
+     elif key < 256 and key >= 0 and chr(key):
+       ch = chr(key)
+       if not evt.ShiftDown():
+         ch = string.lower(ch)
+ 
+     if ch is not None:
+       # For this example, replace the text.  Normally we would append it.
+       #self._tc.AppendText(ch)
+       pass
+ #      self._tc.SetValue(ch)
+ #      self._tc.SetInsertionPointEnd()
+     else:
+       evt.Skip()
+ 
+ 
+ class BoolCellEditor (CharCellEditor):
+   def __init__(self, grid, attributes):
+     CharCellEditor.__init__(self, grid, attributes)
+       
+     self.selectionList = ['FALSE','TRUE']
+ 
+   def Create(self, parent, id, evtHandler):
+     self._tc = wxComboBox(parent, id, "", style=wxCB_READONLY, 
+                           choices=self.selectionList)
+     self.SetControl(self._tc)
+     if evtHandler:
+       self._tc.PushEventHandler(evtHandler)
+ 
+   def BeginEdit(self, row, col, grid):
+     self.startValue = grid.GetTable().GetValue(row, col)
+     
+     self._tc.SetValue(self.startValue)
+     self._tc.SetFocus()
+ 
+   def EndEdit(self, row, col, grid):
+     changed = false
+ 
+     if self._tc.GetSelection(): 
+       val = 'TRUE' 
+     else: 
+       val = 'FALSE' 
+     if val != self.startValue:
+        changed = true
+        grid.GetTable().SetValue(row, col, "%s" % val) # update the table
+ 
+     self.startValue = ''
+     self._tc.SetSelection(0)
+     return changed
+ 
+ 
+   def Reset(self):
+     self._tc.SetValue(self.startValue)
+     #self._tc.SetInsertionPointEnd()
+ 
+ 
+   def StartingKey(self, evt):
+     key = evt.GetKeyCode()
+     ch = None
+     if key in [WXK_NUMPAD0, WXK_NUMPAD1, WXK_NUMPAD2, WXK_NUMPAD3, 
WXK_NUMPAD4,
+                WXK_NUMPAD5, WXK_NUMPAD6, WXK_NUMPAD7, WXK_NUMPAD8, 
WXK_NUMPAD9]:
+         ch = ch = chr(ord('0') + key - WXK_NUMPAD0)
+ 
+     elif key < 256 and key >= 0 and chr(key):
+       ch = chr(key)
+       if not evt.ShiftDown():
+         ch = string.lower(ch)
+ 
+     if ch is not None:
+       # For this example, replace the text.  Normally we would append it.
+       #self._tc.AppendText(ch)
+       pass
+ #      self._tc.SetValue(ch)
+ #      self._tc.SetInsertionPointEnd()
+     else:
+       evt.Skip()
+ 
Index: gnue/designer/src/Instance.py
diff -c gnue/designer/src/Instance.py:1.68 gnue/designer/src/Instance.py:1.69
*** gnue/designer/src/Instance.py:1.68  Fri Nov 22 20:48:02 2002
--- gnue/designer/src/Instance.py       Mon Nov 25 00:41:41 2002
***************
*** 37,42 ****
--- 37,43 ----
  from gnue.common.events import EventController, Event
  from ToolFrame import ToolFrame
  from ToolPanel import ToolPanel
+ from ToolDock import *
  from gnue.designer import VERSION, PACKAGE
  from gnue.designer.Debugger import DebugSession
  import TemplateBase
***************
*** 123,128 ****
--- 124,136 ----
  
      self._path = ""
  
+     self.registerEventListeners({
+                        'ObjectSelected'      : self.__onSetCurrentObject,
+                        'ObjectCreated'       : self.__onCreateObject,
+                        'ObjectModified'      : self.__onModifyObject,
+                        'ObjectDeleted'       : self.__onDeleteObject,
+                       })
+ 
      if location == None:
  
        if buffer != None:
***************
*** 163,191 ****
      self.SetStatusText('Welcome to GNUe Designer. Watch your step and try not 
to get hurt.')
      self._menubar = MainMenuBar(self)
      self.SetMenuBar(self._menubar)
-     self.Show(true)
  
  
      self.rootObject.walk(self.__inventory)
  
  
      # Create the supplemental tools
-     self.__objectListeners = []
      self._toolCache = []
      self.createTools()
      self._initTools()
      self.createWizards()
      self._menubar.buildMenu()
  
-     # Create our tools
- ##    self.visualEditorWindow = self
- ##    self.visualEditor = self.createVisualEditor()
- ##    self.__objectListeners.append(self.visualEditor)
  
      self._app.addInstance(self)
  
      # Fit the widgets to the screen
- ##    self.visualEditor.Fit()
      self.Fit()
  
      self.SetSize((
--- 171,192 ----
***************
*** 196,203 ****
         RuntimeSettings.getint(self.runtime_section, 'x', -1),
         RuntimeSettings.getint(self.runtime_section, 'y', -1)))
  
!     self.onSetCurrentObject(self.rootObject, __name__)
  
      self.Refresh()
  
      EVT_CLOSE(self, self.OnClose)
--- 197,207 ----
         RuntimeSettings.getint(self.runtime_section, 'x', -1),
         RuntimeSettings.getint(self.runtime_section, 'y', -1)))
  
!     self.dispatchEvent(Event('ObjectSelected', originator=self,
!                        object=self.rootObject))
!     ##self.onSetCurrentObject(self.rootObject, __name__)
  
+     self.Show(true)
      self.Refresh()
  
      EVT_CLOSE(self, self.OnClose)
***************
*** 210,249 ****
  
      cache = []
  
!     for id, title, baseclass in self._toolCache:
!       if baseclass.DEFAULTDOC
!         pos = RuntimeSettings.get(self.runtime_section, 'Dock-%s' % id, 
baseclass.default_dock),
  
        lefties += 1 and (pos == 'left')
        toppies += 1 and (pos == 'top')
        bottomites += 1 and (pos == 'bottom')
  
!       cache.append( (id, title, baseclass, pos) )
  
  
      if lefties:
!       self.horizSplitter = wxSplitter(self, -1, style=wxSP_FULLSASH)
        rightWin = leftWin = self.horizSplitter
        if lefties > 1:
!         leftPane = MultiTooledPane(leftWin)
        else:
!         leftPane = SingleTooledPane(leftWin)
! 
!       leftPane.AddTool
  
      else:
        rightWin = leftWin = self
  
      if bottomites:
!       topWin = bottomWin = self.vertSplitter = wxSplitter(rightWin, -1, 
style=wxSP_FULLSASH)
      else:
        topWin = bottomWin = rightWin
  
  
-     self.mainArea = wxPanel(self, -1)
-     self.left = wxPanel(self, -1)
  
!     for id, title, baseclass, pos in cache:
        if id == None:
          self._menubar.addToolSeparator()
        else:
--- 214,258 ----
  
      cache = []
  
!     for id, title, baseclass, hotkey in self._toolCache:
!       if not id: continue
!       print "Dock-%s" % id
!       pos = RuntimeSettings.get(self.runtime_section, 'Dock-%s' % id, 
baseclass.default_dock)
  
        lefties += 1 and (pos == 'left')
        toppies += 1 and (pos == 'top')
        bottomites += 1 and (pos == 'bottom')
  
!       cache.append( (id, title, baseclass, hotkey, pos) )
  
  
      if lefties:
!       self.horizSplitter = wxSplitterWindow(self, -1, style=wxSP_3D)
        rightWin = leftWin = self.horizSplitter
        if lefties > 1:
!         leftPane = MultiTooledPane(leftWin, self)
        else:
!         leftPane = SingleTooledPane(leftWin, self)
  
      else:
        rightWin = leftWin = self
  
      if bottomites:
!       topWin = bottomWin = self.vertSplitter = wxSplitterWindow(rightWin, -1, 
style=wxSP_3D)
!       if bottomites > 1:
!         bottomPane = MultiTooledPane(bottomWin, self)
!       else:
!         bottomPane = SingleTooledPane(bottomWin, self)
      else:
        topWin = bottomWin = rightWin
  
+     if toppies > 1:
+       topPane = MultiTooledPane(topWin, self)
+     else:
+       topPane = SingleTooledPane(topWin, self)
  
  
!     for id, title, baseclass, hotkey, pos in cache:
        if id == None:
          self._menubar.addToolSeparator()
        else:
***************
*** 251,284 ****
          if pos == 'frame':
            window = ToolFrame(self, title)
            control = baseclass(self, self.rootObject, window)
          elif pos == 'left':
!           control = leftPane.AddTool(title, baseclass, self.rootObject)
            window = leftPane.GetWindow()
          elif pos == 'top':
!           control = topPane.AddTool(title, baseclass, self.rootObject)
            window = topPane.GetWindow()
          elif pos == 'bottom':
!           control = bottomPane.AddTool(title, baseclass, self.rootObject)
            window = bottomPane.GetWindow()
  
!         control = baseclass(self, self.rootObject, window)
          self.__dict__["%sWindow" % id] = window
          self.__dict__[id] = control
-         self.__objectListeners.append(control)
- 
  
      if lefties:
!       self.horizSplitter.SplitVertically(leftPane, self.vertSplitter)
  
      if bottomites:
!       self.vertSplitter.SplitHorizontally(topPane, bottomPane)
  
  
!   def addTool(self, id, title, baseclass):
!     self._toolCache.append( (id, title, baseclass) )
  
    def addToolSeparator(self):
!     self._toolCache.append( (None, None, None) )
  
    def addToolCreate(self, title, method):
      self._menubar.addToolCreate(title, method)
--- 260,299 ----
          if pos == 'frame':
            window = ToolFrame(self, title)
            control = baseclass(self, self.rootObject, window)
+           window.control = control
          elif pos == 'left':
!           control = leftPane.AddTool(title, baseclass, self.rootObject, self)
            window = leftPane.GetWindow()
          elif pos == 'top':
!           control = topPane.AddTool(title, baseclass, self.rootObject, self)
            window = topPane.GetWindow()
          elif pos == 'bottom':
!           control = bottomPane.AddTool(title, baseclass, self.rootObject, 
self)
            window = bottomPane.GetWindow()
  
!         # Add ourselves to the Window menu
!         control._menutool = self._menubar.addTool(window, title, hotkey)
! 
          self.__dict__["%sWindow" % id] = window
          self.__dict__[id] = control
  
      if lefties:
!       self.horizSplitter.SetSize(self.GetClientSize())
!       self.horizSplitter.SplitVertically(leftPane.GetWindow(), 
self.vertSplitter,
!                 RuntimeSettings.getint(self.runtime_section, 
'DockSplitter-Horiz',200))
  
      if bottomites:
!       self.vertSplitter.SplitHorizontally(topPane.GetWindow(), 
bottomPane.GetWindow(),
!                 RuntimeSettings.getint(self.runtime_section, 
'DockSplitter-Vert-Right',200))
! 
! #    topPane.GetWindow().Fit()
  
  
!   def addTool(self, id, title, baseclass, hotkey=None):
!     self._toolCache.append( (id, title, baseclass, hotkey) )
  
    def addToolSeparator(self):
!     self._toolCache.append( (None, None, None, None) )
  
    def addToolCreate(self, title, method):
      self._menubar.addToolCreate(title, method)
***************
*** 313,323 ****
    def saveRuntimeSettings(self):
      x, y = self.GetPositionTuple()
      width, height = self.GetSizeTuple()
!     return ( self.runtime_section,
!              { 'x': abs(x),
!                'y': abs(y),
!                'height': height,
!                'width': width  } )
  
    # Do we need to be saved?
    def isDirty(self):
--- 328,348 ----
    def saveRuntimeSettings(self):
      x, y = self.GetPositionTuple()
      width, height = self.GetSizeTuple()
!     settings = { 'x': abs(x),
!                  'y': abs(y),
!                  'height': height,
!                  'width': width  }
!     try:
!       settings['docksplitter-vert-right'] = 
self.vertSplitter.GetSashPosition()
!     except AttributeError:
!       pass
! 
!     try:
!       settings['DockSplitter-Horiz'] = self.horizSplitter.GetSashPosition()
!     except AttributeError:
!       pass
! 
!     return ( self.runtime_section, settings )
  
    # Do we need to be saved?
    def isDirty(self):
***************
*** 348,354 ****
    def __inventory (self, object):
  
      if object != self.rootObject:
!     
        # just a hack for designer.reports.TreeView.py (btami)
        if object._xmlnamespace:
          if object.name:
--- 373,379 ----
    def __inventory (self, object):
  
      if object != self.rootObject:
! 
        # just a hack for designer.reports.TreeView.py (btami)
        if object._xmlnamespace:
          if object.name:
***************
*** 356,362 ****
          else:
           object._description = object._xmltag + "(out:)"
  
!       # Assign an ID if none exists 
        # TODO: in the future, I want to change these to id=".." instead of 
name=".."
        if hasattr(object, 'name'):
          if (object.name == None or ( \
--- 381,387 ----
          else:
           object._description = object._xmltag + "(out:)"
  
!       # Assign an ID if none exists
        # TODO: in the future, I want to change these to id=".." instead of 
name=".."
        if hasattr(object, 'name'):
          if (object.name == None or ( \
***************
*** 369,395 ****
      self.inventoryObject(object)
  
  
!   def onSetCurrentObject (self, object, handler):
      self._currentObject = object
-     for listener in self.__objectListeners:
-       listener.onSetCurrentObject(object, handler)
  
!   def onCreateObject (self, object, handler):
      self.__inventory(object)
-     for listener in self.__objectListeners:
-       listener.onCreateObject(object, handler)
      self.makeDirty()
  
!   def onModifyObject (self, object, handler, modifications):
!     for listener in self.__objectListeners:
!       listener.onModifyObject(object, handler, modifications)
      self.makeDirty()
  
!   def onDeleteObject (self, object, handler):
! 
!     # Notify all listeners
!     for listener in self.__objectListeners:
!       listener.onDeleteObject(object, handler)
  
      # Delete the actual object from its parent
      i = 0
--- 394,427 ----
      self.inventoryObject(object)
  
  
!   def __onSetCurrentObject (self, event):
!     object = event.object
!     handler = event.originator
      self._currentObject = object
  
!   def __onCreateObject (self, object, handler):
      self.__inventory(object)
      self.makeDirty()
  
!   def __onModifyObject (self, event):
!     object = event.object
!     # Check for any name dependencies
!     # (i.e., GFEntry is dependent on GFBlock.name and GFField.name)
!     # Automatically create any change events for the child objects
!     if hasattr(object, '_nameDependencies'):
!       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 )
      self.makeDirty()
  
!   def __onDeleteObject (self, object, handler):
  
      # Delete the actual object from its parent
      i = 0
***************
*** 621,688 ****
  
  
  
- def MultipleTooledPane(wxNotebook):
-   def __init__(self, parent, menutool):
-     wxNotebook.__init__(self, parent, -1, style=wxCLIP_CHILDREN):
-     self.menutool = menutool
- 
-   def AddTool(self, title, baseclass, rootObject):
-     control = baseclass(self, rootObject, self.parent)
-     self.AddPage(control, title)
-     return control
- 
-   def GetWindow(self):
-     return self
- 
- 
-   ######
-   def OnMenuSelected(self, event):
-     if self.menutool.menu.IsChecked():
-       self.show()
-     else:
-       self.hide()
- 
-   def show(self):
-     self.menutool.menu.SetHelp(_("Hide the %s window")  % self.title)
-     self.menutool.menu.Check(1)
-     self.Show(1)
- 
-   def hide(self):
-     self.menutool.menu.SetHelp(_("Show the %s window") % self.title)
-     self.menutool.menu.Check(0)
-     self.Show(0)
- 
- 
- 
- def SingleTooledPane:
-   def __init__(self, parent):
-     self.menutool = menutool
-     self.parent = parent
- 
-   def AddTool(self, title, baseclass, rootObject):
-     self.window = baseclass(self, rootObject, self.parent)
-     return self.window
- 
-   def GetWindow(self):
-     return self.window
- 
-   ######
-   def OnMenuSelected(self, event):
-     if self.menutool.menu.IsChecked():
-       self.show()
-     else:
-       self.hide()
- 
-   def show(self):
-     self.menutool.menu.SetHelp(_("Hide the %s window")  % self.title)
-     self.menutool.menu.Check(1)
-     self.Show(1)
- 
-   def hide(self):
-     self.menutool.menu.SetHelp(_("Show the %s window") % self.title)
-     self.menutool.menu.Check(0)
-     self.Show(0)
- 
  
  #
  # Helper class used by the tool-specific packages
--- 653,658 ----
***************
*** 694,707 ****
    description = 'undefined'
    fileExtensions = {}
    defaultFileExtension = 'undefined'
- 
- 
- 
- 
- 
- 
- 
- 
- 
  
  
--- 664,668 ----
Index: gnue/designer/src/MenuBar.py
diff -c gnue/designer/src/MenuBar.py:1.33 gnue/designer/src/MenuBar.py:1.34
*** gnue/designer/src/MenuBar.py:1.33   Fri Nov 22 20:48:02 2002
--- gnue/designer/src/MenuBar.py        Mon Nov 25 00:41:41 2002
***************
*** 302,310 ****
  
  
  
!   def addTool(self, toolFrame, title):
      location = 'Tools|%s' % title
!     self._menuMappings[location] = ToolRunner(toolFrame, title)
      self._toolMenuOrder.append(location)
      return self._menuMappings[location]
  
--- 302,310 ----
  
  
  
!   def addTool(self, toolFrame, title, hotkey=None):
      location = 'Tools|%s' % title
!     self._menuMappings[location] = ToolRunner(toolFrame, title, hotkey)
      self._toolMenuOrder.append(location)
      return self._menuMappings[location]
  
***************
*** 321,331 ****
  
  
  class ToolRunner:
!   def __init__(self, toolFrame, title):
       self.toolFrame = toolFrame
  
       self.wxId = wxNewId()
!      self.title = title
       self.checkable = 1
       self.tooltip = _("Show or hide the %s") % title
  
--- 321,332 ----
  
  
  class ToolRunner:
!   def __init__(self, toolFrame, title, hotkey):
       self.toolFrame = toolFrame
  
+      self.hotkey = hotkey
       self.wxId = wxNewId()
!      self.title = title + (hotkey and '\t%s'% hotkey or '')
       self.checkable = 1
       self.tooltip = _("Show or hide the %s") % title
  
Index: gnue/designer/src/PropertyEditor.py
diff -c gnue/designer/src/PropertyEditor.py:1.29 
gnue/designer/src/PropertyEditor.py:1.30
*** gnue/designer/src/PropertyEditor.py:1.29    Fri Nov 22 20:48:02 2002
--- gnue/designer/src/PropertyEditor.py Mon Nov 25 00:41:41 2002
***************
*** 36,41 ****
--- 36,42 ----
  class PropertyEditor (ToolPanel):
  
    runtime_section = 'PropertyEditor'
+   uses_feedback_header = 1
  
    def init(self):
      self.panel = wxPanel(self,-1,style=wxSIMPLE_BORDER, pos=wxPoint(6,6))
***************
*** 53,63 ****
      EVT_GRID_CELL_LEFT_DCLICK(self.grid, self.OnLeftDClick)
      EVT_SIZE(self, self.onSize)
  
! 
!   def onSetCurrentObject (self, object, handler):
      if object == None:
        return
!     if handler != __name__:
        self.object = object
        elements = self.instance.incubator.elements
        try:
--- 54,82 ----
      EVT_GRID_CELL_LEFT_DCLICK(self.grid, self.OnLeftDClick)
      EVT_SIZE(self, self.onSize)
  
!     # EventAware provided by ToolPanel
!     self.registerEventListeners({
!                        'ObjectSelected'      : self.onSetCurrentObject,
!                        'ObjectCreated'       : self.onCreateObject,
!                        'ObjectModified'      : self.onModifyObject,
!                        'ObjectDeleted'       : self.onDeleteObject,
!                       })
! 
!   def onSetCurrentObject (self, event):
!     object = event.object
!     handler = event.originator
      if object == None:
        return
!     if handler != self:
!       self._setCurrent(object)
! 
!   def _setCurrent(self, object):
!       try:
!         text  = "%s Properties (%s)" % 
(object._type[2:].capitalize(),object.name)
!       except:
!         text = object.getDescription()
!       self.setHeaderText(text)
! 
        self.object = object
        elements = self.instance.incubator.elements
        try:
***************
*** 66,72 ****
          self.attributes = {}
  
        self.elements = elements[string.lower(object._type[2:])]
!  
        # Speed up the process by not refreshing the grid yet
        self.grid.BeginBatch()
  
--- 85,91 ----
          self.attributes = {}
  
        self.elements = elements[string.lower(object._type[2:])]
! 
        # Speed up the process by not refreshing the grid yet
        self.grid.BeginBatch()
  
***************
*** 89,97 ****
             self.attributes[key]['Deprecated'] and \
             (not hasattr(object, key) or \
                (self.attributes[key].has_key('Default') and \
!                object.__dict__[key] == self.attributes[key]['Default'] ) ): 
            self.rowList.pop(i)
!         else: 
            i = i + 1
  
  
--- 108,116 ----
             self.attributes[key]['Deprecated'] and \
             (not hasattr(object, key) or \
                (self.attributes[key].has_key('Default') and \
!                object.__dict__[key] == self.attributes[key]['Default'] ) ):
            self.rowList.pop(i)
!         else:
            i = i + 1
  
  
***************
*** 114,122 ****
  
          # Determine the type of Cell Editor we want 
          # (Integer, Boolean, Dropdown, Char)
!         if self.attributes[key].has_key('ValueSet'): 
            self.grid.SetCellEditor(i, 0, 
RestrictedCellEditor(self.grid,self.attributes[key]))
!         elif self.attributes[key]['Typecast'] == GTypecast.boolean: 
            self.grid.SetCellEditor(i, 0, 
BoolCellEditor(self.grid,self.attributes[key]))
          elif self.attributes[key]['Typecast'] in (GTypecast.integer,
                  GTypecast.number, GTypecast.whole):
--- 133,141 ----
  
          # Determine the type of Cell Editor we want 
          # (Integer, Boolean, Dropdown, Char)
!         if self.attributes[key].has_key('ValueSet'):
            self.grid.SetCellEditor(i, 0, 
RestrictedCellEditor(self.grid,self.attributes[key]))
!         elif self.attributes[key]['Typecast'] == GTypecast.boolean:
            self.grid.SetCellEditor(i, 0, 
BoolCellEditor(self.grid,self.attributes[key]))
          elif self.attributes[key]['Typecast'] in (GTypecast.integer,
                  GTypecast.number, GTypecast.whole):
***************
*** 125,139 ****
             self.grid.SetCellEditor(i, 0, 
CharCellEditor(self.grid,self.attributes[key]))
  
  
!         # Set the initial value of the cells to the current property values 
!         if hasattr(object, key): 
            if self.attributes[key]['Typecast'] == GTypecast.boolean:
!             if object.__dict__[key]:    
                self.grid.SetCellValue(i,0,"TRUE")
!             else: 
                self.grid.SetCellValue(i,0,"FALSE")
                pass
!           else: 
              self.grid.SetCellValue(i,0, "%s" % object.__dict__[key])
              pass
          i = i + 1
--- 144,158 ----
             self.grid.SetCellEditor(i, 0, 
CharCellEditor(self.grid,self.attributes[key]))
  
  
!         # Set the initial value of the cells to the current property values
!         if hasattr(object, key):
            if self.attributes[key]['Typecast'] == GTypecast.boolean:
!             if object.__dict__[key]:
                self.grid.SetCellValue(i,0,"TRUE")
!             else:
                self.grid.SetCellValue(i,0,"FALSE")
                pass
!           else:
              self.grid.SetCellValue(i,0, "%s" % object.__dict__[key])
              pass
          i = i + 1
***************
*** 141,167 ****
  
        # Redraw the grid
        self.grid.EndBatch()
!       try: 
          self.grid.ForceRefresh()  # Added in 2.3.1
!       except AttributeError: 
          pass
  
  
!   def onCreateObject (self, object, handler):
!     pass
  
  
!   def onModifyObject (self, object, handler, modifications):
!     if object == None: 
        return
!     if handler != __name__ and self.object == object:
! #      for modification in modifications: 
  #        attribute, value = modification
!       self.onSetCurrentObject(object, handler)
  
  
!   def onDeleteObject (self, object, handler):
!     if object == None: 
        return
      if handler != __name__:
        pass
--- 160,191 ----
  
        # Redraw the grid
        self.grid.EndBatch()
!       try:
          self.grid.ForceRefresh()  # Added in 2.3.1
!       except AttributeError:
          pass
  
  
!   def onCreateObject (self, event):
!     object = event.object
!     handler = event.originator
  
  
!   def onModifyObject (self, event):
!     object = event.object
!     handler = event.originator
!     if object == None:
        return
!     if handler != self and self.object == object:
! #      for modification in modifications:
  #        attribute, value = modification
!       self._setCurrent(object)
  
  
!   def onDeleteObject (self, event):
!     object = event.object
!     handler = event.originator
!     if object == None:
        return
      if handler != __name__:
        pass
***************
*** 189,199 ****
      attr = self.rowList[evt.GetRow()]
      value = self.grid.GetCellValue(evt.GetRow(), evt.GetCol())
  
!     try: 
        self.object.__dict__[attr] = self.attributes[attr]['Typecast'](value)
!       self.instance.onModifyObject(self.object, __name__, ((attr, 
self.object.__dict__[attr]),))
        evt.Skip()
!     except ValueError: 
        wxBell()
  
  #
--- 213,232 ----
      attr = self.rowList[evt.GetRow()]
      value = self.grid.GetCellValue(evt.GetRow(), evt.GetCol())
  
!     try:
!       try:
!         oldVal = {attr: self.object.__dict__[attr]}
!       except KeyError:
!         oldVal = {attr: None}
        self.object.__dict__[attr] = self.attributes[attr]['Typecast'](value)
!       newVal = {attr: self.object.__dict__[attr]}
!       self.dispatchEvent('ObjectModified',
!                          object=self.object,
!                          originator=self,
!                          old=oldVal,
!                          new=newVal)
        evt.Skip()
!     except ValueError:
        wxBell()
  
  #
Index: gnue/designer/src/SchemaViewer.py
diff -c gnue/designer/src/SchemaViewer.py:1.8 
gnue/designer/src/SchemaViewer.py:1.9
*** gnue/designer/src/SchemaViewer.py:1.8       Fri Nov 22 20:48:02 2002
--- gnue/designer/src/SchemaViewer.py   Mon Nov 25 00:41:42 2002
***************
*** 30,36 ****
  import sys, os, cPickle, traceback, StringIO
  from wxPython.wx import *
  from gnue.common import GDebug, GDataSource
! from gnue.common import RuntimeSettings
  from ToolPanel import *
  
  class SchemaViewer(ToolPanel):
--- 30,36 ----
  import sys, os, cPickle, traceback, StringIO
  from wxPython.wx import *
  from gnue.common import GDebug, GDataSource
! from gnue.common import RuntimeSettings, events
  from ToolPanel import *
  
  class SchemaViewer(ToolPanel):
***************
*** 64,69 ****
--- 64,77 ----
  
      self.current = None
  
+     # EventAware provided by ToolPanel
+     self.registerEventListeners({
+                        'ObjectSelected'      : self.onSetCurrentObject,
+                        'ObjectCreated'       : self.onCreateObject,
+                        'ObjectModified'      : self.onModifyObject,
+                        'ObjectDeleted'       : self.onDeleteObject,
+                       })
+ 
  
      #
      # Set up the "selection" panel
***************
*** 100,106 ****
  
      EVT_LIST_BEGIN_DRAG(self, self.list.GetId(), self.OnBeginDrag)
      EVT_LIST_ITEM_SELECTED(self, self.list.GetId(), self.OnTableSelected)
-     self.onSetCurrentObject(self.current, "")
  
      self.finalized = 0
      self.splitter.SetSize(self.GetSize())
--- 108,113 ----
***************
*** 160,177 ****
  
  
  
!   def onSetCurrentObject (self, object, handler):
!     pass
! 
!   def onCreateObject (self, object, handler):
!     pass
! 
!   def onModifyObject (self, object, handler, modifications):
!     pass
! 
!   def onDeleteObject (self, object, handler):
!     pass
! 
  
    def OnSize(self, event):
      if not self.finalized:
--- 167,187 ----
  
  
  
!   def onSetCurrentObject (self, event):
!     object = event.object
!     handler = event.originator
! 
!   def onCreateObject (self, event):
!     object = event.object
!     handler = event.originator
! 
!   def onModifyObject (self, event):
!     object = event.object
!     handler = event.originator
! 
!   def onDeleteObject (self, event):
!     object = event.object
!     handler = event.originator
  
    def OnSize(self, event):
      if not self.finalized:
***************
*** 184,190 ****
  
  
    # Runtime Setting Support
- 
    def finalize(self):
  
      self.finalized = 1
--- 194,199 ----
Index: gnue/designer/src/ToolFrame.py
diff -c gnue/designer/src/ToolFrame.py:1.13 gnue/designer/src/ToolFrame.py:1.14
*** gnue/designer/src/ToolFrame.py:1.13 Fri Nov 22 20:48:02 2002
--- gnue/designer/src/ToolFrame.py      Mon Nov 25 00:41:42 2002
***************
*** 30,44 ****
  from gnue.common import RuntimeSettings
  from wxPython.wx import *
  from gnue.common import GDebug
  
  #
  # Any tool frames inherit from this
  # It handles the Window menu and
  # saving size/position/display settings
  #
! class ToolFrame (wxFrame):
  
-   # TODO: Set by the toolpanel??
    default_width = 200
    default_height = 150
    default_visible = 0
--- 30,44 ----
  from gnue.common import RuntimeSettings
  from wxPython.wx import *
  from gnue.common import GDebug
+ from ToolDock import ToolDock
  
  #
  # Any tool frames inherit from this
  # It handles the Window menu and
  # saving size/position/display settings
  #
! class ToolFrame (wxFrame, ToolDock):
  
    default_width = 200
    default_height = 150
    default_visible = 0
***************
*** 56,66 ****
      self.runtime_section = "ToolFrame-%s" % string.replace(self.title,' ','')
      self.instance = instance
  
-     # Add ourselves to the Window menu
-     self.menutool = self.instance._menubar.addTool(self, title)
- 
      EVT_CLOSE(self, self.OnClose)
! 
  
    def finalize(self):
  
--- 56,66 ----
      self.runtime_section = "ToolFrame-%s" % string.replace(self.title,' ','')
      self.instance = instance
  
      EVT_CLOSE(self, self.OnClose)
! ##    EVT_SIZE(self, self.OnSize)
! ##
! ##  def OnSize(self, evt):
! ##    self.child.SetSize(self.GetClientSize())
  
    def finalize(self):
  
***************
*** 89,113 ****
                'y': y,
                'height': height,
                'width': width,
!               'visible': self.menutool.menu.IsChecked() } )
  
  
    # This event is set by MenuBar.addTool
    # Called whenever menu item is selected
    def OnMenuSelected(self, event):
!     if self.menutool.menu.IsChecked():
        self.show()
      else:
        self.hide()
  
    def show(self):
!     self.menutool.menu.SetHelp(_("Hide the %s window")  % self.title)
!     self.menutool.menu.Check(1)
      self.Show(1)
  
    def hide(self):
!     self.menutool.menu.SetHelp(_("Show the %s window") % self.title)
!     self.menutool.menu.Check(0)
      self.Show(0)
  
    def OnClose(self, event):
--- 89,113 ----
                'y': y,
                'height': height,
                'width': width,
!               'visible': self.control._menutool.menu.IsChecked() } )
  
  
    # This event is set by MenuBar.addTool
    # Called whenever menu item is selected
    def OnMenuSelected(self, event):
!     if self.control._menutool.menu.IsChecked():
        self.show()
      else:
        self.hide()
  
    def show(self):
!     self.control._menutool.menu.SetHelp(_("Hide the %s window")  % self.title)
!     self.control._menutool.menu.Check(1)
      self.Show(1)
  
    def hide(self):
!     self.control._menutool.menu.SetHelp(_("Show the %s window") % self.title)
!     self.control._menutool.menu.Check(0)
      self.Show(0)
  
    def OnClose(self, event):
Index: gnue/designer/src/ToolPanel.py
diff -c gnue/designer/src/ToolPanel.py:1.1 gnue/designer/src/ToolPanel.py:1.2
*** gnue/designer/src/ToolPanel.py:1.1  Fri Nov 22 20:48:02 2002
--- gnue/designer/src/ToolPanel.py      Mon Nov 25 00:41:42 2002
***************
*** 28,48 ****
  #
  
  from wxPython.wx import *
! from gnue.common import RuntimeSettings
  
  DOCK_FRAME = 'frame'    # The tool has its own frame
  DOCK_LEFT = 'left'      # The tool is in the left split of the main window
  DOCK_TOP = 'top'        # The tool is in the top split of the main window
  DOCK_BOTTOM = 'bottom'  # The tool is in the bottom split of the main window
  
! class ToolPanel (wxPanel):
  
    default_visible = 0
    default_dock = DOCK_FRAME
    runtime_section = ""
  
    def __init__(self, instance, rootObject, parentWindow):
      wxPanel.__init__(self,parentWindow,-1)
      self.frame = parentWindow
      self.instance = instance
      self.rootObject = rootObject
--- 28,51 ----
  #
  
  from wxPython.wx import *
! from gnue.common import RuntimeSettings, events
  
  DOCK_FRAME = 'frame'    # The tool has its own frame
  DOCK_LEFT = 'left'      # The tool is in the left split of the main window
  DOCK_TOP = 'top'        # The tool is in the top split of the main window
  DOCK_BOTTOM = 'bottom'  # The tool is in the bottom split of the main window
  
! class ToolPanel (wxPanel, events.EventAware):
  
    default_visible = 0
    default_dock = DOCK_FRAME
    runtime_section = ""
+   uses_feedback_header = 0
  
    def __init__(self, instance, rootObject, parentWindow):
      wxPanel.__init__(self,parentWindow,-1)
+     events.EventAware.__init__(self, instance.eventController)
+ 
      self.frame = parentWindow
      self.instance = instance
      self.rootObject = rootObject
***************
*** 54,56 ****
--- 57,65 ----
    def saveRuntimeSettings(self):
      return (self.runtime_section, {})
  
+   def setHeaderText(self, text):
+     self.frame.setFeedbackText(text)
+ 
+   # Over-written by the parent docks
+   def setHeaderText(self, text):
+     return
Index: gnue/designer/src/TreeView.py
diff -c gnue/designer/src/TreeView.py:1.25 gnue/designer/src/TreeView.py:1.26
*** gnue/designer/src/TreeView.py:1.25  Fri Nov 22 20:48:02 2002
--- gnue/designer/src/TreeView.py       Mon Nov 25 00:41:42 2002
***************
*** 44,49 ****
--- 44,58 ----
  
  
    def init(self):
+ 
+     # EventAware provided by ToolPanel
+     self.registerEventListeners({
+                        'ObjectSelected'      : self.onSetCurrentObject,
+                        'ObjectCreated'       : self.onCreateObject,
+                        'ObjectModified'      : self.onModifyObject,
+                        'ObjectDeleted'       : self.onDeleteObject,
+                       })
+ 
      self.tree = wxTreeCtrl(self, wxNewId(),
         style=wxTR_HAS_BUTTONS|wxTR_EDIT_LABELS|wxTR_HAS_VARIABLE_ROW_HEIGHT)
      self._handler = None
***************
*** 68,74 ****
      rv = self.tree.AppendItem(parent, description)
      return rv
  
!   def onSetCurrentObject (self, object, handler):
      if object == None:
        return
      if handler != __name__:
--- 77,85 ----
      rv = self.tree.AppendItem(parent, description)
      return rv
  
!   def onSetCurrentObject (self, event):
!     object = event.object
!     handler = event.originator
      if object == None:
        return
      if handler != __name__:
***************
*** 77,83 ****
        self.tree.SelectItem(object._treeItem)
        self._handler = None
  
!   def onCreateObject (self, object, handler):
      if object == None:
        return
      if handler != __name__:
--- 88,96 ----
        self.tree.SelectItem(object._treeItem)
        self._handler = None
  
!   def onCreateObject (self, event):
!     object = event.object
!     handler = event.originator
      if object == None:
        return
      if handler != __name__:
***************
*** 87,102 ****
          pass
        self.inventoryObject(object)
  
!   def onModifyObject (self, object, handler, modifications):
      if object == None:
        return
      if handler != __name__:
!       for modification in modifications:
!         attribute, value = modification
          if attribute == 'name' and object != self.rootObject:
!           self.SetItemText(object._treeItem, object.getDescription())
  
!   def onDeleteObject (self, object, handler):
      if object == None:
        return
      if hasattr(object, '_treeItemTrigger'):
--- 100,119 ----
          pass
        self.inventoryObject(object)
  
!   def onModifyObject (self, event):
!     object = event.object
!     handler = event.originator
      if object == None:
        return
      if handler != __name__:
!       for attribute in event.new.keys():
!         value = event.new[attribute]
          if attribute == 'name' and object != self.rootObject:
!           self.tree.SetItemText(object._treeItem, object.getDescription())
  
!   def onDeleteObject (self, event):
!     object = event.object
!     handler = event.originator
      if object == None:
        return
      if hasattr(object, '_treeItemTrigger'):
Index: gnue/designer/src/TriggerEditor.py
diff -c gnue/designer/src/TriggerEditor.py:1.21 
gnue/designer/src/TriggerEditor.py:1.22
*** gnue/designer/src/TriggerEditor.py:1.21     Fri Nov 22 20:48:02 2002
--- gnue/designer/src/TriggerEditor.py  Mon Nov 25 00:41:42 2002
***************
*** 55,62 ****
  
      self.editor = EditorCtrl(self,-1, pos=wxPoint(0,32))
  
!     self.SetSize(self.frame.GetClientSize())
!     self.editor.SetSize(self.GetClientSize())
      self.object = None
  
      self.namedTriggerList = []
--- 55,62 ----
  
      self.editor = EditorCtrl(self,-1, pos=wxPoint(0,32))
  
! #    self.SetSize(self.frame.GetClientSize())
! #    self.editor.SetSize(self.GetClientSize())
      self.object = None
  
      self.namedTriggerList = []
***************
*** 84,89 ****
--- 84,97 ----
      self.namedTriggerCombo = wxComboBox(self.toolpanel, -1, 
pos=wxPoint(self.namedNameLabel.GetSize().width + 10,4), style=wxCB_READONLY)
      EVT_COMBOBOX(self, self.namedTriggerCombo.GetId(), 
self.OnNamedTriggerSelected)
  
+     # EventAware provided by ToolPanel
+     self.registerEventListeners({
+                        'ObjectSelected'      : self.onSetCurrentObject,
+                        'ObjectCreated'       : self.onCreateObject,
+                        'ObjectModified'      : self.onModifyObject,
+                        'ObjectDeleted'       : self.onDeleteObject,
+                       })
+ 
      self.rootObject.walk(self.inventoryObject)
  
  
***************
*** 98,104 ****
      self.editor.SetSize(wxSize(w,h-32))
  
  
!   def onSetCurrentObject (self, object, handler):
      if object == None:
        return
  
--- 106,114 ----
      self.editor.SetSize(wxSize(w,h-32))
  
  
!   def onSetCurrentObject (self, event):
!     object = event.object
!     handler = event.originator
      if object == None:
        return
  
***************
*** 146,170 ****
      if self.object != None and not self.__ignoreevent:
        self.object._children[0]._content = self.editor.GetText()
  
!   def onCreateObject (self, object, handler):
      if object == None:
        return
  
      self.inventoryObject(object)
  
!   def onModifyObject (self, object, handler, modifications):
      if object == None:
        return
      if handler != __name__:
-       for modification in modifications:
-         attribute, value = modification
  
        if isinstance(object, GTrigger.GTrigger):
          if object.type == 'NAMED':
            self.refillNamedTriggerCombo()
  
  
!   def onDeleteObject (self, object, handler):
      if object == None:
        return
  
--- 156,185 ----
      if self.object != None and not self.__ignoreevent:
        self.object._children[0]._content = self.editor.GetText()
  
!   def onCreateObject (self, event):
!     object = event.object
!     handler = event.originator
      if object == None:
        return
  
      self.inventoryObject(object)
  
!   def onModifyObject (self, event):
!     object = event.object
!     handler = event.originator
!     
      if object == None:
        return
      if handler != __name__:
  
        if isinstance(object, GTrigger.GTrigger):
          if object.type == 'NAMED':
            self.refillNamedTriggerCombo()
  
  
!   def onDeleteObject (self, event):
!     object = event.object
!     handler = event.originator
      if object == None:
        return
  
***************
*** 183,189 ****
  
   if int(gConfig('ForceSimpleEditor',section="designer")):
     raise ImportError
!    
   from wxPython.stc import *
   USE_STC = 1
  
--- 198,204 ----
  
   if int(gConfig('ForceSimpleEditor',section="designer")):
     raise ImportError
! 
   from wxPython.stc import *
   USE_STC = 1
  
Index: gnue/designer/src/forms/Incubator.py
diff -c gnue/designer/src/forms/Incubator.py:1.2 
gnue/designer/src/forms/Incubator.py:1.3
*** gnue/designer/src/forms/Incubator.py:1.2    Thu Jul  4 14:45:08 2002
--- gnue/designer/src/forms/Incubator.py        Mon Nov 25 00:41:42 2002
***************
*** 52,58 ****
    except KeyError:
      GDebug.printMesg(1, "Attempted to create a '%s', "
                          "but I don't know what to do!" % tag)
!     return
  
  
    if tag == 'trigger':
--- 52,58 ----
    except KeyError:
      GDebug.printMesg(1, "Attempted to create a '%s', "
                          "but I don't know what to do!" % tag)
!     return 1
  
  
    if tag == 'trigger':
***************
*** 100,107 ****
    o.name = name
    instance.nameMappings[o.name] = o
    o._buildObject()
!   instance.onCreateObject(o, __name__)
!   instance.onSetCurrentObject(o, __name__)
    return o
  
  
--- 100,107 ----
    o.name = name
    instance.nameMappings[o.name] = o
    o._buildObject()
!   instance.dispatchEvent('ObjectCreated',object=o, originator=__name__)
!   instance.dispatchEvent('ObjectSelected',object=object, originator=__name__)
    return o
  
  
***************
*** 116,128 ****
  def deleteObject(instance, form, object, newCurrentObject=None, firstRun=1):
  
    if firstRun:
!     newCurrentObject = object._parent
!     parent = object._parent
  
    for child in object._children:
      child.deleteObject(instance, form, child, firstRun=0)
  
!   instance.onDeleteObject(object, __name__)
  
    if firstRun:
      o = parent
--- 116,127 ----
  def deleteObject(instance, form, object, newCurrentObject=None, firstRun=1):
  
    if firstRun:
!     newCurrentObject = parent = object._parent
  
    for child in object._children:
      child.deleteObject(instance, form, child, firstRun=0)
  
!   instance.dispatchEvent('ObjectDeleted',object=object, originator=__name__)
  
    if firstRun:
      o = parent
***************
*** 131,137 ****
        o = o._parent
  
      if newCurrentObject:
!       instance.onSetCurrentObject(newCurrentObject, __name__)
  
  
  
--- 130,136 ----
        o = o._parent
  
      if newCurrentObject:
!       instance.dispatchEvent('ObjectSelected',object=object, 
originator=__name__)
  
  
  
Index: gnue/designer/src/forms/Instance.py
diff -c gnue/designer/src/forms/Instance.py:1.17 
gnue/designer/src/forms/Instance.py:1.18
*** gnue/designer/src/forms/Instance.py:1.17    Fri Nov 22 20:48:02 2002
--- gnue/designer/src/forms/Instance.py Mon Nov 25 00:41:42 2002
***************
*** 72,77 ****
--- 72,80 ----
  
      BaseInstance.__init__(self, app, *args, **params)
  
+     self.registerEventListeners({
+                        'ObjectModified' : self.onModifyObject,
+                       })
  
    def loadBuffer(self, buffer):
      form = GFParser.loadFile (buffer, self, initialize=0)
***************
*** 93,117 ****
  
  
    def inventoryObject(self, object):
!     if isinstance(object, GFObjects.GFPage) and \
          object._parent == self.rootObject:
        self._pages.append(object)
  
      object._popupMenu = ObjectMenu(self, object)
  
  
    def createTools(self):
!     self.addTool('visualEditor', _('Layout Editor'), LayoutEditor)
!     self.addTool('propertyEditor', _('Property Inspector'), PropertyEditor)
!     self.addTool('treeEditor', _('Object Navigator'), TreeView)
!     self.addTool('schemaViewer', _('Schema Navigator'), SchemaViewer)
      self.addToolSeparator()
!     self.addTool('datasourceEditor', _('Data Source Editor'), 
DataSourceEditor)
!     #self.addTool('blockEditor', _('Block Editor'), BlockEditor)
!     #self.addTool('fieldEditor', _('Field Editor'), FieldEditor)
      self.addToolSeparator()
!     self.addTool('eventEditor', _('Trigger Inspector'), EventEditor)
!     self.addTool('triggerEditor', _('Code Editor'), TriggerEditor)
  
    def createWizards(self):
      self.loadWizards(wizards)
--- 96,130 ----
  
  
    def inventoryObject(self, object):
!     if object._type == 'GFForm':
!       object._blockMap = {}
!     elif object._type == 'GFBlock':
!       if self.rootObject._blockMap.has_key(object.name):
!         raise "Warning: Multiple blocks with name %s" % object.name
!       self.rootObject._blockMap[object.name] = object
! 
!     elif isinstance(object, GFObjects.GFPage) and \
          object._parent == self.rootObject:
        self._pages.append(object)
  
      object._popupMenu = ObjectMenu(self, object)
  
  
+   def onModifyObject(self, event):
+     object = event.object
+ 
    def createTools(self):
!     self.addTool('visualEditor',   _('Layout Editor'), LayoutEditor, 'F11')
!     self.addTool('propertyEditor', _('Property Inspector'), PropertyEditor, 
'F10')
!     self.addTool('treeEditor',     _('Object Navigator'), TreeView, 'F8')
!     self.addTool('schemaViewer',   _('Schema Navigator'), SchemaViewer)
      self.addToolSeparator()
!     self.addTool('datasourceEditor',_('Data Source Editor'), DataSourceEditor)
!     #self.addTool('blockEditor',   _('Block Editor'), BlockEditor, 'F5')
!     #self.addTool('fieldEditor',   _('Field Editor'), FieldEditor, 'F6')
      self.addToolSeparator()
!     self.addTool('eventEditor',    _('Trigger Inspector'), EventEditor, 'F7')
!     self.addTool('triggerEditor',  _('Code Editor'), TriggerEditor, 'F12')
  
    def createWizards(self):
      self.loadWizards(wizards)
Index: gnue/designer/src/forms/LayoutEditor/LayoutEditor.py
diff -c gnue/designer/src/forms/LayoutEditor/LayoutEditor.py:1.34 
gnue/designer/src/forms/LayoutEditor/LayoutEditor.py:1.35
*** gnue/designer/src/forms/LayoutEditor/LayoutEditor.py:1.34   Fri Nov 22 
20:48:02 2002
--- gnue/designer/src/forms/LayoutEditor/LayoutEditor.py        Mon Nov 25 
00:41:42 2002
***************
*** 50,55 ****
--- 50,56 ----
  
    runtime_section = "FormsLayoutEditor"
    default_dock = DOCK_TOP
+   uses_feedback_header = 1
  
    def init(self):
  
***************
*** 59,70 ****
      self._app = self.instance._app
      self.widgets = {}
      self.widgets.update(UIwxpython.WIDGETS)
!     self.toolbar = LayoutEditorTools(self, self.frame)
      del self.widgets['GFPage']
  
      self.notebook = wxNotebook(self, -1, pos=wxPoint(4, 4), 
size=wxSize(32,32))
      self.backcolor = wxWHITE
!     self.propBar = PropertyBar(self)
  
      EVT_NOTEBOOK_PAGE_CHANGED(self,self.notebook.GetId(), self.OnPageSelected)
      EVT_SIZE(self, self.OnSize)
--- 60,71 ----
      self._app = self.instance._app
      self.widgets = {}
      self.widgets.update(UIwxpython.WIDGETS)
! ##    self.toolbar = LayoutEditorTools(self, self.frame)
      del self.widgets['GFPage']
  
      self.notebook = wxNotebook(self, -1, pos=wxPoint(4, 4), 
size=wxSize(32,32))
      self.backcolor = wxWHITE
! ##    self.propBar = PropertyBar(self)
  
      EVT_NOTEBOOK_PAGE_CHANGED(self,self.notebook.GetId(), self.OnPageSelected)
      EVT_SIZE(self, self.OnSize)
***************
*** 84,96 ****
      self.__ox = 0
      self.__oy = 0
  
      self.instance.rootObject.walk (self.inventoryObject)
      try:
        self._setCurrentPage(self._notebookMap[0])
      except KeyError:
        pass
  
!     self.frame.SetToolBar(self.toolbar)
  
    def inventoryObject(self, object):
      if object._type == 'GFPage':
--- 85,108 ----
      self.__ox = 0
      self.__oy = 0
  
+ 
+     # EventAware provided by ToolPanel
+     self.registerEventListeners({
+                        'ObjectSelected'      : self.onSetCurrentObject,
+                        'ObjectCreated'       : self.onCreateObject,
+                        'ObjectModified'      : self.onModifyObject,
+                        'ObjectDeleted'       : self.onDeleteObject,
+                       })
+ 
      self.instance.rootObject.walk (self.inventoryObject)
      try:
        self._setCurrentPage(self._notebookMap[0])
      except KeyError:
        pass
  
! ## TODO: Fix me
! ##    self.frame.SetToolBar(self.toolbar)
! ##
  
    def inventoryObject(self, object):
      if object._type == 'GFPage':
***************
*** 115,131 ****
        self.drawPage(object)
  
  
!   def onSetCurrentObject (self, object, handler):
      self._currentObject = object
      if object == None:
        for o in self._currentSelection.keys():
          o.setSelected(0)
        return
!     if hasattr(object, '_widgetHandler'):
!       self.propBar.setCurrentObject(object)
      if handler != "Forms::LayoutEditor":
        self._setCurrentPage(object)
  
  
    def _setCurrentPage(self, object):
  
--- 127,152 ----
        self.drawPage(object)
  
  
!   def onSetCurrentObject (self, event):
!     object = event.object
!     handler = event.originator
      self._currentObject = object
      if object == None:
        for o in self._currentSelection.keys():
          o.setSelected(0)
        return
! ##    if hasattr(object, '_widgetHandler'):
! ##      self.propBar.setCurrentObject(object)
      if handler != "Forms::LayoutEditor":
        self._setCurrentPage(object)
  
+   def _setCurrentBlock(self,object): 
+     if not object: 
+       return
+     block = self.findParentOfType('GFBlock')
+     if not block:
+       if object._type == 'GFField': 
+         block = object._block
  
    def _setCurrentPage(self, object):
  
***************
*** 164,171 ****
        object._widgetHandler.setSelected(1)
  
  
!   def onCreateObject (self, object, handler):
! 
      self._currentSelection = {}
      if object == None:
        return
--- 185,193 ----
        object._widgetHandler.setSelected(1)
  
  
!   def onCreateObject (self, event):
!     object = event.object
!     handler = event.originator
      self._currentSelection = {}
      if object == None:
        return
***************
*** 183,206 ****
        self._setCurrentPage(origpage)
  
  
!   def onModifyObject (self, object, handler, modifications):
      if object == None:
        return
  
      # TODO: adjust label width to match new length...this shouldn't be here
      if object._type == 'GFLabel':
        mods = []
!       for field, value in modifications:
          if field=='text':
            #TODO: this will butcher align=center setups
            if (not hasattr(object,'alignment')) or ( object.alignment == 
'left'):
!             object.width=len(value)
!             mods.append( ('width',len(value)) )
!     else:
!       mods = modifications
! 
!     self.propBar.onModifyObject(object, handler, mods)
  
  
      if handler != "Forms::LayoutEditor":
        if object._type == 'GFPage':
--- 205,230 ----
        self._setCurrentPage(origpage)
  
  
!   def onModifyObject (self, event):
!     object = event.object
!     handler = event.originator
      if object == None:
        return
  
      # TODO: adjust label width to match new length...this shouldn't be here
      if object._type == 'GFLabel':
        mods = []
!       for field in event.new.keys():
!         value = event.new[field]
          if field=='text':
            #TODO: this will butcher align=center setups
            if (not hasattr(object,'alignment')) or ( object.alignment == 
'left'):
!             if not hasattr(object,'width') or object.width != len(value):
!               object.width=len(value)
!               # TODO: This should probably trigger a new ObjectModified event
!               event.new['width'] = object.width
  
+ ##    self.propBar.onModifyObject(object, event)
  
      if handler != "Forms::LayoutEditor":
        if object._type == 'GFPage':
***************
*** 215,221 ****
          self.refreshPage(self.page)
  
  
!   def onDeleteObject (self, object, handler):
  
      self._currentObject = None
  
--- 239,247 ----
          self.refreshPage(self.page)
  
  
!   def onDeleteObject (self, event):
!     object = event.object
!     handler = event.originator
  
      self._currentObject = None
  
***************
*** 351,364 ****
        self.widgetList.append(object)
  
    def OnSize(self, event):
!     self.propBar.SetSize(wxSize(self.GetClientSize().x, 
self.propBar.GetSize().y))
!     self.propBar.SetPosition(wxPoint(0, self.GetClientSize().y - 
self.propBar.GetSize().y))
!     self.notebook.SetSize(wxSize(self.GetClientSize().x-8, 
self.GetClientSize().y - 8 - self.propBar.GetSize().y))
  
    def OnPageSelected(self, event):
      p = self._notebookMap[event.GetSelection()]
      if p != self.page:
!       self.instance.onSetCurrentObject(p, "Forms::LayoutEditor")
      self._setCurrentPage(p)
  
  
--- 377,390 ----
        self.widgetList.append(object)
  
    def OnSize(self, event):
! ##    self.propBar.SetSize(wxSize(self.GetClientSize().x, 
self.propBar.GetSize().y))
! ##    self.propBar.SetPosition(wxPoint(0, self.GetClientSize().y - 
self.propBar.GetSize().y))
!     self.notebook.SetSize(wxSize(self.GetClientSize().x-8, 
self.GetClientSize().y - 8))# - self.propBar.GetSize().y))
  
    def OnPageSelected(self, event):
      p = self._notebookMap[event.GetSelection()]
      if p != self.page:
!       self.dispatchEvent('ObjectSelected', object=p, 
originator="Forms::LayoutEditor")
      self._setCurrentPage(p)
  
  
***************
*** 469,475 ****
  
  
    def OnRightUp(self, event):
!     self.toolbar.resetTool(self.mode)
      self.mode = 'move'
  
      x, y = event.GetPositionTuple()
--- 495,501 ----
  
  
    def OnRightUp(self, event):
! ##    self.toolbar.resetTool(self.mode)
      self.mode = 'move'
  
      x, y = event.GetPositionTuple()
Index: gnue/designer/src/forms/LayoutEditor/PropertyBar.py
diff -c gnue/designer/src/forms/LayoutEditor/PropertyBar.py:1.3 
gnue/designer/src/forms/LayoutEditor/PropertyBar.py:1.4
*** gnue/designer/src/forms/LayoutEditor/PropertyBar.py:1.3     Sat May  4 
12:45:08 2002
--- gnue/designer/src/forms/LayoutEditor/PropertyBar.py Mon Nov 25 00:41:42 2002
***************
*** 160,166 ****
        self.nameEditor.SetValue(0)
        self.nameEditor.SetEditable(0)
  
!   def onModifyObject (self, object, handler, modifications):
      if object == None:
        return
      if object == self.object:
--- 160,167 ----
        self.nameEditor.SetValue(0)
        self.nameEditor.SetEditable(0)
  
!   def onModifyObject (self, event):
!     raise "I have not been fixed yet!"
      if object == None:
        return
      if object == self.object:
Index: gnue/designer/src/forms/LayoutEditor/WidgetHandler.py
diff -c gnue/designer/src/forms/LayoutEditor/WidgetHandler.py:1.4 
gnue/designer/src/forms/LayoutEditor/WidgetHandler.py:1.5
*** gnue/designer/src/forms/LayoutEditor/WidgetHandler.py:1.4   Sat May  4 
12:45:08 2002
--- gnue/designer/src/forms/LayoutEditor/WidgetHandler.py       Mon Nov 25 
00:41:42 2002
***************
*** 128,134 ****
  
      if not self.instance._currentSelection.has_key(self):
        self.instance._currentSelection[self] = 1
!       
self.instance._instance.onSetCurrentObject(self.object,"Forms::LayoutEditor")
        self.setSelected(1)
        self._alreadySelected = 0
      else:
--- 128,134 ----
  
      if not self.instance._currentSelection.has_key(self):
        self.instance._currentSelection[self] = 1
!       
self.instance._instance.dispatchEvent('ObjectSelected',object=self.object,originator="Forms::LayoutEditor")
        self.setSelected(1)
        self._alreadySelected = 0
      else:
***************
*** 199,205 ****
  
    def OnRightUp(self, event):
      pt = event.GetPositionTuple()
!     self.instance._instance.onSetCurrentObject(self.object, None)
      wxPyTypeCast(event.GetEventObject(),'wxWindow') \
         .PopupMenu(self.object._popupMenu, pt)
      event.Skip()
--- 199,205 ----
  
    def OnRightUp(self, event):
      pt = event.GetPositionTuple()
!     self.instance.dispatchEvent('ObjectSelected',object=self.object, 
originator=None)
      wxPyTypeCast(event.GetEventObject(),'wxWindow') \
         .PopupMenu(self.object._popupMenu, pt)
      event.Skip()
***************
*** 207,215 ****
  
    def _endPopupEditor(self, success, value=""):
      if success:
!       self.object.__dict__[self.__popupAttr] = value
!       self.instance._instance.onModifyObject(self.object,
!             "Forms::LayoutEditor", ((self.__popupAttr, value),))
        self._popup_editor.Destroy()
        self._popup_editor = None
        self.widget.SetLabel(value or "<Unset>")
--- 207,224 ----
  
    def _endPopupEditor(self, success, value=""):
      if success:
! 
!       try:
!         oldVals = {self.__popupAttr:self.object.__dict__[self.__popupAttr]}
!       except KeyError:
!         oldVals = {self.__popupAttr:None}
!       newVals = {self.__popupAttr: value}
!       self.object.__dict__.update(newVals)
!       self.instance.dispatchEvent('ObjectModified', object=self.object,
!                                   originator="Forms::LayoutEditor",
!                                   old=oldVals,
!                                   new=newVals)
! 
        self._popup_editor.Destroy()
        self._popup_editor = None
        self.widget.SetLabel(value or "<Unset>")
***************
*** 269,282 ****
        for widget in self.mainWidget.widgets:
          x,y = widget.GetSizeTuple()
          widget.SetSize(wxSize(x + nx,y + ny))
!       changes = []
        if dx:
          self.object.width = self.object.width + dx
!         changes.append(['width',self.object.width])
        if dy:
          self.object.height = self.object.height + dy
!         changes.append(['height',self.object.height])
!       self.instance._instance.onModifyObject(self.object, 
"Forms::LayoutEditor", changes)
        self.recalcBoundaries()
  
  
--- 278,300 ----
        for widget in self.mainWidget.widgets:
          x,y = widget.GetSizeTuple()
          widget.SetSize(wxSize(x + nx,y + ny))
! 
!       oldVals = {}
!       newVals = {}
        if dx:
+         oldVals['width'] = self.object.width
          self.object.width = self.object.width + dx
!         newVals['width'] = self.object.width
        if dy:
+         oldVals['height'] = self.object.height
          self.object.height = self.object.height + dy
!         newVals['height'] = self.object.height
! 
!       self.instance.dispatchEvent('ObjectModified', object=self.object,
!                                   originator="Forms::LayoutEditor",
!                                   old=oldVals,
!                                   new=newVals)
! 
        self.recalcBoundaries()
  
  
***************
*** 298,312 ****
        for widget in self.mainWidget.widgets:
          x,y = widget.GetPositionTuple()
          widget.SetPosition(wxPoint(x + nx,y + ny))
!       changes = []
        if dx:
          self.object.x = self.object.x + dx
!         changes.append(['x',self.object.x])
        if dy:
          self.object.y = self.object.y + dy
!         changes.append(['y',self.object.y])
!       self.instance._instance.onModifyObject(self.object,
!            "Forms::LayoutEditor", changes)
        self.recalcBoundaries()
  
    #
--- 316,337 ----
        for widget in self.mainWidget.widgets:
          x,y = widget.GetPositionTuple()
          widget.SetPosition(wxPoint(x + nx,y + ny))
!       oldVals = {}
!       newVals = {}
        if dx:
+         oldVals['x'] = self.object.x
          self.object.x = self.object.x + dx
!         newVals['x'] = self.object.x
        if dy:
+         oldVals['y'] = self.object.y
          self.object.y = self.object.y + dy
!         newVals['y'] = self.object.y
! 
!       self.instance.dispatchEvent('ObjectModified', object=self.object,
!                                   originator="Forms::LayoutEditor",
!                                   old=oldVals,
!                                   new=newVals)
! 
        self.recalcBoundaries()
  
    #
Index: gnue/designer/src/forms/TreeView.py
diff -c gnue/designer/src/forms/TreeView.py:1.4 
gnue/designer/src/forms/TreeView.py:1.5
*** gnue/designer/src/forms/TreeView.py:1.4     Fri Nov 22 20:48:02 2002
--- gnue/designer/src/forms/TreeView.py Mon Nov 25 00:41:42 2002
***************
*** 46,51 ****
--- 46,59 ----
  
      BaseTreeView.init(self)
  
+     logic = None
+     layout = None
+     for child in self.rootObject._children:
+       if child._type == 'GFLogic':
+         logic = child
+       elif child._type == 'GFLayout':
+         layout = child
+ 
      self.rootObject._treeItemFormProperties = \
          self.AppendItem(self.rootObject._treeItem, _("Properties"))
      self.tree.SetItemImage(self.rootObject._treeItemFormProperties, 
treeIconMap['properties'])
***************
*** 58,64 ****
      self.rootObject._treeItemNamedTriggers = \
          self.AppendItem(self.rootObject._treeItem, _("Shared Triggers"))
      self.tree.SetItemImage(self.rootObject._treeItemNamedTriggers, 
treeIconMap['trigger'])
!     self.rootObject._treeItemPageLayout = \
          self.AppendItem(self.rootObject._treeItem, _("Page Layout"))
      self.tree.SetItemImage(self.rootObject._treeItemPageLayout, 
treeIconMap['page'])
  
--- 66,75 ----
      self.rootObject._treeItemNamedTriggers = \
          self.AppendItem(self.rootObject._treeItem, _("Shared Triggers"))
      self.tree.SetItemImage(self.rootObject._treeItemNamedTriggers, 
treeIconMap['trigger'])
!     self.rootObject._treeItemLogic = logic._treeItem = \
!         self.AppendItem(self.rootObject._treeItem, _("Field Logic"))
!     self.tree.SetItemImage(self.rootObject._treeItemLogic, 
treeIconMap['block'])
!     self.rootObject._treeItemPageLayout = layout._treeItem = \
          self.AppendItem(self.rootObject._treeItem, _("Page Layout"))
      self.tree.SetItemImage(self.rootObject._treeItemPageLayout, 
treeIconMap['page'])
  
***************
*** 66,72 ****
      self.tree.SetPyData(self.rootObject._treeItemFormProperties, 
ObjectMenu(self.instance,None))
      self.tree.SetPyData(self.rootObject._treeItemDataSources, 
ObjectMenu(self.instance,None))
      self.tree.SetPyData(self.rootObject._treeItemNamedTriggers, 
ObjectMenu(self.instance,None))
!     self.tree.SetPyData(self.rootObject._treeItemPageLayout, 
ObjectMenu(self.instance,None))
  
      self.rootObject.walk(self.inventoryObject)
  
--- 77,84 ----
      self.tree.SetPyData(self.rootObject._treeItemFormProperties, 
ObjectMenu(self.instance,None))
      self.tree.SetPyData(self.rootObject._treeItemDataSources, 
ObjectMenu(self.instance,None))
      self.tree.SetPyData(self.rootObject._treeItemNamedTriggers, 
ObjectMenu(self.instance,None))
!     self.tree.SetPyData(self.rootObject._treeItemLogic, logic)
!     self.tree.SetPyData(self.rootObject._treeItemPageLayout, layout)
  
      self.rootObject.walk(self.inventoryObject)
  
***************
*** 78,83 ****
--- 90,98 ----
           object._parent == self.rootObject:
          object._treeItem = self.rootObject._treeItemFormProperties
          icon = 'properties'
+       elif object._type in ('GFLogic','GFLayout') and \
+            object._parent == self.rootObject:
+         pass
        else:
          parentTreeItem = object._parent._treeItem
          if isinstance(object, GTrigger.GTrigger) and \
***************
*** 100,106 ****
            icon = 'datasource'
          elif isinstance(object, GFObjects.GFPage) and \
               object._parent == self.rootObject:
-           parentTreeItem = self.rootObject._treeItemPageLayout
            icon = 'page'
          elif object._type in ('GFBlock',):
            icon = 'block'
--- 115,120 ----
Index: gnue/designer/src/navigator/LayoutEditor.py
diff -c gnue/designer/src/navigator/LayoutEditor.py:1.5 
gnue/designer/src/navigator/LayoutEditor.py:1.6
*** gnue/designer/src/navigator/LayoutEditor.py:1.5     Sat May  4 12:45:08 2002
--- gnue/designer/src/navigator/LayoutEditor.py Mon Nov 25 00:41:42 2002
***************
*** 30,49 ****
  from wxPython.wx import *
  from gnue.common import GDebug
  from gnue.common import RuntimeSettings
  
  
! class LayoutEditor (wxPanel):
  
!   def __init__(self, instance, rootObject, parentWindow):
!     wxPanel.__init__(self,parentWindow,-1)
!     self.instance = instance
!     self.rootObject = rootObject
!     self.frame = parentWindow
! 
! 
!     # Tell RuntimeSettings that we have information to save
!     self.runtime_section = 'ProcessVisualEditor'
!     RuntimeSettings.registerRuntimeSettingHandler(self.instance, self)
  
      self.splitter = wxSplitterWindow(self, -1)
  
--- 30,42 ----
  from wxPython.wx import *
  from gnue.common import GDebug
  from gnue.common import RuntimeSettings
+ from gnue.designer.ToolPanel import ToolPanel
  
+ class LayoutEditor (ToolPanel):
  
!   runtime_section = 'ProcessVisualEditor'
  
!   def init(self):
  
      self.splitter = wxSplitterWindow(self, -1)
  
***************
*** 59,91 ****
      self.tree.postInit()
  
  
  
    def inventoryObject(self, object):
      self.tree.inventoryObject(object)
  
! 
!   def onSetCurrentObject (self, object, handler):
      if object == None:
        return
      if handler != __name__:
        pass
  
  
!   def onCreateObject (self, object, handler):
      if object == None:
        return
      if handler != __name__:
        pass
  
  
!   def onModifyObject (self, object, handler, modifications):
      if object == None:
        return
      if handler != __name__:
        pass
  
  
!   def onDeleteObject (self, object, handler):
      if object == None:
        return
      if handler != __name__:
--- 52,99 ----
      self.tree.postInit()
  
  
+     # EventAware provided by ToolPanel
+     self.registerEventListeners({
+                        'ObjectSelected'      : self.onSetCurrentObject,
+                        'ObjectCreated'       : self.onCreateObject,
+                        'ObjectModified'      : self.onModifyObject,
+                        'ObjectDeleted'       : self.onDeleteObject,
+                       })
  
    def inventoryObject(self, object):
      self.tree.inventoryObject(object)
  
!   def onSetCurrentObject (self, event):
!     object = event.object
!     handler = event.originator
      if object == None:
        return
      if handler != __name__:
        pass
  
  
!   def onCreateObject (self, event):
!     object = event.object
!     handler = event.originator
      if object == None:
        return
      if handler != __name__:
        pass
  
  
!   def onModifyObject (self, event):
!     object = event.object
!     handler = event.originator
!     modifications = event.modifications
      if object == None:
        return
      if handler != __name__:
        pass
  
  
!   def onDeleteObject (self, event):
!     object = event.object
!     handler = event.originator
      if object == None:
        return
      if handler != __name__:
***************
*** 183,189 ****
    def OnEndEdit(self, event):
      object = self.GetPyData(event.GetItem())
      object.description = event.GetLabel()
!     self.editor.instance.onModifyObject(self, object, __name__)
      self.SetItemText(object._treeItem, self.getName(object,1))
      event.Veto()
  
--- 191,198 ----
    def OnEndEdit(self, event):
      object = self.GetPyData(event.GetItem())
      object.description = event.GetLabel()
!     # TODO: Change to new struct
! ##    self.editor.instance.onModifyObject(self, object, __name__)
      self.SetItemText(object._treeItem, self.getName(object,1))
      event.Veto()
  
Index: gnue/designer/src/reports/Incubator.py
diff -c gnue/designer/src/reports/Incubator.py:1.2 
gnue/designer/src/reports/Incubator.py:1.3
*** gnue/designer/src/reports/Incubator.py:1.2  Tue Jul 23 13:52:51 2002
--- gnue/designer/src/reports/Incubator.py      Mon Nov 25 00:41:42 2002
***************
*** 73,80 ****
    o.name = name
    instance.nameMappings[o.name] = o
    o._buildObject()
!   instance.onCreateObject(o, __name__)
!   instance.onSetCurrentObject(o, __name__)
    return o
  
  
--- 73,80 ----
    o.name = name
    instance.nameMappings[o.name] = o
    o._buildObject()
!   instance.dispatchEvent(events.Event('ObjectCreated',object=o, 
originator=__name__))
!   instance.dispatchEvent(events.Event('ObjectSelected',object=object, 
originator=__name__))
    return o
  
  
***************
*** 95,101 ****
    for child in object._children:
      child.deleteObject(instance, report, child, firstRun=0)
  
!   instance.onDeleteObject(object, __name__)
  
    if firstRun:
      o = parent
--- 95,101 ----
    for child in object._children:
      child.deleteObject(instance, report, child, firstRun=0)
  
!   instance.dispatchEvent(events.Event('ObjectDeleted',object=object, 
originator=__name__))
  
    if firstRun:
      o = parent
***************
*** 104,110 ****
        o = o._parent
  
      if newCurrentObject:
!       instance.onSetCurrentObject(newCurrentObject, __name__)
  
  
  
--- 104,110 ----
        o = o._parent
  
      if newCurrentObject:
!       instance.dispatchEvent(events.Event('ObjectSelected',object=object, 
originator=__name__))
  
  
  
Index: gnue/designer/src/reports/LayoutEditor.py
diff -c gnue/designer/src/reports/LayoutEditor.py:1.1 
gnue/designer/src/reports/LayoutEditor.py:1.2
*** gnue/designer/src/reports/LayoutEditor.py:1.1       Tue Jul 23 13:52:52 2002
--- gnue/designer/src/reports/LayoutEditor.py   Mon Nov 25 00:41:42 2002
***************
*** 28,58 ****
  #
  
  from wxPython.wx import *
  
! class LayoutEditor (wxPanel):
!   def __init__(self, instance, parentWindow):
!     wxPanel.__init__(self,parentWindow,-1)
!     self.frame = instance
      self.panelColor = self.GetBackgroundColour()
!     self._instance = instance
      self.rootObject = instance.rootObject
      self._app = instance._app
      self.rootObject.walk(self.inventoryObject)
  
!   def inventoryObject(self, object):
!     pass
! 
!   def onSetCurrentObject (self, object, handler):
!     pass
  
-   def onCreateObject (self, object, handler):
-     pass
  
!   def onModifyObject (self, object, handler, modifications):
      pass
  
!   def onDeleteObject (self, object, handler):
!     pass
  
  
  
--- 28,72 ----
  #
  
  from wxPython.wx import *
+ from gnue.designer.ToolPanel import ToolPanel
  
! class LayoutEditor (ToolPanel):
! 
!   def init(self):
      self.panelColor = self.GetBackgroundColour()
!     self._instance = self.instance
      self.rootObject = instance.rootObject
      self._app = instance._app
      self.rootObject.walk(self.inventoryObject)
  
!     # EventAware provided by ToolPanel
!     self.registerEventListeners({
!                        'ObjectSelected'      : self.onSetCurrentObject,
!                        'ObjectCreated'       : self.onCreateObject,
!                        'ObjectModified'      : self.onModifyObject,
!                        'ObjectDeleted'       : self.onDeleteObject,
!                       })
  
  
!   def inventoryObject(self, object):
      pass
  
!   def onSetCurrentObject (self, event):
!     object = event.object
!     handler = event.originator
! 
!   def onCreateObject (self, event):
!     object = event.object
!     handler = event.originator
! 
!   def onModifyObject (self, event):
!     object = event.object
!     handler = event.originator
!     modifications = event.modifications
! 
!   def onDeleteObject (self, event):
!     object = event.object
!     handler = event.originator
  
  
  
Index: gnue/designer/src/schema/Incubator.py
diff -c gnue/designer/src/schema/Incubator.py:1.3 
gnue/designer/src/schema/Incubator.py:1.4
*** gnue/designer/src/schema/Incubator.py:1.3   Mon Sep 16 19:26:10 2002
--- gnue/designer/src/schema/Incubator.py       Mon Nov 25 00:41:42 2002
***************
*** 73,80 ****
    o.name = name
    instance.nameMappings[o.name] = o
    o._buildObject()
!   instance.onCreateObject(o, __name__)
!   instance.onSetCurrentObject(o, __name__)
    return o
  
  
--- 73,80 ----
    o.name = name
    instance.nameMappings[o.name] = o
    o._buildObject()
!   instance.dispatchEvent(events.Event('ObjectCreated',object=o, 
originator=__name__))
!   instance.dispatchEvent(events.Event('ObjectSelected',object=object, 
originator=__name__))
    return o
  
  
***************
*** 95,101 ****
    for child in object._children:
      deleteObject(instance, schema, child, firstRun=0)
  
!   instance.onDeleteObject(object, __name__)
  
    if firstRun:
      o = parent
--- 95,101 ----
    for child in object._children:
      deleteObject(instance, schema, child, firstRun=0)
  
!   instance.dispatchEvent(events.Event('ObjectDeleted',object=object, 
originator=__name__))
  
    if firstRun:
      o = parent
***************
*** 104,110 ****
        o = o._parent
  
      if newCurrentObject:
!       instance.onSetCurrentObject(newCurrentObject, __name__)
  
  
  
--- 104,110 ----
        o = o._parent
  
      if newCurrentObject:
!       instance.dispatchEvent(events.Event('ObjectSelected',object=object, 
originator=__name__))
  
  
  
Index: gnue/designer/src/schema/LayoutEditor.py
diff -c gnue/designer/src/schema/LayoutEditor.py:1.1 
gnue/designer/src/schema/LayoutEditor.py:1.2
*** gnue/designer/src/schema/LayoutEditor.py:1.1        Fri Jun 28 11:19:32 2002
--- gnue/designer/src/schema/LayoutEditor.py    Mon Nov 25 00:41:42 2002
***************
*** 28,58 ****
  #
  
  from wxPython.wx import *
  
! class LayoutEditor (wxPanel):
!   def __init__(self, instance, parentWindow):
!     wxPanel.__init__(self,parentWindow,-1)
!     self.frame = instance
      self.panelColor = self.GetBackgroundColour()
-     self._instance = instance
-     self.rootObject = instance.rootObject
      self._app = instance._app
      self.rootObject.walk(self.inventoryObject)
  
!   def inventoryObject(self, object):
!     pass
! 
!   def onSetCurrentObject (self, object, handler):
!     pass
! 
!   def onCreateObject (self, object, handler):
!     pass
! 
!   def onModifyObject (self, object, handler, modifications):
!     pass
  
!   def onDeleteObject (self, object, handler):
      pass
  
! 
  
--- 28,68 ----
  #
  
  from wxPython.wx import *
+ from gnue.designer.ToolPanel import ToolPanel
  
! class LayoutEditor (ToolPanel):
! 
!   runtime_section = 'SchemaLayoutEditor'
! 
!   def init(self):
      self.panelColor = self.GetBackgroundColour()
      self._app = instance._app
      self.rootObject.walk(self.inventoryObject)
  
!     # EventAware provided by ToolPanel
!     self.registerEventListeners({
!                        'ObjectSelected'      : self.onSetCurrentObject,
!                        'ObjectCreated'       : self.onCreateObject,
!                        'ObjectModified'      : self.onModifyObject,
!                        'ObjectDeleted'       : self.onDeleteObject,
!                       })
  
!   def inventoryObject(self, object):
      pass
  
!   def onSetCurrentObject (self, event):
!     object = event.object
!     handler = event.originator
! 
!   def onCreateObject (self, event):
!     object = event.object
!     handler = event.originator
! 
!   def onModifyObject (self, event):
!     object = event.object
!     handler = event.originator
! 
!   def onDeleteObject (self, event):
!     object = event.object
!     handler = event.originator
  
Index: gnue/designer/src/schema/VisualEditor.py
diff -c gnue/designer/src/schema/VisualEditor.py:1.4 
gnue/designer/src/schema/VisualEditor.py:1.5
*** gnue/designer/src/schema/VisualEditor.py:1.4        Mon Sep 16 19:26:10 2002
--- gnue/designer/src/schema/VisualEditor.py    Mon Nov 25 00:41:42 2002
***************
*** 32,40 ****
  from gnue.common.schema.Objects import *
  from Incubator import *
  
! class VisualEditor (wxPanel):
!   def __init__(self, instance, root, parent):
!     wxPanel.__init__(self,parent,-1)
      self.frame = instance
      self.panelColor = self.GetBackgroundColour()
      self._instance = instance
--- 32,43 ----
  from gnue.common.schema.Objects import *
  from Incubator import *
  
! 
! class VisualEditor (ToolPanel):
! 
!   runtime_section = 'SchemaDiaEditor'
! 
!   def init(self):
      self.frame = instance
      self.panelColor = self.GetBackgroundColour()
      self._instance = instance
***************
*** 54,62 ****
      self.redrawBackground()
      #self.diagram.SetBackgroundColour(wxWHITE)
      self.calculateTablePositions()
!     
!     
!         
      EVT_PAINT(self.diagram, self.onPaintEvent)
  #    EVT_LEFT_DOWN(self.diagram, self.onLeftClickEvent)
      EVT_MOTION(self.diagram, self.onMouseEvent)
--- 57,74 ----
      self.redrawBackground()
      #self.diagram.SetBackgroundColour(wxWHITE)
      self.calculateTablePositions()
! 
!     # EventAware provided by ToolPanel
!     self.registerEventListeners({
!                        'ObjectSelected'      : self.onSetCurrentObject,
!                        'ObjectCreated'       : self.onCreateObject,
!                        'ObjectModified'      : self.onModifyObject,
!                        'ObjectDeleted'       : self.onDeleteObject,
!                       })
! 
! 
! 
! 
      EVT_PAINT(self.diagram, self.onPaintEvent)
  #    EVT_LEFT_DOWN(self.diagram, self.onLeftClickEvent)
      EVT_MOTION(self.diagram, self.onMouseEvent)
***************
*** 94,100 ****
          
        dc.EndDrawing()
        self.resizeCanvas(maxx,maxy)
!       
        # Rules for better positioning:
        #   tables with most connections in the middle
        #   ...
--- 106,112 ----
          
        dc.EndDrawing()
        self.resizeCanvas(maxx,maxy)
! 
        # Rules for better positioning:
        #   tables with most connections in the middle
        #   ...




reply via email to

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