eric5.py

changeset 15
f6ccc31d6e72
child 18
3b1f5d872fd7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric5.py	Sat Jan 02 17:09:08 2010 +0000
@@ -0,0 +1,253 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2002 - 2010 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Eric4 Python IDE
+
+This is the main Python script that performs the necessary initialization
+of the IDE and starts the Qt event loop.
+"""
+
+import sys
+import os
+import traceback
+import io
+import time
+import logging
+
+from PyQt4.QtCore import QTextCodec, SIGNAL, SLOT, qWarning, \
+    QLibraryInfo, QTimer
+from PyQt4.QtGui import QApplication, QErrorMessage
+
+# some global variables needed to start the application
+args = None
+mainWindow = None
+splash = None
+
+# generate list of arguments to be remembered for a restart
+restartArgsList = ["--nosplash", "--plugin", "--debug", "--config"]
+restartArgs = [arg for arg in sys.argv[1:] if arg.split("=", 1)[0] in restartArgsList]
+
+if "--debug" in sys.argv:
+    del sys.argv[sys.argv.index("--debug")]
+    logging.basicConfig(level = logging.DEBUG)
+
+for arg in sys.argv:
+    if arg.startswith("--config="):
+        import Utilities
+        configDir = arg.replace("--config=", "")
+        Utilities.setConfigDir(configDir)
+        sys.argv.remove(arg)
+        break
+
+# make ThirdParty package available as a packages repository
+try:
+    import pygments
+except ImportError:
+    sys.path.insert(2, os.path.join(os.path.dirname(__file__), "ThirdParty", "Pygments"))
+
+from E4Gui.E4Application import E4Application
+
+from UI.Info import Program, Version, BugAddress
+from UI.SplashScreen import SplashScreen, NoneSplashScreen
+from E4Gui.E4SingleApplication import E4SingleApplicationClient
+
+import Utilities
+from Utilities import Startup
+
+logging.debug("Importing Preferences")
+import Preferences
+
+def handleSingleApplication(ddindex):
+    """
+    Global function to handle the single application mode.
+    
+    @param ddindex index of a '--' option in the options list
+    """
+    client = E4SingleApplicationClient()
+    res = client.connect()
+    if res > 0:
+        if "--nosplash" in sys.argv and sys.argv.index("--nosplash") < ddindex:
+            del sys.argv[sys.argv.index("--nosplash")]
+        if "--noopen" in sys.argv and sys.argv.index("--noopen") < ddindex:
+            del sys.argv[sys.argv.index("--noopen")]
+        if "--debug" in sys.argv and sys.argv.index("--debug") < ddindex:
+            del sys.argv[sys.argv.index("--debug")]
+        for arg in sys.argv:
+            if arg.startswith("--config="):
+                sys.argv.remove(arg)
+                break
+        if len(sys.argv) > 1:
+            client.processArgs(sys.argv[1:])
+        sys.exit(0)
+    elif res < 0:
+        print("eric5: %s" % client.errstr())
+        sys.exit(res)
+
+def excepthook(excType, excValue, tracebackobj):
+    """
+    Global function to catch unhandled exceptions.
+    
+    @param excType exception type
+    @param excValue exception value
+    @param tracebackobj traceback object
+    """
+    separator = '-' * 80
+    logFile = os.path.join(Utilities.getConfigDir(), "eric5_error.log")
+    notice = \
+        """An unhandled exception occurred. Please report the problem\n"""\
+        """using the error reporting dialog or via email to <%s>.\n"""\
+        """A log has been written to "%s".\n\nError information:\n""" % \
+        (BugAddress, logFile)
+    timeString = time.strftime("%Y-%m-%d, %H:%M:%S")
+    
+    versionInfo = "\n%s\n%s" % (separator, Utilities.generateVersionInfo())
+    pluginVersionInfo = Utilities.generatePluginsVersionInfo()
+    if pluginVersionInfo:
+        versionInfo += "%s\n%s" % (separator, pluginVersionInfo)
+    distroInfo = Utilities.generateDistroInfo()
+    if distroInfo:
+        versionInfo += "%s\n%s" % (separator, distroInfo)
+    
+    tbinfofile = io.StringIO()
+    traceback.print_tb(tracebackobj, None, tbinfofile)
+    tbinfofile.seek(0)
+    tbinfo = tbinfofile.read()
+    errmsg = '%s: \n%s' % (str(excType), str(excValue))
+    sections = [separator, timeString, separator, errmsg, separator, tbinfo]
+    msg = '\n'.join(sections)
+    try:
+        f = open(logFile, "w")
+        f.write(msg)
+        f.write(versionInfo)
+        f.close()
+    except IOError:
+        pass
+    qWarning(str(notice) + str(msg) + str(versionInfo))
+
+def uiStartUp():
+    """
+    Global function to finalize the start up of the main UI.
+    
+    Note: It is activated by a zero timeout single-shot timer.
+    """
+    global args, mainWindow, splash
+    
+    if splash:
+        splash.finish(mainWindow)
+        del splash
+    
+    mainWindow.checkForErrorLog()
+    mainWindow.processArgs(args)
+    mainWindow.performVersionCheck(False)
+    mainWindow.checkConfigurationStatus()
+
+def main():
+    """
+    Main entry point into the application.
+    """
+    global args, mainWindow, splash, restartArgs
+    
+    sys.excepthook = excepthook
+    
+    options = [\
+        ("--config=configDir", 
+         "use the given directory as the one containing the config files"), 
+        ("--debug", "activate debugging output to the console"), 
+        ("--nosplash", "don't show the splash screen"),
+        ("--noopen", "don't open anything at startup except that given in command"), 
+        ("--plugin=plugin-file", "load the given plugin file (plugin development)"), 
+        ("--start-session", "load the global session file"), 
+        ("--", "indicate that there are options for the program to be debugged"),
+        ("", "(everything after that is considered arguments for this program)")
+    ]
+    appinfo = Startup.makeAppInfo(sys.argv,
+                                  "Eric4",
+                                  "[project | files... [--] [debug-options]]",
+                                  "A Python IDE",
+                                  options)
+    ddindex = Startup.handleArgs(sys.argv, appinfo)
+    
+    if Preferences.getUI("SingleApplicationMode"):
+        handleSingleApplication(ddindex)
+    
+    app = E4Application(sys.argv)
+    
+    # set the searchpath for icons
+    Startup.initializeResourceSearchPath()
+
+    # generate and show a splash window, if not suppressed
+    if "--nosplash" in sys.argv and sys.argv.index("--nosplash") < ddindex:
+        del sys.argv[sys.argv.index("--nosplash")]
+        splash = NoneSplashScreen()
+    elif not Preferences.getUI("ShowSplash"):
+        splash = NoneSplashScreen()
+    else:
+        splash = SplashScreen()
+
+    pluginFile = None
+    noopen = False
+    if "--noopen" in sys.argv and sys.argv.index("--noopen") < ddindex:
+        del sys.argv[sys.argv.index("--noopen")]
+        noopen = True
+    for arg in sys.argv:
+        if arg.startswith("--plugin=") and sys.argv.index(arg) < ddindex:
+            # extract the plugin development option
+            pluginFile = arg.replace("--plugin=", "")
+            sys.argv.remove(arg)
+            pluginFile = os.path.expanduser(pluginFile)
+            pluginFile = Utilities.normabspath(pluginFile)
+            break
+    
+    # is there a set of filenames or options on the command line,
+    # if so, pass them to the UI
+    if len(sys.argv) > 1:
+        args = sys.argv[1:]
+    
+    # Set the applications string encoding
+    try:
+        sys.setappdefaultencoding(Preferences.getSystem("StringEncoding"))
+    except AttributeError:
+        pass
+    
+    # get the Qt4 translations directory
+    qt4TransDir = Preferences.getQt4TranslationsDir()
+    if not qt4TransDir:
+        qt4TransDir = QLibraryInfo.location(QLibraryInfo.TranslationsPath)
+    
+    # Load translation files and install them
+    loc = Startup.loadTranslators(qt4TransDir, app, ("qscintilla",))
+    
+    QTextCodec.setCodecForCStrings(QTextCodec.codecForName(\
+        str(Preferences.getSystem("StringEncoding"))))
+    
+    splash.showMessage(QApplication.translate("eric5", "Importing packages..."))
+    # We can only import these after creating the E4Application because they
+    # make Qt calls that need the E4Application to exist.
+    from UI.UserInterface import UserInterface
+
+    splash.showMessage(QApplication.translate("eric5", "Generating Main Window..."))
+    try:
+        mainWindow = UserInterface(loc, splash, pluginFile, noopen, restartArgs)
+        app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
+        mainWindow.show()
+        
+        QTimer.singleShot(0, uiStartUp)
+        
+        # generate a graphical error handler
+        eMsg = QErrorMessage.qtHandler()
+        eMsg.setMinimumSize(600, 400)
+        
+        # start the event loop
+        res = app.exec_()
+        logging.debug("Shutting down, result %d" % res)
+        logging.shutdown()
+        sys.exit(res)
+    except Exception as err:
+        raise err
+
+if __name__ == '__main__':
+    main()
\ No newline at end of file

eric ide

mercurial