eric6/E5XML/SessionWriter.py

changeset 6942
2602857055c5
parent 6645
ad476851d7e0
child 7229
53054eb5b15a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/E5XML/SessionWriter.py	Sun Apr 14 15:09:21 2019 +0200
@@ -0,0 +1,256 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2004 - 2019 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing the writer class for writing an XML session file.
+"""
+
+from __future__ import unicode_literals
+
+import time
+
+from E5Gui.E5Application import e5App
+
+from .XMLStreamWriterBase import XMLStreamWriterBase
+from .Config import sessionFileFormatVersion
+
+import Preferences
+
+
+class SessionWriter(XMLStreamWriterBase):
+    """
+    Class implementing the writer class for writing an XML session file.
+    """
+    def __init__(self, device, projectName):
+        """
+        Constructor
+        
+        @param device reference to the I/O device to write to
+        @type QIODevice
+        @param projectName name of the project or None for the
+            global session
+        @type str or None
+        """
+        XMLStreamWriterBase.__init__(self, device)
+        
+        self.name = projectName
+        self.project = e5App().getObject("Project")
+        self.projectBrowser = e5App().getObject("ProjectBrowser")
+        self.multiProject = e5App().getObject("MultiProject")
+        self.vm = e5App().getObject("ViewManager")
+        self.dbg = e5App().getObject("DebugUI")
+        self.dbs = e5App().getObject("DebugServer")
+        
+    def writeXML(self):
+        """
+        Public method to write the XML to the file.
+        """
+        isGlobal = self.name is None
+        
+        XMLStreamWriterBase.writeXML(self)
+        
+        self.writeDTD('<!DOCTYPE Session SYSTEM "Session-{0}.dtd">'.format(
+            sessionFileFormatVersion))
+        
+        # add some generation comments
+        if not isGlobal:
+            self.writeComment(
+                " eric6 session file for project {0} ".format(self.name))
+        self.writeComment(
+            " This file was generated automatically, do not edit. ")
+        if Preferences.getProject("XMLTimestamp") or isGlobal:
+            self.writeComment(
+                " Saved: {0} ".format(time.strftime('%Y-%m-%d, %H:%M:%S')))
+        
+        # add the main tag
+        self.writeStartElement("Session")
+        self.writeAttribute("version", sessionFileFormatVersion)
+        
+        # step 0: save open multi project and project for the global session
+        if isGlobal:
+            if self.multiProject.isOpen():
+                self.writeTextElement(
+                    "MultiProject", self.multiProject.getMultiProjectFile())
+            if self.project.isOpen():
+                self.writeTextElement("Project", self.project.getProjectFile())
+        
+        # step 1: save all open (project) filenames and the active window
+        if self.vm.canSplit():
+            self.writeEmptyElement("ViewManagerSplits")
+            self.writeAttribute("count", str(self.vm.splitCount()))
+            self.writeAttribute("orientation",
+                                str(self.vm.getSplitOrientation()))
+        
+        allOpenEditorLists = self.vm.getOpenEditorsForSession()
+        editorDict = {}     # remember editors by file name to detect clones
+        self.writeStartElement("Filenames")
+        for splitIndex, openEditorList in enumerate(allOpenEditorLists):
+            for editorIndex, editor in enumerate(openEditorList):
+                fileName = editor.getFileName()
+                if isGlobal or self.project.isProjectFile(fileName):
+                    line, index = editor.getCursorPosition()
+                    folds = ','.join(
+                        [str(i + 1) for i in editor.contractedFolds()])
+                    zoom = editor.getZoom()
+                    if fileName in editorDict:
+                        isClone = int(editorDict[fileName].isClone(editor))
+                    else:
+                        isClone = 0
+                        editorDict[fileName] = editor
+                    self.writeStartElement("Filename")
+                    self.writeAttribute("cline", str(line))
+                    self.writeAttribute("cindex", str(index))
+                    self.writeAttribute("folds", folds)
+                    self.writeAttribute("zoom", str(zoom))
+                    self.writeAttribute("cloned", str(isClone))
+                    self.writeAttribute("splitindex", str(splitIndex))
+                    self.writeAttribute("editorindex", str(editorIndex))
+                    self.writeCharacters(fileName)
+                    self.writeEndElement()
+        self.writeEndElement()
+        
+        aw = self.vm.getActiveName()
+        if aw and self.project.isProjectFile(aw):
+            ed = self.vm.getOpenEditor(aw)
+            line, index = ed.getCursorPosition()
+            self.writeStartElement("ActiveWindow")
+            self.writeAttribute("cline", str(line))
+            self.writeAttribute("cindex", str(index))
+            self.writeCharacters(aw)
+            self.writeEndElement()
+        
+        # step 2a: save all breakpoints
+        allBreaks = Preferences.getProject("SessionAllBreakpoints")
+        projectFiles = self.project.getSources(True)
+        bpModel = self.dbs.getBreakPointModel()
+        self.writeStartElement("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.writeStartElement("Breakpoint")
+                self.writeTextElement("BpFilename", fname)
+                self.writeEmptyElement("Linenumber")
+                self.writeAttribute("value", str(lineno))
+                self.writeTextElement("Condition", str(cond))
+                self.writeEmptyElement("Temporary")
+                self.writeAttribute("value", str(temp))
+                self.writeEmptyElement("Enabled")
+                self.writeAttribute("value", str(enabled))
+                self.writeEmptyElement("Count")
+                self.writeAttribute("value", str(count))
+                self.writeEndElement()
+        self.writeEndElement()
+        
+        # step 2b: save all watch expressions
+        self.writeStartElement("Watchexpressions")
+        wpModel = self.dbs.getWatchPointModel()
+        for row in range(wpModel.rowCount()):
+            index = wpModel.index(row, 0)
+            cond, special, temp, enabled, count = \
+                wpModel.getWatchPointByIndex(index)[:5]
+            self.writeStartElement("Watchexpression")
+            self.writeTextElement("Condition", str(cond))
+            self.writeEmptyElement("Temporary")
+            self.writeAttribute("value", str(temp))
+            self.writeEmptyElement("Enabled")
+            self.writeAttribute("value", str(enabled))
+            self.writeEmptyElement("Count")
+            self.writeAttribute("value", str(count))
+            self.writeTextElement("Special", special)
+            self.writeEndElement()
+        self.writeEndElement()
+        
+        # step 3: save the debug info
+        self.writeStartElement("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.writeTextElement("VirtualEnv", self.dbg.lastUsedVenvName)
+            self.writeTextElement("CommandLine", dbgCmdline)
+            self.writeTextElement("WorkingDirectory", dbgWd)
+            self.writeTextElement("Environment", dbgEnv)
+            self.writeEmptyElement("ReportExceptions")
+            self.writeAttribute("value", str(self.dbg.exceptions))
+            self.writeStartElement("Exceptions")
+            for exc in self.dbg.excList:
+                self.writeTextElement("Exception", exc)
+            self.writeEndElement()
+            self.writeStartElement("IgnoredExceptions")
+            for iexc in self.dbg.excIgnoreList:
+                self.writeTextElement("IgnoredException", iexc)
+            self.writeEndElement()
+            self.writeEmptyElement("AutoClearShell")
+            self.writeAttribute("value", str(self.dbg.autoClearShell))
+            self.writeEmptyElement("TracePython")
+            self.writeAttribute("value", str(self.dbg.tracePython))
+            self.writeEmptyElement("AutoContinue")
+            self.writeAttribute("value", str(self.dbg.autoContinue))
+            self.writeEmptyElement("CovexcPattern")    # kept for compatibility
+        else:
+            self.writeTextElement("VirtualEnv", self.project.dbgVirtualEnv)
+            self.writeTextElement("CommandLine", self.project.dbgCmdline)
+            self.writeTextElement("WorkingDirectory", self.project.dbgWd)
+            self.writeTextElement("Environment", self.project.dbgEnv)
+            self.writeEmptyElement("ReportExceptions")
+            self.writeAttribute("value", str(self.project.dbgReportExceptions))
+            self.writeStartElement("Exceptions")
+            for exc in self.project.dbgExcList:
+                self.writeTextElement("Exception", exc)
+            self.writeEndElement()
+            self.writeStartElement("IgnoredExceptions")
+            for iexc in self.project.dbgExcIgnoreList:
+                self.writeTextElement("IgnoredException", iexc)
+            self.writeEndElement()
+            self.writeEmptyElement("AutoClearShell")
+            self.writeAttribute("value", str(self.project.dbgAutoClearShell))
+            self.writeEmptyElement("TracePython")
+            self.writeAttribute("value", str(self.project.dbgTracePython))
+            self.writeEmptyElement("AutoContinue")
+            self.writeAttribute("value", str(self.project.dbgAutoContinue))
+            self.writeEmptyElement("CovexcPattern")    # kept for compatibility
+        self.writeEndElement()
+        
+        # step 4: save bookmarks of all open (project) files
+        self.writeStartElement("Bookmarks")
+        for fileName in editorDict:
+            if isGlobal or self.project.isProjectFile(fileName):
+                editor = editorDict[fileName]
+                for bookmark in editor.getBookmarks():
+                    self.writeStartElement("Bookmark")
+                    self.writeTextElement("BmFilename", fileName)
+                    self.writeEmptyElement("Linenumber")
+                    self.writeAttribute("value", str(bookmark))
+                    self.writeEndElement()
+        self.writeEndElement()
+        
+        # step 5: save state of the various project browsers
+        if not isGlobal:
+            self.writeStartElement("ProjectBrowserStates")
+            for browserName in self.projectBrowser.getProjectBrowserNames():
+                self.writeStartElement("ProjectBrowserState")
+                self.writeAttribute("name", browserName)
+                # get the names of expanded files and directories
+                names = self.projectBrowser\
+                    .getProjectBrowser(browserName).getExpandedItemNames()
+                for name in names:
+                    self.writeTextElement("ExpandedItemName", name)
+                self.writeEndElement()
+            self.writeEndElement()
+        
+        # add the main end tag
+        self.writeEndElement()
+        self.writeEndDocument()

eric ide

mercurial