diff -r f991944e859c -r a36eecf45b2e E5XML/SessionWriter.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/E5XML/SessionWriter.py Tue Jan 12 17:55:24 2010 +0000 @@ -0,0 +1,201 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2004 - 2010 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing the writer class for writing an XML project session file. +""" + +import os +import time + +from E4Gui.E4Application import e4App + +from .XMLWriterBase import XMLWriterBase +from .Config import sessionFileFormatVersion + +import Preferences + +class SessionWriter(XMLWriterBase): + """ + Class implementing the writer class for writing an XML project session file. + """ + def __init__(self, file, projectName): + """ + Constructor + + @param file open file (like) object for writing + @param projectName name of the project (string) or None for the + global session + """ + XMLWriterBase.__init__(self, file) + + self.name = projectName + 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 writeXML(self): + """ + Public method to write the XML to the file. + """ + isGlobal = self.name is None + + XMLWriterBase.writeXML(self) + + self._write('<!DOCTYPE Session SYSTEM "Session-%s.dtd">' % \ + sessionFileFormatVersion) + + # add some generation comments + if not isGlobal: + self._write("<!-- eric5 session file for project %s -->" % self.name) + self._write("<!-- This file was generated automatically, do not edit. -->") + if Preferences.getProject("XMLTimestamp") or isGlobal: + self._write("<!-- Saved: %s -->" % time.strftime('%Y-%m-%d, %H:%M:%S')) + + # add the main tag + self._write('<Session version="%s">' % sessionFileFormatVersion) + + # step 0: save open multi project and project for the global session + if isGlobal: + if self.multiProject.isOpen(): + self._write(' <MultiProject>%s</MultiProject>' % \ + self.multiProject.getMultiProjectFile()) + if self.project.isOpen(): + self._write(' <Project>%s</Project>' % \ + self.project.getProjectFile()) + + # step 1: save all open (project) filenames and the active window + allOpenFiles = self.vm.getOpenFilenames() + self._write(" <Filenames>") + for of in allOpenFiles: + if isGlobal or of.startswith(self.project.ppath): + ed = self.vm.getOpenEditor(of) + if ed is not None: + line, index = ed.getCursorPosition() + folds = ','.join([str(i + 1) for i in ed.getFolds()]) + else: + line, index = 0, 0 + folds = '' + self._write(' <Filename cline="%d" cindex="%d" folds="%s">%s</Filename>' % \ + (line, index, folds, of)) + self._write(" </Filenames>") + + aw = self.vm.getActiveName() + if aw and aw.startswith(self.project.ppath): + ed = self.vm.getOpenEditor(aw) + if ed is not None: + line, index = ed.getCursorPosition() + else: + line, index = 0, 0 + self._write(' <ActiveWindow cline="%d" cindex="%d">%s</ActiveWindow>' % \ + (line, index, aw)) + + # step 2a: save all breakpoints + allBreaks = Preferences.getProject("SessionAllBreakpoints") + projectFiles = self.project.getSources(True) + bpModel = self.dbs.getBreakPointModel() + self._write(" <Breakpoints>") + for row in range(bpModel.rowCount()): + index = bpModel.index(row, 0) + fname, lineno, cond, temp, enabled, count = \ + bpModel.getBreakPointByIndex(index)[:6] + if isGlobal or allBreaks or fname in projectFiles: + self._write(" <Breakpoint>") + self._write(" <BpFilename>%s</BpFilename>" % fname) + self._write(' <Linenumber value="%d" />' % lineno) + self._write(" <Condition>%s</Condition>" % self.escape(str(cond))) + self._write(' <Temporary value="%s" />' % temp) + self._write(' <Enabled value="%s" />' % enabled) + self._write(' <Count value="%d" />' % count) + self._write(" </Breakpoint>") + self._write(" </Breakpoints>") + + # step 2b: save all watch expressions + self._write(" <Watchexpressions>") + wpModel = self.dbs.getWatchPointModel() + for row in range(wpModel.rowCount()): + index = wpModel.index(row, 0) + cond, temp, enabled, count, special = wpModel.getWatchPointByIndex(index)[:5] + self._write(' <Watchexpression>') + self._write(" <Condition>%s</Condition>" % self.escape(str(cond))) + self._write(' <Temporary value="%s" />' % temp) + self._write(' <Enabled value="%s" />' % enabled) + self._write(' <Count value="%d" />' % count) + self._write(' <Special>%s</Special>' % special) + self._write(' </Watchexpression>') + self._write(' </Watchexpressions>') + + # step 3: save the debug info + self._write(" <DebugInfo>") + if isGlobal: + if len(self.dbg.argvHistory): + dbgCmdline = str(self.dbg.argvHistory[0]) + else: + dbgCmdline = "" + if len(self.dbg.wdHistory): + dbgWd = self.dbg.wdHistory[0] + else: + dbgWd = "" + if len(self.dbg.envHistory): + dbgEnv = self.dbg.envHistory[0] + else: + dbgEnv = "" + self._write(" <CommandLine>%s</CommandLine>" % self.escape(dbgCmdline)) + self._write(" <WorkingDirectory>%s</WorkingDirectory>" % dbgWd) + self._write(" <Environment>%s</Environment>" % dbgEnv) + self._write(' <ReportExceptions value="%s" />' % self.dbg.exceptions) + self._write(" <Exceptions>") + for exc in self.dbg.excList: + self._write(" <Exception>%s</Exception>" % exc) + self._write(" </Exceptions>") + self._write(" <IgnoredExceptions>") + for iexc in self.dbg.excIgnoreList: + self._write(" <IgnoredException>%s</IgnoredException>" % iexc) + self._write(" </IgnoredExceptions>") + self._write(' <AutoClearShell value="%s" />' % self.dbg.autoClearShell) + self._write(' <TracePython value="%s" />' % self.dbg.tracePython) + self._write(' <AutoContinue value="%s" />' % self.dbg.autoContinue) + self._write(" <CovexcPattern></CovexcPattern>") # kept for compatibility + else: + self._write(" <CommandLine>%s</CommandLine>" % \ + self.escape(str(self.project.dbgCmdline))) + self._write(" <WorkingDirectory>%s</WorkingDirectory>" % \ + self.project.dbgWd) + self._write(" <Environment>%s</Environment>" % \ + self.project.dbgEnv) + self._write(' <ReportExceptions value="%s" />' % \ + self.project.dbgReportExceptions) + self._write(" <Exceptions>") + for exc in self.project.dbgExcList: + self._write(" <Exception>%s</Exception>" % exc) + self._write(" </Exceptions>") + self._write(" <IgnoredExceptions>") + for iexc in self.project.dbgExcIgnoreList: + self._write(" <IgnoredException>%s</IgnoredException>" % iexc) + self._write(" </IgnoredExceptions>") + self._write(' <AutoClearShell value="%s" />' % \ + self.project.dbgAutoClearShell) + self._write(' <TracePython value="%s" />' % \ + self.project.dbgTracePython) + self._write(' <AutoContinue value="%s" />' % \ + self.project.dbgAutoContinue) + self._write(" <CovexcPattern></CovexcPattern>") # kept for compatibility + self._write(" </DebugInfo>") + + # step 4: save bookmarks of all open (project) files + self._write(" <Bookmarks>") + for of in allOpenFiles: + if isGlobal or of.startswith(self.project.ppath): + editor = self.vm.getOpenEditor(of) + for bookmark in editor.getBookmarks(): + self._write(" <Bookmark>") + self._write(" <BmFilename>%s</BmFilename>" % of) + self._write(' <Linenumber value="%d" />' % bookmark) + self._write(" </Bookmark>") + self._write(" </Bookmarks>") + + self._write("</Session>", newline = False) \ No newline at end of file