Merged with default branch. QtWebEngine

Mon, 28 Mar 2016 11:59:42 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Mon, 28 Mar 2016 11:59:42 +0200
branch
QtWebEngine
changeset 4895
3baaf8303a7f
parent 4886
b56735d36159 (current diff)
parent 4892
64fc1deaeadb (diff)
child 4900
32f940762654

Merged with default branch.

Documentation/Help/source.qch file | annotate | diff | comparison | revisions
Preferences/ConfigurationPages/NetworkPage.py file | annotate | diff | comparison | revisions
Preferences/__init__.py file | annotate | diff | comparison | revisions
WebBrowser/AdBlock/AdBlockIcon.py file | annotate | diff | comparison | revisions
WebBrowser/AdBlock/AdBlockTreeWidget.py file | annotate | diff | comparison | revisions
WebBrowser/CookieJar/CookieExceptionsModel.py file | annotate | diff | comparison | revisions
WebBrowser/CookieJar/CookieModel.py file | annotate | diff | comparison | revisions
WebBrowser/CookieJar/CookiesExceptionsDialog.py file | annotate | diff | comparison | revisions
WebBrowser/QtHelp/HelpDocsInstaller.py file | annotate | diff | comparison | revisions
install.py file | annotate | diff | comparison | revisions
--- a/APIs/Python3/eric6.api	Sun Mar 20 20:13:29 2016 +0100
+++ b/APIs/Python3/eric6.api	Mon Mar 28 11:59:42 2016 +0200
@@ -7572,12 +7572,12 @@
 eric6.QScintilla.Editor.Editor.viewportEvent?4(evt)
 eric6.QScintilla.Editor.Editor.wheelEvent?4(evt)
 eric6.QScintilla.Editor.Editor.writeFile?4(fn, backup=True)
-eric6.QScintilla.Editor.Editor?1(dbs, fn=None, vm=None, filetype="", editor=None, tv=None)
+eric6.QScintilla.Editor.Editor?1(dbs, fn="", vm=None, filetype="", editor=None, tv=None)
 eric6.QScintilla.Editor.EditorAutoCompletionListID?7
 eric6.QScintilla.Editor.TemplateCompletionListID?7
 eric6.QScintilla.EditorAssembly.EditorAssembly.getEditor?4()
 eric6.QScintilla.EditorAssembly.EditorAssembly.shutdownTimer?4()
-eric6.QScintilla.EditorAssembly.EditorAssembly?1(dbs, fn=None, vm=None, filetype="", editor=None, tv=None)
+eric6.QScintilla.EditorAssembly.EditorAssembly?1(dbs, fn="", vm=None, filetype="", editor=None, tv=None)
 eric6.QScintilla.EditorMarkerMap.EditorMarkerMap._paintIt?5(painter)
 eric6.QScintilla.EditorMarkerMap.EditorMarkerMap.initColors?4()
 eric6.QScintilla.EditorMarkerMap.EditorMarkerMap?1(parent=None)
Binary file Documentation/Help/source.qch has changed
--- a/Documentation/Source/eric6.QScintilla.Editor.html	Sun Mar 20 20:13:29 2016 +0100
+++ b/Documentation/Source/eric6.QScintilla.Editor.html	Mon Mar 28 11:59:42 2016 +0200
@@ -1203,7 +1203,7 @@
 </table>
 <a NAME="Editor.__init__" ID="Editor.__init__"></a>
 <h4>Editor (Constructor)</h4>
-<b>Editor</b>(<i>dbs, fn=None, vm=None, filetype="", editor=None, tv=None</i>)
+<b>Editor</b>(<i>dbs, fn="", vm=None, filetype="", editor=None, tv=None</i>)
 <p>
         Constructor
 </p><dl>
--- a/Documentation/Source/eric6.QScintilla.EditorAssembly.html	Sun Mar 20 20:13:29 2016 +0100
+++ b/Documentation/Source/eric6.QScintilla.EditorAssembly.html	Mon Mar 28 11:59:42 2016 +0200
@@ -90,7 +90,7 @@
 </table>
 <a NAME="EditorAssembly.__init__" ID="EditorAssembly.__init__"></a>
 <h4>EditorAssembly (Constructor)</h4>
-<b>EditorAssembly</b>(<i>dbs, fn=None, vm=None, filetype="", editor=None, tv=None</i>)
+<b>EditorAssembly</b>(<i>dbs, fn="", vm=None, filetype="", editor=None, tv=None</i>)
 <p>
         Constructor
 </p><dl>
--- a/Documentation/Source/eric6.ViewManager.ViewManager.html	Sun Mar 20 20:13:29 2016 +0100
+++ b/Documentation/Source/eric6.ViewManager.ViewManager.html	Mon Mar 28 11:59:42 2016 +0200
@@ -2186,7 +2186,7 @@
 <dt>Returns:</dt>
 <dd>
 reference to the new editor object (Editor.Editor) and the new
-            edito assembly object (EditorAssembly.EditorAssembly)
+            editor assembly object (EditorAssembly.EditorAssembly)
 </dd>
 </dl><a NAME="ViewManager.closeAllWindows" ID="ViewManager.closeAllWindows"></a>
 <h4>ViewManager.closeAllWindows</h4>
--- a/Helpviewer/AdBlock/AdBlockIcon.py	Sun Mar 20 20:13:29 2016 +0100
+++ b/Helpviewer/AdBlock/AdBlockIcon.py	Mon Mar 28 11:59:42 2016 +0200
@@ -122,7 +122,7 @@
         @return reference to the menu action (QAction)
         """
         if not self.__menuAction:
-            self.__menuAction = QAction(self.tr("AdBlock"))
+            self.__menuAction = QAction(self.tr("AdBlock"), self)
             self.__menuAction.setMenu(QMenu())
             self.__menuAction.menu().aboutToShow.connect(self.__createMenu)
         
@@ -163,6 +163,9 @@
         @return flag indicating an exception (boolean)
         """
         browser = self.__mw.currentBrowser()
+        if browser is None:
+            return False
+        
         urlHost = browser.page().url().host()
         
         import Helpviewer.HelpWindow
--- a/Helpviewer/AdBlock/AdBlockTreeWidget.py	Sun Mar 20 20:13:29 2016 +0100
+++ b/Helpviewer/AdBlock/AdBlockTreeWidget.py	Mon Mar 28 11:59:42 2016 +0200
@@ -116,28 +116,17 @@
             return
         
         if not filter:
-            filter = QInputDialog.getText(
+            filter, ok = QInputDialog.getText(
                 self,
                 self.tr("Add Custom Rule"),
                 self.tr("Write your rule here:"),
                 QLineEdit.Normal)
-            if filter == "":
+            if not ok or filter == "":
                 return
         
         from .AdBlockRule import AdBlockRule
         rule = AdBlockRule(filter, self.__subscription)
-        offset = self.__subscription.addRule(rule)
-        
-        item = QTreeWidgetItem()
-        item.setText(0, filter)
-        item.setData(0, Qt.UserRole, offset)
-        item.setFlags(item.flags() | Qt.ItemIsEditable)
-        
-        self.__itemChangingBlock = True
-        self.__topItem.addChild(item)
-        self.__itemChangingBlock = False
-        
-        self.__adjustItemFeatures(item, rule)
+        self.__subscription.addRule(rule)
     
     def removeRule(self):
         """
--- a/Helpviewer/CookieJar/CookieExceptionsModel.py	Sun Mar 20 20:13:29 2016 +0100
+++ b/Helpviewer/CookieJar/CookieExceptionsModel.py	Mon Mar 28 11:59:42 2016 +0200
@@ -221,7 +221,7 @@
         else:
             otherRule = '.' + host
         if otherRule in addList:
-            addList.removeOne(otherRule)
+            addList.remove(otherRule)
         if otherRule in removeList1:
             removeList1.remove(otherRule)
         if otherRule in removeList2:
--- a/Helpviewer/CookieJar/CookieModel.py	Sun Mar 20 20:13:29 2016 +0100
+++ b/Helpviewer/CookieJar/CookieModel.py	Mon Mar 28 11:59:42 2016 +0200
@@ -136,11 +136,9 @@
             return False
         
         lastRow = row + count - 1
-        self.beginRemoveRows(parent, row, lastRow)
         lst = self.__cookieJar.cookies()
         del lst[row:lastRow + 1]
         self.__cookieJar.setCookies(lst)
-        self.endRemoveRows()
         
         return True
     
--- a/Helpviewer/CookieJar/CookiesExceptionsDialog.py	Sun Mar 20 20:13:29 2016 +0100
+++ b/Helpviewer/CookieJar/CookiesExceptionsDialog.py	Mon Mar 28 11:59:42 2016 +0200
@@ -96,6 +96,7 @@
         """
         from .CookieJar import CookieJar
         self.__exceptionsModel.addRule(self.domainEdit.text(), CookieJar.Block)
+        self.domainEdit.clear()
     
     @pyqtSlot()
     def on_allowForSessionButton_clicked(self):
@@ -105,6 +106,7 @@
         from .CookieJar import CookieJar
         self.__exceptionsModel.addRule(self.domainEdit.text(),
                                        CookieJar.AllowForSession)
+        self.domainEdit.clear()
     
     @pyqtSlot()
     def on_allowButton_clicked(self):
@@ -113,3 +115,4 @@
         """
         from .CookieJar import CookieJar
         self.__exceptionsModel.addRule(self.domainEdit.text(), CookieJar.Allow)
+        self.domainEdit.clear()
--- a/Helpviewer/HelpDocsInstaller.py	Sun Mar 20 20:13:29 2016 +0100
+++ b/Helpviewer/HelpDocsInstaller.py	Mon Mar 28 11:59:42 2016 +0200
@@ -76,14 +76,15 @@
             "qtconcurrent", "qtcore", "qtdbus", "qtdesigner", "qtdoc",
             "qtenginio", "qtenginiooverview", "qtenginoqml",
             "qtgraphicaleffects", "qtgui", "qthelp", "qtimageformats",
-            "qtlinguist", "qtlocation", "qtmaxextras", "qtmultimedia",
-            "qtmultimediawidgets", "qtnetwork", "qtnfc", "qtopengl",
-            "qtplatformheaders", "qtpositioning", "qtprintsupport", "qtqml",
-            "qtquick", "qtquickcontrols", "qtquickdialogs", "qtquickextras",
-            "qtquicklayouts", "qtscript", "qtscripttools", "qtsensors",
-            "qtserialport", "qtsql", "qtsvg", "qttestlib", "qtuitools",
-            "qtwebchannel", "qtwebengine", "qtwebenginewidgets", "qtwebkit",
-            "qtwebkitexamples", "qtwebsockets", "qtwidgets", "qtwinextras",
+            "qtlabscontrols", "qtlinguist", "qtlocation", "qtmaxextras",
+            "qtmultimedia", "qtmultimediawidgets", "qtnetwork", "qtnfc",
+            "qtopengl", "qtplatformheaders", "qtpositioning", "qtprintsupport",
+            "qtqml", "qtquick", "qtquickcontrols", "qtquickdialogs",
+            "qtquickextras", "qtquicklayouts", "qtscript", "qtscripttools",
+            "qtsensors", "qtserialbus", "qtserialport", "qtsql", "qtsvg",
+            "qttestlib", "qtuitools", "qtwebchannel", "qtwebengine",
+            "qtwebenginewidgets", "qtwebkit", "qtwebkitexamples",
+            "qtwebsockets", "qtwebview", "qtwidgets", "qtwinextras",
             "qtx11extras", "qtxml", "qtxmlpatterns"]
         for qtDocs, version in [(qt4Docs, 4), (qt5Docs, 5)]:
             for doc in qtDocs:
@@ -127,7 +128,8 @@
                 QDir.separator() + "qch")
         elif version == 5:
             docsPath = QLibraryInfo.location(QLibraryInfo.DocumentationPath)
-            if not os.path.isdir(docsPath):
+            if not os.path.isdir(docsPath) or \
+                    len(QDir(docsPath).entryList(["*.qch"])) == 0:
                 # Qt installer is a bit buggy; it's missing a symbolic link
                 docsPathList = QDir.fromNativeSeparators(docsPath).split("/")
                 docsPath = os.sep.join(
--- a/Network/IRC/IrcNetworkWidget.py	Sun Mar 20 20:13:29 2016 +0100
+++ b/Network/IRC/IrcNetworkWidget.py	Mon Mar 28 11:59:42 2016 +0200
@@ -241,6 +241,7 @@
         return network.getChannels()
     
     @pyqtSlot(str)
+    @pyqtSlot()
     def on_nickCombo_currentIndexChanged(self, nick=""):
         """
         Private slot to use another nick name.
--- a/Preferences/ConfigurationPages/NetworkPage.py	Sun Mar 20 20:13:29 2016 +0100
+++ b/Preferences/ConfigurationPages/NetworkPage.py	Mon Mar 28 11:59:42 2016 +0200
@@ -68,6 +68,9 @@
         self.downloadDirPicker.setText(Preferences.getUI("DownloadPath"))
         self.requestFilenameCheckBox.setChecked(
             Preferences.getUI("RequestDownloadFilename"))
+        try:
+        except ImportError:
+            self.cleanupGroup.hide()
         
         # HTTP proxy
         self.httpProxyHostEdit.setText(
--- a/Preferences/__init__.py	Sun Mar 20 20:13:29 2016 +0100
+++ b/Preferences/__init__.py	Mon Mar 28 11:59:42 2016 +0200
@@ -919,9 +919,9 @@
         "FlashCookiesDataPath": flashDataPathForOS(),
     }
     if QWebSettings:
-        helpDefaults["HelpViewerType"] = 1,      # eric browser
+        helpDefaults["HelpViewerType"] = 1      # eric browser
     else:
-        helpDefaults["HelpViewerType"] = 2,      # Qt Assistant
+        helpDefaults["HelpViewerType"] = 2      # Qt Assistant
     
     @classmethod
     def initWebSettingsDefaults(cls):
@@ -2586,10 +2586,11 @@
         return pwConvert(prefClass.settings.value(
             "Help/" + key, prefClass.helpDefaults[key]), encode=False)
     elif key == "HelpViewerType":
-        # special treatment to adjust for missing QtWebKit
+        # special treatment to adjust for missing QtWebKit if eric web browser
+        # was selected
         value = int(prefClass.settings.value(
             "Help/" + key, prefClass.helpDefaults[key]))
-        if QWebSettings is None:
+        if value == 1 and QWebSettings is None:
             value = prefClass.helpDefaults[key]
         return value
     elif key in ["DiskCacheSize", "AcceptCookies",
--- a/QScintilla/Editor.py	Sun Mar 20 20:13:29 2016 +0100
+++ b/QScintilla/Editor.py	Mon Mar 28 11:59:42 2016 +0200
@@ -136,7 +136,7 @@
     RequestSyncToken = "REQUEST_SYNC"
     SyncToken = "SYNC"
     
-    def __init__(self, dbs, fn=None, vm=None,
+    def __init__(self, dbs, fn="", vm=None,
                  filetype="", editor=None, tv=None):
         """
         Constructor
@@ -330,7 +330,7 @@
         
         self.isResourcesFile = False
         if editor is None:
-            if self.fileName is not None:
+            if self.fileName:
                 if (QFileInfo(self.fileName).size() // 1024) > \
                    Preferences.getEditor("WarnFilesize"):
                     res = E5MessageBox.yesNo(
@@ -1676,7 +1676,7 @@
         
         @param m modification status
         """
-        if not m and self.fileName is not None:
+        if not m and bool(self.fileName):
             self.lastModified = QFileInfo(self.fileName).lastModified()
         self.modificationStatusChanged.emit(m, self)
         self.undoAvailable.emit(self.isUndoAvailable())
@@ -1850,7 +1850,7 @@
                 self.filetype = "Ruby"
                 return True
             
-            if self.fileName is not None and \
+            if bool(self.fileName) and \
                os.path.splitext(self.fileName)[1] in \
                     self.dbs.getExtensions('Ruby'):
                 self.filetype = "Ruby"
@@ -1868,7 +1868,7 @@
             return True
         
         if self.filetype == "":
-            if self.fileName is not None and \
+            if self.fileName and \
                os.path.splitext(self.fileName)[1] == ".js":
                 self.filetype = "JavaScript"
                 return True
@@ -2968,13 +2968,13 @@
         """
         # save to project, if a project is loaded
         if self.project.isOpen():
-            if self.fileName is not None and \
+            if self.fileName and \
                self.project.startswithProjectPath(self.fileName):
                 path = os.path.dirname(self.fileName)
             else:
                 path = self.project.getProjectPath()
         
-        if not path and self.fileName is not None:
+        if not path and self.fileName:
             path = os.path.dirname(self.fileName)
         if not path:
             path = Preferences.getMultiProject("Workspace") or \
@@ -3054,7 +3054,7 @@
             return False      # do nothing if text wasn't changed
             
         newName = None
-        if saveas or self.fileName is None:
+        if saveas or self.fileName == "":
             saveas = True
             
             fn = self.__getSaveFileName(path)
@@ -5354,7 +5354,7 @@
         
         @return flag indicating this editor should be saved (boolean)
         """
-        return self.fileName is not None and \
+        return bool (self.fileName) and \
             not self.autosaveManuallyDisabled and \
             not self.isReadOnly()
 
@@ -5383,7 +5383,7 @@
         @type str
         """
         if fn != self.fileName and (
-                self.fileName is not None or fn != "(Unnamed)"):
+                bool(self.fileName) or fn != "(Unnamed)"):
             return
         
         self.clearSyntaxError()
@@ -5405,7 +5405,7 @@
         """
         # Check if it's the requested file, otherwise ignore signal
         if fn != self.fileName and (
-                self.fileName is not None or fn != "(Unnamed)"):
+                bool(self.fileName) or fn != "(Unnamed)"):
             return
         
         self.clearSyntaxError()
@@ -6469,7 +6469,7 @@
         @param evt the event, that was generated (QEvent)
         """
         if evt.type() == QEvent.WindowStateChange and \
-           self.fileName is not None:
+           bool(self.fileName):
             if self.windowState() == Qt.WindowStates(Qt.WindowMinimized):
                 cap = os.path.basename(self.fileName)
             else:
@@ -6583,12 +6583,14 @@
         @param bForce True to force change, False to only update and emit
                 signal if there was an attribute change.
         """
-        if self.fileName is None:
+        if self.fileName == "":
             return
+        
         readOnly = not QFileInfo(self.fileName).isWritable() or \
             self.isReadOnly()
         if not bForce and (readOnly == self.isReadOnly()):
             return
+        
         cap = self.fileName
         if readOnly:
             cap = self.tr("{0} (ro)".format(cap))
@@ -7280,7 +7282,7 @@
             and if it is inside a remotely initiated shared edit session
             (boolean, boolean, boolean, boolean)
         """
-        return self.fileName is not None and \
+        return bool(self.fileName) and \
             self.project.isOpen() and \
             self.project.isProjectFile(self.fileName), \
             self.__isShared, self.__inSharedEdit, self.__inRemoteSharedEdit
--- a/QScintilla/EditorAssembly.py	Sun Mar 20 20:13:29 2016 +0100
+++ b/QScintilla/EditorAssembly.py	Mon Mar 28 11:59:42 2016 +0200
@@ -21,7 +21,7 @@
     Class implementing the editor assembly widget containing the navigation
     combos and the editor widget.
     """
-    def __init__(self, dbs, fn=None, vm=None, filetype="", editor=None,
+    def __init__(self, dbs, fn="", vm=None, filetype="", editor=None,
                  tv=None):
         """
         Constructor
--- a/Tasks/TaskViewer.py	Sun Mar 20 20:13:29 2016 +0100
+++ b/Tasks/TaskViewer.py	Mon Mar 28 11:59:42 2016 +0200
@@ -137,10 +137,10 @@
         self.__backMenu.addSeparator()
         self.backPasteItem = self.__backMenu.addAction(
             self.tr("&Paste"), self.__pasteTask)
-        self.backPasteMainItem = self.__menu.addAction(
+        self.backPasteMainItem = self.__backMenu.addAction(
             self.tr("Paste as &Main Task"), self.__pasteMainTask)
         self.__backMenu.addSeparator()
-        self.__backMenu.addAction(
+        self.backDeleteCompletedItem = self.__backMenu.addAction(
             self.tr("Delete Completed &Tasks"), self.__deleteCompleted)
         self.__backMenu.addSeparator()
         self.__backMenuFilteredAct = self.__backMenu.addAction(
@@ -273,6 +273,8 @@
             else:
                 self.backPasteItem.setEnabled(False)
                 self.backPasteMainItem.setEnabled(False)
+            self.backDeleteCompletedItem.setEnabled(
+                bool(self.tasks))
             self.__backMenu.popup(coord)
         else:
             self.projectTasksMenuItem.setEnabled(self.projectOpen)
--- a/ViewManager/ViewManager.py	Sun Mar 20 20:13:29 2016 +0100
+++ b/ViewManager/ViewManager.py	Mon Mar 28 11:59:42 2016 +0200
@@ -11,7 +11,7 @@
 
 import os
 
-from PyQt5.QtCore import pyqtSignal, QSignalMapper, QTimer, \
+from PyQt5.QtCore import pyqtSignal, pyqtSlot, QSignalMapper, QTimer, \
     QFileInfo, QRegExp, QObject, Qt, QCoreApplication
 from PyQt5.QtGui import QColor, QKeySequence, QPalette, QPixmap
 from PyQt5.QtWidgets import QLineEdit, QToolBar, QWidgetAction, QDialog, \
@@ -4530,7 +4530,7 @@
         @param filetype type of the source file (string)
         @param fn filename of this view
         @return reference to the new editor object (Editor.Editor) and the new
-            edito assembly object (EditorAssembly.EditorAssembly)
+            editor assembly object (EditorAssembly.EditorAssembly)
         """
         from QScintilla.EditorAssembly import EditorAssembly
         assembly = EditorAssembly(self.dbs, fn, self, filetype=filetype,
@@ -4939,7 +4939,7 @@
         Public slot to generate a new empty editor.
         """
         from QScintilla.EditorAssembly import EditorAssembly
-        assembly = EditorAssembly(self.dbs, None, self,
+        assembly = EditorAssembly(self.dbs, "", self,
                                   tv=e5App().getObject("TaskViewer"))
         editor = assembly.getEditor()
         self.editors.append(editor)
@@ -6563,6 +6563,7 @@
         if editor:
             self.editorRenamedEd.emit(editor)
         
+##    @pyqtSlot(str, int, int)
     def __cursorChanged(self, fn, line, pos):
         """
         Private slot to handle the cursorChanged signal.
--- a/WebBrowser/AdBlock/AdBlockTreeWidget.py	Sun Mar 20 20:13:29 2016 +0100
+++ b/WebBrowser/AdBlock/AdBlockTreeWidget.py	Mon Mar 28 11:59:42 2016 +0200
@@ -116,12 +116,12 @@
             return
         
         if not filter:
-            filter = QInputDialog.getText(
+            filter, ok = QInputDialog.getText(
                 self,
                 self.tr("Add Custom Rule"),
                 self.tr("Write your rule here:"),
                 QLineEdit.Normal)
-            if filter == "":
+            if not ok or filter == "":
                 return
         
         from .AdBlockRule import AdBlockRule
--- a/install.py	Sun Mar 20 20:13:29 2016 +0100
+++ b/install.py	Mon Mar 28 11:59:42 2016 +0200
@@ -1179,8 +1179,8 @@
         import sip
         sipVersion = sip.SIP_VERSION_STR
         print("sip Version:", sipVersion.strip())
-        # always assume, that snapshots are new enough
-        if "snapshot" not in sipVersion:
+        # always assume, that snapshots or dev versions are new enough
+        if "snapshot" not in sipVersion and "dev" not in sipVersion:
             while sipVersion.count('.') < 2:
                 sipVersion += '.0'
             (maj, min, pat) = sipVersion.split('.')
@@ -1210,8 +1210,8 @@
         from PyQt5.QtCore import PYQT_VERSION_STR
     pyqtVersion = PYQT_VERSION_STR
     print("PyQt Version:", pyqtVersion.strip())
-    # always assume, that snapshots are new enough
-    if "snapshot" not in pyqtVersion:
+    # always assume, that snapshots or dev versions are new enough
+    if "snapshot" not in pyqtVersion and "dev" not in pyqtVersion:
         while pyqtVersion.count('.') < 2:
             pyqtVersion += '.0'
         (maj, min, pat) = pyqtVersion.split('.')
@@ -1240,8 +1240,8 @@
         from PyQt5.Qsci import QSCINTILLA_VERSION_STR
     scintillaVersion = QSCINTILLA_VERSION_STR
     print("QScintilla Version:", QSCINTILLA_VERSION_STR.strip())
-    # always assume, that snapshots are new enough
-    if "snapshot" not in scintillaVersion:
+    # always assume, that snapshots or dev versions are new enough
+    if "snapshot" not in scintillaVersion and "dev" not in scintillaVersion:
         while scintillaVersion.count('.') < 2:
             scintillaVersion += '.0'
         (maj, min, pat) = scintillaVersion.split('.')

eric ide

mercurial