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 |
|