eric6/UI/UserInterface.py

branch
maintenance
changeset 8176
31965986ecd1
parent 8142
43248bafe9b2
parent 8173
b2f9cda5cc0e
child 8177
5688d73cc3ae
diff -r e01ae92db699 -r 31965986ecd1 eric6/UI/UserInterface.py
--- a/eric6/UI/UserInterface.py	Sat Mar 06 10:00:52 2021 +0100
+++ b/eric6/UI/UserInterface.py	Sun Mar 28 15:00:11 2021 +0200
@@ -265,11 +265,11 @@
         # Generate the debug server object
         from Debugger.DebugServer import DebugServer
         debugServer = DebugServer(self.__originalPathString,
-                                  project=self.project)
+                                  project=self.project, parent=self)
         
         # Create the background service object
         from Utilities.BackgroundService import BackgroundService
-        self.backgroundService = BackgroundService()
+        self.backgroundService = BackgroundService(self)
         
         splash.showMessage(self.tr("Initializing Plugin Manager..."))
         
@@ -771,12 +771,12 @@
         layout.addWidget(self.viewmanager.searchWidget())
         layout.addWidget(self.viewmanager.replaceWidget())
         self.viewmanager.mainWidget().setSizePolicy(
-            QSizePolicy.Preferred, QSizePolicy.Expanding)
+            QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Expanding)
         leftWidget.setLayout(layout)
         self.viewmanager.searchWidget().hide()
         self.viewmanager.replaceWidget().hide()
         
-        splitter = QSplitter(Qt.Horizontal)
+        splitter = QSplitter(Qt.Orientation.Horizontal)
         splitter.addWidget(leftWidget)
         self.setCentralWidget(splitter)
         
@@ -826,21 +826,26 @@
         # Create the left toolbox
         self.lToolboxDock = self.__createDockWindow("lToolboxDock")
         self.lToolbox = E5VerticalToolBox(self.lToolboxDock)
-        self.__setupDockWindow(self.lToolboxDock, Qt.LeftDockWidgetArea,
-                               self.lToolbox, self.tr("Left Toolbox"))
+        self.__setupDockWindow(self.lToolboxDock,
+                               Qt.DockWidgetArea.LeftDockWidgetArea,
+                               self.lToolbox,
+                               self.tr("Left Toolbox"))
         
         # Create the horizontal toolbox
         self.hToolboxDock = self.__createDockWindow("hToolboxDock")
         self.hToolbox = E5HorizontalToolBox(self.hToolboxDock)
-        self.__setupDockWindow(self.hToolboxDock, Qt.BottomDockWidgetArea,
+        self.__setupDockWindow(self.hToolboxDock,
+                               Qt.DockWidgetArea.BottomDockWidgetArea,
                                self.hToolbox,
                                self.tr("Horizontal Toolbox"))
         
         # Create the right toolbox
         self.rToolboxDock = self.__createDockWindow("rToolboxDock")
         self.rToolbox = E5VerticalToolBox(self.rToolboxDock)
-        self.__setupDockWindow(self.rToolboxDock, Qt.RightDockWidgetArea,
-                               self.rToolbox, self.tr("Right Toolbox"))
+        self.__setupDockWindow(self.rToolboxDock,
+                               Qt.DockWidgetArea.RightDockWidgetArea,
+                               self.rToolbox,
+                               self.tr("Right Toolbox"))
         
         ####################################################
         ## Populate the left toolbox
@@ -1215,9 +1220,9 @@
         # create the central widget
         logging.debug("Creating central widget...")
         cw = self.centralWidget()   # save the current central widget
-        self.leftSplitter = QSplitter(Qt.Horizontal)
-        self.rightSplitter = QSplitter(Qt.Horizontal)
-        self.verticalSplitter = QSplitter(Qt.Vertical)
+        self.leftSplitter = QSplitter(Qt.Orientation.Horizontal)
+        self.rightSplitter = QSplitter(Qt.Orientation.Horizontal)
+        self.verticalSplitter = QSplitter(Qt.Orientation.Vertical)
         self.verticalSplitter.addWidget(cw)
         self.verticalSplitter.addWidget(self.bottomSidebar)
         self.rightSplitter.addWidget(self.verticalSplitter)
@@ -1560,7 +1565,12 @@
         dock = QDockWidget()
         dock.setObjectName(name)
         dock.setFeatures(
-            QDockWidget.DockWidgetFeatures(QDockWidget.AllDockWidgetFeatures))
+            QDockWidget.DockWidgetFeatures(
+                QDockWidget.DockWidgetFeature.DockWidgetClosable |
+                QDockWidget.DockWidgetFeature.DockWidgetMovable |
+                QDockWidget.DockWidgetFeature.DockWidgetFloatable
+            )
+        )
         return dock
 
     def __setupDockWindow(self, dock, where, widget, caption):
@@ -1642,7 +1652,7 @@
             """ and the preferences will be written to disc.</p>"""
         ))
         self.exitAct.triggered.connect(self.__quit)
-        self.exitAct.setMenuRole(QAction.QuitRole)
+        self.exitAct.setMenuRole(QAction.MenuRole.QuitRole)
         self.actions.append(self.exitAct)
 
         self.restartAct = E5Action(
@@ -2526,7 +2536,7 @@
             """ with your prefered values.</p>"""
         ))
         self.prefAct.triggered.connect(self.showPreferences)
-        self.prefAct.setMenuRole(QAction.PreferencesRole)
+        self.prefAct.setMenuRole(QAction.MenuRole.PreferencesRole)
         self.actions.append(self.prefAct)
 
         self.prefExportAct = E5Action(
@@ -3455,8 +3465,8 @@
         self.addToolBar(multiprojecttb)
         self.addToolBar(projecttb)
         self.addToolBar(vcstb)
-        self.addToolBar(Qt.RightToolBarArea, settingstb)
-        self.addToolBar(Qt.RightToolBarArea, toolstb)
+        self.addToolBar(Qt.ToolBarArea.RightToolBarArea, settingstb)
+        self.addToolBar(Qt.ToolBarArea.RightToolBarArea, toolstb)
         self.addToolBar(helptb)
         self.addToolBar(bookmarktb)
         self.addToolBar(spellingtb)
@@ -4499,14 +4509,14 @@
                 
                 if self.__layoutType == "Toolboxes":
                     # set the corner usages
-                    self.setCorner(Qt.TopLeftCorner,
-                                   Qt.LeftDockWidgetArea)
-                    self.setCorner(Qt.BottomLeftCorner,
-                                   Qt.LeftDockWidgetArea)
-                    self.setCorner(Qt.TopRightCorner,
-                                   Qt.RightDockWidgetArea)
-                    self.setCorner(Qt.BottomRightCorner,
-                                   Qt.RightDockWidgetArea)
+                    self.setCorner(Qt.Corner.TopLeftCorner,
+                                   Qt.DockWidgetArea.LeftDockWidgetArea)
+                    self.setCorner(Qt.Corner.BottomLeftCorner,
+                                   Qt.DockWidgetArea.LeftDockWidgetArea)
+                    self.setCorner(Qt.Corner.TopRightCorner,
+                                   Qt.DockWidgetArea.RightDockWidgetArea)
+                    self.setCorner(Qt.Corner.BottomRightCorner,
+                                   Qt.DockWidgetArea.RightDockWidgetArea)
             
             # step 3: activate the windows of the new profile
             if self.__layoutType == "Toolboxes":
@@ -4618,7 +4628,7 @@
             self.leftSidebar.show()
             self.leftSidebar.setCurrentWidget(self.projectBrowser)
         self.projectBrowser.currentWidget().setFocus(
-            Qt.ActiveWindowFocusReason)
+            Qt.FocusReason.ActiveWindowFocusReason)
         
     def __activateMultiProjectBrowser(self):
         """
@@ -4630,7 +4640,8 @@
         elif self.__layoutType == "Sidebars":
             self.leftSidebar.show()
             self.leftSidebar.setCurrentWidget(self.multiProjectBrowser)
-        self.multiProjectBrowser.setFocus(Qt.ActiveWindowFocusReason)
+        self.multiProjectBrowser.setFocus(
+            Qt.FocusReason.ActiveWindowFocusReason)
         
     def activateDebugViewer(self):
         """
@@ -4642,7 +4653,8 @@
         elif self.__layoutType == "Sidebars":
             self.rightSidebar.show()
             self.rightSidebar.setCurrentWidget(self.debugViewer)
-        self.debugViewer.currentWidget().setFocus(Qt.ActiveWindowFocusReason)
+        self.debugViewer.currentWidget().setFocus(
+            Qt.FocusReason.ActiveWindowFocusReason)
         
     def __activateShell(self):
         """
@@ -4654,7 +4666,7 @@
         elif self.__layoutType == "Sidebars":
             self.__shellParent.show()
             self.__shellParent.setCurrentWidget(self.shellAssembly)
-        self.shell.setFocus(Qt.ActiveWindowFocusReason)
+        self.shell.setFocus(Qt.FocusReason.ActiveWindowFocusReason)
         
     def __activateLogViewer(self):
         """
@@ -4666,7 +4678,7 @@
         elif self.__layoutType == "Sidebars":
             self.bottomSidebar.show()
             self.bottomSidebar.setCurrentWidget(self.logViewer)
-        self.logViewer.setFocus(Qt.ActiveWindowFocusReason)
+        self.logViewer.setFocus(Qt.FocusReason.ActiveWindowFocusReason)
         
     def __activateTaskViewer(self):
         """
@@ -4678,7 +4690,7 @@
         elif self.__layoutType == "Sidebars":
             self.bottomSidebar.show()
             self.bottomSidebar.setCurrentWidget(self.taskViewer)
-        self.taskViewer.setFocus(Qt.ActiveWindowFocusReason)
+        self.taskViewer.setFocus(Qt.FocusReason.ActiveWindowFocusReason)
         
     def __activateTemplateViewer(self):
         """
@@ -4691,7 +4703,8 @@
             elif self.__layoutType == "Sidebars":
                 self.leftSidebar.show()
                 self.leftSidebar.setCurrentWidget(self.templateViewer)
-            self.templateViewer.setFocus(Qt.ActiveWindowFocusReason)
+            self.templateViewer.setFocus(
+                Qt.FocusReason.ActiveWindowFocusReason)
         
     def __activateBrowser(self):
         """
@@ -4704,7 +4717,7 @@
             elif self.__layoutType == "Sidebars":
                 self.leftSidebar.show()
                 self.leftSidebar.setCurrentWidget(self.browser)
-            self.browser.setFocus(Qt.ActiveWindowFocusReason)
+            self.browser.setFocus(Qt.FocusReason.ActiveWindowFocusReason)
         
     def __toggleLeftToolbox(self):
         """
@@ -4713,7 +4726,8 @@
         hasFocus = self.lToolbox.currentWidget().hasFocus()
         shown = self.__toggleWindow(self.lToolboxDock)
         if shown:
-            self.lToolbox.currentWidget().setFocus(Qt.ActiveWindowFocusReason)
+            self.lToolbox.currentWidget().setFocus(
+                Qt.FocusReason.ActiveWindowFocusReason)
         else:
             if hasFocus:
                 self.__activateViewmanager()
@@ -4725,7 +4739,8 @@
         hasFocus = self.rToolbox.currentWidget().hasFocus()
         shown = self.__toggleWindow(self.rToolboxDock)
         if shown:
-            self.rToolbox.currentWidget().setFocus(Qt.ActiveWindowFocusReason)
+            self.rToolbox.currentWidget().setFocus(
+                Qt.FocusReason.ActiveWindowFocusReason)
         else:
             if hasFocus:
                 self.__activateViewmanager()
@@ -4737,7 +4752,8 @@
         hasFocus = self.hToolbox.currentWidget().hasFocus()
         shown = self.__toggleWindow(self.hToolboxDock)
         if shown:
-            self.hToolbox.currentWidget().setFocus(Qt.ActiveWindowFocusReason)
+            self.hToolbox.currentWidget().setFocus(
+                Qt.FocusReason.ActiveWindowFocusReason)
         else:
             if hasFocus:
                 self.__activateViewmanager()
@@ -4750,7 +4766,7 @@
         shown = self.__toggleWindow(self.leftSidebar)
         if shown:
             self.leftSidebar.currentWidget().setFocus(
-                Qt.ActiveWindowFocusReason)
+                Qt.FocusReason.ActiveWindowFocusReason)
         else:
             if hasFocus:
                 self.__activateViewmanager()
@@ -4763,7 +4779,7 @@
         shown = self.__toggleWindow(self.rightSidebar)
         if shown:
             self.rightSidebar.currentWidget().setFocus(
-                Qt.ActiveWindowFocusReason)
+                Qt.FocusReason.ActiveWindowFocusReason)
         else:
             if hasFocus:
                 self.__activateViewmanager()
@@ -4776,7 +4792,7 @@
         shown = self.__toggleWindow(self.bottomSidebar)
         if shown:
             self.bottomSidebar.currentWidget().setFocus(
-                Qt.ActiveWindowFocusReason)
+                Qt.FocusReason.ActiveWindowFocusReason)
         else:
             if hasFocus:
                 self.__activateViewmanager()
@@ -4792,7 +4808,7 @@
             elif self.__layoutType == "Sidebars":
                 self.rightSidebar.show()
                 self.rightSidebar.setCurrentWidget(self.cooperation)
-            self.cooperation.setFocus(Qt.ActiveWindowFocusReason)
+            self.cooperation.setFocus(Qt.FocusReason.ActiveWindowFocusReason)
         
     def __activateIRC(self):
         """
@@ -4805,7 +4821,7 @@
             elif self.__layoutType == "Sidebars":
                 self.rightSidebar.show()
                 self.rightSidebar.setCurrentWidget(self.irc)
-            self.irc.setFocus(Qt.ActiveWindowFocusReason)
+            self.irc.setFocus(Qt.FocusReason.ActiveWindowFocusReason)
         
     def __activateSymbolsViewer(self):
         """
@@ -4818,7 +4834,7 @@
             elif self.__layoutType == "Sidebars":
                 self.leftSidebar.show()
                 self.leftSidebar.setCurrentWidget(self.symbolsViewer)
-            self.symbolsViewer.setFocus(Qt.ActiveWindowFocusReason)
+            self.symbolsViewer.setFocus(Qt.FocusReason.ActiveWindowFocusReason)
         
     def __activateNumbersViewer(self):
         """
@@ -4831,7 +4847,7 @@
             elif self.__layoutType == "Sidebars":
                 self.bottomSidebar.show()
                 self.bottomSidebar.setCurrentWidget(self.numbersViewer)
-            self.numbersViewer.setFocus(Qt.ActiveWindowFocusReason)
+            self.numbersViewer.setFocus(Qt.FocusReason.ActiveWindowFocusReason)
         
     def __activateViewmanager(self):
         """
@@ -4839,7 +4855,7 @@
         """
         aw = self.viewmanager.activeWindow()
         if aw is not None:
-            aw.setFocus(Qt.ActiveWindowFocusReason)
+            aw.setFocus(Qt.FocusReason.ActiveWindowFocusReason)
     
     def activateCodeDocumentationViewer(self, switchFocus=True):
         """
@@ -4858,7 +4874,7 @@
                     self.codeDocumentationViewer)
             if switchFocus:
                 self.codeDocumentationViewer.setFocus(
-                    Qt.ActiveWindowFocusReason)
+                    Qt.FocusReason.ActiveWindowFocusReason)
     
     def __activatePipWidget(self):
         """
@@ -4871,7 +4887,7 @@
             elif self.__layoutType == "Sidebars":
                 self.rightSidebar.show()
                 self.rightSidebar.setCurrentWidget(self.pipWidget)
-            self.pipWidget.setFocus(Qt.ActiveWindowFocusReason)
+            self.pipWidget.setFocus(Qt.FocusReason.ActiveWindowFocusReason)
     
     def __activateCondaWidget(self):
         """
@@ -4884,7 +4900,7 @@
             elif self.__layoutType == "Sidebars":
                 self.rightSidebar.show()
                 self.rightSidebar.setCurrentWidget(self.condaWidget)
-            self.condaWidget.setFocus(Qt.ActiveWindowFocusReason)
+            self.condaWidget.setFocus(Qt.FocusReason.ActiveWindowFocusReason)
     
     def __activateMicroPython(self):
         """
@@ -4897,7 +4913,8 @@
             elif self.__layoutType == "Sidebars":
                 self.rightSidebar.show()
                 self.rightSidebar.setCurrentWidget(self.microPythonWidget)
-            self.microPythonWidget.setFocus(Qt.ActiveWindowFocusReason)
+            self.microPythonWidget.setFocus(
+                Qt.FocusReason.ActiveWindowFocusReason)
     
     def __toggleWindow(self, w):
         """
@@ -4920,7 +4937,7 @@
         from Preferences.ToolConfigurationDialog import ToolConfigurationDialog
         dlg = ToolConfigurationDialog(
             self.toolGroups[self.currentToolGroup][1], self)
-        if dlg.exec() == QDialog.Accepted:
+        if dlg.exec() == QDialog.DialogCode.Accepted:
             self.toolGroups[self.currentToolGroup][1] = dlg.getToollist()
             self.__updateExternalToolsActions()
         
@@ -4933,7 +4950,7 @@
         )
         dlg = ToolGroupConfigurationDialog(
             self.toolGroups, self.currentToolGroup, self)
-        if dlg.exec() == QDialog.Accepted:
+        if dlg.exec() == QDialog.DialogCode.Accepted:
             self.toolGroups, self.currentToolGroup = dlg.getToolGroups()
         
     def __createUnitTestDialog(self):
@@ -5549,8 +5566,8 @@
         else:
             self.toolProcs.append((program, proc, procData))
             if tool['redirect'] == 'no':
-                proc.closeReadChannel(QProcess.StandardOutput)
-                proc.closeReadChannel(QProcess.StandardError)
+                proc.closeReadChannel(QProcess.ProcessChannel.StandardOutput)
+                proc.closeReadChannel(QProcess.ProcessChannel.StandardError)
                 proc.closeWriteChannel()
         
     def __processToolStdout(self):
@@ -5561,7 +5578,7 @@
         
         # loop through all running tool processes
         for program, toolProc, toolProcData in self.toolProcs:
-            toolProc.setReadChannel(QProcess.StandardOutput)
+            toolProc.setReadChannel(QProcess.ProcessChannel.StandardOutput)
             
             if (
                 toolProcData[0] is None or
@@ -5588,7 +5605,7 @@
         
         # loop through all running tool processes
         for program, toolProc, _toolProcData in self.toolProcs:
-            toolProc.setReadChannel(QProcess.StandardError)
+            toolProc.setReadChannel(QProcess.ProcessChannel.StandardError)
             
             while toolProc.canReadLine():
                 error = str(toolProc.readLine(), ioEncoding, 'replace')
@@ -5606,7 +5623,7 @@
         
         # loop through all running tool processes
         for program, toolProc, toolProcData in self.toolProcs:
-            if toolProc.state() == QProcess.NotRunning:
+            if toolProc.state() == QProcess.ProcessState.NotRunning:
                 exitedProcs.append((program, toolProc, toolProcData))
                 if toolProcData[0] is not None:
                     if toolProcData[1] == "replaceSelection":
@@ -5929,7 +5946,7 @@
         @type bool
         """
         if isinstance(home, QUrl):
-            home = home.toString(QUrl.None_)
+            home = home.toString(QUrl.UrlFormattingOption.None_)
         
         if len(home) > 0:
             homeUrl = QUrl(home)
@@ -6032,8 +6049,8 @@
                 QThread.msleep(1000)
                 QApplication.processEvents()
             if (
-                process.state() == QProcess.NotRunning and
-                process.exitStatus() == QProcess.NormalExit and
+                process.state() == QProcess.ProcessState.NotRunning and
+                process.exitStatus() == QProcess.ExitStatus.NormalExit and
                 process.exitCode() == 100
             ):
                 # Process exited prematurely due to missing pre-requisites
@@ -6117,7 +6134,10 @@
                 self.__configurationDialog.showConfigurationPageByName("empty")
             self.__configurationDialog.exec()
             QApplication.processEvents()
-            if self.__configurationDialog.result() == QDialog.Accepted:
+            if (
+                self.__configurationDialog.result() ==
+                QDialog.DialogCode.Accepted
+            ):
                 self.__configurationDialog.setPreferences()
                 Preferences.syncPreferences()
                 self.__preferencesChanged()
@@ -6256,7 +6276,7 @@
         from Preferences.ViewProfileDialog import ViewProfileDialog
         dlg = ViewProfileDialog(self.__layoutType, self.profiles['edit'][1],
                                 self.profiles['debug'][1])
-        if dlg.exec() == QDialog.Accepted:
+        if dlg.exec() == QDialog.DialogCode.Accepted:
             edit, debug = dlg.getVisibilities()
             self.profiles['edit'][1] = edit
             self.profiles['debug'][1] = debug
@@ -6272,7 +6292,7 @@
         """
         from E5Gui.E5ToolBarDialog import E5ToolBarDialog
         dlg = E5ToolBarDialog(self.toolbarManager)
-        if dlg.exec() == QDialog.Accepted:
+        if dlg.exec() == QDialog.DialogCode.Accepted:
             Preferences.setUI(
                 "ToolbarManagerState", self.toolbarManager.saveState())
         
@@ -6351,7 +6371,7 @@
         """
         from .ClearPrivateDataDialog import ClearPrivateDataDialog
         dlg = ClearPrivateDataDialog(self)
-        if dlg.exec() == QDialog.Accepted:
+        if dlg.exec() == QDialog.DialogCode.Accepted:
             # recent files, recent projects, recent multi  projects,
             # debug histories, shell histories
             (files, projects, multiProjects, debug, shell, vcs, plugins) = (
@@ -6508,7 +6528,7 @@
             fn = os.path.join(Utilities.getConfigDir(), "eric6tasks.e6t")
             if os.path.exists(fn):
                 f = QFile(fn)
-                if f.open(QIODevice.ReadOnly):
+                if f.open(QIODevice.OpenModeFlag.ReadOnly):
                     from E5XML.TasksReader import TasksReader
                     reader = TasksReader(f, viewer=self.taskViewer)
                     reader.readXML()
@@ -6546,7 +6566,7 @@
             res = self.__sessionFile.writeFile(fn)
         else:
             f = QFile(fn)
-            if f.open(QIODevice.WriteOnly):
+            if f.open(QIODevice.OpenModeFlag.WriteOnly):
                 from E5XML.SessionWriter import SessionWriter
                 SessionWriter(f, None).writeXML()
                 f.close()
@@ -6598,7 +6618,7 @@
             else:
                 # old XML based format
                 f = QFile(fn)
-                if f.open(QIODevice.ReadOnly):
+                if f.open(QIODevice.OpenModeFlag.ReadOnly):
                     from E5XML.SessionReader import SessionReader
                     self.__readingSession = True
                     reader = SessionReader(f, True)
@@ -6832,7 +6852,7 @@
         from PluginManager.PluginRepositoryDialog import PluginRepositoryDialog
         dlg = PluginRepositoryDialog(self.pluginManager, self)
         res = dlg.exec()
-        if res == (QDialog.Accepted + 1):
+        if res == (QDialog.DialogCode.Accepted + 1):
             self.__installPlugins(dlg.getDownloadedPlugins())
         
     def __pluginsConfigure(self):
@@ -7071,8 +7091,9 @@
                 self.tr("Trying host {0}").format(url.host()))
             self.__versionCheckProgress.setValue(alternative)
         request = QNetworkRequest(url)
-        request.setAttribute(QNetworkRequest.CacheLoadControlAttribute,
-                             QNetworkRequest.AlwaysNetwork)
+        request.setAttribute(
+            QNetworkRequest.Attribute.CacheLoadControlAttribute,
+            QNetworkRequest.CacheLoadControl.AlwaysNetwork)
         reply = self.__networkManager.get(request)
         reply.finished.connect(lambda: self.__versionsDownloadDone(reply))
         self.__replies.append(reply)
@@ -7096,12 +7117,12 @@
         reply.deleteLater()
         if reply in self.__replies:
             self.__replies.remove(reply)
-        if reply.error() == QNetworkReply.NoError:
+        if reply.error() == QNetworkReply.NetworkError.NoError:
             ioEncoding = Preferences.getSystem("IOEncoding")
             versions = str(reply.readAll(), ioEncoding, 'replace').splitlines()
         reply.close()
         if (
-            reply.error() != QNetworkReply.NoError or
+            reply.error() != QNetworkReply.NetworkError.NoError or
             len(versions) == 0 or
             versions[0].startswith("<")
         ):
@@ -7432,7 +7453,8 @@
         """
         if self.__startup:
             if Preferences.getGeometry("MainMaximized"):
-                self.setWindowState(Qt.WindowStates(Qt.WindowMaximized))
+                self.setWindowState(
+                    Qt.WindowStates(Qt.WindowState.WindowMaximized))
             self.__startup = False
     
     ##########################################

eric ide

mercurial