E5XML/SessionWriter.py

changeset 50
a36eecf45b2e
parent 15
f6ccc31d6e72
child 53
c3eb7cc1ff8b
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

eric ide

mercurial