py_ext/PythonFileCTNMixin.py
changeset 728 e0424e96e3fd
parent 725 31dade089db5
child 734 5c42cafaee15
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/py_ext/PythonFileCTNMixin.py	Sat May 12 11:21:10 2012 +0200
@@ -0,0 +1,118 @@
+import os
+from util import opjimg
+from PLCControler import UndoBuffer
+from PythonEditor import PythonEditor
+
+from xml.dom import minidom
+from xmlclass import *
+import cPickle
+
+PythonClasses = GenerateClassesFromXSD(os.path.join(os.path.dirname(__file__), "py_ext_xsd.xsd")) 
+
+class PythonFileCTNMixin:
+    
+    EditorType = PythonEditor
+    
+    def __init__(self):
+        
+        self.ConfNodeMethods.insert(0, 
+                {"bitmap" : opjimg("editPYTHONcode"),
+                 "name" : _("Edit Python File"), 
+                 "tooltip" : _("Edit Python File"),
+                 "method" : "_OpenView"},
+        )
+
+        filepath = self.PythonFileName()
+        
+        self.PythonCode = PythonClasses["Python"]()
+        if os.path.isfile(filepath):
+            xmlfile = open(filepath, 'r')
+            tree = minidom.parse(xmlfile)
+            xmlfile.close()
+            
+            for child in tree.childNodes:
+                if child.nodeType == tree.ELEMENT_NODE and child.nodeName == "Python":
+                    self.PythonCode.loadXMLTree(child, ["xmlns", "xmlns:xsi", "xsi:schemaLocation"])
+                    self.CreatePythonBuffer(True)
+        else:
+            self.CreatePythonBuffer(False)
+            self.OnCTNSave()
+
+    def PythonFileName(self):
+        return os.path.join(self.CTNPath(), "py_ext.xml")
+
+    def GetFilename(self):
+        if self.PythonBuffer.IsCurrentSaved():
+            return "py_ext"
+        else:
+            return "~py_ext~"
+
+    def SetPythonCode(self, text):
+        self.PythonCode.settext(text)
+        
+    def GetPythonCode(self):
+        return self.PythonCode.gettext()
+    
+    def CTNTestModified(self):
+        return self.ChangesToSave or not self.PythonIsSaved()
+    
+    def OnCTNSave(self):
+        filepath = self.PythonFileName()
+        
+        text = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
+        extras = {"xmlns":"http://www.w3.org/2001/XMLSchema",
+                  "xmlns:xsi":"http://www.w3.org/2001/XMLSchema-instance",
+                  "xsi:schemaLocation" : "py_ext_xsd.xsd"}
+        text += self.PythonCode.generateXMLText("Python", 0, extras)
+
+        xmlfile = open(filepath,"w")
+        xmlfile.write(text.encode("utf-8"))
+        xmlfile.close()
+        
+        self.MarkPythonAsSaved()
+        return True
+        
+#-------------------------------------------------------------------------------
+#                      Current Buffering Management Functions
+#-------------------------------------------------------------------------------
+
+    """
+    Return a copy of the project
+    """
+    def Copy(self, model):
+        return cPickle.loads(cPickle.dumps(model))
+
+    def CreatePythonBuffer(self, saved):
+        self.Buffering = False
+        self.PythonBuffer = UndoBuffer(cPickle.dumps(self.PythonCode), saved)
+
+    def BufferPython(self):
+        self.PythonBuffer.Buffering(cPickle.dumps(self.PythonCode))
+    
+    def StartBuffering(self):
+        self.Buffering = True
+        
+    def EndBuffering(self):
+        if self.Buffering:
+            self.PythonBuffer.Buffering(cPickle.dumps(self.PythonCode))
+            self.Buffering = False
+    
+    def MarkPythonAsSaved(self):
+        self.EndBuffering()
+        self.PythonBuffer.CurrentSaved()
+    
+    def PythonIsSaved(self):
+        return self.PythonBuffer.IsCurrentSaved() and not self.Buffering
+        
+    def LoadPrevious(self):
+        self.EndBuffering()
+        self.PythonCode = cPickle.loads(self.PythonBuffer.Previous())
+    
+    def LoadNext(self):
+        self.PythonCode = cPickle.loads(self.PythonBuffer.Next())
+    
+    def GetBufferState(self):
+        first = self.PythonBuffer.IsFirst() and not self.Buffering
+        last = self.PythonBuffer.IsLast()
+        return not first, not last
+