diff -r f991944e859c -r a36eecf45b2e E5XML/SessionHandler.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/E5XML/SessionHandler.py Tue Jan 12 17:55:24 2010 +0000 @@ -0,0 +1,403 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2003 - 2010 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing the handler class for reading an XML project session file. +""" + +from E4Gui.E4Application import e4App + +from .Config import sessionFileFormatVersion +from .XMLHandlerBase import XMLHandlerBase + +class SessionHandler(XMLHandlerBase): + """ + Class implementing a sax handler to read an XML project session file. + """ + def __init__(self, project): + """ + Constructor + + @param project Reference to the project object to store the + information into. + """ + XMLHandlerBase.__init__(self) + + self.startDocumentSpecific = self.startDocumentSession + + self.elements.update({ + 'Session' : (self.startSession, self.defaultEndElement), + 'MultiProject' : (self.defaultStartElement, self.endMultiProject), + 'Project' : (self.defaultStartElement, self.endProject), + 'Filename' : (self.startFilename, self.endFilename), + 'ActiveWindow' : (self.startFilename, self.endFilename), + 'Breakpoint' : (self.startBreakpoint, self.endBreakpoint), + 'BpFilename' : (self.defaultStartElement, self.endBFilename), + 'Linenumber' : (self.startLinenumber, self.defaultEndElement), + 'Condition' : (self.defaultStartElement, self.endCondition), + 'Enabled' : (self.startEnabled, self.defaultEndElement), + 'Temporary' : (self.startTemporary, self.defaultEndElement), + 'Count' : (self.startCount, self.defaultEndElement), + 'Watchexpression' : (self.startWatchexpression, self.endWatchexpression), + 'Special' : (self.defaultStartElement, self.endSpecial), + 'CommandLine' : (self.defaultStartElement, self.endCommandLine), + 'WorkingDirectory' : (self.defaultStartElement, self.endWorkingDirectory), + 'Environment' : (self.defaultStartElement, self.endEnvironment), + 'ReportExceptions' : (self.startReportExceptions, self.defaultEndElement), + 'Exceptions' : (self.startExceptions, self.endExceptions), + 'Exception' : (self.defaultStartElement, self.endException), + 'IgnoredExceptions' : (self.startIgnoredExceptions, self.endIgnoredExceptions), + 'IgnoredException' : (self.defaultStartElement, self.endIgnoredException), + 'AutoClearShell' : (self.startAutoClearShell, self.defaultEndElement), + 'TracePython' : (self.startTracePython, self.defaultEndElement), + 'AutoContinue' : (self.startAutoContinue, self.defaultEndElement), + 'Bookmark' : (self.startBookmark, self.endBookmark), + 'BmFilename' : (self.defaultStartElement, self.endBFilename), + + #################################################################### + ## backward compatibility + #################################################################### + 'Watchpoint' : (self.startWatchexpression, self.endWatchexpression), # 4.0 + 'CovexcPattern' : (self.defaultStartElement, self.defaultEndElement), # 4.3 + }) + + self.project = project + self.isGlobal = project is None + + self.project = e4App().getObject("Project") + self.multiProject = e4App().getObject("MultiProject") + self.vm = e4App().getObject("ViewManager") + self.dbg = e4App().getObject("DebugUI") + self.dbs = e4App().getObject("DebugServer") + + def startDocumentSession(self): + """ + Handler called, when the document parsing is started. + """ + if not self.isGlobal: + # clear all breakpoints and bookmarks first + # (in case we are rereading a session file) + files = self.project.getSources(True) + for file in files: + editor = self.vm.getOpenEditor(file) + if editor is not None: + editor.clearBookmarks() + self.dbs.getBreakPointModel().deleteAll() + self.version = '' + + ################################################### + ## below follow the individual handler functions + ################################################### + + def endMultiProject(self): + """ + Handler method for the "MultiProject" end tag. + """ + self.multiProject.openMultiProject(self.buffer, False) + + def endProject(self): + """ + Handler method for the "Project" end tag. + """ + self.project.openProject(self.buffer, False) + + def startFilename(self, attrs): + """ + Handler method for the "Filename" start tag. + + @param attrs list of tag attributes + """ + self.buffer = "" + self.cline = int(attrs.get("cline", "0")) + self.cindex = int(attrs.get("cindex", "0")) + + folds = attrs.get("folds", "") + if folds: + self.folds = [int(f) for f in folds.split(',')] + else: + self.folds = [] + + def endFilename(self): + """ + Handler method for the "Filename" end tag. + """ + self.vm.openFiles(self.buffer) + ed = self.vm.getOpenEditor(self.buffer) + if ed is not None: + if self.folds: + ed.recolor() + for line in self.folds: + ed.foldLine(line - 1) + ed.setCursorPosition(self.cline, self.cindex) + ed.ensureCursorVisible() + + def startBreakpoint(self, attrs): + """ + Handler method for the "Breakpoint" start tag. + + @param attrs list of tag attributes + """ + self.filename = "" + self.lineno = 0 + self.bpCond = "" + self.bpTemp = False + self.bpEnabled = True + self.bpCount = 0 + + def endBreakpoint(self): + """ + Handler method for the "Breakpoint" end tag. + """ + self.dbs.getBreakPointModel().addBreakPoint(self.filename, self.lineno, + (self.bpCond, self.bpTemp, self.bpEnabled, self.bpCount)) + + def startWatchexpression(self, attrs): + """ + Handler method for the "Watchexpression" start tag. + + @param attrs list of tag attributes + """ + self.bpCond = "" + self.bpTemp = False + self.bpEnabled = True + self.bpCount = 0 + self.wpSpecialCond = "" + + def endWatchexpression(self): + """ + Handler method for the "Watchexpression" end tag. + """ + self.dbs.getWatchPointModel().addWatchPoint(self.bpCond, + (self.bpTemp, self.bpEnabled, self.bpCount, self.wpSpecialCond)) + + def endBFilename(self): + """ + Handler method for the "BFilename" end tag. + """ + self.filename = self.buffer + + def startLinenumber(self, attrs): + """ + Handler method for the "Linenumber" start tag. + + @param attrs list of tag attributes + """ + self.lineno = int(attrs["value"]) + + def endCondition(self): + """ + Handler method for the "Condition" end tag. + """ + cond = self.unescape(self.buffer) + if cond == 'None': + self.bpCond = '' + else: + self.bpCond = cond + + def startEnabled(self, attrs): + """ + Handler method for the "Enabled" start tag. + + @param attrs list of tag attributes + """ + self.bpEnabled = attrs["value"] + if self.bpEnabled in ["True", "False"]: + self.bpEnabled = self.bpEnabled == "True" + else: + self.bpEnabled = bool(int(self.bpEnabled)) + + def startTemporary(self, attrs): + """ + Handler method for the "Temporary" start tag. + + @param attrs list of tag attributes + """ + self.bpTemp = attrs["value"] + if self.bpTemp in ["True", "False"]: + self.bpTemp = self.bpTemp == "True" + else: + self.bpTemp = bool(int(self.bpTemp)) + + def startCount(self, attrs): + """ + Handler method for the "Count" start tag. + + @param attrs list of tag attributes + """ + self.bpCount = int(attrs["value"]) + + def endSpecial(self): + """ + Handler method for the "Special" end tag. + """ + self.wpSpecialCond = self.buffer + + def endCommandLine(self): + """ + Handler method for the "CommandLine" end tag. + """ + self.buffer = self.unescape(self.buffer) + self.dbg.setArgvHistory(self.buffer) + if not self.isGlobal: + self.project.dbgCmdline = self.buffer + + def endWorkingDirectory(self): + """ + Handler method for the "WorkinDirectory" end tag. + """ + self.dbg.setWdHistory(self.buffer) + if not self.isGlobal: + self.project.dbgWd = self.buffer + + def endEnvironment(self): + """ + Handler method for the "Environment" end tag. + """ + self.dbg.setEnvHistory(self.buffer) + if not self.isGlobal: + self.project.dbgEnv = self.buffer + + def startReportExceptions(self, attrs): + """ + Handler method for the "ReportExceptions" start tag. + + @param attrs list of tag attributes + """ + exc = attrs.get("value", "False") + if exc in ["True", "False"]: + if exc == "True": + exc = True + else: + exc = False + else: + exc = bool(int(exc)) + self.dbg.setExceptionReporting(exc) + if not self.isGlobal: + self.project.dbgReportExceptions = exc + + def startExceptions(self, attrs): + """ + Handler method for the "Exceptions" start tag. + + @param attrs list of tag attributes + """ + self.dbgExcList = [] + + def endExceptions(self): + """ + Handler method for the "Exceptions" end tag. + """ + self.dbg.setExcList(self.dbgExcList) + if not self.isGlobal: + self.project.dbgExcList = self.dbgExcList[:] # keep a copy + + def endException(self): + """ + Handler method for the "Exception" end tag. + """ + self.dbgExcList.append(self.buffer) + + def startIgnoredExceptions(self, attrs): + """ + Handler method for the "IgnoredExceptions" start tag. + + @param attrs list of tag attributes + """ + self.dbgExcIgnoreList = [] + + def endIgnoredExceptions(self): + """ + Handler method for the "IgnoredExceptions" end tag. + """ + self.dbg.setExcIgnoreList(self.dbgExcIgnoreList) + if not self.isGlobal: + self.project.dbgExcIgnoreList = self.dbgExcIgnoreList[:] # keep a copy + + def endIgnoredException(self): + """ + Handler method for the "IgnoredException" end tag. + """ + self.dbgExcIgnoreList.append(self.buffer) + + def startAutoClearShell(self, attrs): + """ + Handler method for the "AutoClearShell" start tag. + + @param attrs list of tag attributes + """ + autoClearShell = attrs.get("value", "False") + if autoClearShell == "True": + autoClearShell = True + else: + autoClearShell = False + self.dbg.setAutoClearShell(autoClearShell) + if not self.isGlobal: + self.project.dbgAutoClearShell = autoClearShell + + def startTracePython(self, attrs): + """ + Handler method for the "TracePython" start tag. + + @param attrs list of tag attributes + """ + tracePython = attrs.get("value", "False") + if tracePython in ["True", "False"]: + if tracePython == "True": + tracePython = True + else: + tracePython = False + else: + tracePython = bool(int(tracePython)) + self.dbg.setTracePython(tracePython) + if not self.isGlobal: + self.project.dbgTracePython = tracePython + + def startAutoContinue(self, attrs): + """ + Handler method for the "AutoContinue" start tag. + + @param attrs list of tag attributes + """ + autoContinue = attrs.get("value", "False") + if autoContinue == "True": + autoContinue = True + else: + autoContinue = False + self.dbg.setAutoContinue(autoContinue) + if not self.isGlobal: + self.project.dbgAutoContinue = autoContinue + + def startBookmark(self, attrs): + """ + Handler method for the "Bookmark" start tag. + + @param attrs list of tag attributes + """ + self.filename = "" + self.lineno = 0 + + def endBookmark(self): + """ + Handler method for the "Bookmark" end tag. + """ + editor = self.vm.getOpenEditor(self.filename) + if editor is not None: + editor.toggleBookmark(self.lineno) + + def startSession(self, attrs): + """ + Handler method for the "Session" start tag. + + @param attrs list of tag attributes + """ + self.version = attrs.get('version', sessionFileFormatVersion) + + def getVersion(self): + """ + Public method to retrieve the version of the session. + + @return String containing the version number. + """ + return self.version