lbessard@145: import os laurent@401: from xml.dom import minidom laurent@401: import cPickle laurent@401: laurent@401: from xmlclass import * laurent@401: Laurent@1096: from PLCControler import UndoBuffer Laurent@1096: from editors.CodeFileEditor import SECTIONS_NAMES laurent@630: Laurent@1096: CodeFileClasses = GenerateClassesFromXSD(os.path.join(os.path.dirname(__file__), "code_file.xsd")) lbessard@145: Laurent@1096: class CodeFile: laurent@656: etisserant@31: def __init__(self): Laurent@1096: filepath = self.CodeFileName() lbessard@145: Laurent@1096: self.CodeFile = CodeFileClasses["CodeFile"]() lbessard@145: if os.path.isfile(filepath): lbessard@145: xmlfile = open(filepath, 'r') lbessard@145: tree = minidom.parse(xmlfile) lbessard@145: xmlfile.close() lbessard@145: lbessard@145: for child in tree.childNodes: Laurent@1100: if child.nodeType == tree.ELEMENT_NODE and child.nodeName in ["CodeFile", "CFile"]: Laurent@1096: self.CodeFile.loadXMLTree(child, ["xmlns", "xmlns:xsi", "xsi:schemaLocation"]) Laurent@1096: self.CreateCodeFileBuffer(True) lbessard@145: else: Laurent@1096: self.CreateCodeFileBuffer(False) Edouard@718: self.OnCTNSave() lbessard@145: lbessard@145: def GetBaseTypes(self): Edouard@718: return self.GetCTRoot().GetBaseTypes() lbessard@145: Laurent@1096: def GetDataTypes(self, basetypes = False): Laurent@1096: return self.GetCTRoot().GetDataTypes(basetypes=basetypes) lbessard@145: lbessard@145: def SetVariables(self, variables): Laurent@1096: self.CodeFile.variables.setvariable([]) lbessard@145: for var in variables: Laurent@1096: variable = CodeFileClasses["variables_variable"]() lbessard@145: variable.setname(var["Name"]) lbessard@145: variable.settype(var["Type"]) Laurent@1096: variable.setinitial(var["Initial"]) Laurent@1096: self.CodeFile.variables.appendvariable(variable) lbessard@145: lbessard@145: def GetVariables(self): lbessard@145: datas = [] Laurent@1096: for var in self.CodeFile.variables.getvariable(): Laurent@1096: datas.append({"Name" : var.getname(), "Type" : var.gettype(), "Initial" : var.getinitial()}) lbessard@145: return datas lbessard@145: Laurent@1096: def SetTextParts(self, parts): Laurent@1096: for section, code_object in zip( Laurent@1096: SECTIONS_NAMES, Laurent@1096: [self.CodeFile.includes, Laurent@1096: self.CodeFile.globals, Laurent@1096: self.CodeFile.initFunction, Laurent@1096: self.CodeFile.cleanUpFunction, Laurent@1096: self.CodeFile.retrieveFunction, Laurent@1096: self.CodeFile.publishFunction]): Laurent@1096: code_object.settext(parts[section]) lbessard@145: Laurent@1096: def GetTextParts(self): Laurent@1096: parts = {} Laurent@1096: for section, code_object in zip( Laurent@1096: SECTIONS_NAMES, Laurent@1096: [self.CodeFile.includes, Laurent@1096: self.CodeFile.globals, Laurent@1096: self.CodeFile.initFunction, Laurent@1096: self.CodeFile.cleanUpFunction, Laurent@1096: self.CodeFile.retrieveFunction, Laurent@1096: self.CodeFile.publishFunction]): Laurent@1096: parts[section] = code_object.gettext() Laurent@1096: return parts laurent@630: Edouard@718: def CTNTestModified(self): Laurent@1096: return self.ChangesToSave or not self.CodeFileIsSaved() laurent@630: Laurent@1061: def OnCTNSave(self, from_project_path=None): Laurent@1096: filepath = self.CodeFileName() lbessard@145: lbessard@145: text = "\n" lbessard@145: extras = {"xmlns":"http://www.w3.org/2001/XMLSchema", lbessard@145: "xmlns:xsi":"http://www.w3.org/2001/XMLSchema-instance", Laurent@1100: "xsi:schemaLocation" : "code_file.xsd"} Laurent@1096: text += self.CodeFile.generateXMLText("CodeFile", 0, extras) lbessard@145: lbessard@145: xmlfile = open(filepath,"w") laurent@430: xmlfile.write(text.encode("utf-8")) lbessard@145: xmlfile.close() lbessard@145: Laurent@1096: self.MarkCodeFileAsSaved() etisserant@31: return True etisserant@31: Laurent@1095: def CTNGlobalInstances(self): Laurent@1095: current_location = self.GetCurrentLocation() Laurent@1096: return [(variable.getname(), Laurent@1096: variable.gettype(), Laurent@1096: variable.getinitial()) Laurent@1096: for variable in self.CodeFile.variables.variable] laurent@656: lbessard@145: #------------------------------------------------------------------------------- lbessard@145: # Current Buffering Management Functions lbessard@145: #------------------------------------------------------------------------------- lbessard@145: lbessard@145: """ Laurent@1096: Return a copy of the codefile model lbessard@145: """ lbessard@145: def Copy(self, model): lbessard@145: return cPickle.loads(cPickle.dumps(model)) lbessard@145: Laurent@1096: def CreateCodeFileBuffer(self, saved): laurent@658: self.Buffering = False Laurent@1096: self.CodeFileBuffer = UndoBuffer(cPickle.dumps(self.CodeFile), saved) laurent@651: Laurent@1096: def BufferCodeFile(self): Laurent@1096: self.CodeFileBuffer.Buffering(cPickle.dumps(self.CodeFile)) lbessard@145: lbessard@145: def StartBuffering(self): lbessard@145: self.Buffering = True lbessard@145: lbessard@145: def EndBuffering(self): lbessard@145: if self.Buffering: Laurent@1096: self.CodeFileBuffer.Buffering(cPickle.dumps(self.CodeFile)) lbessard@145: self.Buffering = False lbessard@145: Laurent@1096: def MarkCodeFileAsSaved(self): laurent@651: self.EndBuffering() Laurent@1096: self.CodeFileBuffer.CurrentSaved() laurent@651: Laurent@1096: def CodeFileIsSaved(self): Laurent@1096: return self.CodeFileBuffer.IsCurrentSaved() and not self.Buffering laurent@658: lbessard@145: def LoadPrevious(self): laurent@651: self.EndBuffering() Laurent@1096: self.CodeFile = cPickle.loads(self.CodeFileBuffer.Previous()) lbessard@145: lbessard@145: def LoadNext(self): Laurent@1096: self.CodeFile = cPickle.loads(self.CodeFileBuffer.Next()) lbessard@145: lbessard@145: def GetBufferState(self): Laurent@1096: first = self.CodeFileBuffer.IsFirst() and not self.Buffering Laurent@1096: last = self.CodeFileBuffer.IsLast() lbessard@145: return not first, not last lbessard@145: