CodeFileTreeNode.py
changeset 1730 64d8f52bc8c8
parent 1581 2295fdc5c271
child 1732 94ffe74e6895
equal deleted inserted replaced
1726:d51af006fa6b 1730:64d8f52bc8c8
    79 </xsd:schema>"""
    79 </xsd:schema>"""
    80 
    80 
    81 SECTION_TAG_ELEMENT = "<xsd:element name=\"%s\" type=\"CodeText\"/>"
    81 SECTION_TAG_ELEMENT = "<xsd:element name=\"%s\" type=\"CodeText\"/>"
    82 
    82 
    83 class CodeFile:
    83 class CodeFile:
    84     
    84 
    85     CODEFILE_NAME = "CodeFile"
    85     CODEFILE_NAME = "CodeFile"
    86     SECTIONS_NAMES = []
    86     SECTIONS_NAMES = []
    87     
    87 
    88     def __init__(self):
    88     def __init__(self):
    89         sections_str = {"codefile_name": self.CODEFILE_NAME}
    89         sections_str = {"codefile_name": self.CODEFILE_NAME}
    90         if "includes" in self.SECTIONS_NAMES:
    90         if "includes" in self.SECTIONS_NAMES:
    91             sections_str["includes_section"] = SECTION_TAG_ELEMENT % "includes"
    91             sections_str["includes_section"] = SECTION_TAG_ELEMENT % "includes"
    92         else:
    92         else:
    93             sections_str["includes_section"] = ""
    93             sections_str["includes_section"] = ""
    94         sections_str["sections"] = "\n".join(
    94         sections_str["sections"] = "\n".join(
    95             [SECTION_TAG_ELEMENT % name
    95             [SECTION_TAG_ELEMENT % name
    96              for name in self.SECTIONS_NAMES if name != "includes"])
    96              for name in self.SECTIONS_NAMES if name != "includes"])
    97         
    97 
    98         self.CodeFileParser = GenerateParserFromXSDstring(
    98         self.CodeFileParser = GenerateParserFromXSDstring(
    99             CODEFILE_XSD % sections_str)
    99             CODEFILE_XSD % sections_str)
   100         self.CodeFileVariables = etree.XPath("variables/variable")
   100         self.CodeFileVariables = etree.XPath("variables/variable")
   101         
   101 
   102         filepath = self.CodeFileName()
   102         filepath = self.CodeFileName()
   103         
   103 
   104         if os.path.isfile(filepath):
   104         if os.path.isfile(filepath):
   105             xmlfile = open(filepath, 'r')
   105             xmlfile = open(filepath, 'r')
   106             codefile_xml = xmlfile.read()
   106             codefile_xml = xmlfile.read()
   107             xmlfile.close()
   107             xmlfile.close()
   108             
   108 
   109             codefile_xml = codefile_xml.replace(
   109             codefile_xml = codefile_xml.replace(
   110                 '<%s>' % self.CODEFILE_NAME, 
   110                 '<%s>' % self.CODEFILE_NAME,
   111                 '<%s xmlns:xhtml="http://www.w3.org/1999/xhtml">' % self.CODEFILE_NAME)
   111                 '<%s xmlns:xhtml="http://www.w3.org/1999/xhtml">' % self.CODEFILE_NAME)
   112             for cre, repl in [
   112             for cre, repl in [
   113                 (re.compile("(?<!<xhtml:p>)(?:<!\[CDATA\[)"), "<xhtml:p><![CDATA["),
   113                 (re.compile("(?<!<xhtml:p>)(?:<!\[CDATA\[)"), "<xhtml:p><![CDATA["),
   114                 (re.compile("(?:]]>)(?!</xhtml:p>)"), "]]></xhtml:p>")]:
   114                 (re.compile("(?:]]>)(?!</xhtml:p>)"), "]]></xhtml:p>")]:
   115                 codefile_xml = cre.sub(repl, codefile_xml)
   115                 codefile_xml = cre.sub(repl, codefile_xml)
   116             
   116 
   117             try:
   117             try:
   118                 self.CodeFile, error = self.CodeFileParser.LoadXMLString(codefile_xml)
   118                 self.CodeFile, error = self.CodeFileParser.LoadXMLString(codefile_xml)
   119                 if error is not None:
   119                 if error is not None:
   120                     (fname, lnum, src) = ((self.CODEFILE_NAME,) + error)
   120                     (fname, lnum, src) = ((self.CODEFILE_NAME,) + error)
   121                     self.GetCTRoot().logger.write_warning(XSDSchemaErrorMessage.format(a1 = fname, a2 = lnum, a3 = src))
   121                     self.GetCTRoot().logger.write_warning(XSDSchemaErrorMessage.format(a1 = fname, a2 = lnum, a3 = src))
   136         return self.GetCTRoot().GetDataTypes(basetypes=basetypes)
   136         return self.GetCTRoot().GetDataTypes(basetypes=basetypes)
   137 
   137 
   138     def GenerateNewName(self, format, start_idx):
   138     def GenerateNewName(self, format, start_idx):
   139         return self.GetCTRoot().GenerateNewName(
   139         return self.GetCTRoot().GenerateNewName(
   140             None, None, format, start_idx,
   140             None, None, format, start_idx,
   141             dict([(var.getname().upper(), True) 
   141             dict([(var.getname().upper(), True)
   142                   for var in self.CodeFile.variables.getvariable()]))
   142                   for var in self.CodeFile.variables.getvariable()]))
   143 
   143 
   144     def SetVariables(self, variables):
   144     def SetVariables(self, variables):
   145         self.CodeFile.variables.setvariable([])
   145         self.CodeFile.variables.setvariable([])
   146         for var in variables:
   146         for var in variables:
   150             variable.setinitial(var["Initial"])
   150             variable.setinitial(var["Initial"])
   151             variable.setdesc(var["Description"])
   151             variable.setdesc(var["Description"])
   152             variable.setonchange(var["OnChange"])
   152             variable.setonchange(var["OnChange"])
   153             variable.setopts(var["Options"])
   153             variable.setopts(var["Options"])
   154             self.CodeFile.variables.appendvariable(variable)
   154             self.CodeFile.variables.appendvariable(variable)
   155     
   155 
   156     def GetVariables(self):
   156     def GetVariables(self):
   157         datas = []
   157         datas = []
   158         for var in self.CodeFileVariables(self.CodeFile):
   158         for var in self.CodeFileVariables(self.CodeFile):
   159             datas.append({"Name" : var.getname(), 
   159             datas.append({"Name" : var.getname(),
   160                           "Type" : var.gettype(), 
   160                           "Type" : var.gettype(),
   161                           "Initial" : var.getinitial(),
   161                           "Initial" : var.getinitial(),
   162                           "Description" : var.getdesc(),
   162                           "Description" : var.getdesc(),
   163                           "OnChange"    : var.getonchange(),
   163                           "OnChange"    : var.getonchange(),
   164                           "Options"     : var.getopts(),
   164                           "Options"     : var.getopts(),
   165                          })
   165                          })
   168     def SetTextParts(self, parts):
   168     def SetTextParts(self, parts):
   169         for section in self.SECTIONS_NAMES:
   169         for section in self.SECTIONS_NAMES:
   170             section_code = parts.get(section)
   170             section_code = parts.get(section)
   171             if section_code is not None:
   171             if section_code is not None:
   172                 getattr(self.CodeFile, section).setanyText(section_code)
   172                 getattr(self.CodeFile, section).setanyText(section_code)
   173     
   173 
   174     def GetTextParts(self):
   174     def GetTextParts(self):
   175         return dict([(section, getattr(self.CodeFile, section).getanyText())
   175         return dict([(section, getattr(self.CodeFile, section).getanyText())
   176                      for section in self.SECTIONS_NAMES])
   176                      for section in self.SECTIONS_NAMES])
   177             
   177 
   178     def CTNTestModified(self):
   178     def CTNTestModified(self):
   179         return self.ChangesToSave or not self.CodeFileIsSaved()    
   179         return self.ChangesToSave or not self.CodeFileIsSaved()
   180 
   180 
   181     def OnCTNSave(self, from_project_path=None):
   181     def OnCTNSave(self, from_project_path=None):
   182         filepath = self.CodeFileName()
   182         filepath = self.CodeFileName()
   183         
   183 
   184         xmlfile = open(filepath,"w")
   184         xmlfile = open(filepath,"w")
   185         xmlfile.write(etree.tostring(
   185         xmlfile.write(etree.tostring(
   186             self.CodeFile, 
   186             self.CodeFile,
   187             pretty_print=True, 
   187             pretty_print=True,
   188             xml_declaration=True, 
   188             xml_declaration=True,
   189             encoding='utf-8'))
   189             encoding='utf-8'))
   190         xmlfile.close()
   190         xmlfile.close()
   191         
   191 
   192         self.MarkCodeFileAsSaved()
   192         self.MarkCodeFileAsSaved()
   193         return True
   193         return True
   194 
   194 
   195     def CTNGlobalInstances(self):
   195     def CTNGlobalInstances(self):
   196         variables = self.CodeFileVariables(self.CodeFile)
   196         variables = self.CodeFileVariables(self.CodeFile)
   197         ret =  [(variable.getname(),
   197         ret =  [(variable.getname(),
   198                  variable.gettype(),
   198                  variable.gettype(),
   199                  variable.getinitial()) 
   199                  variable.getinitial())
   200                 for variable in variables]
   200                 for variable in variables]
   201         ret.extend([("On"+variable.getname()+"Change", "python_poll", "")
   201         ret.extend([("On"+variable.getname()+"Change", "python_poll", "")
   202                 for variable in variables
   202                 for variable in variables
   203                 if variable.getonchange()])
   203                 if variable.getonchange()])
   204         return ret
   204         return ret
   217         self.Buffering = False
   217         self.Buffering = False
   218         self.CodeFileBuffer = UndoBuffer(self.CodeFileParser.Dumps(self.CodeFile), saved)
   218         self.CodeFileBuffer = UndoBuffer(self.CodeFileParser.Dumps(self.CodeFile), saved)
   219 
   219 
   220     def BufferCodeFile(self):
   220     def BufferCodeFile(self):
   221         self.CodeFileBuffer.Buffering(self.CodeFileParser.Dumps(self.CodeFile))
   221         self.CodeFileBuffer.Buffering(self.CodeFileParser.Dumps(self.CodeFile))
   222     
   222 
   223     def StartBuffering(self):
   223     def StartBuffering(self):
   224         self.Buffering = True
   224         self.Buffering = True
   225         
   225 
   226     def EndBuffering(self):
   226     def EndBuffering(self):
   227         if self.Buffering:
   227         if self.Buffering:
   228             self.CodeFileBuffer.Buffering(self.CodeFileParser.Dumps(self.CodeFile))
   228             self.CodeFileBuffer.Buffering(self.CodeFileParser.Dumps(self.CodeFile))
   229             self.Buffering = False
   229             self.Buffering = False
   230     
   230 
   231     def MarkCodeFileAsSaved(self):
   231     def MarkCodeFileAsSaved(self):
   232         self.EndBuffering()
   232         self.EndBuffering()
   233         self.CodeFileBuffer.CurrentSaved()
   233         self.CodeFileBuffer.CurrentSaved()
   234     
   234 
   235     def CodeFileIsSaved(self):
   235     def CodeFileIsSaved(self):
   236         return self.CodeFileBuffer.IsCurrentSaved() and not self.Buffering
   236         return self.CodeFileBuffer.IsCurrentSaved() and not self.Buffering
   237         
   237 
   238     def LoadPrevious(self):
   238     def LoadPrevious(self):
   239         self.EndBuffering()
   239         self.EndBuffering()
   240         self.CodeFile = self.CodeFileParser.Loads(self.CodeFileBuffer.Previous())
   240         self.CodeFile = self.CodeFileParser.Loads(self.CodeFileBuffer.Previous())
   241     
   241 
   242     def LoadNext(self):
   242     def LoadNext(self):
   243         self.CodeFile = self.CodeFileParser.Loads(self.CodeFileBuffer.Next())
   243         self.CodeFile = self.CodeFileParser.Loads(self.CodeFileBuffer.Next())
   244     
   244 
   245     def GetBufferState(self):
   245     def GetBufferState(self):
   246         first = self.CodeFileBuffer.IsFirst() and not self.Buffering
   246         first = self.CodeFileBuffer.IsFirst() and not self.Buffering
   247         last = self.CodeFileBuffer.IsLast()
   247         last = self.CodeFileBuffer.IsLast()
   248         return not first, not last
   248         return not first, not last
   249