daboide Commit
Revision 729
Date: 2006-12-30 15:41:12 -0800 (Sat, 30 Dec 2006)
Author: Ed

Changed:
U   trunk/ClassDesigner.py
U   trunk/ClassDesignerComponents.py
U   trunk/ClassDesignerControlMixin.py
U   trunk/ClassDesignerEditor.py

Log:
Added the handling of inherited code to the Class Designer. Objects now only 
save their code if it has been modified from the superclass version.

There are still some bugs in handling inherited code and attributes when 
running from a cdxml file; fixing those are next on the agenda.

Improved the way that composite classes, such as paged controls, handle things 
when their child class (e.g., dPageFrame.PageClass) is a path to a cdxml file.

Removed some leftover debugging print statements.


Diff:
Modified: trunk/ClassDesigner.py
===================================================================
--- trunk/ClassDesigner.py      2006-12-30 18:04:47 UTC (rev 728)
+++ trunk/ClassDesigner.py      2006-12-30 23:41:12 UTC (rev 729)
@@ -53,11 +53,14 @@
                self._srcObj = None
                self._srcPos = None
                self._codeDict = {}
+               self._classCodeDict = {}
                self._classPropDict = {}
                self._classImportDict = {}
                self._classDefaultVals = {}
                self._mixedControlClasses = {}
-#              self.isClosing = False
+               # Tuple of all paged-control classes
+               self.pagedControls = (dui.dPageFrame, dui.dPageList, 
dui.dPageSelect, 
+                               dui.dPageFrameNoTabs)
                self.MainFormClass = None
                self.setAppInfo("appName", "Class Designer")
                # Create the clipboard
@@ -99,9 +102,6 @@
                gsa["MaxDimension"] = atts["MaxDimension"]
                # Get rid of the update/refresh delays
                dabo.useUpdateDelays = False
-               # Tuple of all paged-control classes
-               self.pagedControls = (dui.dPageFrame, dui.dPageList, 
dui.dPageSelect, 
-                               dui.dPageFrameNoTabs)
 
                
                # Define the controls that can be added to the ClassDesigner. 
The 
@@ -451,6 +451,9 @@
                if super:
                        # We need to modify the info to incorporate the 
superclass info
                        self._addInheritedInfo(dct, super)
+                       # Store the base code so that we can determine if 
instances have
+                       # modified it.
+                       self._updateClassCodeRepository(super)
                return dct
                
        
@@ -474,6 +477,25 @@
                                self._addInheritedInfo(kid, super)
        
        
+       def _updateClassCodeRepository(self, dct):
+               """Take a flattened dict of class IDs and store any code
+               associated with those IDs, so that we can later compare it to 
+               an object's code in order to determine if it has been changed.
+               """
+               cds = [(kk, vv["code"]) for kk, vv in dct.items()
+                               if vv["code"]]
+               for cd in cds:
+                       self._classCodeDict.update({cd[0]: cd[1]})
+               
+
+       def _getClassMethod(self, clsID, mthd):
+               """Given a class ID and a method name, returns the code for that
+               classID/method combination (if any) from self._classCodeDict.
+               """
+               cd = self._classCodeDict.get(clsID, {})
+               return cd.get(mthd, "")
+               
+               
        def _findSizerInClassDict(self, clsd):
                """Recursively search until a child is found with sizer 
information.
                If no such child is found, return False.
@@ -2201,12 +2223,14 @@
                                obj.Panel2.Sizer = LayoutSizer("v")
                                LayoutPanel(obj.Panel2)
                        except AttributeError: pass
-                               
-               if isPageControl:
                        pgCls = obj.PageClass
                        if isinstance(pgCls, basestring):
                                # Saved class; let the control handle it
                                obj.PageCount = pcount
+                               # This is the key that marks it as a class, and 
not a base object.
+                               prop = LayoutSaverMixin.classFlagProp
+                               for pg in obj.Pages:
+                                       pg.__setattr__(prop, pgCls)
                                pg0panel = obj.Pages[0]
                        else:
                                pgCtlCls = self.getControlClass(pgCls)

Modified: trunk/ClassDesignerComponents.py
===================================================================
--- trunk/ClassDesignerComponents.py    2006-12-30 18:04:47 UTC (rev 728)
+++ trunk/ClassDesignerComponents.py    2006-12-30 23:41:12 UTC (rev 729)
@@ -111,7 +111,9 @@
                                and isinstance(self.Parent, dabo.ui.dSplitter))
                desProps = self.DesignerProps.keys()
                if isinstance(self, dabo.ui.dForm) and hasattr(self, 
"UseSizers"):
-                       desProps = desProps + ["UseSizers"]
+                       desProps += ["UseSizers"]
+               elif isinstance(self, self.Controller.pagedControls) and 
isinstance(self.PageClass, basestring):
+                       desProps += ["PageClass"]
                for prop in desProps:
                        if prop.startswith("Sizer_"):
                                continue

Modified: trunk/ClassDesignerControlMixin.py
===================================================================
--- trunk/ClassDesignerControlMixin.py  2006-12-30 18:04:47 UTC (rev 728)
+++ trunk/ClassDesignerControlMixin.py  2006-12-30 23:41:12 UTC (rev 729)
@@ -141,14 +141,10 @@
                tmpPgCls = cnt.getControlClass(dabo.ui.dPage)
                pg = self.insertPage(pos, tmpPgCls, ignoreOverride=True)
                classID = self._extractKey(atts, "classID", "")
-               
-               print "PAGE CLSID", 
                pg.setPropertiesFromAtts(atts)
                pg.classID = classID
                prop = LayoutSaverMixin.classFlagProp
                pg.__setattr__(prop, pgCls)
-               
-               print pg.classID
                pth = dabo.lib.utils.relativePath(pgCls)
                pth = os.path.abspath(os.path.split(pth)[0])
                cnt._basePath = pth

Modified: trunk/ClassDesignerEditor.py
===================================================================
--- trunk/ClassDesignerEditor.py        2006-12-30 18:04:47 UTC (rev 728)
+++ trunk/ClassDesignerEditor.py        2006-12-30 23:41:12 UTC (rev 729)
@@ -220,6 +220,9 @@
                if objCode:
                        txt = objCode.get(mthd, "")
                if not txt:
+                       if hasattr(obj, "classID"):
+                               txt = 
self.Controller._getClassMethod(obj.classID, mthd)
+               if not txt:
                        mvPointer = True
                        if nonEvent is None:
                                nonEvent = mthd not in 
self.Controller.getClassEvents(obj._baseClass)
@@ -438,7 +441,7 @@
                mthd = pg.method
 
                mb = self._getMethodBase(mthd, None)
-               isEmpty = (txt.strip() == "") or (txt in 
self._getMethodBase(mthd, None))
+               isEmpty = (txt.strip() == "") or (txt in mb)
                obj = pg.object
                objCode = rep.get(obj)
                if isEmpty:
@@ -456,6 +459,15 @@
 #                              dabo.errorLog.write(_("Method '%s' of object 
'%s' has the following error: %s")
 #                                              % (mthd, obj.Name, e))
                        # Add it to the repository.
+                       
+                       if hasattr(obj, "classID"):
+                               # Make sure that it differs from the base code 
for this class. If not, 
+                               # don't save it.
+                               cid = obj.classID
+                               cb = self._getClassMethod(cid, mthd)
+                               if txt.rstrip() == cb.rstrip():
+                                       # Identical; store nothing
+                                       txt = ""
                        if objCode:
                                txt = self._extractImports(txt)
                                objCode[mthd] = txt
@@ -471,7 +483,13 @@
                        dabo.ui.setAfterInterval(4000, self, "StatusText", curr)
 
 
+       def _getClassMethod(self, clsID, mthd):
+               return self.Controller._getClassMethod(clsID, mthd)
+               
+               
        def _extractImports(self, cd):
+               if not cd:
+                       return ""
                codeLines = cd.splitlines()
                for pos, ln in enumerate(codeLines):
                        if ln.lstrip()[:4] == "def ":
@@ -484,6 +502,10 @@
                return ret
 
 
+       def _getCodeRepository(self):
+               return self.Controller.getCodeDict()
+
+
        def _getController(self):
                try:
                        return self._controller
@@ -498,10 +520,6 @@
                        self._properties["Controller"] = val
 
 
-       def _getCodeRepository(self):
-               return self.Controller.getCodeDict()
-
-
        CodeRepository = property(_getCodeRepository, None, None,
                        _("""Reference to the Controller dictionary of all 
objects and their
                        method code  (dict)""") )




_______________________________________________
Post Messages to: [email protected]
Subscription Maintenance: http://leafe.com/mailman/listinfo/dabo-dev

Reply via email to