Added my own Python3 port of pyflakes and integrated py3flakes into syntax checker dialog and editor.

Sat, 30 Jan 2010 18:37:18 +0000

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sat, 30 Jan 2010 18:37:18 +0000
changeset 88
3701923bccf2
parent 87
4cc5c8d1184d
child 89
5328bc217a3c

Added my own Python3 port of pyflakes and integrated py3flakes into syntax checker dialog and editor.

APIs/Python3/eric5.api file | annotate | diff | comparison | revisions
Documentation/Help/source.qch file | annotate | diff | comparison | revisions
Documentation/Help/source.qhp file | annotate | diff | comparison | revisions
Documentation/Source/eric5.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckerDialog.html file | annotate | diff | comparison | revisions
Documentation/Source/eric5.Preferences.ConfigurationPages.Py3FlakesPage.html file | annotate | diff | comparison | revisions
Documentation/Source/eric5.Preferences.__init__.html file | annotate | diff | comparison | revisions
Documentation/Source/eric5.QScintilla.Editor.html file | annotate | diff | comparison | revisions
Documentation/Source/eric5.Utilities.py3flakes.checker.html file | annotate | diff | comparison | revisions
Documentation/Source/eric5.Utilities.py3flakes.messages.html file | annotate | diff | comparison | revisions
Documentation/Source/eric5.ViewManager.ViewManager.html file | annotate | diff | comparison | revisions
Documentation/Source/index-eric5.Preferences.ConfigurationPages.html file | annotate | diff | comparison | revisions
Documentation/Source/index-eric5.Utilities.html file | annotate | diff | comparison | revisions
Documentation/Source/index-eric5.Utilities.py3flakes.html file | annotate | diff | comparison | revisions
Plugins/CheckerPlugins/SyntaxChecker/SyntaxCheckerDialog.py file | annotate | diff | comparison | revisions
Plugins/ViewManagerPlugins/Listspace/Listspace.py file | annotate | diff | comparison | revisions
Plugins/ViewManagerPlugins/MdiArea/MdiArea.py file | annotate | diff | comparison | revisions
Plugins/ViewManagerPlugins/Tabview/Tabview.py file | annotate | diff | comparison | revisions
Preferences/ConfigurationDialog.py file | annotate | diff | comparison | revisions
Preferences/ConfigurationPages/Py3FlakesPage.py file | annotate | diff | comparison | revisions
Preferences/ConfigurationPages/Py3FlakesPage.ui file | annotate | diff | comparison | revisions
Preferences/__init__.py file | annotate | diff | comparison | revisions
QScintilla/Editor.py file | annotate | diff | comparison | revisions
Utilities/py3flakes/__init__.py file | annotate | diff | comparison | revisions
Utilities/py3flakes/checker.py file | annotate | diff | comparison | revisions
Utilities/py3flakes/messages.py file | annotate | diff | comparison | revisions
ViewManager/ViewManager.py file | annotate | diff | comparison | revisions
changelog file | annotate | diff | comparison | revisions
eric5.e4p file | annotate | diff | comparison | revisions
i18n/eric5_cs.ts file | annotate | diff | comparison | revisions
i18n/eric5_de.qm file | annotate | diff | comparison | revisions
i18n/eric5_de.ts file | annotate | diff | comparison | revisions
i18n/eric5_es.ts file | annotate | diff | comparison | revisions
i18n/eric5_fr.ts file | annotate | diff | comparison | revisions
i18n/eric5_it.ts file | annotate | diff | comparison | revisions
i18n/eric5_ru.ts file | annotate | diff | comparison | revisions
i18n/eric5_tr.ts file | annotate | diff | comparison | revisions
i18n/eric5_zh_CN.GB2312.ts file | annotate | diff | comparison | revisions
icons/default/warning.png file | annotate | diff | comparison | revisions
icons/default/warningNext.png file | annotate | diff | comparison | revisions
icons/default/warningPrev.png file | annotate | diff | comparison | revisions
--- a/APIs/Python3/eric5.api	Sat Jan 30 16:07:16 2010 +0000
+++ b/APIs/Python3/eric5.api	Sat Jan 30 18:37:18 2010 +0000
@@ -2336,10 +2336,12 @@
 eric5.Plugins.AboutPlugin.AboutDialog.licenseText?7
 eric5.Plugins.AboutPlugin.AboutDialog.thanksText?7
 eric5.Plugins.AboutPlugin.AboutDialog.titleText?7
+eric5.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckerDialog.SyntaxCheckerDialog.filenameRole?7
 eric5.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckerDialog.SyntaxCheckerDialog.on_buttonBox_clicked?4(button)
 eric5.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckerDialog.SyntaxCheckerDialog.on_resultList_itemActivated?4(itm, col)
 eric5.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckerDialog.SyntaxCheckerDialog.on_showButton_clicked?4()
 eric5.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckerDialog.SyntaxCheckerDialog.start?4(fn, codestring = "")
+eric5.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckerDialog.SyntaxCheckerDialog.warningRole?7
 eric5.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckerDialog.SyntaxCheckerDialog?1(parent = None)
 eric5.Plugins.CheckerPlugins.Tabnanny.Tabnanny.NannyNag.get_line?4()
 eric5.Plugins.CheckerPlugins.Tabnanny.Tabnanny.NannyNag.get_lineno?4()
@@ -3502,6 +3504,9 @@
 eric5.Preferences.ConfigurationPages.ProjectPage.ProjectPage.save?4()
 eric5.Preferences.ConfigurationPages.ProjectPage.ProjectPage?1()
 eric5.Preferences.ConfigurationPages.ProjectPage.create?4(dlg)
+eric5.Preferences.ConfigurationPages.Py3FlakesPage.Py3FlakesPage.save?4()
+eric5.Preferences.ConfigurationPages.Py3FlakesPage.Py3FlakesPage?1()
+eric5.Preferences.ConfigurationPages.Py3FlakesPage.create?4(dlg)
 eric5.Preferences.ConfigurationPages.PythonPage.PythonPage.save?4()
 eric5.Preferences.ConfigurationPages.PythonPage.PythonPage?1()
 eric5.Preferences.ConfigurationPages.PythonPage.create?4(dlg)
@@ -3583,6 +3588,7 @@
 eric5.Preferences.Prefs.projectBrowserColourDefaults?7
 eric5.Preferences.Prefs.projectBrowserFlagsDefaults?7
 eric5.Preferences.Prefs.projectDefaults?7
+eric5.Preferences.Prefs.py3flakesDefaults?7
 eric5.Preferences.Prefs.qtDefaults?7
 eric5.Preferences.Prefs.resetLayout?7
 eric5.Preferences.Prefs.shellDefaults?7
@@ -3662,6 +3668,7 @@
 eric5.Preferences.getEditorLexerAssocs?4(prefClass = Prefs)
 eric5.Preferences.getEditorOtherFonts?4(key, prefClass = Prefs)
 eric5.Preferences.getEditorTyping?4(key, prefClass = Prefs)
+eric5.Preferences.getFlakes?4(key, prefClass = Prefs)
 eric5.Preferences.getGeometry?4(key, prefClass = Prefs)
 eric5.Preferences.getGraphics?4(key, prefClass = Prefs)
 eric5.Preferences.getHelp?4(key, prefClass = Prefs)
@@ -3707,6 +3714,7 @@
 eric5.Preferences.setEditorLexerAssocs?4(assocs, prefClass = Prefs)
 eric5.Preferences.setEditorOtherFonts?4(key, font, prefClass = Prefs)
 eric5.Preferences.setEditorTyping?4(key, value, prefClass = Prefs)
+eric5.Preferences.setFlakes?4(key, value, prefClass = Prefs)
 eric5.Preferences.setGeometry?4(key, value, prefClass = Prefs)
 eric5.Preferences.setGraphics?4(key, value, prefClass = Prefs)
 eric5.Preferences.setHelp?4(key, value, prefClass = Prefs)
@@ -4101,6 +4109,7 @@
 eric5.QScintilla.Editor.Editor.checkSpelling?4()
 eric5.QScintilla.Editor.Editor.clearBookmarks?4()
 eric5.QScintilla.Editor.Editor.clearBreakpoint?4(line)
+eric5.QScintilla.Editor.Editor.clearFlakesWarnings?4()
 eric5.QScintilla.Editor.Editor.clearSearchIndicators?4()
 eric5.QScintilla.Editor.Editor.clearSyntaxError?4()
 eric5.QScintilla.Editor.Editor.close?4(alsoDelete = False)
@@ -4128,6 +4137,7 @@
 eric5.QScintilla.Editor.Editor.getEncoding?4()
 eric5.QScintilla.Editor.Editor.getFileName?4()
 eric5.QScintilla.Editor.Editor.getFileType?4()
+eric5.QScintilla.Editor.Editor.getFlakesWarnings?4()
 eric5.QScintilla.Editor.Editor.getFolds?4()
 eric5.QScintilla.Editor.Editor.getHighlightPosition?4()
 eric5.QScintilla.Editor.Editor.getLanguage?4()
@@ -4147,6 +4157,7 @@
 eric5.QScintilla.Editor.Editor.hasBookmarks?4()
 eric5.QScintilla.Editor.Editor.hasBreakpoints?4()
 eric5.QScintilla.Editor.Editor.hasCoverageMarkers?4()
+eric5.QScintilla.Editor.Editor.hasFlakesWarnings?4()
 eric5.QScintilla.Editor.Editor.hasMiniMenu?4()
 eric5.QScintilla.Editor.Editor.hasSyntaxErrors?4()
 eric5.QScintilla.Editor.Editor.hasTaskMarkers?4()
@@ -4173,9 +4184,11 @@
 eric5.QScintilla.Editor.Editor.mousePressEvent?4(event)
 eric5.QScintilla.Editor.Editor.newBreakpointWithProperties?4(line, properties)
 eric5.QScintilla.Editor.Editor.nextBookmark?4()
+eric5.QScintilla.Editor.Editor.nextFlakesWarning?4()
 eric5.QScintilla.Editor.Editor.nextTask?4()
 eric5.QScintilla.Editor.Editor.nextUncovered?4()
 eric5.QScintilla.Editor.Editor.previousBookmark?4()
+eric5.QScintilla.Editor.Editor.previousFlakesWarning?4()
 eric5.QScintilla.Editor.Editor.previousTask?4()
 eric5.QScintilla.Editor.Editor.previousUncovered?4()
 eric5.QScintilla.Editor.Editor.printFile?4()
@@ -4208,6 +4221,7 @@
 eric5.QScintilla.Editor.Editor.streamCommentLineOrSelection?4()
 eric5.QScintilla.Editor.Editor.streamCommentSelection?4()
 eric5.QScintilla.Editor.Editor.toggleBookmark?4(line)
+eric5.QScintilla.Editor.Editor.toggleFlakesWarning?4(line, warning, msg = "")
 eric5.QScintilla.Editor.Editor.toggleSyntaxError?4(line, error, msg = "")
 eric5.QScintilla.Editor.Editor.uncommentLine?4()
 eric5.QScintilla.Editor.Editor.uncommentLineOrSelection?4()
@@ -5233,6 +5247,108 @@
 eric5.Utilities.prepareQtMacBundle?4(toolname, version, args)
 eric5.Utilities.pwDecode?4(epw)
 eric5.Utilities.pwEncode?4(pw)
+eric5.Utilities.py3flakes.checker.Binding?1(name, source)
+eric5.Utilities.py3flakes.checker.Checker.ASSERT?4(node)
+eric5.Utilities.py3flakes.checker.Checker.ASSIGN?4(node)
+eric5.Utilities.py3flakes.checker.Checker.ATTRIBUTE?4(node)
+eric5.Utilities.py3flakes.checker.Checker.ATTRIBUTES?7
+eric5.Utilities.py3flakes.checker.Checker.AUGASSIGN?4(node)
+eric5.Utilities.py3flakes.checker.Checker.BINOP?4(node)
+eric5.Utilities.py3flakes.checker.Checker.BOOLOP?4(node)
+eric5.Utilities.py3flakes.checker.Checker.CALL?4(node)
+eric5.Utilities.py3flakes.checker.Checker.CLASSDEF?4(node)
+eric5.Utilities.py3flakes.checker.Checker.COMPARE?4(node)
+eric5.Utilities.py3flakes.checker.Checker.COMPREHENSION?4(node)
+eric5.Utilities.py3flakes.checker.Checker.DELETE?4(node)
+eric5.Utilities.py3flakes.checker.Checker.DICT?4(node)
+eric5.Utilities.py3flakes.checker.Checker.DICTCOMP?4(node)
+eric5.Utilities.py3flakes.checker.Checker.EXCEPTHANDLER?4(node)
+eric5.Utilities.py3flakes.checker.Checker.EXPR?4(node)
+eric5.Utilities.py3flakes.checker.Checker.EXTSLICE?4(node)
+eric5.Utilities.py3flakes.checker.Checker.FOR?4(node)
+eric5.Utilities.py3flakes.checker.Checker.FUNCTIONDEF?4(node)
+eric5.Utilities.py3flakes.checker.Checker.GLOBAL?4(node)
+eric5.Utilities.py3flakes.checker.Checker.IF?4(node)
+eric5.Utilities.py3flakes.checker.Checker.IFEXP?4(node)
+eric5.Utilities.py3flakes.checker.Checker.IMPORT?4(node)
+eric5.Utilities.py3flakes.checker.Checker.IMPORTFROM?4(node)
+eric5.Utilities.py3flakes.checker.Checker.INDEX?4(node)
+eric5.Utilities.py3flakes.checker.Checker.INVERT?7
+eric5.Utilities.py3flakes.checker.Checker.KEYWORD?4(node)
+eric5.Utilities.py3flakes.checker.Checker.LAMBDA?4(node)
+eric5.Utilities.py3flakes.checker.Checker.LIST?4(node)
+eric5.Utilities.py3flakes.checker.Checker.LISTCOMP?4(node)
+eric5.Utilities.py3flakes.checker.Checker.MOD?7
+eric5.Utilities.py3flakes.checker.Checker.NAME?4(node)
+eric5.Utilities.py3flakes.checker.Checker.NONLOCAL?7
+eric5.Utilities.py3flakes.checker.Checker.PASS?7
+eric5.Utilities.py3flakes.checker.Checker.RAISE?4(node)
+eric5.Utilities.py3flakes.checker.Checker.RETURN?4(node)
+eric5.Utilities.py3flakes.checker.Checker.SET?7
+eric5.Utilities.py3flakes.checker.Checker.SETCOMP?7
+eric5.Utilities.py3flakes.checker.Checker.SLICE?4(node)
+eric5.Utilities.py3flakes.checker.Checker.STARRED?4(node)
+eric5.Utilities.py3flakes.checker.Checker.SUBSCRIPT?4(node)
+eric5.Utilities.py3flakes.checker.Checker.TRYEXCEPT?4(node)
+eric5.Utilities.py3flakes.checker.Checker.TRYFINALLY?4(node)
+eric5.Utilities.py3flakes.checker.Checker.UNARYOP?4(node)
+eric5.Utilities.py3flakes.checker.Checker.WHILE?7
+eric5.Utilities.py3flakes.checker.Checker.WITH?4(node)
+eric5.Utilities.py3flakes.checker.Checker.YIELD?4(node)
+eric5.Utilities.py3flakes.checker.Checker._runDeferred?5(deferred)
+eric5.Utilities.py3flakes.checker.Checker.addArgs?4()
+eric5.Utilities.py3flakes.checker.Checker.addBinding?4(lineno, value, reportRedef = True)
+eric5.Utilities.py3flakes.checker.Checker.checkUnusedAssignments?4()
+eric5.Utilities.py3flakes.checker.Checker.check_dead_scopes?4()
+eric5.Utilities.py3flakes.checker.Checker.collectLoopVars?4()
+eric5.Utilities.py3flakes.checker.Checker.deferAssignment?4(callable)
+eric5.Utilities.py3flakes.checker.Checker.deferFunction?4(callable)
+eric5.Utilities.py3flakes.checker.Checker.handleAssignName?4(node)
+eric5.Utilities.py3flakes.checker.Checker.handleBody?4(tree)
+eric5.Utilities.py3flakes.checker.Checker.handleNode?4(node, parent)
+eric5.Utilities.py3flakes.checker.Checker.ignore?4(node)
+eric5.Utilities.py3flakes.checker.Checker.nodeDepth?7
+eric5.Utilities.py3flakes.checker.Checker.popScope?4()
+eric5.Utilities.py3flakes.checker.Checker.pushClassScope?4()
+eric5.Utilities.py3flakes.checker.Checker.pushFunctionScope?4()
+eric5.Utilities.py3flakes.checker.Checker.report?4(messageClass, *args, **kwargs)
+eric5.Utilities.py3flakes.checker.Checker.runFunction?4()
+eric5.Utilities.py3flakes.checker.Checker.scope?4()
+eric5.Utilities.py3flakes.checker.Checker.scope?7
+eric5.Utilities.py3flakes.checker.Checker.traceTree?7
+eric5.Utilities.py3flakes.checker.Checker?1(module, filename = '(none)')
+eric5.Utilities.py3flakes.checker.ExportBinding.names?4()
+eric5.Utilities.py3flakes.checker.FunctionScope?1()
+eric5.Utilities.py3flakes.checker.Importation?1(name, source)
+eric5.Utilities.py3flakes.checker.Scope.importStarred?7
+eric5.Utilities.py3flakes.checker.Scope?1()
+eric5.Utilities.py3flakes.checker._MAGIC_GLOBALS?8
+eric5.Utilities.py3flakes.messages.DuplicateArgument.message?7
+eric5.Utilities.py3flakes.messages.DuplicateArgument?1(filename, lineno, name)
+eric5.Utilities.py3flakes.messages.ImportShadowedByLoopVar.message?7
+eric5.Utilities.py3flakes.messages.ImportShadowedByLoopVar?1(filename, lineno, name, orig_lineno)
+eric5.Utilities.py3flakes.messages.ImportStarUsed.message?7
+eric5.Utilities.py3flakes.messages.ImportStarUsed?1(filename, lineno, modname)
+eric5.Utilities.py3flakes.messages.LateFutureImport.message?7
+eric5.Utilities.py3flakes.messages.LateFutureImport?1(filename, lineno, names)
+eric5.Utilities.py3flakes.messages.Message.getMessageData?4()
+eric5.Utilities.py3flakes.messages.Message.message?7
+eric5.Utilities.py3flakes.messages.Message.message_args?7
+eric5.Utilities.py3flakes.messages.Message?1(filename, lineno)
+eric5.Utilities.py3flakes.messages.RedefinedFunction.message?7
+eric5.Utilities.py3flakes.messages.RedefinedFunction?1(filename, lineno, name, orig_lineno)
+eric5.Utilities.py3flakes.messages.RedefinedWhileUnused.message?7
+eric5.Utilities.py3flakes.messages.RedefinedWhileUnused?1(filename, lineno, name, orig_lineno)
+eric5.Utilities.py3flakes.messages.UndefinedExport.message?7
+eric5.Utilities.py3flakes.messages.UndefinedExport?1(filename, lineno, name)
+eric5.Utilities.py3flakes.messages.UndefinedLocal.message?7
+eric5.Utilities.py3flakes.messages.UndefinedLocal?1(filename, lineno, name, orig_lineno)
+eric5.Utilities.py3flakes.messages.UndefinedName.message?7
+eric5.Utilities.py3flakes.messages.UndefinedName?1(filename, lineno, name)
+eric5.Utilities.py3flakes.messages.UnusedImport.message?7
+eric5.Utilities.py3flakes.messages.UnusedImport?1(filename, lineno, name)
+eric5.Utilities.py3flakes.messages.UnusedVariable.message?7
+eric5.Utilities.py3flakes.messages.UnusedVariable?1(filename, lineno, name)
 eric5.Utilities.readEncodedFile?4(filename)
 eric5.Utilities.relpath?4(path, start = os.path.curdir)
 eric5.Utilities.samepath?4(f1, f2)
Binary file Documentation/Help/source.qch has changed
--- a/Documentation/Help/source.qhp	Sat Jan 30 16:07:16 2010 +0000
+++ b/Documentation/Help/source.qhp	Sat Jan 30 18:37:18 2010 +0000
@@ -478,6 +478,7 @@
               <section title="eric5.Preferences.ConfigurationPages.PrinterPage" ref="eric5.Preferences.ConfigurationPages.PrinterPage.html" />
               <section title="eric5.Preferences.ConfigurationPages.ProjectBrowserPage" ref="eric5.Preferences.ConfigurationPages.ProjectBrowserPage.html" />
               <section title="eric5.Preferences.ConfigurationPages.ProjectPage" ref="eric5.Preferences.ConfigurationPages.ProjectPage.html" />
+              <section title="eric5.Preferences.ConfigurationPages.Py3FlakesPage" ref="eric5.Preferences.ConfigurationPages.Py3FlakesPage.html" />
               <section title="eric5.Preferences.ConfigurationPages.PythonPage" ref="eric5.Preferences.ConfigurationPages.PythonPage.html" />
               <section title="eric5.Preferences.ConfigurationPages.QtPage" ref="eric5.Preferences.ConfigurationPages.QtPage.html" />
               <section title="eric5.Preferences.ConfigurationPages.ShellPage" ref="eric5.Preferences.ConfigurationPages.ShellPage.html" />
@@ -642,6 +643,10 @@
               <section title="eric5.Utilities.ClassBrowsers.pyclbr" ref="eric5.Utilities.ClassBrowsers.pyclbr.html" />
               <section title="eric5.Utilities.ClassBrowsers.rbclbr" ref="eric5.Utilities.ClassBrowsers.rbclbr.html" />
             </section>
+            <section title="eric5.Utilities.py3flakes" ref="index-eric5.Utilities.py3flakes.html">
+              <section title="eric5.Utilities.py3flakes.checker" ref="eric5.Utilities.py3flakes.checker.html" />
+              <section title="eric5.Utilities.py3flakes.messages" ref="eric5.Utilities.py3flakes.messages.html" />
+            </section>
             <section title="eric5.Utilities.AutoSaver" ref="eric5.Utilities.AutoSaver.html" />
             <section title="eric5.Utilities.ModuleParser" ref="eric5.Utilities.ModuleParser.html" />
             <section title="eric5.Utilities.SingleApplication" ref="eric5.Utilities.SingleApplication.html" />
@@ -2943,6 +2948,7 @@
       <keyword name="getEditorLexerAssocs" id="getEditorLexerAssocs" ref="eric5.Preferences.__init__.html#getEditorLexerAssocs" />
       <keyword name="getEditorOtherFonts" id="getEditorOtherFonts" ref="eric5.Preferences.__init__.html#getEditorOtherFonts" />
       <keyword name="getEditorTyping" id="getEditorTyping" ref="eric5.Preferences.__init__.html#getEditorTyping" />
+      <keyword name="getFlakes" id="getFlakes" ref="eric5.Preferences.__init__.html#getFlakes" />
       <keyword name="getGeometry" id="getGeometry" ref="eric5.Preferences.__init__.html#getGeometry" />
       <keyword name="getGraphics" id="getGraphics" ref="eric5.Preferences.__init__.html#getGraphics" />
       <keyword name="getHelp" id="getHelp" ref="eric5.Preferences.__init__.html#getHelp" />
@@ -2988,6 +2994,7 @@
       <keyword name="setEditorLexerAssocs" id="setEditorLexerAssocs" ref="eric5.Preferences.__init__.html#setEditorLexerAssocs" />
       <keyword name="setEditorOtherFonts" id="setEditorOtherFonts" ref="eric5.Preferences.__init__.html#setEditorOtherFonts" />
       <keyword name="setEditorTyping" id="setEditorTyping" ref="eric5.Preferences.__init__.html#setEditorTyping" />
+      <keyword name="setFlakes" id="setFlakes" ref="eric5.Preferences.__init__.html#setFlakes" />
       <keyword name="setGeometry" id="setGeometry" ref="eric5.Preferences.__init__.html#setGeometry" />
       <keyword name="setGraphics" id="setGraphics" ref="eric5.Preferences.__init__.html#setGraphics" />
       <keyword name="setHelp" id="setHelp" ref="eric5.Preferences.__init__.html#setHelp" />
@@ -3171,6 +3178,7 @@
       <keyword name="ViewManager.__breakpointToggled" id="ViewManager.__breakpointToggled" ref="eric5.ViewManager.ViewManager.html#ViewManager.__breakpointToggled" />
       <keyword name="ViewManager.__clearAllBookmarks" id="ViewManager.__clearAllBookmarks" ref="eric5.ViewManager.ViewManager.html#ViewManager.__clearAllBookmarks" />
       <keyword name="ViewManager.__clearAllSyntaxErrors" id="ViewManager.__clearAllSyntaxErrors" ref="eric5.ViewManager.ViewManager.html#ViewManager.__clearAllSyntaxErrors" />
+      <keyword name="ViewManager.__clearAllWarnings" id="ViewManager.__clearAllWarnings" ref="eric5.ViewManager.ViewManager.html#ViewManager.__clearAllWarnings" />
       <keyword name="ViewManager.__clearBookmarked" id="ViewManager.__clearBookmarked" ref="eric5.ViewManager.ViewManager.html#ViewManager.__clearBookmarked" />
       <keyword name="ViewManager.__clearRecent" id="ViewManager.__clearRecent" ref="eric5.ViewManager.ViewManager.html#ViewManager.__clearRecent" />
       <keyword name="ViewManager.__connectEditor" id="ViewManager.__connectEditor" ref="eric5.ViewManager.ViewManager.html#ViewManager.__connectEditor" />
@@ -3231,10 +3239,12 @@
       <keyword name="ViewManager.__nextBookmark" id="ViewManager.__nextBookmark" ref="eric5.ViewManager.ViewManager.html#ViewManager.__nextBookmark" />
       <keyword name="ViewManager.__nextTask" id="ViewManager.__nextTask" ref="eric5.ViewManager.ViewManager.html#ViewManager.__nextTask" />
       <keyword name="ViewManager.__nextUncovered" id="ViewManager.__nextUncovered" ref="eric5.ViewManager.ViewManager.html#ViewManager.__nextUncovered" />
+      <keyword name="ViewManager.__nextWarning" id="ViewManager.__nextWarning" ref="eric5.ViewManager.ViewManager.html#ViewManager.__nextWarning" />
       <keyword name="ViewManager.__openSourceFile" id="ViewManager.__openSourceFile" ref="eric5.ViewManager.ViewManager.html#ViewManager.__openSourceFile" />
       <keyword name="ViewManager.__previousBookmark" id="ViewManager.__previousBookmark" ref="eric5.ViewManager.ViewManager.html#ViewManager.__previousBookmark" />
       <keyword name="ViewManager.__previousTask" id="ViewManager.__previousTask" ref="eric5.ViewManager.ViewManager.html#ViewManager.__previousTask" />
       <keyword name="ViewManager.__previousUncovered" id="ViewManager.__previousUncovered" ref="eric5.ViewManager.ViewManager.html#ViewManager.__previousUncovered" />
+      <keyword name="ViewManager.__previousWarning" id="ViewManager.__previousWarning" ref="eric5.ViewManager.ViewManager.html#ViewManager.__previousWarning" />
       <keyword name="ViewManager.__quickSearch" id="ViewManager.__quickSearch" ref="eric5.ViewManager.ViewManager.html#ViewManager.__quickSearch" />
       <keyword name="ViewManager.__quickSearchEnter" id="ViewManager.__quickSearchEnter" ref="eric5.ViewManager.ViewManager.html#ViewManager.__quickSearchEnter" />
       <keyword name="ViewManager.__quickSearchEscape" id="ViewManager.__quickSearchEscape" ref="eric5.ViewManager.ViewManager.html#ViewManager.__quickSearchEscape" />
@@ -5469,6 +5479,7 @@
       <keyword name="Editor.__showContextMenuResources" id="Editor.__showContextMenuResources" ref="eric5.QScintilla.Editor.html#Editor.__showContextMenuResources" />
       <keyword name="Editor.__showContextMenuShow" id="Editor.__showContextMenuShow" ref="eric5.QScintilla.Editor.html#Editor.__showContextMenuShow" />
       <keyword name="Editor.__showContextMenuSpelling" id="Editor.__showContextMenuSpelling" ref="eric5.QScintilla.Editor.html#Editor.__showContextMenuSpelling" />
+      <keyword name="Editor.__showFlakesWarning" id="Editor.__showFlakesWarning" ref="eric5.QScintilla.Editor.html#Editor.__showFlakesWarning" />
       <keyword name="Editor.__showImportsDiagram" id="Editor.__showImportsDiagram" ref="eric5.QScintilla.Editor.html#Editor.__showImportsDiagram" />
       <keyword name="Editor.__showPackageDiagram" id="Editor.__showPackageDiagram" ref="eric5.QScintilla.Editor.html#Editor.__showPackageDiagram" />
       <keyword name="Editor.__showProfileData" id="Editor.__showProfileData" ref="eric5.QScintilla.Editor.html#Editor.__showProfileData" />
@@ -5496,6 +5507,7 @@
       <keyword name="Editor.checkSpelling" id="Editor.checkSpelling" ref="eric5.QScintilla.Editor.html#Editor.checkSpelling" />
       <keyword name="Editor.clearBookmarks" id="Editor.clearBookmarks" ref="eric5.QScintilla.Editor.html#Editor.clearBookmarks" />
       <keyword name="Editor.clearBreakpoint" id="Editor.clearBreakpoint" ref="eric5.QScintilla.Editor.html#Editor.clearBreakpoint" />
+      <keyword name="Editor.clearFlakesWarnings" id="Editor.clearFlakesWarnings" ref="eric5.QScintilla.Editor.html#Editor.clearFlakesWarnings" />
       <keyword name="Editor.clearSearchIndicators" id="Editor.clearSearchIndicators" ref="eric5.QScintilla.Editor.html#Editor.clearSearchIndicators" />
       <keyword name="Editor.clearSyntaxError" id="Editor.clearSyntaxError" ref="eric5.QScintilla.Editor.html#Editor.clearSyntaxError" />
       <keyword name="Editor.close" id="Editor.close" ref="eric5.QScintilla.Editor.html#Editor.close" />
@@ -5523,6 +5535,7 @@
       <keyword name="Editor.getEncoding" id="Editor.getEncoding" ref="eric5.QScintilla.Editor.html#Editor.getEncoding" />
       <keyword name="Editor.getFileName" id="Editor.getFileName" ref="eric5.QScintilla.Editor.html#Editor.getFileName" />
       <keyword name="Editor.getFileType" id="Editor.getFileType" ref="eric5.QScintilla.Editor.html#Editor.getFileType" />
+      <keyword name="Editor.getFlakesWarnings" id="Editor.getFlakesWarnings" ref="eric5.QScintilla.Editor.html#Editor.getFlakesWarnings" />
       <keyword name="Editor.getFolds" id="Editor.getFolds" ref="eric5.QScintilla.Editor.html#Editor.getFolds" />
       <keyword name="Editor.getHighlightPosition" id="Editor.getHighlightPosition" ref="eric5.QScintilla.Editor.html#Editor.getHighlightPosition" />
       <keyword name="Editor.getLanguage" id="Editor.getLanguage" ref="eric5.QScintilla.Editor.html#Editor.getLanguage" />
@@ -5542,6 +5555,7 @@
       <keyword name="Editor.hasBookmarks" id="Editor.hasBookmarks" ref="eric5.QScintilla.Editor.html#Editor.hasBookmarks" />
       <keyword name="Editor.hasBreakpoints" id="Editor.hasBreakpoints" ref="eric5.QScintilla.Editor.html#Editor.hasBreakpoints" />
       <keyword name="Editor.hasCoverageMarkers" id="Editor.hasCoverageMarkers" ref="eric5.QScintilla.Editor.html#Editor.hasCoverageMarkers" />
+      <keyword name="Editor.hasFlakesWarnings" id="Editor.hasFlakesWarnings" ref="eric5.QScintilla.Editor.html#Editor.hasFlakesWarnings" />
       <keyword name="Editor.hasMiniMenu" id="Editor.hasMiniMenu" ref="eric5.QScintilla.Editor.html#Editor.hasMiniMenu" />
       <keyword name="Editor.hasSyntaxErrors" id="Editor.hasSyntaxErrors" ref="eric5.QScintilla.Editor.html#Editor.hasSyntaxErrors" />
       <keyword name="Editor.hasTaskMarkers" id="Editor.hasTaskMarkers" ref="eric5.QScintilla.Editor.html#Editor.hasTaskMarkers" />
@@ -5568,9 +5582,11 @@
       <keyword name="Editor.mousePressEvent" id="Editor.mousePressEvent" ref="eric5.QScintilla.Editor.html#Editor.mousePressEvent" />
       <keyword name="Editor.newBreakpointWithProperties" id="Editor.newBreakpointWithProperties" ref="eric5.QScintilla.Editor.html#Editor.newBreakpointWithProperties" />
       <keyword name="Editor.nextBookmark" id="Editor.nextBookmark" ref="eric5.QScintilla.Editor.html#Editor.nextBookmark" />
+      <keyword name="Editor.nextFlakesWarning" id="Editor.nextFlakesWarning" ref="eric5.QScintilla.Editor.html#Editor.nextFlakesWarning" />
       <keyword name="Editor.nextTask" id="Editor.nextTask" ref="eric5.QScintilla.Editor.html#Editor.nextTask" />
       <keyword name="Editor.nextUncovered" id="Editor.nextUncovered" ref="eric5.QScintilla.Editor.html#Editor.nextUncovered" />
       <keyword name="Editor.previousBookmark" id="Editor.previousBookmark" ref="eric5.QScintilla.Editor.html#Editor.previousBookmark" />
+      <keyword name="Editor.previousFlakesWarning" id="Editor.previousFlakesWarning" ref="eric5.QScintilla.Editor.html#Editor.previousFlakesWarning" />
       <keyword name="Editor.previousTask" id="Editor.previousTask" ref="eric5.QScintilla.Editor.html#Editor.previousTask" />
       <keyword name="Editor.previousUncovered" id="Editor.previousUncovered" ref="eric5.QScintilla.Editor.html#Editor.previousUncovered" />
       <keyword name="Editor.printFile" id="Editor.printFile" ref="eric5.QScintilla.Editor.html#Editor.printFile" />
@@ -5603,6 +5619,7 @@
       <keyword name="Editor.streamCommentLineOrSelection" id="Editor.streamCommentLineOrSelection" ref="eric5.QScintilla.Editor.html#Editor.streamCommentLineOrSelection" />
       <keyword name="Editor.streamCommentSelection" id="Editor.streamCommentSelection" ref="eric5.QScintilla.Editor.html#Editor.streamCommentSelection" />
       <keyword name="Editor.toggleBookmark" id="Editor.toggleBookmark" ref="eric5.QScintilla.Editor.html#Editor.toggleBookmark" />
+      <keyword name="Editor.toggleFlakesWarning" id="Editor.toggleFlakesWarning" ref="eric5.QScintilla.Editor.html#Editor.toggleFlakesWarning" />
       <keyword name="Editor.toggleSyntaxError" id="Editor.toggleSyntaxError" ref="eric5.QScintilla.Editor.html#Editor.toggleSyntaxError" />
       <keyword name="Editor.uncommentLine" id="Editor.uncommentLine" ref="eric5.QScintilla.Editor.html#Editor.uncommentLine" />
       <keyword name="Editor.uncommentLineOrSelection" id="Editor.uncommentLineOrSelection" ref="eric5.QScintilla.Editor.html#Editor.uncommentLineOrSelection" />
@@ -6387,6 +6404,113 @@
       <keyword name="Interface (Constructor)" id="Interface (Constructor)" ref="eric5.Utilities.ClassBrowsers.idlclbr.html#Interface.__init__" />
       <keyword name="Module (Constructor)" id="Module (Constructor)" ref="eric5.Utilities.ClassBrowsers.idlclbr.html#Module.__init__" />
       <keyword name="VisibilityMixin (Constructor)" id="VisibilityMixin (Constructor)" ref="eric5.Utilities.ClassBrowsers.idlclbr.html#VisibilityMixin.__init__" />
+      <keyword name="py3flakes (Package)" id="py3flakes (Package)" ref="index-eric5.Utilities.py3flakes.html" />
+      <keyword name="checker (Module)" id="checker (Module)" ref="eric5.Utilities.py3flakes.checker.html" />
+      <keyword name="Argument" id="Argument" ref="eric5.Utilities.py3flakes.checker.html#Argument" />
+      <keyword name="Assignment" id="Assignment" ref="eric5.Utilities.py3flakes.checker.html#Assignment" />
+      <keyword name="Binding" id="Binding" ref="eric5.Utilities.py3flakes.checker.html#Binding" />
+      <keyword name="Checker" id="Checker" ref="eric5.Utilities.py3flakes.checker.html#Checker" />
+      <keyword name="ClassScope" id="ClassScope" ref="eric5.Utilities.py3flakes.checker.html#ClassScope" />
+      <keyword name="ExportBinding" id="ExportBinding" ref="eric5.Utilities.py3flakes.checker.html#ExportBinding" />
+      <keyword name="FunctionDefinition" id="FunctionDefinition" ref="eric5.Utilities.py3flakes.checker.html#FunctionDefinition" />
+      <keyword name="FunctionScope" id="FunctionScope" ref="eric5.Utilities.py3flakes.checker.html#FunctionScope" />
+      <keyword name="Importation" id="Importation" ref="eric5.Utilities.py3flakes.checker.html#Importation" />
+      <keyword name="ModuleScope" id="ModuleScope" ref="eric5.Utilities.py3flakes.checker.html#ModuleScope" />
+      <keyword name="Scope" id="Scope" ref="eric5.Utilities.py3flakes.checker.html#Scope" />
+      <keyword name="UnBinding" id="UnBinding" ref="eric5.Utilities.py3flakes.checker.html#UnBinding" />
+      <keyword name="Binding (Constructor)" id="Binding (Constructor)" ref="eric5.Utilities.py3flakes.checker.html#Binding.__init__" />
+      <keyword name="Binding.__repr__" id="Binding.__repr__" ref="eric5.Utilities.py3flakes.checker.html#Binding.__repr__" />
+      <keyword name="Binding.__str__" id="Binding.__str__" ref="eric5.Utilities.py3flakes.checker.html#Binding.__str__" />
+      <keyword name="Checker (Constructor)" id="Checker (Constructor)" ref="eric5.Utilities.py3flakes.checker.html#Checker.__init__" />
+      <keyword name="Checker.ASSERT" id="Checker.ASSERT" ref="eric5.Utilities.py3flakes.checker.html#Checker.ASSERT" />
+      <keyword name="Checker.ASSIGN" id="Checker.ASSIGN" ref="eric5.Utilities.py3flakes.checker.html#Checker.ASSIGN" />
+      <keyword name="Checker.ATTRIBUTE" id="Checker.ATTRIBUTE" ref="eric5.Utilities.py3flakes.checker.html#Checker.ATTRIBUTE" />
+      <keyword name="Checker.AUGASSIGN" id="Checker.AUGASSIGN" ref="eric5.Utilities.py3flakes.checker.html#Checker.AUGASSIGN" />
+      <keyword name="Checker.BINOP" id="Checker.BINOP" ref="eric5.Utilities.py3flakes.checker.html#Checker.BINOP" />
+      <keyword name="Checker.BOOLOP" id="Checker.BOOLOP" ref="eric5.Utilities.py3flakes.checker.html#Checker.BOOLOP" />
+      <keyword name="Checker.CALL" id="Checker.CALL" ref="eric5.Utilities.py3flakes.checker.html#Checker.CALL" />
+      <keyword name="Checker.CLASSDEF" id="Checker.CLASSDEF" ref="eric5.Utilities.py3flakes.checker.html#Checker.CLASSDEF" />
+      <keyword name="Checker.COMPARE" id="Checker.COMPARE" ref="eric5.Utilities.py3flakes.checker.html#Checker.COMPARE" />
+      <keyword name="Checker.COMPREHENSION" id="Checker.COMPREHENSION" ref="eric5.Utilities.py3flakes.checker.html#Checker.COMPREHENSION" />
+      <keyword name="Checker.DELETE" id="Checker.DELETE" ref="eric5.Utilities.py3flakes.checker.html#Checker.DELETE" />
+      <keyword name="Checker.DICT" id="Checker.DICT" ref="eric5.Utilities.py3flakes.checker.html#Checker.DICT" />
+      <keyword name="Checker.DICTCOMP" id="Checker.DICTCOMP" ref="eric5.Utilities.py3flakes.checker.html#Checker.DICTCOMP" />
+      <keyword name="Checker.EXCEPTHANDLER" id="Checker.EXCEPTHANDLER" ref="eric5.Utilities.py3flakes.checker.html#Checker.EXCEPTHANDLER" />
+      <keyword name="Checker.EXPR" id="Checker.EXPR" ref="eric5.Utilities.py3flakes.checker.html#Checker.EXPR" />
+      <keyword name="Checker.EXTSLICE" id="Checker.EXTSLICE" ref="eric5.Utilities.py3flakes.checker.html#Checker.EXTSLICE" />
+      <keyword name="Checker.FOR" id="Checker.FOR" ref="eric5.Utilities.py3flakes.checker.html#Checker.FOR" />
+      <keyword name="Checker.FUNCTIONDEF" id="Checker.FUNCTIONDEF" ref="eric5.Utilities.py3flakes.checker.html#Checker.FUNCTIONDEF" />
+      <keyword name="Checker.GLOBAL" id="Checker.GLOBAL" ref="eric5.Utilities.py3flakes.checker.html#Checker.GLOBAL" />
+      <keyword name="Checker.IF" id="Checker.IF" ref="eric5.Utilities.py3flakes.checker.html#Checker.IF" />
+      <keyword name="Checker.IFEXP" id="Checker.IFEXP" ref="eric5.Utilities.py3flakes.checker.html#Checker.IFEXP" />
+      <keyword name="Checker.IMPORT" id="Checker.IMPORT" ref="eric5.Utilities.py3flakes.checker.html#Checker.IMPORT" />
+      <keyword name="Checker.IMPORTFROM" id="Checker.IMPORTFROM" ref="eric5.Utilities.py3flakes.checker.html#Checker.IMPORTFROM" />
+      <keyword name="Checker.INDEX" id="Checker.INDEX" ref="eric5.Utilities.py3flakes.checker.html#Checker.INDEX" />
+      <keyword name="Checker.KEYWORD" id="Checker.KEYWORD" ref="eric5.Utilities.py3flakes.checker.html#Checker.KEYWORD" />
+      <keyword name="Checker.LAMBDA" id="Checker.LAMBDA" ref="eric5.Utilities.py3flakes.checker.html#Checker.LAMBDA" />
+      <keyword name="Checker.LIST" id="Checker.LIST" ref="eric5.Utilities.py3flakes.checker.html#Checker.LIST" />
+      <keyword name="Checker.LISTCOMP" id="Checker.LISTCOMP" ref="eric5.Utilities.py3flakes.checker.html#Checker.LISTCOMP" />
+      <keyword name="Checker.NAME" id="Checker.NAME" ref="eric5.Utilities.py3flakes.checker.html#Checker.NAME" />
+      <keyword name="Checker.RAISE" id="Checker.RAISE" ref="eric5.Utilities.py3flakes.checker.html#Checker.RAISE" />
+      <keyword name="Checker.RETURN" id="Checker.RETURN" ref="eric5.Utilities.py3flakes.checker.html#Checker.RETURN" />
+      <keyword name="Checker.SLICE" id="Checker.SLICE" ref="eric5.Utilities.py3flakes.checker.html#Checker.SLICE" />
+      <keyword name="Checker.STARRED" id="Checker.STARRED" ref="eric5.Utilities.py3flakes.checker.html#Checker.STARRED" />
+      <keyword name="Checker.SUBSCRIPT" id="Checker.SUBSCRIPT" ref="eric5.Utilities.py3flakes.checker.html#Checker.SUBSCRIPT" />
+      <keyword name="Checker.TRYEXCEPT" id="Checker.TRYEXCEPT" ref="eric5.Utilities.py3flakes.checker.html#Checker.TRYEXCEPT" />
+      <keyword name="Checker.TRYFINALLY" id="Checker.TRYFINALLY" ref="eric5.Utilities.py3flakes.checker.html#Checker.TRYFINALLY" />
+      <keyword name="Checker.UNARYOP" id="Checker.UNARYOP" ref="eric5.Utilities.py3flakes.checker.html#Checker.UNARYOP" />
+      <keyword name="Checker.WITH" id="Checker.WITH" ref="eric5.Utilities.py3flakes.checker.html#Checker.WITH" />
+      <keyword name="Checker.YIELD" id="Checker.YIELD" ref="eric5.Utilities.py3flakes.checker.html#Checker.YIELD" />
+      <keyword name="Checker._runDeferred" id="Checker._runDeferred" ref="eric5.Utilities.py3flakes.checker.html#Checker._runDeferred" />
+      <keyword name="Checker.addArgs" id="Checker.addArgs" ref="eric5.Utilities.py3flakes.checker.html#Checker.addArgs" />
+      <keyword name="Checker.addBinding" id="Checker.addBinding" ref="eric5.Utilities.py3flakes.checker.html#Checker.addBinding" />
+      <keyword name="Checker.checkUnusedAssignments" id="Checker.checkUnusedAssignments" ref="eric5.Utilities.py3flakes.checker.html#Checker.checkUnusedAssignments" />
+      <keyword name="Checker.check_dead_scopes" id="Checker.check_dead_scopes" ref="eric5.Utilities.py3flakes.checker.html#Checker.check_dead_scopes" />
+      <keyword name="Checker.collectLoopVars" id="Checker.collectLoopVars" ref="eric5.Utilities.py3flakes.checker.html#Checker.collectLoopVars" />
+      <keyword name="Checker.deferAssignment" id="Checker.deferAssignment" ref="eric5.Utilities.py3flakes.checker.html#Checker.deferAssignment" />
+      <keyword name="Checker.deferFunction" id="Checker.deferFunction" ref="eric5.Utilities.py3flakes.checker.html#Checker.deferFunction" />
+      <keyword name="Checker.handleAssignName" id="Checker.handleAssignName" ref="eric5.Utilities.py3flakes.checker.html#Checker.handleAssignName" />
+      <keyword name="Checker.handleBody" id="Checker.handleBody" ref="eric5.Utilities.py3flakes.checker.html#Checker.handleBody" />
+      <keyword name="Checker.handleNode" id="Checker.handleNode" ref="eric5.Utilities.py3flakes.checker.html#Checker.handleNode" />
+      <keyword name="Checker.ignore" id="Checker.ignore" ref="eric5.Utilities.py3flakes.checker.html#Checker.ignore" />
+      <keyword name="Checker.popScope" id="Checker.popScope" ref="eric5.Utilities.py3flakes.checker.html#Checker.popScope" />
+      <keyword name="Checker.pushClassScope" id="Checker.pushClassScope" ref="eric5.Utilities.py3flakes.checker.html#Checker.pushClassScope" />
+      <keyword name="Checker.pushFunctionScope" id="Checker.pushFunctionScope" ref="eric5.Utilities.py3flakes.checker.html#Checker.pushFunctionScope" />
+      <keyword name="Checker.report" id="Checker.report" ref="eric5.Utilities.py3flakes.checker.html#Checker.report" />
+      <keyword name="Checker.runFunction" id="Checker.runFunction" ref="eric5.Utilities.py3flakes.checker.html#Checker.runFunction" />
+      <keyword name="Checker.scope" id="Checker.scope" ref="eric5.Utilities.py3flakes.checker.html#Checker.scope" />
+      <keyword name="ExportBinding.names" id="ExportBinding.names" ref="eric5.Utilities.py3flakes.checker.html#ExportBinding.names" />
+      <keyword name="FunctionScope (Constructor)" id="FunctionScope (Constructor)" ref="eric5.Utilities.py3flakes.checker.html#FunctionScope.__init__" />
+      <keyword name="Importation (Constructor)" id="Importation (Constructor)" ref="eric5.Utilities.py3flakes.checker.html#Importation.__init__" />
+      <keyword name="Scope (Constructor)" id="Scope (Constructor)" ref="eric5.Utilities.py3flakes.checker.html#Scope.__init__" />
+      <keyword name="Scope.__repr__" id="Scope.__repr__" ref="eric5.Utilities.py3flakes.checker.html#Scope.__repr__" />
+      <keyword name="messages (Module)" id="messages (Module)" ref="eric5.Utilities.py3flakes.messages.html" />
+      <keyword name="DuplicateArgument" id="DuplicateArgument" ref="eric5.Utilities.py3flakes.messages.html#DuplicateArgument" />
+      <keyword name="ImportShadowedByLoopVar" id="ImportShadowedByLoopVar" ref="eric5.Utilities.py3flakes.messages.html#ImportShadowedByLoopVar" />
+      <keyword name="ImportStarUsed" id="ImportStarUsed" ref="eric5.Utilities.py3flakes.messages.html#ImportStarUsed" />
+      <keyword name="LateFutureImport" id="LateFutureImport" ref="eric5.Utilities.py3flakes.messages.html#LateFutureImport" />
+      <keyword name="Message" id="Message" ref="eric5.Utilities.py3flakes.messages.html#Message" />
+      <keyword name="RedefinedFunction" id="RedefinedFunction" ref="eric5.Utilities.py3flakes.messages.html#RedefinedFunction" />
+      <keyword name="RedefinedWhileUnused" id="RedefinedWhileUnused" ref="eric5.Utilities.py3flakes.messages.html#RedefinedWhileUnused" />
+      <keyword name="UndefinedExport" id="UndefinedExport" ref="eric5.Utilities.py3flakes.messages.html#UndefinedExport" />
+      <keyword name="UndefinedLocal" id="UndefinedLocal" ref="eric5.Utilities.py3flakes.messages.html#UndefinedLocal" />
+      <keyword name="UndefinedName" id="UndefinedName" ref="eric5.Utilities.py3flakes.messages.html#UndefinedName" />
+      <keyword name="UnusedImport" id="UnusedImport" ref="eric5.Utilities.py3flakes.messages.html#UnusedImport" />
+      <keyword name="UnusedVariable" id="UnusedVariable" ref="eric5.Utilities.py3flakes.messages.html#UnusedVariable" />
+      <keyword name="DuplicateArgument (Constructor)" id="DuplicateArgument (Constructor)" ref="eric5.Utilities.py3flakes.messages.html#DuplicateArgument.__init__" />
+      <keyword name="ImportShadowedByLoopVar (Constructor)" id="ImportShadowedByLoopVar (Constructor)" ref="eric5.Utilities.py3flakes.messages.html#ImportShadowedByLoopVar.__init__" />
+      <keyword name="ImportStarUsed (Constructor)" id="ImportStarUsed (Constructor)" ref="eric5.Utilities.py3flakes.messages.html#ImportStarUsed.__init__" />
+      <keyword name="LateFutureImport (Constructor)" id="LateFutureImport (Constructor)" ref="eric5.Utilities.py3flakes.messages.html#LateFutureImport.__init__" />
+      <keyword name="Message (Constructor)" id="Message (Constructor)" ref="eric5.Utilities.py3flakes.messages.html#Message.__init__" />
+      <keyword name="Message.__str__" id="Message.__str__" ref="eric5.Utilities.py3flakes.messages.html#Message.__str__" />
+      <keyword name="Message.getMessageData" id="Message.getMessageData" ref="eric5.Utilities.py3flakes.messages.html#Message.getMessageData" />
+      <keyword name="RedefinedFunction (Constructor)" id="RedefinedFunction (Constructor)" ref="eric5.Utilities.py3flakes.messages.html#RedefinedFunction.__init__" />
+      <keyword name="RedefinedWhileUnused (Constructor)" id="RedefinedWhileUnused (Constructor)" ref="eric5.Utilities.py3flakes.messages.html#RedefinedWhileUnused.__init__" />
+      <keyword name="UndefinedExport (Constructor)" id="UndefinedExport (Constructor)" ref="eric5.Utilities.py3flakes.messages.html#UndefinedExport.__init__" />
+      <keyword name="UndefinedLocal (Constructor)" id="UndefinedLocal (Constructor)" ref="eric5.Utilities.py3flakes.messages.html#UndefinedLocal.__init__" />
+      <keyword name="UndefinedName (Constructor)" id="UndefinedName (Constructor)" ref="eric5.Utilities.py3flakes.messages.html#UndefinedName.__init__" />
+      <keyword name="UnusedImport (Constructor)" id="UnusedImport (Constructor)" ref="eric5.Utilities.py3flakes.messages.html#UnusedImport.__init__" />
+      <keyword name="UnusedVariable (Constructor)" id="UnusedVariable (Constructor)" ref="eric5.Utilities.py3flakes.messages.html#UnusedVariable.__init__" />
       <keyword name="Passwords (Package)" id="Passwords (Package)" ref="index-eric5.Helpviewer.Passwords.html" />
       <keyword name="PasswordModel (Module)" id="PasswordModel (Module)" ref="eric5.Helpviewer.Passwords.PasswordModel.html" />
       <keyword name="PasswordModel" id="PasswordModel" ref="eric5.Helpviewer.Passwords.PasswordModel.html#PasswordModel" />
@@ -7198,6 +7322,11 @@
       <keyword name="ViewmanagerPage (Constructor)" id="ViewmanagerPage (Constructor)" ref="eric5.Preferences.ConfigurationPages.ViewmanagerPage.html#ViewmanagerPage.__init__" />
       <keyword name="ViewmanagerPage.on_windowComboBox_activated" id="ViewmanagerPage.on_windowComboBox_activated" ref="eric5.Preferences.ConfigurationPages.ViewmanagerPage.html#ViewmanagerPage.on_windowComboBox_activated" />
       <keyword name="ViewmanagerPage.save" id="ViewmanagerPage.save" ref="eric5.Preferences.ConfigurationPages.ViewmanagerPage.html#ViewmanagerPage.save" />
+      <keyword name="Py3FlakesPage (Module)" id="Py3FlakesPage (Module)" ref="eric5.Preferences.ConfigurationPages.Py3FlakesPage.html" />
+      <keyword name="Py3FlakesPage" id="Py3FlakesPage" ref="eric5.Preferences.ConfigurationPages.Py3FlakesPage.html#Py3FlakesPage" />
+      <keyword name="create" id="create" ref="eric5.Preferences.ConfigurationPages.Py3FlakesPage.html#create" />
+      <keyword name="Py3FlakesPage (Constructor)" id="Py3FlakesPage (Constructor)" ref="eric5.Preferences.ConfigurationPages.Py3FlakesPage.html#Py3FlakesPage.__init__" />
+      <keyword name="Py3FlakesPage.save" id="Py3FlakesPage.save" ref="eric5.Preferences.ConfigurationPages.Py3FlakesPage.html#Py3FlakesPage.save" />
       <keyword name="EditorAPIsPage (Module)" id="EditorAPIsPage (Module)" ref="eric5.Preferences.ConfigurationPages.EditorAPIsPage.html" />
       <keyword name="EditorAPIsPage" id="EditorAPIsPage" ref="eric5.Preferences.ConfigurationPages.EditorAPIsPage.html#EditorAPIsPage" />
       <keyword name="create" id="create" ref="eric5.Preferences.ConfigurationPages.EditorAPIsPage.html#create" />
@@ -9209,6 +9338,7 @@
       <file>eric5.Preferences.ConfigurationPages.PrinterPage.html</file>
       <file>eric5.Preferences.ConfigurationPages.ProjectBrowserPage.html</file>
       <file>eric5.Preferences.ConfigurationPages.ProjectPage.html</file>
+      <file>eric5.Preferences.ConfigurationPages.Py3FlakesPage.html</file>
       <file>eric5.Preferences.ConfigurationPages.PythonPage.html</file>
       <file>eric5.Preferences.ConfigurationPages.QtPage.html</file>
       <file>eric5.Preferences.ConfigurationPages.ShellPage.html</file>
@@ -9350,6 +9480,8 @@
       <file>eric5.Utilities.SingleApplication.html</file>
       <file>eric5.Utilities.Startup.html</file>
       <file>eric5.Utilities.__init__.html</file>
+      <file>eric5.Utilities.py3flakes.checker.html</file>
+      <file>eric5.Utilities.py3flakes.messages.html</file>
       <file>eric5.Utilities.uic.html</file>
       <file>eric5.VCS.CommandOptionsDialog.html</file>
       <file>eric5.VCS.ProjectBrowserHelper.html</file>
@@ -9453,6 +9585,7 @@
       <file>index-eric5.UI.html</file>
       <file>index-eric5.Utilities.ClassBrowsers.html</file>
       <file>index-eric5.Utilities.html</file>
+      <file>index-eric5.Utilities.py3flakes.html</file>
       <file>index-eric5.VCS.html</file>
       <file>index-eric5.ViewManager.html</file>
       <file>index-eric5.html</file>
--- a/Documentation/Source/eric5.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckerDialog.html	Sat Jan 30 16:07:16 2010 +0000
+++ b/Documentation/Source/eric5.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckerDialog.html	Sat Jan 30 18:37:18 2010 +0000
@@ -49,7 +49,7 @@
 QDialog, Ui_SyntaxCheckerDialog
 <h3>Class Attributes</h3>
 <table>
-<tr><td>None</td></tr>
+<tr><td>filenameRole</td></tr><tr><td>warningRole</td></tr>
 </table>
 <h3>Methods</h3>
 <table>
@@ -99,7 +99,7 @@
         Private method to clear all error markers of open editors.
 </p><a NAME="SyntaxCheckerDialog.__createResultItem" ID="SyntaxCheckerDialog.__createResultItem"></a>
 <h4>SyntaxCheckerDialog.__createResultItem</h4>
-<b>__createResultItem</b>(<i>file, line, error, sourcecode</i>)
+<b>__createResultItem</b>(<i>file, line, error, sourcecode, isWarning = False</i>)
 <p>
         Private method to create an entry in the result list.
 </p><dl>
@@ -115,6 +115,9 @@
 </dd><dt><i>sourcecode</i></dt>
 <dd>
 faulty line of code (string)
+</dd><dt><i>isWarning</i></dt>
+<dd>
+flag indicating a warning message (boolean)
 </dd>
 </dl><a NAME="SyntaxCheckerDialog.__finish" ID="SyntaxCheckerDialog.__finish"></a>
 <h4>SyntaxCheckerDialog.__finish</h4>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Documentation/Source/eric5.Preferences.ConfigurationPages.Py3FlakesPage.html	Sat Jan 30 18:37:18 2010 +0000
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN'
+'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
+<html><head>
+<title>eric5.Preferences.ConfigurationPages.Py3FlakesPage</title>
+<style>
+body {
+    background:white;
+    margin: 0em 1em 10em 1em;
+    color: black;
+}
+
+h1 { color: white; background: #4FA4FF; }
+h2 { color: white; background: #4FA4FF; }
+h3 { color: white; background: #00557F; }
+h4 { color: white; background: #00557F; }
+    
+a { color: #AA5500; }
+
+</style>
+</head>
+<body><a NAME="top" ID="top"></a>
+<h1>eric5.Preferences.ConfigurationPages.Py3FlakesPage</h1>
+<p>
+Module implementing the Py3Flakes configuration page.
+</p>
+<h3>Global Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Classes</h3>
+<table>
+<tr>
+<td><a href="#Py3FlakesPage">Py3FlakesPage</a></td>
+<td>Class implementing the Python configuration page.</td>
+</tr>
+</table>
+<h3>Functions</h3>
+<table>
+<tr>
+<td><a href="#create">create</a></td>
+<td>Module function to create the configuration page.</td>
+</tr>
+</table>
+<hr /><hr />
+<a NAME="Py3FlakesPage" ID="Py3FlakesPage"></a>
+<h2>Py3FlakesPage</h2>
+<p>
+    Class implementing the Python configuration page.
+</p>
+<h3>Derived from</h3>
+ConfigurationPageBase, Ui_Py3FlakesPage
+<h3>Class Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#Py3FlakesPage.__init__">Py3FlakesPage</a></td>
+<td>Constructor</td>
+</tr><tr>
+<td><a href="#Py3FlakesPage.save">save</a></td>
+<td>Public slot to save the Python configuration.</td>
+</tr>
+</table>
+<a NAME="Py3FlakesPage.__init__" ID="Py3FlakesPage.__init__"></a>
+<h4>Py3FlakesPage (Constructor)</h4>
+<b>Py3FlakesPage</b>(<i></i>)
+<p>
+        Constructor
+</p><a NAME="Py3FlakesPage.save" ID="Py3FlakesPage.save"></a>
+<h4>Py3FlakesPage.save</h4>
+<b>save</b>(<i></i>)
+<p>
+        Public slot to save the Python configuration.
+</p>
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
+<a NAME="create" ID="create"></a>
+<h2>create</h2>
+<b>create</b>(<i>dlg</i>)
+<p>
+    Module function to create the configuration page.
+</p><dl>
+<dt><i>dlg</i></dt>
+<dd>
+reference to the configuration dialog
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+</body></html>
\ No newline at end of file
--- a/Documentation/Source/eric5.Preferences.__init__.html	Sat Jan 30 16:07:16 2010 +0000
+++ b/Documentation/Source/eric5.Preferences.__init__.html	Sat Jan 30 18:37:18 2010 +0000
@@ -80,6 +80,9 @@
 <td><a href="#getEditorTyping">getEditorTyping</a></td>
 <td>Module function to retrieve the various editor typing settings.</td>
 </tr><tr>
+<td><a href="#getFlakes">getFlakes</a></td>
+<td>Module function to retrieve the py3flakes related settings.</td>
+</tr><tr>
 <td><a href="#getGeometry">getGeometry</a></td>
 <td>Module function to retrieve the display geometry.</td>
 </tr><tr>
@@ -215,6 +218,9 @@
 <td><a href="#setEditorTyping">setEditorTyping</a></td>
 <td>Module function to store the various editor typing settings.</td>
 </tr><tr>
+<td><a href="#setFlakes">setFlakes</a></td>
+<td>Module function to store the py3flakes related settings.</td>
+</tr><tr>
 <td><a href="#setGeometry">setGeometry</a></td>
 <td>Module function to store the display geometry.</td>
 </tr><tr>
@@ -316,7 +322,7 @@
 object
 <h3>Class Attributes</h3>
 <table>
-<tr><td>corbaDefaults</td></tr><tr><td>debuggerDefaults</td></tr><tr><td>editorColourDefaults</td></tr><tr><td>editorDefaults</td></tr><tr><td>editorExporterDefaults</td></tr><tr><td>editorOtherFontsDefaults</td></tr><tr><td>editorTypingDefaults</td></tr><tr><td>fontFamily</td></tr><tr><td>fontSize</td></tr><tr><td>geometryDefaults</td></tr><tr><td>graphicsDefaults</td></tr><tr><td>helpDefaults</td></tr><tr><td>iconEditorDefaults</td></tr><tr><td>iconsDefaults</td></tr><tr><td>multiProjectDefaults</td></tr><tr><td>pluginManagerDefaults</td></tr><tr><td>printerDefaults</td></tr><tr><td>projectBrowserColourDefaults</td></tr><tr><td>projectBrowserFlagsDefaults</td></tr><tr><td>projectDefaults</td></tr><tr><td>qtDefaults</td></tr><tr><td>resetLayout</td></tr><tr><td>shellDefaults</td></tr><tr><td>sysDefaults</td></tr><tr><td>tasksDefaults</td></tr><tr><td>templatesDefaults</td></tr><tr><td>terminalDefaults</td></tr><tr><td>uiDefaults</td></tr><tr><td>userDefaults</td></tr><tr><td>varDefaults</td></tr><tr><td>vcsDefaults</td></tr><tr><td>viewProfilesLength</td></tr><tr><td>websettings</td></tr>
+<tr><td>corbaDefaults</td></tr><tr><td>debuggerDefaults</td></tr><tr><td>editorColourDefaults</td></tr><tr><td>editorDefaults</td></tr><tr><td>editorExporterDefaults</td></tr><tr><td>editorOtherFontsDefaults</td></tr><tr><td>editorTypingDefaults</td></tr><tr><td>fontFamily</td></tr><tr><td>fontSize</td></tr><tr><td>geometryDefaults</td></tr><tr><td>graphicsDefaults</td></tr><tr><td>helpDefaults</td></tr><tr><td>iconEditorDefaults</td></tr><tr><td>iconsDefaults</td></tr><tr><td>multiProjectDefaults</td></tr><tr><td>pluginManagerDefaults</td></tr><tr><td>printerDefaults</td></tr><tr><td>projectBrowserColourDefaults</td></tr><tr><td>projectBrowserFlagsDefaults</td></tr><tr><td>projectDefaults</td></tr><tr><td>py3flakesDefaults</td></tr><tr><td>qtDefaults</td></tr><tr><td>resetLayout</td></tr><tr><td>shellDefaults</td></tr><tr><td>sysDefaults</td></tr><tr><td>tasksDefaults</td></tr><tr><td>templatesDefaults</td></tr><tr><td>terminalDefaults</td></tr><tr><td>uiDefaults</td></tr><tr><td>userDefaults</td></tr><tr><td>varDefaults</td></tr><tr><td>vcsDefaults</td></tr><tr><td>viewProfilesLength</td></tr><tr><td>websettings</td></tr>
 </table>
 <h3>Methods</h3>
 <table>
@@ -546,6 +552,27 @@
 </dl>
 <div align="right"><a href="#top">Up</a></div>
 <hr /><hr />
+<a NAME="getFlakes" ID="getFlakes"></a>
+<h2>getFlakes</h2>
+<b>getFlakes</b>(<i>key, prefClass = Prefs</i>)
+<p>
+    Module function to retrieve the py3flakes related settings.
+</p><dl>
+<dt><i>key</i></dt>
+<dd>
+the key of the value to get
+</dd><dt><i>prefClass</i></dt>
+<dd>
+preferences class used as the storage area
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+the requested user setting
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
 <a NAME="getGeometry" ID="getGeometry"></a>
 <h2>getGeometry</h2>
 <b>getGeometry</b>(<i>key, prefClass = Prefs</i>)
@@ -1389,6 +1416,25 @@
 </dl>
 <div align="right"><a href="#top">Up</a></div>
 <hr /><hr />
+<a NAME="setFlakes" ID="setFlakes"></a>
+<h2>setFlakes</h2>
+<b>setFlakes</b>(<i>key, value, prefClass = Prefs</i>)
+<p>
+    Module function to store the py3flakes related settings.
+</p><dl>
+<dt><i>key</i></dt>
+<dd>
+the key of the setting to be set
+</dd><dt><i>value</i></dt>
+<dd>
+the value to be set
+</dd><dt><i>prefClass</i></dt>
+<dd>
+preferences class used as the storage area
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
 <a NAME="setGeometry" ID="setGeometry"></a>
 <h2>setGeometry</h2>
 <b>setGeometry</b>(<i>key, value, prefClass = Prefs</i>)
--- a/Documentation/Source/eric5.QScintilla.Editor.html	Sat Jan 30 16:07:16 2010 +0000
+++ b/Documentation/Source/eric5.QScintilla.Editor.html	Sat Jan 30 18:37:18 2010 +0000
@@ -446,6 +446,9 @@
 <td><a href="#Editor.__showContextMenuSpelling">__showContextMenuSpelling</a></td>
 <td>Private slot to set up the spelling menu before it is shown.</td>
 </tr><tr>
+<td><a href="#Editor.__showFlakesWarning">__showFlakesWarning</a></td>
+<td>Private slot to handle the 'Show warning' context menu action.</td>
+</tr><tr>
 <td><a href="#Editor.__showImportsDiagram">__showImportsDiagram</a></td>
 <td>Private method to handle the Imports Diagram context menu action.</td>
 </tr><tr>
@@ -527,6 +530,9 @@
 <td><a href="#Editor.clearBreakpoint">clearBreakpoint</a></td>
 <td>Public method to clear a breakpoint.</td>
 </tr><tr>
+<td><a href="#Editor.clearFlakesWarnings">clearFlakesWarnings</a></td>
+<td>Public slot to handle the 'Clear all warnings' context menu action.</td>
+</tr><tr>
 <td><a href="#Editor.clearSearchIndicators">clearSearchIndicators</a></td>
 <td>Public method to clear all search indicators.</td>
 </tr><tr>
@@ -608,6 +614,9 @@
 <td><a href="#Editor.getFileType">getFileType</a></td>
 <td>Public method to return the type of the file being displayed.</td>
 </tr><tr>
+<td><a href="#Editor.getFlakesWarnings">getFlakesWarnings</a></td>
+<td>Public method to retrieve the flakes warning markers.</td>
+</tr><tr>
 <td><a href="#Editor.getFolds">getFolds</a></td>
 <td>Public method to get a list line numbers of collapsed folds.</td>
 </tr><tr>
@@ -665,11 +674,14 @@
 <td><a href="#Editor.hasCoverageMarkers">hasCoverageMarkers</a></td>
 <td>Public method to test, if there are coverage markers.</td>
 </tr><tr>
+<td><a href="#Editor.hasFlakesWarnings">hasFlakesWarnings</a></td>
+<td>Public method to check for the presence of flakes warnings.</td>
+</tr><tr>
 <td><a href="#Editor.hasMiniMenu">hasMiniMenu</a></td>
 <td>Public method to check the miniMenu flag.</td>
 </tr><tr>
 <td><a href="#Editor.hasSyntaxErrors">hasSyntaxErrors</a></td>
-<td>Public method to check for the presence of bookmarks.</td>
+<td>Public method to check for the presence of syntax errors.</td>
 </tr><tr>
 <td><a href="#Editor.hasTaskMarkers">hasTaskMarkers</a></td>
 <td>Public method to determine, if this editor contains any task markers.</td>
@@ -743,6 +755,9 @@
 <td><a href="#Editor.nextBookmark">nextBookmark</a></td>
 <td>Public slot to handle the 'Next bookmark' context menu action.</td>
 </tr><tr>
+<td><a href="#Editor.nextFlakesWarning">nextFlakesWarning</a></td>
+<td>Public slot to handle the 'Next warning' context menu action.</td>
+</tr><tr>
 <td><a href="#Editor.nextTask">nextTask</a></td>
 <td>Public slot to handle the 'Next task' context menu action.</td>
 </tr><tr>
@@ -752,6 +767,9 @@
 <td><a href="#Editor.previousBookmark">previousBookmark</a></td>
 <td>Public slot to handle the 'Previous bookmark' context menu action.</td>
 </tr><tr>
+<td><a href="#Editor.previousFlakesWarning">previousFlakesWarning</a></td>
+<td>Public slot to handle the 'Previous warning' context menu action.</td>
+</tr><tr>
 <td><a href="#Editor.previousTask">previousTask</a></td>
 <td>Public slot to handle the 'Previous task' context menu action.</td>
 </tr><tr>
@@ -848,6 +866,9 @@
 <td><a href="#Editor.toggleBookmark">toggleBookmark</a></td>
 <td>Public method to toggle a bookmark.</td>
 </tr><tr>
+<td><a href="#Editor.toggleFlakesWarning">toggleFlakesWarning</a></td>
+<td>Public method to toggle a flakes warning indicator.</td>
+</tr><tr>
 <td><a href="#Editor.toggleSyntaxError">toggleSyntaxError</a></td>
 <td>Public method to toggle a syntax error indicator.</td>
 </tr><tr>
@@ -1681,7 +1702,17 @@
 <b>__showContextMenuSpelling</b>(<i></i>)
 <p>
         Private slot to set up the spelling menu before it is shown.
-</p><a NAME="Editor.__showImportsDiagram" ID="Editor.__showImportsDiagram"></a>
+</p><a NAME="Editor.__showFlakesWarning" ID="Editor.__showFlakesWarning"></a>
+<h4>Editor.__showFlakesWarning</h4>
+<b>__showFlakesWarning</b>(<i>line = -1</i>)
+<p>
+        Private slot to handle the 'Show warning' context menu action.
+</p><dl>
+<dt><i>line</i></dt>
+<dd>
+line number to show the flakes warning for (integer)
+</dd>
+</dl><a NAME="Editor.__showImportsDiagram" ID="Editor.__showImportsDiagram"></a>
 <h4>Editor.__showImportsDiagram</h4>
 <b>__showImportsDiagram</b>(<i></i>)
 <p>
@@ -1912,7 +1943,12 @@
 <dd>
 linenumber of the breakpoint (integer)
 </dd>
-</dl><a NAME="Editor.clearSearchIndicators" ID="Editor.clearSearchIndicators"></a>
+</dl><a NAME="Editor.clearFlakesWarnings" ID="Editor.clearFlakesWarnings"></a>
+<h4>Editor.clearFlakesWarnings</h4>
+<b>clearFlakesWarnings</b>(<i></i>)
+<p>
+        Public slot to handle the 'Clear all warnings' context menu action.
+</p><a NAME="Editor.clearSearchIndicators" ID="Editor.clearSearchIndicators"></a>
 <h4>Editor.clearSearchIndicators</h4>
 <b>clearSearchIndicators</b>(<i></i>)
 <p>
@@ -2157,6 +2193,17 @@
 <dd>
 type of the displayed file (string)
 </dd>
+</dl><a NAME="Editor.getFlakesWarnings" ID="Editor.getFlakesWarnings"></a>
+<h4>Editor.getFlakesWarnings</h4>
+<b>getFlakesWarnings</b>(<i></i>)
+<p>
+        Public method to retrieve the flakes warning markers.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+sorted list of all lines containing a flakes warning
+            (list of integer)
+</dd>
 </dl><a NAME="Editor.getFolds" ID="Editor.getFolds"></a>
 <h4>Editor.getFolds</h4>
 <b>getFolds</b>(<i></i>)
@@ -2389,7 +2436,17 @@
 <b>hasCoverageMarkers</b>(<i></i>)
 <p>
         Public method to test, if there are coverage markers.
-</p><a NAME="Editor.hasMiniMenu" ID="Editor.hasMiniMenu"></a>
+</p><a NAME="Editor.hasFlakesWarnings" ID="Editor.hasFlakesWarnings"></a>
+<h4>Editor.hasFlakesWarnings</h4>
+<b>hasFlakesWarnings</b>(<i></i>)
+<p>
+        Public method to check for the presence of flakes warnings.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+flag indicating the presence of flakes warnings (boolean)
+</dd>
+</dl><a NAME="Editor.hasMiniMenu" ID="Editor.hasMiniMenu"></a>
 <h4>Editor.hasMiniMenu</h4>
 <b>hasMiniMenu</b>(<i></i>)
 <p>
@@ -2403,11 +2460,11 @@
 <h4>Editor.hasSyntaxErrors</h4>
 <b>hasSyntaxErrors</b>(<i></i>)
 <p>
-        Public method to check for the presence of bookmarks.
+        Public method to check for the presence of syntax errors.
 </p><dl>
 <dt>Returns:</dt>
 <dd>
-flag indicating the presence of bookmarks (boolean)
+flag indicating the presence of syntax errors (boolean)
 </dd>
 </dl><a NAME="Editor.hasTaskMarkers" ID="Editor.hasTaskMarkers"></a>
 <h4>Editor.hasTaskMarkers</h4>
@@ -2603,6 +2660,11 @@
 <b>nextBookmark</b>(<i></i>)
 <p>
         Public slot to handle the 'Next bookmark' context menu action.
+</p><a NAME="Editor.nextFlakesWarning" ID="Editor.nextFlakesWarning"></a>
+<h4>Editor.nextFlakesWarning</h4>
+<b>nextFlakesWarning</b>(<i></i>)
+<p>
+        Public slot to handle the 'Next warning' context menu action.
 </p><a NAME="Editor.nextTask" ID="Editor.nextTask"></a>
 <h4>Editor.nextTask</h4>
 <b>nextTask</b>(<i></i>)
@@ -2618,6 +2680,11 @@
 <b>previousBookmark</b>(<i></i>)
 <p>
         Public slot to handle the 'Previous bookmark' context menu action.
+</p><a NAME="Editor.previousFlakesWarning" ID="Editor.previousFlakesWarning"></a>
+<h4>Editor.previousFlakesWarning</h4>
+<b>previousFlakesWarning</b>(<i></i>)
+<p>
+        Public slot to handle the 'Previous warning' context menu action.
 </p><a NAME="Editor.previousTask" ID="Editor.previousTask"></a>
 <h4>Editor.previousTask</h4>
 <b>previousTask</b>(<i></i>)
@@ -2895,6 +2962,23 @@
 <dd>
 line number of the bookmark (integer)
 </dd>
+</dl><a NAME="Editor.toggleFlakesWarning" ID="Editor.toggleFlakesWarning"></a>
+<h4>Editor.toggleFlakesWarning</h4>
+<b>toggleFlakesWarning</b>(<i>line, warning, msg = ""</i>)
+<p>
+        Public method to toggle a flakes warning indicator.
+</p><dl>
+<dt><i>line</i></dt>
+<dd>
+line number of the flakes warning
+</dd><dt><i>erwarningror</i></dt>
+<dd>
+flag indicating if the warning marker should be
+            set or deleted (boolean)
+</dd><dt><i>msg</i></dt>
+<dd>
+warning message (string)
+</dd>
 </dl><a NAME="Editor.toggleSyntaxError" ID="Editor.toggleSyntaxError"></a>
 <h4>Editor.toggleSyntaxError</h4>
 <b>toggleSyntaxError</b>(<i>line, error, msg = ""</i>)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Documentation/Source/eric5.Utilities.py3flakes.checker.html	Sat Jan 30 18:37:18 2010 +0000
@@ -0,0 +1,763 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN'
+'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
+<html><head>
+<title>eric5.Utilities.py3flakes.checker</title>
+<style>
+body {
+    background:white;
+    margin: 0em 1em 10em 1em;
+    color: black;
+}
+
+h1 { color: white; background: #4FA4FF; }
+h2 { color: white; background: #4FA4FF; }
+h3 { color: white; background: #00557F; }
+h4 { color: white; background: #00557F; }
+    
+a { color: #AA5500; }
+
+</style>
+</head>
+<body><a NAME="top" ID="top"></a>
+<h1>eric5.Utilities.py3flakes.checker</h1>
+
+<h3>Global Attributes</h3>
+<table>
+<tr><td>_MAGIC_GLOBALS</td></tr>
+</table>
+<h3>Classes</h3>
+<table>
+<tr>
+<td><a href="#Argument">Argument</a></td>
+<td>Represents binding a name as an argument.</td>
+</tr><tr>
+<td><a href="#Assignment">Assignment</a></td>
+<td>Represents binding a name with an explicit assignment.</td>
+</tr><tr>
+<td><a href="#Binding">Binding</a></td>
+<td>Represents the binding of a value to a name.</td>
+</tr><tr>
+<td><a href="#Checker">Checker</a></td>
+<td>Class to check the cleanliness and sanity of Python code.</td>
+</tr><tr>
+<td><a href="#ClassScope">ClassScope</a></td>
+<td>Class representing a name scope for a class.</td>
+</tr><tr>
+<td><a href="#ExportBinding">ExportBinding</a></td>
+<td>A binding created by an __all__ assignment.</td>
+</tr><tr>
+<td><a href="#FunctionDefinition">FunctionDefinition</a></td>
+<td>Represents a function definition.</td>
+</tr><tr>
+<td><a href="#FunctionScope">FunctionScope</a></td>
+<td>Class representing a name scope for a function.</td>
+</tr><tr>
+<td><a href="#Importation">Importation</a></td>
+<td>A binding created by an import statement.</td>
+</tr><tr>
+<td><a href="#ModuleScope">ModuleScope</a></td>
+<td>Class representing a name scope for a module.</td>
+</tr><tr>
+<td><a href="#Scope">Scope</a></td>
+<td>Class defining the scope base class.</td>
+</tr><tr>
+<td><a href="#UnBinding">UnBinding</a></td>
+<td>Created by the 'del' operator.</td>
+</tr>
+</table>
+<h3>Functions</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<hr /><hr />
+<a NAME="Argument" ID="Argument"></a>
+<h2>Argument</h2>
+<p>
+    Represents binding a name as an argument.
+</p>
+<h3>Derived from</h3>
+Binding
+<h3>Class Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
+<a NAME="Assignment" ID="Assignment"></a>
+<h2>Assignment</h2>
+<p>
+    Represents binding a name with an explicit assignment.
+</p><p>
+    The checker will raise warnings for any Assignment that isn't used. Also,
+    the checker does not consider assignments in tuple/list unpacking to be
+    Assignments, rather it treats them as simple Bindings.
+</p>
+<h3>Derived from</h3>
+Binding
+<h3>Class Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
+<a NAME="Binding" ID="Binding"></a>
+<h2>Binding</h2>
+<p>
+    Represents the binding of a value to a name.
+</p><p>
+    The checker uses this to keep track of which names have been bound and
+    which names have not. See Assignment for a special type of binding that
+    is checked with stricter rules.
+</p>
+<h3>Derived from</h3>
+object
+<h3>Class Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#Binding.__init__">Binding</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Binding.__repr__">__repr__</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Binding.__str__">__str__</a></td>
+<td></td>
+</tr>
+</table>
+<a NAME="Binding.__init__" ID="Binding.__init__"></a>
+<h4>Binding (Constructor)</h4>
+<b>Binding</b>(<i>name, source</i>)
+<a NAME="Binding.__repr__" ID="Binding.__repr__"></a>
+<h4>Binding.__repr__</h4>
+<b>__repr__</b>(<i></i>)
+<a NAME="Binding.__str__" ID="Binding.__str__"></a>
+<h4>Binding.__str__</h4>
+<b>__str__</b>(<i></i>)
+
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
+<a NAME="Checker" ID="Checker"></a>
+<h2>Checker</h2>
+<p>
+    Class to check the cleanliness and sanity of Python code.
+</p>
+<h3>Derived from</h3>
+object
+<h3>Class Attributes</h3>
+<table>
+<tr><td>ATTRIBUTES</td></tr><tr><td>INVERT</td></tr><tr><td>MOD</td></tr><tr><td>NONLOCAL</td></tr><tr><td>PASS</td></tr><tr><td>SET</td></tr><tr><td>SETCOMP</td></tr><tr><td>WHILE</td></tr><tr><td>nodeDepth</td></tr><tr><td>scope</td></tr><tr><td>traceTree</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#Checker.__init__">Checker</a></td>
+<td>Constructor</td>
+</tr><tr>
+<td><a href="#Checker.ASSERT">ASSERT</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.ASSIGN">ASSIGN</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.ATTRIBUTE">ATTRIBUTE</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.AUGASSIGN">AUGASSIGN</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.BINOP">BINOP</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.BOOLOP">BOOLOP</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.CALL">CALL</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.CLASSDEF">CLASSDEF</a></td>
+<td>Check names used in a class definition, including its decorators, base classes, and the body of its definition.</td>
+</tr><tr>
+<td><a href="#Checker.COMPARE">COMPARE</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.COMPREHENSION">COMPREHENSION</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.DELETE">DELETE</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.DICT">DICT</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.DICTCOMP">DICTCOMP</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.EXCEPTHANDLER">EXCEPTHANDLER</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.EXPR">EXPR</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.EXTSLICE">EXTSLICE</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.FOR">FOR</a></td>
+<td>Process bindings for loop variables.</td>
+</tr><tr>
+<td><a href="#Checker.FUNCTIONDEF">FUNCTIONDEF</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.GLOBAL">GLOBAL</a></td>
+<td>Keep track of globals declarations.</td>
+</tr><tr>
+<td><a href="#Checker.IF">IF</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.IFEXP">IFEXP</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.IMPORT">IMPORT</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.IMPORTFROM">IMPORTFROM</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.INDEX">INDEX</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.KEYWORD">KEYWORD</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.LAMBDA">LAMBDA</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.LIST">LIST</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.LISTCOMP">LISTCOMP</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.NAME">NAME</a></td>
+<td>Locate the name in locals / function / globals scopes.</td>
+</tr><tr>
+<td><a href="#Checker.RAISE">RAISE</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.RETURN">RETURN</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.SLICE">SLICE</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.STARRED">STARRED</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.SUBSCRIPT">SUBSCRIPT</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.TRYEXCEPT">TRYEXCEPT</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.TRYFINALLY">TRYFINALLY</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.UNARYOP">UNARYOP</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.WITH">WITH</a></td>
+<td>Handle with by checking the target of the statement (which can be an identifier, a list or tuple of targets, an attribute, etc) for undefined names and defining any it adds to the scope and by continuing to process the suite within the statement.</td>
+</tr><tr>
+<td><a href="#Checker.YIELD">YIELD</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker._runDeferred">_runDeferred</a></td>
+<td>Run the callables in deferred using their associated scope stack.</td>
+</tr><tr>
+<td><a href="#Checker.addArgs">addArgs</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.addBinding">addBinding</a></td>
+<td>Called when a binding is altered.</td>
+</tr><tr>
+<td><a href="#Checker.checkUnusedAssignments">checkUnusedAssignments</a></td>
+<td>Check to see if any assignments have not been used.</td>
+</tr><tr>
+<td><a href="#Checker.check_dead_scopes">check_dead_scopes</a></td>
+<td>Look at scopes which have been fully examined and report names in them which were imported but unused.</td>
+</tr><tr>
+<td><a href="#Checker.collectLoopVars">collectLoopVars</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.deferAssignment">deferAssignment</a></td>
+<td>Schedule an assignment handler to be called just after deferred function handlers.</td>
+</tr><tr>
+<td><a href="#Checker.deferFunction">deferFunction</a></td>
+<td>Schedule a function handler to be called just before completion.</td>
+</tr><tr>
+<td><a href="#Checker.handleAssignName">handleAssignName</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.handleBody">handleBody</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.handleNode">handleNode</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.ignore">ignore</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.popScope">popScope</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.pushClassScope">pushClassScope</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.pushFunctionScope">pushFunctionScope</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.report">report</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.runFunction">runFunction</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Checker.scope">scope</a></td>
+<td></td>
+</tr>
+</table>
+<a NAME="Checker.__init__" ID="Checker.__init__"></a>
+<h4>Checker (Constructor)</h4>
+<b>Checker</b>(<i>module, filename = '(none)'</i>)
+<p>
+        Constructor
+</p><dl>
+<dt><i>module</i></dt>
+<dd>
+parsed module tree or module source code
+</dd><dt><i>filename</i></dt>
+<dd>
+name of the module file (string)
+</dd>
+</dl><a NAME="Checker.ASSERT" ID="Checker.ASSERT"></a>
+<h4>Checker.ASSERT</h4>
+<b>ASSERT</b>(<i>node</i>)
+<a NAME="Checker.ASSIGN" ID="Checker.ASSIGN"></a>
+<h4>Checker.ASSIGN</h4>
+<b>ASSIGN</b>(<i>node</i>)
+<a NAME="Checker.ATTRIBUTE" ID="Checker.ATTRIBUTE"></a>
+<h4>Checker.ATTRIBUTE</h4>
+<b>ATTRIBUTE</b>(<i>node</i>)
+<a NAME="Checker.AUGASSIGN" ID="Checker.AUGASSIGN"></a>
+<h4>Checker.AUGASSIGN</h4>
+<b>AUGASSIGN</b>(<i>node</i>)
+<a NAME="Checker.BINOP" ID="Checker.BINOP"></a>
+<h4>Checker.BINOP</h4>
+<b>BINOP</b>(<i>node</i>)
+<a NAME="Checker.BOOLOP" ID="Checker.BOOLOP"></a>
+<h4>Checker.BOOLOP</h4>
+<b>BOOLOP</b>(<i>node</i>)
+<a NAME="Checker.CALL" ID="Checker.CALL"></a>
+<h4>Checker.CALL</h4>
+<b>CALL</b>(<i>node</i>)
+<a NAME="Checker.CLASSDEF" ID="Checker.CLASSDEF"></a>
+<h4>Checker.CLASSDEF</h4>
+<b>CLASSDEF</b>(<i>node</i>)
+<p>
+        Check names used in a class definition, including its decorators, base
+        classes, and the body of its definition.  Additionally, add its name to
+        the current scope.
+</p><a NAME="Checker.COMPARE" ID="Checker.COMPARE"></a>
+<h4>Checker.COMPARE</h4>
+<b>COMPARE</b>(<i>node</i>)
+<a NAME="Checker.COMPREHENSION" ID="Checker.COMPREHENSION"></a>
+<h4>Checker.COMPREHENSION</h4>
+<b>COMPREHENSION</b>(<i>node</i>)
+<a NAME="Checker.DELETE" ID="Checker.DELETE"></a>
+<h4>Checker.DELETE</h4>
+<b>DELETE</b>(<i>node</i>)
+<a NAME="Checker.DICT" ID="Checker.DICT"></a>
+<h4>Checker.DICT</h4>
+<b>DICT</b>(<i>node</i>)
+<a NAME="Checker.DICTCOMP" ID="Checker.DICTCOMP"></a>
+<h4>Checker.DICTCOMP</h4>
+<b>DICTCOMP</b>(<i>node</i>)
+<a NAME="Checker.EXCEPTHANDLER" ID="Checker.EXCEPTHANDLER"></a>
+<h4>Checker.EXCEPTHANDLER</h4>
+<b>EXCEPTHANDLER</b>(<i>node</i>)
+<a NAME="Checker.EXPR" ID="Checker.EXPR"></a>
+<h4>Checker.EXPR</h4>
+<b>EXPR</b>(<i>node</i>)
+<a NAME="Checker.EXTSLICE" ID="Checker.EXTSLICE"></a>
+<h4>Checker.EXTSLICE</h4>
+<b>EXTSLICE</b>(<i>node</i>)
+<a NAME="Checker.FOR" ID="Checker.FOR"></a>
+<h4>Checker.FOR</h4>
+<b>FOR</b>(<i>node</i>)
+<p>
+        Process bindings for loop variables.
+</p><a NAME="Checker.FUNCTIONDEF" ID="Checker.FUNCTIONDEF"></a>
+<h4>Checker.FUNCTIONDEF</h4>
+<b>FUNCTIONDEF</b>(<i>node</i>)
+<a NAME="Checker.GLOBAL" ID="Checker.GLOBAL"></a>
+<h4>Checker.GLOBAL</h4>
+<b>GLOBAL</b>(<i>node</i>)
+<p>
+        Keep track of globals declarations.
+</p><a NAME="Checker.IF" ID="Checker.IF"></a>
+<h4>Checker.IF</h4>
+<b>IF</b>(<i>node</i>)
+<a NAME="Checker.IFEXP" ID="Checker.IFEXP"></a>
+<h4>Checker.IFEXP</h4>
+<b>IFEXP</b>(<i>node</i>)
+<a NAME="Checker.IMPORT" ID="Checker.IMPORT"></a>
+<h4>Checker.IMPORT</h4>
+<b>IMPORT</b>(<i>node</i>)
+<a NAME="Checker.IMPORTFROM" ID="Checker.IMPORTFROM"></a>
+<h4>Checker.IMPORTFROM</h4>
+<b>IMPORTFROM</b>(<i>node</i>)
+<a NAME="Checker.INDEX" ID="Checker.INDEX"></a>
+<h4>Checker.INDEX</h4>
+<b>INDEX</b>(<i>node</i>)
+<a NAME="Checker.KEYWORD" ID="Checker.KEYWORD"></a>
+<h4>Checker.KEYWORD</h4>
+<b>KEYWORD</b>(<i>node</i>)
+<a NAME="Checker.LAMBDA" ID="Checker.LAMBDA"></a>
+<h4>Checker.LAMBDA</h4>
+<b>LAMBDA</b>(<i>node</i>)
+<a NAME="Checker.LIST" ID="Checker.LIST"></a>
+<h4>Checker.LIST</h4>
+<b>LIST</b>(<i>node</i>)
+<a NAME="Checker.LISTCOMP" ID="Checker.LISTCOMP"></a>
+<h4>Checker.LISTCOMP</h4>
+<b>LISTCOMP</b>(<i>node</i>)
+<a NAME="Checker.NAME" ID="Checker.NAME"></a>
+<h4>Checker.NAME</h4>
+<b>NAME</b>(<i>node</i>)
+<p>
+        Locate the name in locals / function / globals scopes.
+</p><a NAME="Checker.RAISE" ID="Checker.RAISE"></a>
+<h4>Checker.RAISE</h4>
+<b>RAISE</b>(<i>node</i>)
+<a NAME="Checker.RETURN" ID="Checker.RETURN"></a>
+<h4>Checker.RETURN</h4>
+<b>RETURN</b>(<i>node</i>)
+<a NAME="Checker.SLICE" ID="Checker.SLICE"></a>
+<h4>Checker.SLICE</h4>
+<b>SLICE</b>(<i>node</i>)
+<a NAME="Checker.STARRED" ID="Checker.STARRED"></a>
+<h4>Checker.STARRED</h4>
+<b>STARRED</b>(<i>node</i>)
+<a NAME="Checker.SUBSCRIPT" ID="Checker.SUBSCRIPT"></a>
+<h4>Checker.SUBSCRIPT</h4>
+<b>SUBSCRIPT</b>(<i>node</i>)
+<a NAME="Checker.TRYEXCEPT" ID="Checker.TRYEXCEPT"></a>
+<h4>Checker.TRYEXCEPT</h4>
+<b>TRYEXCEPT</b>(<i>node</i>)
+<a NAME="Checker.TRYFINALLY" ID="Checker.TRYFINALLY"></a>
+<h4>Checker.TRYFINALLY</h4>
+<b>TRYFINALLY</b>(<i>node</i>)
+<a NAME="Checker.UNARYOP" ID="Checker.UNARYOP"></a>
+<h4>Checker.UNARYOP</h4>
+<b>UNARYOP</b>(<i>node</i>)
+<a NAME="Checker.WITH" ID="Checker.WITH"></a>
+<h4>Checker.WITH</h4>
+<b>WITH</b>(<i>node</i>)
+<p>
+        Handle with by checking the target of the statement (which can be an
+        identifier, a list or tuple of targets, an attribute, etc) for
+        undefined names and defining any it adds to the scope and by continuing
+        to process the suite within the statement.
+</p><a NAME="Checker.YIELD" ID="Checker.YIELD"></a>
+<h4>Checker.YIELD</h4>
+<b>YIELD</b>(<i>node</i>)
+<a NAME="Checker._runDeferred" ID="Checker._runDeferred"></a>
+<h4>Checker._runDeferred</h4>
+<b>_runDeferred</b>(<i>deferred</i>)
+<p>
+        Run the callables in deferred using their associated scope stack.
+</p><a NAME="Checker.addArgs" ID="Checker.addArgs"></a>
+<h4>Checker.addArgs</h4>
+<b>addArgs</b>(<i></i>)
+<a NAME="Checker.addBinding" ID="Checker.addBinding"></a>
+<h4>Checker.addBinding</h4>
+<b>addBinding</b>(<i>lineno, value, reportRedef = True</i>)
+<p>
+Called when a binding is altered.
+</p><dl>
+<dt><i>lineno</i></dt>
+<dd>
+line of the statement responsible for the change (integer)
+</dd><dt><i>value</i></dt>
+<dd>
+the optional new value, a Binding instance, associated
+            with the binding; if None, the binding is deleted if it exists
+</dd><dt><i>reportRedef</i></dt>
+<dd>
+flag indicating if rebinding while unused will be
+            reported (boolean)
+</dd>
+</dl><a NAME="Checker.checkUnusedAssignments" ID="Checker.checkUnusedAssignments"></a>
+<h4>Checker.checkUnusedAssignments</h4>
+<b>checkUnusedAssignments</b>(<i></i>)
+<p>
+                Check to see if any assignments have not been used.
+</p><a NAME="Checker.check_dead_scopes" ID="Checker.check_dead_scopes"></a>
+<h4>Checker.check_dead_scopes</h4>
+<b>check_dead_scopes</b>(<i></i>)
+<p>
+        Look at scopes which have been fully examined and report names in them
+        which were imported but unused.
+</p><a NAME="Checker.collectLoopVars" ID="Checker.collectLoopVars"></a>
+<h4>Checker.collectLoopVars</h4>
+<b>collectLoopVars</b>(<i></i>)
+<a NAME="Checker.deferAssignment" ID="Checker.deferAssignment"></a>
+<h4>Checker.deferAssignment</h4>
+<b>deferAssignment</b>(<i>callable</i>)
+<p>
+        Schedule an assignment handler to be called just after deferred
+        function handlers.
+</p><a NAME="Checker.deferFunction" ID="Checker.deferFunction"></a>
+<h4>Checker.deferFunction</h4>
+<b>deferFunction</b>(<i>callable</i>)
+<p>
+        Schedule a function handler to be called just before completion.
+</p><p>
+        This is used for handling function bodies, which must be deferred
+        because code later in the file might modify the global scope. When
+        `callable` is called, the scope at the time this is called will be
+        restored, however it will contain any new bindings added to it.
+</p><a NAME="Checker.handleAssignName" ID="Checker.handleAssignName"></a>
+<h4>Checker.handleAssignName</h4>
+<b>handleAssignName</b>(<i>node</i>)
+<a NAME="Checker.handleBody" ID="Checker.handleBody"></a>
+<h4>Checker.handleBody</h4>
+<b>handleBody</b>(<i>tree</i>)
+<a NAME="Checker.handleNode" ID="Checker.handleNode"></a>
+<h4>Checker.handleNode</h4>
+<b>handleNode</b>(<i>node, parent</i>)
+<a NAME="Checker.ignore" ID="Checker.ignore"></a>
+<h4>Checker.ignore</h4>
+<b>ignore</b>(<i>node</i>)
+<a NAME="Checker.popScope" ID="Checker.popScope"></a>
+<h4>Checker.popScope</h4>
+<b>popScope</b>(<i></i>)
+<a NAME="Checker.pushClassScope" ID="Checker.pushClassScope"></a>
+<h4>Checker.pushClassScope</h4>
+<b>pushClassScope</b>(<i></i>)
+<a NAME="Checker.pushFunctionScope" ID="Checker.pushFunctionScope"></a>
+<h4>Checker.pushFunctionScope</h4>
+<b>pushFunctionScope</b>(<i></i>)
+<a NAME="Checker.report" ID="Checker.report"></a>
+<h4>Checker.report</h4>
+<b>report</b>(<i>messageClass, *args, **kwargs</i>)
+<a NAME="Checker.runFunction" ID="Checker.runFunction"></a>
+<h4>Checker.runFunction</h4>
+<b>runFunction</b>(<i></i>)
+<a NAME="Checker.scope" ID="Checker.scope"></a>
+<h4>Checker.scope</h4>
+<b>scope</b>(<i></i>)
+
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
+<a NAME="ClassScope" ID="ClassScope"></a>
+<h2>ClassScope</h2>
+<p>
+    Class representing a name scope for a class.
+</p>
+<h3>Derived from</h3>
+Scope
+<h3>Class Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
+<a NAME="ExportBinding" ID="ExportBinding"></a>
+<h2>ExportBinding</h2>
+<p>
+    A binding created by an __all__ assignment.  If the names in the list
+    can be determined statically, they will be treated as names for export and
+    additional checking applied to them.
+</p><p>
+    The only __all__ assignment that can be recognized is one which takes
+    the value of a literal list containing literal strings.  For example::
+</p><p>
+        __all__ = ["foo", "bar"]
+</p><p>
+    Names which are imported and not otherwise used but appear in the value of
+    __all__ will not have an unused import warning reported for them.
+</p>
+<h3>Derived from</h3>
+Binding
+<h3>Class Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#ExportBinding.names">names</a></td>
+<td>Return a list of the names referenced by this binding.</td>
+</tr>
+</table>
+<a NAME="ExportBinding.names" ID="ExportBinding.names"></a>
+<h4>ExportBinding.names</h4>
+<b>names</b>(<i></i>)
+<p>
+        Return a list of the names referenced by this binding.
+</p>
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
+<a NAME="FunctionDefinition" ID="FunctionDefinition"></a>
+<h2>FunctionDefinition</h2>
+<p>
+    Represents a function definition.
+</p>
+<h3>Derived from</h3>
+Binding
+<h3>Class Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
+<a NAME="FunctionScope" ID="FunctionScope"></a>
+<h2>FunctionScope</h2>
+<p>
+    Class representing a name scope for a function.
+</p>
+<h3>Derived from</h3>
+Scope
+<h3>Class Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#FunctionScope.__init__">FunctionScope</a></td>
+<td></td>
+</tr>
+</table>
+<a NAME="FunctionScope.__init__" ID="FunctionScope.__init__"></a>
+<h4>FunctionScope (Constructor)</h4>
+<b>FunctionScope</b>(<i></i>)
+
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
+<a NAME="Importation" ID="Importation"></a>
+<h2>Importation</h2>
+<p>
+    A binding created by an import statement.
+</p>
+<h3>Derived from</h3>
+Binding
+<h3>Class Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#Importation.__init__">Importation</a></td>
+<td></td>
+</tr>
+</table>
+<a NAME="Importation.__init__" ID="Importation.__init__"></a>
+<h4>Importation (Constructor)</h4>
+<b>Importation</b>(<i>name, source</i>)
+
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
+<a NAME="ModuleScope" ID="ModuleScope"></a>
+<h2>ModuleScope</h2>
+<p>
+    Class representing a name scope for a module.
+</p>
+<h3>Derived from</h3>
+Scope
+<h3>Class Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
+<a NAME="Scope" ID="Scope"></a>
+<h2>Scope</h2>
+<p>
+    Class defining the scope base class.
+</p>
+<h3>Derived from</h3>
+dict
+<h3>Class Attributes</h3>
+<table>
+<tr><td>importStarred</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#Scope.__init__">Scope</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Scope.__repr__">__repr__</a></td>
+<td></td>
+</tr>
+</table>
+<a NAME="Scope.__init__" ID="Scope.__init__"></a>
+<h4>Scope (Constructor)</h4>
+<b>Scope</b>(<i></i>)
+<a NAME="Scope.__repr__" ID="Scope.__repr__"></a>
+<h4>Scope.__repr__</h4>
+<b>__repr__</b>(<i></i>)
+
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
+<a NAME="UnBinding" ID="UnBinding"></a>
+<h2>UnBinding</h2>
+<p>
+    Created by the 'del' operator.
+</p>
+<h3>Derived from</h3>
+Binding
+<h3>Class Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+</body></html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Documentation/Source/eric5.Utilities.py3flakes.messages.html	Sat Jan 30 18:37:18 2010 +0000
@@ -0,0 +1,557 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN'
+'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
+<html><head>
+<title>eric5.Utilities.py3flakes.messages</title>
+<style>
+body {
+    background:white;
+    margin: 0em 1em 10em 1em;
+    color: black;
+}
+
+h1 { color: white; background: #4FA4FF; }
+h2 { color: white; background: #4FA4FF; }
+h3 { color: white; background: #00557F; }
+h4 { color: white; background: #00557F; }
+    
+a { color: #AA5500; }
+
+</style>
+</head>
+<body><a NAME="top" ID="top"></a>
+<h1>eric5.Utilities.py3flakes.messages</h1>
+
+<h3>Global Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Classes</h3>
+<table>
+<tr>
+<td><a href="#DuplicateArgument">DuplicateArgument</a></td>
+<td>Class defining the "Duplicate Argument" message.</td>
+</tr><tr>
+<td><a href="#ImportShadowedByLoopVar">ImportShadowedByLoopVar</a></td>
+<td>Class defining the "Import Shadowed By Loop Var" message.</td>
+</tr><tr>
+<td><a href="#ImportStarUsed">ImportStarUsed</a></td>
+<td>Class defining the "Import Star Used" message.</td>
+</tr><tr>
+<td><a href="#LateFutureImport">LateFutureImport</a></td>
+<td>Class defining the "Late Future Import" message.</td>
+</tr><tr>
+<td><a href="#Message">Message</a></td>
+<td>Class defining the base for all specific message classes.</td>
+</tr><tr>
+<td><a href="#RedefinedFunction">RedefinedFunction</a></td>
+<td>Class defining the "Redefined Function" message.</td>
+</tr><tr>
+<td><a href="#RedefinedWhileUnused">RedefinedWhileUnused</a></td>
+<td>Class defining the "Redefined While Unused" message.</td>
+</tr><tr>
+<td><a href="#UndefinedExport">UndefinedExport</a></td>
+<td>Class defining the "Undefined Export" message.</td>
+</tr><tr>
+<td><a href="#UndefinedLocal">UndefinedLocal</a></td>
+<td>Class defining the "Undefined Local Variable" message.</td>
+</tr><tr>
+<td><a href="#UndefinedName">UndefinedName</a></td>
+<td>Class defining the "Undefined Name" message.</td>
+</tr><tr>
+<td><a href="#UnusedImport">UnusedImport</a></td>
+<td>Class defining the "Unused Import" message.</td>
+</tr><tr>
+<td><a href="#UnusedVariable">UnusedVariable</a></td>
+<td>Class defining the "Unused Variable" message.</td>
+</tr>
+</table>
+<h3>Functions</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<hr /><hr />
+<a NAME="DuplicateArgument" ID="DuplicateArgument"></a>
+<h2>DuplicateArgument</h2>
+<p>
+    Class defining the "Duplicate Argument" message.
+</p>
+<h3>Derived from</h3>
+Message
+<h3>Class Attributes</h3>
+<table>
+<tr><td>message</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#DuplicateArgument.__init__">DuplicateArgument</a></td>
+<td>Constructor</td>
+</tr>
+</table>
+<a NAME="DuplicateArgument.__init__" ID="DuplicateArgument.__init__"></a>
+<h4>DuplicateArgument (Constructor)</h4>
+<b>DuplicateArgument</b>(<i>filename, lineno, name</i>)
+<p>
+        Constructor
+</p><dl>
+<dt><i>filename</i></dt>
+<dd>
+name of the file (string)
+</dd><dt><i>lineno</i></dt>
+<dd>
+line number (integer)
+</dd><dt><i>name</i></dt>
+<dd>
+name of the duplicate argument (string)
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
+<a NAME="ImportShadowedByLoopVar" ID="ImportShadowedByLoopVar"></a>
+<h2>ImportShadowedByLoopVar</h2>
+<p>
+    Class defining the "Import Shadowed By Loop Var" message.
+</p>
+<h3>Derived from</h3>
+Message
+<h3>Class Attributes</h3>
+<table>
+<tr><td>message</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#ImportShadowedByLoopVar.__init__">ImportShadowedByLoopVar</a></td>
+<td>Constructor</td>
+</tr>
+</table>
+<a NAME="ImportShadowedByLoopVar.__init__" ID="ImportShadowedByLoopVar.__init__"></a>
+<h4>ImportShadowedByLoopVar (Constructor)</h4>
+<b>ImportShadowedByLoopVar</b>(<i>filename, lineno, name, orig_lineno</i>)
+<p>
+        Constructor
+</p><dl>
+<dt><i>filename</i></dt>
+<dd>
+name of the file (string)
+</dd><dt><i>lineno</i></dt>
+<dd>
+line number (integer)
+</dd><dt><i>name</i></dt>
+<dd>
+name of the shadowed import (string)
+</dd><dt><i>orig_lineno</i></dt>
+<dd>
+line number of the import (integer)
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
+<a NAME="ImportStarUsed" ID="ImportStarUsed"></a>
+<h2>ImportStarUsed</h2>
+<p>
+    Class defining the "Import Star Used" message.
+</p>
+<h3>Derived from</h3>
+Message
+<h3>Class Attributes</h3>
+<table>
+<tr><td>message</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#ImportStarUsed.__init__">ImportStarUsed</a></td>
+<td>Constructor</td>
+</tr>
+</table>
+<a NAME="ImportStarUsed.__init__" ID="ImportStarUsed.__init__"></a>
+<h4>ImportStarUsed (Constructor)</h4>
+<b>ImportStarUsed</b>(<i>filename, lineno, modname</i>)
+<p>
+        Constructor
+</p><dl>
+<dt><i>filename</i></dt>
+<dd>
+name of the file (string)
+</dd><dt><i>lineno</i></dt>
+<dd>
+line number (integer)
+</dd><dt><i>modname</i></dt>
+<dd>
+name of the module imported using star import (string)
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
+<a NAME="LateFutureImport" ID="LateFutureImport"></a>
+<h2>LateFutureImport</h2>
+<p>
+    Class defining the "Late Future Import" message.
+</p>
+<h3>Derived from</h3>
+Message
+<h3>Class Attributes</h3>
+<table>
+<tr><td>message</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#LateFutureImport.__init__">LateFutureImport</a></td>
+<td>Constructor</td>
+</tr>
+</table>
+<a NAME="LateFutureImport.__init__" ID="LateFutureImport.__init__"></a>
+<h4>LateFutureImport (Constructor)</h4>
+<b>LateFutureImport</b>(<i>filename, lineno, names</i>)
+<p>
+        Constructor
+</p><dl>
+<dt><i>filename</i></dt>
+<dd>
+name of the file (string)
+</dd><dt><i>lineno</i></dt>
+<dd>
+line number (integer)
+</dd><dt><i>names</i></dt>
+<dd>
+names of the imported futures (string)
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
+<a NAME="Message" ID="Message"></a>
+<h2>Message</h2>
+<p>
+    Class defining the base for all specific message classes.
+</p>
+<h3>Derived from</h3>
+object
+<h3>Class Attributes</h3>
+<table>
+<tr><td>message</td></tr><tr><td>message_args</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#Message.__init__">Message</a></td>
+<td>Constructor</td>
+</tr><tr>
+<td><a href="#Message.__str__">__str__</a></td>
+<td>Special method return a string representation of the instance object.</td>
+</tr><tr>
+<td><a href="#Message.getMessageData">getMessageData</a></td>
+<td>Public method to get the individual message data elements.</td>
+</tr>
+</table>
+<a NAME="Message.__init__" ID="Message.__init__"></a>
+<h4>Message (Constructor)</h4>
+<b>Message</b>(<i>filename, lineno</i>)
+<p>
+        Constructor
+</p><dl>
+<dt><i>filename</i></dt>
+<dd>
+name of the file (string)
+</dd><dt><i>lineno</i></dt>
+<dd>
+line number (integer)
+</dd>
+</dl><a NAME="Message.__str__" ID="Message.__str__"></a>
+<h4>Message.__str__</h4>
+<b>__str__</b>(<i></i>)
+<p>
+        Special method return a string representation of the instance object.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+string representation of the object (string)
+</dd>
+</dl><a NAME="Message.getMessageData" ID="Message.getMessageData"></a>
+<h4>Message.getMessageData</h4>
+<b>getMessageData</b>(<i></i>)
+<p>
+        Public method to get the individual message data elements.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+tuple containing file name, line number and message
+            (string, integer, string)
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
+<a NAME="RedefinedFunction" ID="RedefinedFunction"></a>
+<h2>RedefinedFunction</h2>
+<p>
+    Class defining the "Redefined Function" message.
+</p>
+<h3>Derived from</h3>
+Message
+<h3>Class Attributes</h3>
+<table>
+<tr><td>message</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#RedefinedFunction.__init__">RedefinedFunction</a></td>
+<td>Constructor</td>
+</tr>
+</table>
+<a NAME="RedefinedFunction.__init__" ID="RedefinedFunction.__init__"></a>
+<h4>RedefinedFunction (Constructor)</h4>
+<b>RedefinedFunction</b>(<i>filename, lineno, name, orig_lineno</i>)
+<p>
+        Constructor
+</p><dl>
+<dt><i>filename</i></dt>
+<dd>
+name of the file (string)
+</dd><dt><i>lineno</i></dt>
+<dd>
+line number (integer)
+</dd><dt><i>name</i></dt>
+<dd>
+name of the redefined function (string)
+</dd><dt><i>orig_lineno</i></dt>
+<dd>
+line number of the original definition (integer)
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
+<a NAME="RedefinedWhileUnused" ID="RedefinedWhileUnused"></a>
+<h2>RedefinedWhileUnused</h2>
+<p>
+    Class defining the "Redefined While Unused" message.
+</p>
+<h3>Derived from</h3>
+Message
+<h3>Class Attributes</h3>
+<table>
+<tr><td>message</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#RedefinedWhileUnused.__init__">RedefinedWhileUnused</a></td>
+<td>Constructor</td>
+</tr>
+</table>
+<a NAME="RedefinedWhileUnused.__init__" ID="RedefinedWhileUnused.__init__"></a>
+<h4>RedefinedWhileUnused (Constructor)</h4>
+<b>RedefinedWhileUnused</b>(<i>filename, lineno, name, orig_lineno</i>)
+<p>
+        Constructor
+</p><dl>
+<dt><i>filename</i></dt>
+<dd>
+name of the file (string)
+</dd><dt><i>lineno</i></dt>
+<dd>
+line number (integer)
+</dd><dt><i>name</i></dt>
+<dd>
+name of the redefined object (string)
+</dd><dt><i>orig_lineno</i></dt>
+<dd>
+line number of the original definition (integer)
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
+<a NAME="UndefinedExport" ID="UndefinedExport"></a>
+<h2>UndefinedExport</h2>
+<p>
+    Class defining the "Undefined Export" message.
+</p>
+<h3>Derived from</h3>
+Message
+<h3>Class Attributes</h3>
+<table>
+<tr><td>message</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#UndefinedExport.__init__">UndefinedExport</a></td>
+<td>Constructor</td>
+</tr>
+</table>
+<a NAME="UndefinedExport.__init__" ID="UndefinedExport.__init__"></a>
+<h4>UndefinedExport (Constructor)</h4>
+<b>UndefinedExport</b>(<i>filename, lineno, name</i>)
+<p>
+        Constructor
+</p><dl>
+<dt><i>filename</i></dt>
+<dd>
+name of the file (string)
+</dd><dt><i>lineno</i></dt>
+<dd>
+line number (integer)
+</dd><dt><i>name</i></dt>
+<dd>
+undefined exported name (string)
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
+<a NAME="UndefinedLocal" ID="UndefinedLocal"></a>
+<h2>UndefinedLocal</h2>
+<p>
+    Class defining the "Undefined Local Variable" message.
+</p>
+<h3>Derived from</h3>
+Message
+<h3>Class Attributes</h3>
+<table>
+<tr><td>message</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#UndefinedLocal.__init__">UndefinedLocal</a></td>
+<td>Constructor</td>
+</tr>
+</table>
+<a NAME="UndefinedLocal.__init__" ID="UndefinedLocal.__init__"></a>
+<h4>UndefinedLocal (Constructor)</h4>
+<b>UndefinedLocal</b>(<i>filename, lineno, name, orig_lineno</i>)
+<p>
+        Constructor
+</p><dl>
+<dt><i>filename</i></dt>
+<dd>
+name of the file (string)
+</dd><dt><i>lineno</i></dt>
+<dd>
+line number (integer)
+</dd><dt><i>name</i></dt>
+<dd>
+name of the prematurely referenced variable (string)
+</dd><dt><i>orig_lineno</i></dt>
+<dd>
+line number of the variable definition (integer)
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
+<a NAME="UndefinedName" ID="UndefinedName"></a>
+<h2>UndefinedName</h2>
+<p>
+    Class defining the "Undefined Name" message.
+</p>
+<h3>Derived from</h3>
+Message
+<h3>Class Attributes</h3>
+<table>
+<tr><td>message</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#UndefinedName.__init__">UndefinedName</a></td>
+<td>Constructor</td>
+</tr>
+</table>
+<a NAME="UndefinedName.__init__" ID="UndefinedName.__init__"></a>
+<h4>UndefinedName (Constructor)</h4>
+<b>UndefinedName</b>(<i>filename, lineno, name</i>)
+<p>
+        Constructor
+</p><dl>
+<dt><i>filename</i></dt>
+<dd>
+name of the file (string)
+</dd><dt><i>lineno</i></dt>
+<dd>
+line number (integer)
+</dd><dt><i>name</i></dt>
+<dd>
+undefined name (string)
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
+<a NAME="UnusedImport" ID="UnusedImport"></a>
+<h2>UnusedImport</h2>
+<p>
+    Class defining the "Unused Import" message.
+</p>
+<h3>Derived from</h3>
+Message
+<h3>Class Attributes</h3>
+<table>
+<tr><td>message</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#UnusedImport.__init__">UnusedImport</a></td>
+<td>Constructor</td>
+</tr>
+</table>
+<a NAME="UnusedImport.__init__" ID="UnusedImport.__init__"></a>
+<h4>UnusedImport (Constructor)</h4>
+<b>UnusedImport</b>(<i>filename, lineno, name</i>)
+<p>
+        Constructor
+</p><dl>
+<dt><i>filename</i></dt>
+<dd>
+name of the file (string)
+</dd><dt><i>lineno</i></dt>
+<dd>
+line number (integer)
+</dd><dt><i>name</i></dt>
+<dd>
+name of the unused import (string)
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
+<a NAME="UnusedVariable" ID="UnusedVariable"></a>
+<h2>UnusedVariable</h2>
+<p>
+    Class defining the "Unused Variable" message.
+</p><p>
+    Indicates that a variable has been explicitly assigned to but not actually
+    used.
+</p>
+<h3>Derived from</h3>
+Message
+<h3>Class Attributes</h3>
+<table>
+<tr><td>message</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#UnusedVariable.__init__">UnusedVariable</a></td>
+<td>Constructor</td>
+</tr>
+</table>
+<a NAME="UnusedVariable.__init__" ID="UnusedVariable.__init__"></a>
+<h4>UnusedVariable (Constructor)</h4>
+<b>UnusedVariable</b>(<i>filename, lineno, name</i>)
+<p>
+        Constructor
+</p><dl>
+<dt><i>filename</i></dt>
+<dd>
+name of the file (string)
+</dd><dt><i>lineno</i></dt>
+<dd>
+line number (integer)
+</dd><dt><i>name</i></dt>
+<dd>
+name of the unused variable (string)
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+</body></html>
\ No newline at end of file
--- a/Documentation/Source/eric5.ViewManager.ViewManager.html	Sat Jan 30 16:07:16 2010 +0000
+++ b/Documentation/Source/eric5.ViewManager.ViewManager.html	Sat Jan 30 18:37:18 2010 +0000
@@ -188,6 +188,9 @@
 <td><a href="#ViewManager.__clearAllSyntaxErrors">__clearAllSyntaxErrors</a></td>
 <td>Private method to handle the clear all syntax errors action.</td>
 </tr><tr>
+<td><a href="#ViewManager.__clearAllWarnings">__clearAllWarnings</a></td>
+<td>Private method to handle the clear all warnings action.</td>
+</tr><tr>
 <td><a href="#ViewManager.__clearBookmarked">__clearBookmarked</a></td>
 <td>Private method to clear the bookmarked files menu.</td>
 </tr><tr>
@@ -368,6 +371,9 @@
 <td><a href="#ViewManager.__nextUncovered">__nextUncovered</a></td>
 <td>Private method to handle the next uncovered action.</td>
 </tr><tr>
+<td><a href="#ViewManager.__nextWarning">__nextWarning</a></td>
+<td>Private method to handle the next warning action.</td>
+</tr><tr>
 <td><a href="#ViewManager.__openSourceFile">__openSourceFile</a></td>
 <td>Private method to open a file from the list of rencently opened files.</td>
 </tr><tr>
@@ -380,6 +386,9 @@
 <td><a href="#ViewManager.__previousUncovered">__previousUncovered</a></td>
 <td>Private method to handle the previous uncovered action.</td>
 </tr><tr>
+<td><a href="#ViewManager.__previousWarning">__previousWarning</a></td>
+<td>Private method to handle the previous warning action.</td>
+</tr><tr>
 <td><a href="#ViewManager.__quickSearch">__quickSearch</a></td>
 <td>Private slot to handle the incremental quick search.</td>
 </tr><tr>
@@ -822,6 +831,11 @@
 <b>__clearAllSyntaxErrors</b>(<i></i>)
 <p>
         Private method to handle the clear all syntax errors action.
+</p><a NAME="ViewManager.__clearAllWarnings" ID="ViewManager.__clearAllWarnings"></a>
+<h4>ViewManager.__clearAllWarnings</h4>
+<b>__clearAllWarnings</b>(<i></i>)
+<p>
+        Private method to handle the clear all warnings action.
 </p><a NAME="ViewManager.__clearBookmarked" ID="ViewManager.__clearBookmarked"></a>
 <h4>ViewManager.__clearBookmarked</h4>
 <b>__clearBookmarked</b>(<i></i>)
@@ -1163,6 +1177,11 @@
 <b>__nextUncovered</b>(<i></i>)
 <p>
         Private method to handle the next uncovered action.
+</p><a NAME="ViewManager.__nextWarning" ID="ViewManager.__nextWarning"></a>
+<h4>ViewManager.__nextWarning</h4>
+<b>__nextWarning</b>(<i></i>)
+<p>
+        Private method to handle the next warning action.
 </p><a NAME="ViewManager.__openSourceFile" ID="ViewManager.__openSourceFile"></a>
 <h4>ViewManager.__openSourceFile</h4>
 <b>__openSourceFile</b>(<i>act</i>)
@@ -1188,6 +1207,11 @@
 <b>__previousUncovered</b>(<i></i>)
 <p>
         Private method to handle the previous uncovered action.
+</p><a NAME="ViewManager.__previousWarning" ID="ViewManager.__previousWarning"></a>
+<h4>ViewManager.__previousWarning</h4>
+<b>__previousWarning</b>(<i></i>)
+<p>
+        Private method to handle the previous warning action.
 </p><a NAME="ViewManager.__quickSearch" ID="ViewManager.__quickSearch"></a>
 <h4>ViewManager.__quickSearch</h4>
 <b>__quickSearch</b>(<i></i>)
--- a/Documentation/Source/index-eric5.Preferences.ConfigurationPages.html	Sat Jan 30 16:07:16 2010 +0000
+++ b/Documentation/Source/index-eric5.Preferences.ConfigurationPages.html	Sat Jan 30 18:37:18 2010 +0000
@@ -140,6 +140,9 @@
 <td><a href="eric5.Preferences.ConfigurationPages.ProjectPage.html">ProjectPage</a></td>
 <td>Module implementing the Project configuration page.</td>
 </tr><tr>
+<td><a href="eric5.Preferences.ConfigurationPages.Py3FlakesPage.html">Py3FlakesPage</a></td>
+<td>Module implementing the Py3Flakes configuration page.</td>
+</tr><tr>
 <td><a href="eric5.Preferences.ConfigurationPages.PythonPage.html">PythonPage</a></td>
 <td>Module implementing the Python configuration page.</td>
 </tr><tr>
--- a/Documentation/Source/index-eric5.Utilities.html	Sat Jan 30 16:07:16 2010 +0000
+++ b/Documentation/Source/index-eric5.Utilities.html	Sat Jan 30 18:37:18 2010 +0000
@@ -30,6 +30,9 @@
 <tr>
 <td><a href="index-eric5.Utilities.ClassBrowsers.html">ClassBrowsers</a></td>
 <td>Package implementing class browsers for various languages.</td>
+</tr><tr>
+<td><a href="index-eric5.Utilities.py3flakes.html">py3flakes</a></td>
+<td>Package containg the pyflakes Python3 port adapted for Qt.</td>
 </tr>
 </table>
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Documentation/Source/index-eric5.Utilities.py3flakes.html	Sat Jan 30 18:37:18 2010 +0000
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN'
+'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
+<html><head>
+<title>eric5.Utilities.py3flakes</title>
+<style>
+body {
+    background:white;
+    margin: 0em 1em 10em 1em;
+    color: black;
+}
+
+h1 { color: white; background: #4FA4FF; }
+h2 { color: white; background: #4FA4FF; }
+h3 { color: white; background: #00557F; }
+h4 { color: white; background: #00557F; }
+    
+a { color: #AA5500; }
+
+</style>
+</head>
+<body>
+<h1>eric5.Utilities.py3flakes</h1>
+<p>
+Package containg the pyflakes Python3 port adapted for Qt.
+</p>
+
+
+<h3>Modules</h3>
+<table>
+<tr>
+<td><a href="eric5.Utilities.py3flakes.checker.html">checker</a></td>
+<td></td>
+</tr><tr>
+<td><a href="eric5.Utilities.py3flakes.messages.html">messages</a></td>
+<td></td>
+</tr>
+</table>
+</body></html>
\ No newline at end of file
--- a/Plugins/CheckerPlugins/SyntaxChecker/SyntaxCheckerDialog.py	Sat Jan 30 16:07:16 2010 +0000
+++ b/Plugins/CheckerPlugins/SyntaxChecker/SyntaxCheckerDialog.py	Sat Jan 30 18:37:18 2010 +0000
@@ -19,12 +19,18 @@
 from .Ui_SyntaxCheckerDialog import Ui_SyntaxCheckerDialog
 
 import Utilities
+from Utilities.py3flakes.checker import Checker
+from Utilities.py3flakes.messages import ImportStarUsed
 import Preferences
+import UI.PixmapCache
 
 class SyntaxCheckerDialog(QDialog, Ui_SyntaxCheckerDialog):
     """
     Class implementing a dialog to display the results of a syntax check run.
     """
+    filenameRole = Qt.UserRole + 1
+    warningRole = Qt.UserRole + 2
+    
     def __init__(self, parent = None):
         """
         Constructor
@@ -54,7 +60,7 @@
         self.resultList.sortItems(self.resultList.sortColumn(), 
                                   self.resultList.header().sortIndicatorOrder())
         
-    def __createResultItem(self, file, line, error, sourcecode):
+    def __createResultItem(self, file, line, error, sourcecode, isWarning = False):
         """
         Private method to create an entry in the result list.
         
@@ -62,9 +68,17 @@
         @param line linenumber of faulty source (integer or string)
         @param error error text (string)
         @param sourcecode faulty line of code (string)
+        @param isWarning flag indicating a warning message (boolean)
         """
-        itm = QTreeWidgetItem(self.resultList, [file, str(line), error, sourcecode])
+        itm = QTreeWidgetItem(self.resultList, 
+                              [os.path.basename(file), str(line), error, sourcecode])
         itm.setTextAlignment(1, Qt.AlignRight)
+        if isWarning:
+            itm.setIcon(0, UI.PixmapCache.getIcon("warning.png"))
+        else:
+            itm.setIcon(0, UI.PixmapCache.getIcon("syntaxError.png"))
+        itm.setData(0, self.filenameRole, file)
+        itm.setData(0, self.warningRole, isWarning)
         
     def start(self, fn, codestring = ""):
         """
@@ -91,16 +105,39 @@
             self.checkProgress.setMaximum(len(files))
             QApplication.processEvents()
             
+            ignoreStarImportWarnings = Preferences.getFlakes("IgnoreStarImportWarnings")
             # now go through all the files
             progress = 0
             for file in files:
                 if self.cancelled:
                     return
                 
-                nok, fname, line, code, error = Utilities.compile(file, codestring)
+                if codestring:
+                    source = codestring
+                else:
+                    try:
+                        source = Utilities.readEncodedFile(file)[0]
+                        # convert eols
+                        source = Utilities.convertLineEnds(source, os.linesep)
+                    except (UnicodeDecodeError, IOError):
+                        continue    # just ignore it
+                
+                nok, fname, line, code, error = Utilities.compile(file, source)
                 if nok:
                     self.noResults = False
                     self.__createResultItem(fname, line, error, code)
+                else:
+                    if Preferences.getFlakes("IncludeInSyntaxCheck"):
+                        warnings = Checker(source, file)
+                        warnings.messages.sort(key = lambda a: a.lineno)
+                        for warning in warnings.messages:
+                            if ignoreStarImportWarnings and \
+                               isinstance(warning, ImportStarUsed):
+                                continue
+                            self.noResults = False
+                            fname, lineno, message = warning.getMessageData()
+                            self.__createResultItem(fname, lineno, message, "", 
+                                                    isWarning = True)
                 progress += 1
                 self.checkProgress.setValue(progress)
                 QApplication.processEvents()
@@ -152,14 +189,17 @@
         if self.noResults:
             return
             
-        fn = Utilities.normabspath(itm.text(0))
+        fn = Utilities.normabspath(itm.data(0, self.filenameRole))
         lineno = int(itm.text(1))
         error = itm.text(2)
         
         vm = e5App().getObject("ViewManager")
         vm.openSourceFile(fn, lineno)
         editor = vm.getOpenEditor(fn)
-        editor.toggleSyntaxError(lineno, True, error)
+        if itm.data(0, self.warningRole):
+            editor.toggleFlakesWarning(lineno, True, error)
+        else:
+            editor.toggleSyntaxError(lineno, True, error)
         
     @pyqtSlot()
     def on_showButton_clicked(self):
@@ -191,4 +231,4 @@
         openFiles = vm.getOpenFilenames()
         for file in openFiles:
             editor = vm.getOpenEditor(file)
-            editor.clearSyntaxError()
\ No newline at end of file
+            editor.clearSyntaxError()
--- a/Plugins/ViewManagerPlugins/Listspace/Listspace.py	Sat Jan 30 16:07:16 2010 +0000
+++ b/Plugins/ViewManagerPlugins/Listspace/Listspace.py	Sat Jan 30 18:37:18 2010 +0000
@@ -419,6 +419,8 @@
             self.viewlist.item(index).setIcon(UI.PixmapCache.getIcon("fileModified.png"))
         elif editor.hasSyntaxErrors():
             self.viewlist.item(index).setIcon(UI.PixmapCache.getIcon("syntaxError.png"))
+        elif editor.hasFlakesWarnings():
+            self.viewlist.item(index).setIcon(UI.PixmapCache.getIcon("warning.png"))
         else:
             self.viewlist.item(index).setIcon(UI.PixmapCache.getIcon("empty.png"))
         self.viewlist.setCurrentRow(currentRow)
@@ -434,6 +436,8 @@
         index = self.editors.index(editor)
         if editor.hasSyntaxErrors():
             self.viewlist.item(index).setIcon(UI.PixmapCache.getIcon("syntaxError.png"))
+        elif editor.hasFlakesWarnings():
+            self.viewlist.item(index).setIcon(UI.PixmapCache.getIcon("warning.png"))
         else:
             self.viewlist.item(index).setIcon(UI.PixmapCache.getIcon("empty.png"))
         self.viewlist.setCurrentRow(currentRow)
@@ -648,4 +652,4 @@
                 else:
                     self.emit(SIGNAL('changeCaption'), "")
         
-        return False
\ No newline at end of file
+        return False
--- a/Plugins/ViewManagerPlugins/MdiArea/MdiArea.py	Sat Jan 30 16:07:16 2010 +0000
+++ b/Plugins/ViewManagerPlugins/MdiArea/MdiArea.py	Sat Jan 30 18:37:18 2010 +0000
@@ -126,6 +126,8 @@
         win.show()
         if win.hasSyntaxErrors():
             self.__setSubWindowIcon(win, UI.PixmapCache.getIcon("syntaxError.png"))
+        elif win.hasFlakesWarnings():
+            self.__setSubWindowIcon(win, UI.PixmapCache.getIcon("warning.png"))
         else:
             self.__setSubWindowIcon(win, UI.PixmapCache.getIcon("empty.png"))
         
@@ -301,6 +303,8 @@
             self.__setSubWindowIcon(editor, UI.PixmapCache.getIcon("fileModified.png"))
         elif editor.hasSyntaxErrors():
             self.__setSubWindowIcon(editor, UI.PixmapCache.getIcon("syntaxError.png"))
+        elif editor.hasFlakesWarnings():
+            self.__setSubWindowIcon(editor, UI.PixmapCache.getIcon("warning.png"))
         else:
             self.__setSubWindowIcon(editor, UI.PixmapCache.getIcon("empty.png"))
         self._checkActions(editor)
@@ -313,6 +317,8 @@
         """
         if editor.hasSyntaxErrors():
             self.__setSubWindowIcon(editor, UI.PixmapCache.getIcon("syntaxError.png"))
+        elif editor.hasFlakesWarnings():
+            self.__setSubWindowIcon(editor, UI.PixmapCache.getIcon("warning.png"))
         else:
             self.__setSubWindowIcon(editor, UI.PixmapCache.getIcon("empty.png"))
         
@@ -359,4 +365,4 @@
         Private slot to iconize all windows.
         """
         for win in self.subWindowList():
-            win.showMinimized()
\ No newline at end of file
+            win.showMinimized()
--- a/Plugins/ViewManagerPlugins/Tabview/Tabview.py	Sat Jan 30 16:07:16 2010 +0000
+++ b/Plugins/ViewManagerPlugins/Tabview/Tabview.py	Sat Jan 30 18:37:18 2010 +0000
@@ -871,6 +871,8 @@
             tw.setTabIcon(index, UI.PixmapCache.getIcon("fileModified.png"))
         elif editor.hasSyntaxErrors():
             tw.setTabIcon(index, UI.PixmapCache.getIcon("syntaxError.png"))
+        elif editor.hasFlakesWarnings():
+            tw.setTabIcon(index, UI.PixmapCache.getIcon("warning.png"))
         else:
             tw.setTabIcon(index, UI.PixmapCache.getIcon("empty.png"))
         self._checkActions(editor)
@@ -887,6 +889,8 @@
         index = tw.indexOf(editor)
         if editor.hasSyntaxErrors():
             tw.setTabIcon(index, UI.PixmapCache.getIcon("syntaxError.png"))
+        elif editor.hasFlakesWarnings():
+            tw.setTabIcon(index, UI.PixmapCache.getIcon("warning.png"))
         else:
             tw.setTabIcon(index, UI.PixmapCache.getIcon("empty.png"))
         
@@ -1095,4 +1099,4 @@
         for tw in self.tabWidgets:
             if id(tw) == id_:
                 return tw
-        return None
\ No newline at end of file
+        return None
--- a/Preferences/ConfigurationDialog.py	Sat Jan 30 16:07:16 2010 +0000
+++ b/Preferences/ConfigurationDialog.py	Sat Jan 30 18:37:18 2010 +0000
@@ -114,6 +114,9 @@
                 "printerPage" : \
                     [self.trUtf8("Printer"), "preferences-printer.png",
                     "PrinterPage", None, None],
+                "py3flakesPage" : \
+                    [self.trUtf8("Py3Flakes"), "warning.png",
+                    "Py3FlakesPage", None, None],
                 "pythonPage" : \
                     [self.trUtf8("Python"), "preferences-python.png",
                     "PythonPage", None, None],
@@ -663,4 +666,4 @@
         self.cw.setPreferences()
         Preferences.saveResetLayout()
         Preferences.syncPreferences()
-        self.close()
\ No newline at end of file
+        self.close()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Preferences/ConfigurationPages/Py3FlakesPage.py	Sat Jan 30 18:37:18 2010 +0000
@@ -0,0 +1,49 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2010 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing the Py3Flakes configuration page.
+"""
+
+from .ConfigurationPageBase import ConfigurationPageBase
+from .Ui_Py3FlakesPage import Ui_Py3FlakesPage
+
+import Preferences
+
+class Py3FlakesPage(ConfigurationPageBase, Ui_Py3FlakesPage):
+    """
+    Class implementing the Python configuration page.
+    """
+    def __init__(self):
+        """
+        Constructor
+        """
+        ConfigurationPageBase.__init__(self)
+        self.setupUi(self)
+        self.setObjectName("Py3FlakesPage")
+        
+        # set initial values
+        self.includeCheckBox.setChecked(
+            Preferences.getFlakes("IncludeInSyntaxCheck"))
+        self.ignoreStarImportCheckBox.setChecked(
+            Preferences.getFlakes("IgnoreStarImportWarnings"))
+    
+    def save(self):
+        """
+        Public slot to save the Python configuration.
+        """
+        Preferences.setFlakes("IncludeInSyntaxCheck", 
+            self.includeCheckBox.isChecked())
+        Preferences.setFlakes("IgnoreStarImportWarnings", 
+            self.ignoreStarImportCheckBox.isChecked())
+    
+def create(dlg):
+    """
+    Module function to create the configuration page.
+    
+    @param dlg reference to the configuration dialog
+    """
+    page = Py3FlakesPage()
+    return page
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Preferences/ConfigurationPages/Py3FlakesPage.ui	Sat Jan 30 18:37:18 2010 +0000
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Py3FlakesPage</class>
+ <widget class="QWidget" name="Py3FlakesPage">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>482</width>
+    <height>473</height>
+   </rect>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <widget class="QLabel" name="headerLabel">
+     <property name="text">
+      <string>&lt;b&gt;Configure Py3Flakes Behavior&lt;/b&gt;</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="Line" name="line1">
+     <property name="frameShape">
+      <enum>QFrame::HLine</enum>
+     </property>
+     <property name="frameShadow">
+      <enum>QFrame::Sunken</enum>
+     </property>
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QCheckBox" name="includeCheckBox">
+     <property name="toolTip">
+      <string>Select to include a py3flakes check after the syntax check</string>
+     </property>
+     <property name="text">
+      <string>Include Py3Flakes Checks</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QCheckBox" name="ignoreStarImportCheckBox">
+     <property name="toolTip">
+      <string>Select to suppress star import warnings</string>
+     </property>
+     <property name="text">
+      <string>Suppress star import warnings</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <spacer>
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>464</width>
+       <height>41</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
--- a/Preferences/__init__.py	Sat Jan 30 16:07:16 2010 +0000
+++ b/Preferences/__init__.py	Sat Jan 30 18:37:18 2010 +0000
@@ -683,6 +683,12 @@
         "IconEditorState" : QtCore.QByteArray(), 
     }
     
+    # defaults for py3flakes
+    py3flakesDefaults = {
+        "IncludeInSyntaxCheck" : True, 
+        "IgnoreStarImportWarnings" : True, 
+    }
+    
     # defaults for geometry
     geometryDefaults = {
         "HelpViewerGeometry" : QtCore.QByteArray(),
@@ -1960,6 +1966,31 @@
     @param prefClass preferences class used as the storage area
     """
     prefClass.settings.setValue("IconEditor/" + key, value)
+
+def getFlakes(key, prefClass = Prefs):
+    """
+    Module function to retrieve the py3flakes related settings.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested user setting
+    """
+    if key in ["IncludeInSyntaxCheck", "IgnoreStarImportWarnings"]:
+        return toBool(prefClass.settings.value("Py3Flakes/" + key, 
+            prefClass.py3flakesDefaults[key]))
+    else:
+        return prefClass.settings.value("Py3Flakes/" + key,
+            prefClass.py3flakesDefaults[key])
+    
+def setFlakes(key, value, prefClass = Prefs):
+    """
+    Module function to store the py3flakes related settings.
+    
+    @param key the key of the setting to be set
+    @param value the value to be set
+    @param prefClass preferences class used as the storage area
+    """
+    prefClass.settings.setValue("Py3Flakes/" + key, value)
     
 def getGeometry(key, prefClass = Prefs):
     """
--- a/QScintilla/Editor.py	Sat Jan 30 16:07:16 2010 +0000
+++ b/QScintilla/Editor.py	Sat Jan 30 18:37:18 2010 +0000
@@ -1,5274 +1,5454 @@
-# -*- coding: utf-8 -*-
-
-# Copyright (c) 2002 - 2010 Detlev Offenbach <detlev@die-offenbachs.de>
-#
-
-"""
-Module implementing the editor component of the eric5 IDE.
-"""
-
-import os
-import re
-import types
-    
-from PyQt4.Qsci import QsciScintilla, QsciMacro
-from PyQt4.QtCore import *
-from PyQt4.QtGui import *
-
-from E5Gui.E5Application import e5App
-
-from . import Exporters
-from . import Lexers
-from . import TypingCompleters
-from .QsciScintillaCompat import QsciScintillaCompat, QSCINTILLA_VERSION
-from .SpellChecker import SpellChecker
-from .SpellCheckingDialog import SpellCheckingDialog
-
-from Debugger.EditBreakpointDialog import EditBreakpointDialog
-
-from DebugClients.Python3.coverage import coverage
-
-from DataViews.CodeMetricsDialog import CodeMetricsDialog
-from DataViews.PyCoverageDialog import PyCoverageDialog
-from DataViews.PyProfileDialog import PyProfileDialog
-
-from .Printer import Printer
-
-import Preferences
-import Utilities
-
-import UI.PixmapCache
-
-EditorAutoCompletionListID = 1
-TemplateCompletionListID = 2
-
-class Editor(QsciScintillaCompat):
-    """
-    Class implementing the editor component of the eric5 IDE.
-    
-    @signal modificationStatusChanged(boolean, editor) emitted when the
-            modification status has changed
-    @signal undoAvailable(boolean) emitted to signal the undo availability
-    @signal redoAvailable(boolean) emitted to signal the redo availability
-    @signal cursorChanged(string, int, int) emitted when the cursor position
-            was changed
-    @signal editorAboutToBeSaved(string) emitted before the editor is saved
-    @signal editorSaved(string) emitted after the editor has been saved
-    @signal editorRenamed(string) emitted after the editor got a new name
-            (i.e. after a 'Save As')
-    @signal captionChanged(string, editor) emitted when the caption is
-            updated. Typically due to a readOnly attribute change.
-    @signal breakpointToggled(editor) emitted when a breakpoint is toggled
-    @signal bookmarkToggled(editor) emitted when a bookmark is toggled
-    @signal syntaxerrorToggled(editor) emitted when a syntax error was discovered
-    @signal autoCompletionAPIsAvailable(avail) emitted after the autocompletion
-            function has been configured
-    @signal coverageMarkersShown(boolean) emitted after the coverage markers have been 
-            shown or cleared
-    @signal taskMarkersUpdated(editor) emitted when the task markers were updated
-    @signal showMenu(string, QMenu, editor) emitted when a menu is about to be shown.
-            The name of the menu, a reference to the menu and a reference to the
-            editor are given.
-    @signal languageChanged(language) emitted when the editors language was set. The
-            language is passed as a parameter.
-    @signal eolChanged(eol) emitted when the editors eol type was set. The eol string
-            is passed as a parameter.
-    @signal encodingChanged(encoding) emitted when the editors encoding was set. The 
-            encoding name is passed as a parameter.
-    """
-    ClassID              = 1
-    ClassProtectedID     = 2
-    ClassPrivateID       = 3
-    MethodID             = 4
-    MethodProtectedID    = 5
-    MethodPrivateID      = 6
-    AttributeID          = 7
-    AttributeProtectedID = 8
-    AttributePrivateID   = 9
-    EnumID               = 10
-    
-    FromDocumentID       = 99
-    
-    TemplateImageID      = 100
-    
-    def __init__(self, dbs, fn = None, vm = None,
-                 filetype = "", editor = None, tv = None):
-        """
-        Constructor
-        
-        @param dbs reference to the debug server object
-        @param fn name of the file to be opened (string). If it is None,
-                a new (empty) editor is opened
-        @param vm reference to the view manager object (ViewManager.ViewManager)
-        @param filetype type of the source file (string)
-        @param editor reference to an Editor object, if this is a cloned view
-        @param tv reference to the task viewer object
-        """
-        QsciScintillaCompat.__init__(self)
-        self.setAttribute(Qt.WA_DeleteOnClose)
-        self.setAttribute(Qt.WA_KeyCompression)
-        self.setUtf8(True)
-        
-        self.pyExtensions = dbs.getExtensions('Python')
-        self.py3Extensions = dbs.getExtensions('Python3')
-        self.rbExtensions = dbs.getExtensions('Ruby')
-        
-        self.dbs = dbs
-        self.taskViewer = tv
-        self.fileName = fn
-        self.vm = vm
-        self.filetype = filetype
-        self.noName = ""
-        
-        # clear some variables
-        self.lastHighlight   = None   # remember the last highlighted line
-        self.lastErrorMarker = None   # remember the last error line
-        self.lastCurrMarker  = None   # remember the last current line
-        
-        self.breaks = {}            # key:   marker handle, 
-                                    # value: (lineno, condition, temporary, 
-                                    #         enabled, ignorecount)
-        self.bookmarks = []         # bookmarks are just a list of handles to the
-                                    # bookmark markers
-        self.syntaxerrors = {}      # key:   marker handle
-                                    # value: error message
-        self.notcoveredMarkers = [] # just a list of marker handles
-        
-        self.condHistory = []
-        self.lexer_ = None
-        self.__lexerReset = False
-        self.completer = None
-        self.encoding = Preferences.getEditor("DefaultEncoding")
-        self.apiLanguage = ''
-        self.lastModified = 0
-        self.line = -1
-        self.inReopenPrompt = False
-            # true if the prompt to reload a changed source is present
-        self.inFileRenamed = False      # true if we are propagating a rename action
-        self.inLanguageChanged = False  # true if we are propagating a language change
-        self.inEolChanged = False       # true if we are propagating an eol change
-        self.inEncodingChanged = False  # true if we are propagating an encoding change
-        self.inDragDrop = False         # true if we are in drop mode
-        self.__hasTaskMarkers = False   # no task markers present
-            
-        self.macros = {}    # list of defined macros
-        self.curMacro = None
-        self.recording = False
-        
-        self.acAPI = False
-        
-        # list of clones
-        self.__clones = []
-        
-        # clear QScintilla defined keyboard commands
-        # we do our own handling through the view manager
-        self.clearAlternateKeys()
-        self.clearKeys()
-        
-        # initialise the mark occurrences timer
-        self.__markOccurrencesTimer = QTimer(self)
-        self.__markOccurrencesTimer.setSingleShot(True)
-        self.__markOccurrencesTimer.setInterval(
-            Preferences.getEditor("MarkOccurrencesTimeout"))
-        self.connect(self.__markOccurrencesTimer, SIGNAL("timeout()"), 
-                     self.__markOccurrences)
-        self.__markedText = ""
-        
-        # initialise some spellchecking stuff
-        self.spell = None
-        self.lastLine = 0
-        self.lastIndex = 0
-        
-        self.connect(self, SIGNAL('modificationChanged(bool)'), 
-                     self.__modificationChanged)
-        self.connect(self, SIGNAL('cursorPositionChanged(int,int)'),
-                     self.__cursorPositionChanged)
-        self.connect(self, SIGNAL('modificationAttempted()'),
-                     self.__modificationReadOnly)
-        self.connect(self, SIGNAL('userListActivated(int, const QString)'),
-                     self.__completionListSelected)
-        
-        # margins layout
-        if QSCINTILLA_VERSION() >= 0x020301:
-            self.__unifiedMargins = Preferences.getEditor("UnifiedMargins")
-        else:
-            self.__unifiedMargins = True
-        
-        # define the margins markers
-        self.breakpoint = \
-            self.markerDefine(UI.PixmapCache.getPixmap("break.png"))
-        self.cbreakpoint = \
-            self.markerDefine(UI.PixmapCache.getPixmap("cBreak.png"))
-        self.tbreakpoint = \
-            self.markerDefine(UI.PixmapCache.getPixmap("tBreak.png"))
-        self.tcbreakpoint = \
-            self.markerDefine(UI.PixmapCache.getPixmap("tCBreak.png"))
-        self.dbreakpoint = \
-            self.markerDefine(UI.PixmapCache.getPixmap("breakDisabled.png"))
-        self.bookmark = \
-            self.markerDefine(UI.PixmapCache.getPixmap("bookmark.png"))
-        self.syntaxerror = \
-            self.markerDefine(UI.PixmapCache.getPixmap("syntaxError.png"))
-        self.notcovered = \
-            self.markerDefine(UI.PixmapCache.getPixmap("notcovered.png"))
-        self.taskmarker = \
-            self.markerDefine(UI.PixmapCache.getPixmap("task.png"))
-        self.warning = \
-            self.markerDefine(UI.PixmapCache.getPixmap("warning.png"))
-        
-        # define the line markers
-        self.currentline = self.markerDefine(QsciScintilla.Background)
-        self.errorline = self.markerDefine(QsciScintilla.Background)
-        self.__setLineMarkerColours()
-        
-        self.breakpointMask = (1 << self.breakpoint)   | \
-                              (1 << self.cbreakpoint)  | \
-                              (1 << self.tbreakpoint)  | \
-                              (1 << self.tcbreakpoint) | \
-                              (1 << self.dbreakpoint)
-        
-        # configure the margins
-        self.__setMarginsDisplay()
-        
-        self.connect(self, SIGNAL('marginClicked(int, int, Qt::KeyboardModifiers)'),
-                    self.__marginClicked)
-        
-        # set the eol mode
-        self.__setEolMode()
-        
-        self.isResourcesFile = False
-        if editor is None:
-            if self.fileName is not None:
-                if (QFileInfo(self.fileName).size() // 1024) > \
-                   Preferences.getEditor("WarnFilesize"):
-                    res = QMessageBox.warning(None,
-                        self.trUtf8("Open File"),
-                        self.trUtf8("""<p>The size of the file <b>{0}</b>"""
-                                    """ is <b>{1} KB</b>."""
-                                    """ Do you really want to load it?</p>""")\
-                                    .format(self.fileName, 
-                                            QFileInfo(self.fileName).size() // 1024),
-                        QMessageBox.StandardButtons(\
-                            QMessageBox.No | \
-                            QMessageBox.Yes),
-                        QMessageBox.No)
-                    if res == QMessageBox.No or res == QMessageBox.Cancel:
-                        raise IOError()
-                self.readFile(self.fileName, True)
-                bindName = self.__bindName(self.text(0))
-                self.__bindLexer(bindName)
-                self.__bindCompleter(bindName)
-                self.__autoSyntaxCheck()
-                self.isResourcesFile = self.fileName.endswith(".qrc")
-                
-                self.recolor()
-        else:
-            # clone the given editor
-            self.setDocument(editor.document())
-            self.breaks = editor.breaks
-            self.bookmarks = editor.bookmarks
-            self.syntaxerrors = editor.syntaxerrors
-            self.notcoveredMarkers = editor.notcoveredMarkers
-            self.isResourcesFile = editor.isResourcesFile
-            self.lastModified = editor.lastModified
-            
-            self.addClone(editor)
-            editor.addClone(self)
-        
-        self.gotoLine(0)
-        
-        # set the text display
-        self.__setTextDisplay()
-        
-        # set the autocompletion and calltips function
-        self.__acHookFunction = None
-        self.__setAutoCompletion()
-        self.__ctHookFunction = None
-        self.__setCallTips()
-        
-        sh = self.sizeHint()
-        if sh.height() < 300:
-            sh.setHeight(300)
-        self.resize(sh)
-        
-        # Make sure tabbing through a QWorkspace works.
-        self.setFocusPolicy(Qt.StrongFocus)
-        
-        self.__updateReadOnly(True)
-        
-        self.setWhatsThis(self.trUtf8(
-            """<b>A Source Editor Window</b>"""
-            """<p>This window is used to display and edit a source file."""
-            """  You can open as many of these as you like. The name of the file"""
-            """ is displayed in the window's titlebar.</p>"""
-            """<p>In order to set breakpoints just click in the space between"""
-            """ the line numbers and the fold markers. Via the context menu"""
-            """ of the margins they may be edited.</p>"""
-            """<p>In order to set bookmarks just Shift click in the space between"""
-            """ the line numbers and the fold markers.</p>"""
-            """<p>These actions can be reversed via the context menu.</p>"""
-            """<p>Ctrl clicking on a syntax error marker shows some info"""
-            """ about this error.</p>"""
-        ))
-        
-        # Set the editors size, if it is too big for the view manager.
-        if self.vm is not None:
-            req = self.size()
-            bnd = req.boundedTo(self.vm.size())
-            
-            if bnd.width() < req.width() or bnd.height() < req.height():
-                self.resize(bnd)
-            
-        # set the autosave flag
-        self.autosaveEnabled = Preferences.getEditor("AutosaveInterval") > 0
-        self.autosaveManuallyDisabled = False
-        
-        self.__initContextMenu()
-        self.__initContextMenuMargins()
-        
-        self.__checkEol()
-        if editor is None:
-            self.__checkLanguage()
-            self.__checkEncoding()
-        else:
-            # it's a clone
-            self.languageChanged(editor.apiLanguage, propagate = False)
-            self.__encodingChanged(editor.encoding, propagate = False)
-        
-        self.coverageMarkersShown = False   # flag remembering the current status of the
-                                            # code coverage markers
-        
-        self.setAcceptDrops(True)
-        
-        # breakpoint handling
-        self.breakpointModel = self.dbs.getBreakPointModel()
-        self.__restoreBreakpoints()
-        self.connect(self.breakpointModel, 
-            SIGNAL("rowsAboutToBeRemoved(const QModelIndex &, int, int)"), 
-            self.__deleteBreakPoints)
-        self.connect(self.breakpointModel,
-            SIGNAL("dataAboutToBeChanged(const QModelIndex &, const QModelIndex &)"),
-            self.__breakPointDataAboutToBeChanged)
-        self.connect(self.breakpointModel,
-            SIGNAL("dataChanged(const QModelIndex &, const QModelIndex &)"),
-            self.__changeBreakPoints)
-        self.connect(self.breakpointModel,
-            SIGNAL("rowsInserted(const QModelIndex &, int, int)"),
-            self.__addBreakPoints)
-        self.connect(self, SIGNAL("linesChanged()"), self.__linesChanged)
-        
-        # establish connection to some ViewManager action groups
-        self.addActions(self.vm.editorActGrp.actions())
-        self.addActions(self.vm.editActGrp.actions())
-        self.addActions(self.vm.copyActGrp.actions())
-        self.addActions(self.vm.viewActGrp.actions())
-        
-        # register images to be shown in autocompletion lists
-        self.__registerImages()
-    
-    def __registerImages(self):
-        """
-        Private method to register images for autocompletion lists.
-        """
-        self.registerImage(self.ClassID, 
-                           UI.PixmapCache.getPixmap("class.png"))
-        self.registerImage(self.ClassProtectedID, 
-                           UI.PixmapCache.getPixmap("class_protected.png"))
-        self.registerImage(self.ClassPrivateID, 
-                           UI.PixmapCache.getPixmap("class_private.png"))
-        self.registerImage(self.MethodID, 
-                           UI.PixmapCache.getPixmap("method.png"))
-        self.registerImage(self.MethodProtectedID, 
-                           UI.PixmapCache.getPixmap("method_protected.png"))
-        self.registerImage(self.MethodPrivateID, 
-                           UI.PixmapCache.getPixmap("method_private.png"))
-        self.registerImage(self.AttributeID, 
-                           UI.PixmapCache.getPixmap("attribute.png"))
-        self.registerImage(self.AttributeProtectedID, 
-                           UI.PixmapCache.getPixmap("attribute_protected.png"))
-        self.registerImage(self.AttributePrivateID, 
-                           UI.PixmapCache.getPixmap("attribute_private.png"))
-        self.registerImage(self.EnumID, 
-                           UI.PixmapCache.getPixmap("enum.png"))
-        
-        self.registerImage(self.FromDocumentID, 
-                           UI.PixmapCache.getPixmap("editor.png"))
-        
-        self.registerImage(self.TemplateImageID, 
-                           UI.PixmapCache.getPixmap("templateViewer.png"))
-    
-    def addClone(self, editor):
-        """
-        Public method to add a clone to our list.
-        
-        @param clone reference to the cloned editor (Editor)
-        """
-        self.__clones.append(editor)
-        
-        self.connect(editor, SIGNAL('editorRenamed'), self.fileRenamed)
-        self.connect(editor, SIGNAL('languageChanged'), self.languageChanged)
-        self.connect(editor, SIGNAL('eolChanged'), self.__eolChanged)
-        self.connect(editor, SIGNAL('encodingChanged'), self.__encodingChanged)
-        
-    def removeClone(self, editor):
-        """
-        Public method to remove a clone from our list.
-        
-        @param clone reference to the cloned editor (Editor)
-        """
-        if editor in self.__clones:
-            self.disconnect(editor, SIGNAL('editorRenamed'), self.fileRenamed)
-            self.disconnect(editor, SIGNAL('languageChanged'), self.languageChanged)
-            self.disconnect(editor, SIGNAL('eolChanged'), self.__eolChanged)
-            self.disconnect(editor, SIGNAL('encodingChanged'), self.__encodingChanged)
-            self.__clones.remove(editor)
-        
-    def __bindName(self, line0):
-        """
-        Private method to generate a dummy filename for binding a lexer.
-        
-        @param line0 first line of text to use in the generation process (string)
-        """
-        bindName = self.fileName
-        
-        if line0.startswith("<?xml"):
-            # override extension for XML files
-            bindName = "dummy.xml"
-        
-        # check filetype
-        if self.filetype == "Python":
-            bindName = "dummy.py"
-        elif self.filetype == "Ruby":
-            bindName = "dummy.rb"
-        elif self.filetype == "D":
-            bindName = "dummy.d"
-        elif self.filetype == "Properties":
-            bindName = "dummy.ini"
-        
-        # #! marker detection
-        if line0.startswith("#!"):
-            if "python3" in line0:
-                bindName = "dummy.py"
-                self.filetype = "Python3"
-            elif "python2" in line0:
-                bindName = "dummy.py"
-                self.filetype = "Python"
-            elif "python" in line0:
-                bindName = "dummy.py"
-                self.filetype = "Python"
-            elif ("/bash" in line0 or "/sh" in line0):
-                bindName = "dummy.sh"
-            elif "ruby" in line0:
-                bindName = "dummy.rb"
-                self.filetype = "Ruby"
-            elif "perl" in line0:
-                bindName = "dummy.pl"
-            elif "lua" in line0:
-                bindName = "dummy.lua"
-            elif "dmd" in line0:
-                bindName = "dummy.d"
-                self.filetype = "D"
-        return bindName
-        
-    def getMenu(self, menuName):
-        """
-        Public method to get a reference to the main context menu or a submenu.
-        
-        @param menuName name of the menu (string)
-        @return reference to the requested menu (QMenu) or None
-        """
-        try:
-            return self.__menus[menuName]
-        except KeyError:
-            return None
-        
-    def hasMiniMenu(self):
-        """
-        Public method to check the miniMenu flag.
-        
-        @return flag indicating a minimized context menu (boolean)
-        """
-        return self.miniMenu
-        
-    def __initContextMenu(self):
-        """
-        Private method used to setup the context menu
-        """
-        self.miniMenu = Preferences.getEditor("MiniContextMenu")
-        
-        self.menuActs = {}
-        self.menu = QMenu()
-        self.__menus = {
-            "Main" : self.menu, 
-        }
-        
-        self.languagesMenu = self.__initContextMenuLanguages()
-        self.__menus["Languages"] = self.languagesMenu
-        if self.isResourcesFile:
-            self.resourcesMenu = self.__initContextMenuResources()
-            self.__menus["Resources"] = self.resourcesMenu
-        else:
-            self.checksMenu = self.__initContextMenuChecks()
-            self.showMenu = self.__initContextMenuShow()
-            self.graphicsMenu = self.__initContextMenuGraphics()
-            self.autocompletionMenu = self.__initContextMenuAutocompletion()
-            self.__menus["Checks"] = self.checksMenu
-            self.__menus["Show"] = self.showMenu
-            self.__menus["Graphics"] = self.graphicsMenu
-            self.__menus["Autocompletion"] = self.autocompletionMenu
-        self.exportersMenu = self.__initContextMenuExporters()
-        self.__menus["Exporters"] = self.exportersMenu
-        self.eolMenu = self.__initContextMenuEol()
-        self.__menus["Eol"] = self.eolMenu
-        self.encodingsMenu = self.__initContextMenuEncodings()
-        self.__menus["Encodings"] = self.encodingsMenu
-        
-        self.menuActs["Undo"] = \
-            self.menu.addAction(UI.PixmapCache.getIcon("editUndo.png"),
-            self.trUtf8('Undo'), self.undo)
-        self.menuActs["Redo"] = \
-            self.menu.addAction(UI.PixmapCache.getIcon("editRedo.png"),
-            self.trUtf8('Redo'), self.redo)
-        self.menuActs["Revert"] = \
-            self.menu.addAction(self.trUtf8("Revert to last saved state"),
-                self.revertToUnmodified)
-        self.menu.addSeparator()
-        self.menuActs["Cut"] = \
-            self.menu.addAction(UI.PixmapCache.getIcon("editCut.png"),
-            self.trUtf8('Cut'), self.cut)
-        self.menuActs["Copy"] = \
-            self.menu.addAction(UI.PixmapCache.getIcon("editCopy.png"),
-            self.trUtf8('Copy'), self.copy)
-        self.menu.addAction(UI.PixmapCache.getIcon("editPaste.png"),
-            self.trUtf8('Paste'), self.paste)
-        if not self.miniMenu:
-            self.menu.addSeparator()
-            self.menu.addAction(UI.PixmapCache.getIcon("editIndent.png"),
-                self.trUtf8('Indent'), self.indentLineOrSelection)
-            self.menu.addAction(UI.PixmapCache.getIcon("editUnindent.png"),
-                self.trUtf8('Unindent'), self.unindentLineOrSelection)
-            self.menuActs["Comment"] = \
-                self.menu.addAction(UI.PixmapCache.getIcon("editComment.png"),
-                    self.trUtf8('Comment'), self.commentLineOrSelection)
-            self.menuActs["Uncomment"] = \
-                self.menu.addAction(UI.PixmapCache.getIcon("editUncomment.png"),
-                    self.trUtf8('Uncomment'), self.uncommentLineOrSelection)
-            self.menuActs["StreamComment"] = \
-                self.menu.addAction(self.trUtf8('Stream Comment'), 
-                    self.streamCommentLineOrSelection)
-            self.menuActs["BoxComment"] = \
-                self.menu.addAction(self.trUtf8('Box Comment'), 
-                    self.boxCommentLineOrSelection)
-            self.menu.addSeparator()
-            self.menu.addAction(self.trUtf8('Select to brace'), 
-                self.selectToMatchingBrace)
-            self.menu.addAction(self.trUtf8('Select all'), self.__selectAll)
-            self.menu.addAction(self.trUtf8('Deselect all'), self.__deselectAll)
-            self.menu.addSeparator()
-        self.menuActs["SpellCheck"] = \
-            self.menu.addAction(UI.PixmapCache.getIcon("spellchecking.png"), 
-                self.trUtf8('Check spelling...'), self.checkSpelling)
-        self.menuActs["SpellCheckSelection"] = \
-            self.menu.addAction(UI.PixmapCache.getIcon("spellchecking.png"), 
-                self.trUtf8('Check spelling of selection...'), 
-                self.__checkSpellingSelection)
-        self.menuActs["SpellCheckRemove"] = \
-            self.menu.addAction(self.trUtf8("Remove from dictionary"), 
-                self.__removeFromSpellingDictionary)
-        self.menu.addSeparator()
-        self.menu.addAction(self.trUtf8('Shorten empty lines'), 
-            self.shortenEmptyLines)
-        self.menu.addSeparator()
-        self.menuActs["Languages"] = self.menu.addMenu(self.languagesMenu)
-        self.menuActs["Encodings"] = self.menu.addMenu(self.encodingsMenu)
-        self.menuActs["Eol"] = self.menu.addMenu(self.eolMenu)
-        self.menu.addSeparator()
-        self.menuActs["MonospacedFont"] = \
-            self.menu.addAction(self.trUtf8("Use Monospaced Font"),
-                self.handleMonospacedEnable)
-        self.menuActs["MonospacedFont"].setCheckable(True)
-        self.menuActs["MonospacedFont"].setChecked(self.useMonospaced)
-        self.menuActs["AutosaveEnable"] = \
-            self.menu.addAction(self.trUtf8("Autosave enabled"),
-                self.__autosaveEnable)
-        self.menuActs["AutosaveEnable"].setCheckable(True)
-        self.menuActs["AutosaveEnable"].setChecked(self.autosaveEnabled)
-        self.menuActs["TypingAidsEnabled"] = \
-            self.menu.addAction(self.trUtf8("Typing aids enabled"), 
-                self.__toggleTypingAids)
-        self.menuActs["TypingAidsEnabled"].setCheckable(True)
-        self.menuActs["TypingAidsEnabled"].setEnabled(self.completer is not None)
-        self.menuActs["TypingAidsEnabled"].setChecked(\
-            self.completer is not None and self.completer.isEnabled())
-        self.menuActs["AutoCompletionEnable"] = \
-            self.menu.addAction(self.trUtf8("Autocompletion enabled"),
-                self.__toggleAutoCompletionEnable)
-        self.menuActs["AutoCompletionEnable"].setCheckable(True)
-        self.menuActs["AutoCompletionEnable"].setChecked(\
-            self.autoCompletionThreshold() != -1)
-        if not self.isResourcesFile:
-            self.menu.addMenu(self.autocompletionMenu)
-        self.menu.addSeparator()
-        if self.isResourcesFile:
-            self.menu.addMenu(self.resourcesMenu)
-        else:
-            self.menuActs["Check"] = self.menu.addMenu(self.checksMenu)
-            self.menu.addSeparator()
-            self.menuActs["Show"] = self.menu.addMenu(self.showMenu)
-            self.menu.addSeparator()
-            self.menuActs["Diagrams"] = self.menu.addMenu(self.graphicsMenu)
-        self.menu.addSeparator()
-        self.menu.addAction(self.trUtf8('New view'), self.__newView)
-        act = self.menu.addAction(self.trUtf8('New view (with new split)'), 
-            self.__newViewNewSplit)
-        if not self.vm.canSplit():
-                act.setEnabled(False)
-        self.menu.addAction(UI.PixmapCache.getIcon("close.png"),
-            self.trUtf8('Close'), self.__contextClose)
-        self.menu.addSeparator()
-        self.menuActs["Save"] = \
-            self.menu.addAction(UI.PixmapCache.getIcon("fileSave.png"),
-            self.trUtf8('Save'), self.__contextSave)
-        self.menu.addAction(UI.PixmapCache.getIcon("fileSaveAs.png"),
-            self.trUtf8('Save As...'), self.__contextSaveAs)
-        if not self.miniMenu:
-            self.menu.addMenu(self.exportersMenu)
-            self.menu.addSeparator()
-            self.menu.addAction(UI.PixmapCache.getIcon("printPreview.png"),
-            self.trUtf8("Print Preview"), self.printPreviewFile)
-            self.menu.addAction(UI.PixmapCache.getIcon("print.png"),
-                self.trUtf8('Print'), self.printFile)
-        
-        self.connect(self.menu, SIGNAL('aboutToShow()'), self.__showContextMenu)
-        
-        self.spellingMenu = QMenu()
-        self.__menus["Spelling"] = self.spellingMenu
-        
-        self.connect(self.spellingMenu, SIGNAL('aboutToShow()'), 
-                     self.__showContextMenuSpelling)
-        self.connect(self.spellingMenu, SIGNAL('triggered(QAction *)'), 
-                     self.__contextMenuSpellingTriggered)
-
-    def __initContextMenuAutocompletion(self):
-        """
-        Private method used to setup the Checks context sub menu.
-        """
-        menu = QMenu(self.trUtf8('Autocomplete'))
-        
-        self.menuActs["acDynamic"] = \
-            menu.addAction(self.trUtf8('dynamic'), 
-                self.autoComplete)
-        menu.addSeparator()
-        menu.addAction(self.trUtf8('from Document'), 
-            self.autoCompleteFromDocument)
-        self.menuActs["acAPI"] = \
-            menu.addAction(self.trUtf8('from APIs'),
-                self.autoCompleteFromAPIs)
-        self.menuActs["acAPIDocument"] = \
-            menu.addAction(self.trUtf8('from Document and APIs'), 
-                self.autoCompleteFromAll)
-        menu.addSeparator()
-        self.menuActs["calltip"] = \
-            menu.addAction(self.trUtf8('Calltip'), self.callTip)
-        
-        self.connect(menu, SIGNAL('aboutToShow()'), self.__showContextMenuAutocompletion)
-        
-        return menu
-
-    def __initContextMenuChecks(self):
-        """
-        Private method used to setup the Checks context sub menu.
-        """
-        menu = QMenu(self.trUtf8('Check'))
-        self.connect(menu, SIGNAL("aboutToShow()"), self.__showContextMenuChecks)
-        return menu
-
-    def __initContextMenuShow(self):
-        """
-        Private method used to setup the Show context sub menu.
-        """
-        menu = QMenu(self.trUtf8('Show'))
-        
-        menu.addAction(self.trUtf8('Code metrics...'), self.__showCodeMetrics)
-        self.coverageMenuAct = \
-            menu.addAction(self.trUtf8('Code coverage...'), self.__showCodeCoverage)
-        self.coverageShowAnnotationMenuAct = \
-            menu.addAction(self.trUtf8('Show code coverage annotations'), 
-                self.__codeCoverageShowAnnotations)
-        self.coverageHideAnnotationMenuAct = \
-            menu.addAction(self.trUtf8('Hide code coverage annotations'), 
-                self.__codeCoverageHideAnnotations)
-        self.profileMenuAct = \
-            menu.addAction(self.trUtf8('Profile data...'), self.__showProfileData)
-        
-        self.connect(menu, SIGNAL('aboutToShow()'), self.__showContextMenuShow)
-        
-        return menu
-        
-    def __initContextMenuGraphics(self):
-        """
-        Private method used to setup the diagrams context sub menu.
-        """
-        menu = QMenu(self.trUtf8('Diagrams'))
-        
-        menu.addAction(self.trUtf8('Class Diagram...'), 
-            self.__showClassDiagram)
-        menu.addAction(self.trUtf8('Package Diagram...'), 
-            self.__showPackageDiagram)
-        menu.addAction(self.trUtf8('Imports Diagram...'), 
-            self.__showImportsDiagram)
-        self.applicationDiagramMenuAct = \
-            menu.addAction(self.trUtf8('Application Diagram...'), 
-                self.__showApplicationDiagram)
-        
-        self.connect(menu, SIGNAL('aboutToShow()'), self.__showContextMenuGraphics)
-        
-        return menu
-
-    def __initContextMenuLanguages(self):
-        """
-        Private method used to setup the Languages context sub menu.
-        """
-        menu = QMenu(self.trUtf8("Languages"))
-        
-        self.languagesActGrp = QActionGroup(self)
-        self.noLanguageAct = menu.addAction(self.trUtf8("No Language"))
-        self.noLanguageAct.setCheckable(True)
-        self.noLanguageAct.setData("None")
-        self.languagesActGrp.addAction(self.noLanguageAct)
-        menu.addSeparator()
-        
-        self.supportedLanguages = {}
-        supportedLanguages = Lexers.getSupportedLanguages()
-        languages = sorted(list(supportedLanguages.keys()))
-        for language in languages:
-            if language != "Guessed":
-                self.supportedLanguages[language] = supportedLanguages[language][:]
-                act = menu.addAction(self.supportedLanguages[language][0])
-                act.setCheckable(True)
-                act.setData(language)
-                self.supportedLanguages[language].append(act)
-                self.languagesActGrp.addAction(act)
-        
-        menu.addSeparator()
-        self.pygmentsAct = menu.addAction(self.trUtf8("Guessed"))
-        self.pygmentsAct.setCheckable(True)
-        self.pygmentsAct.setData("Guessed")
-        self.languagesActGrp.addAction(self.pygmentsAct)
-        self.pygmentsSelAct = menu.addAction(self.trUtf8("Alternatives"))
-        self.pygmentsSelAct.setData("Alternatives")
-        
-        self.connect(menu, SIGNAL('triggered(QAction *)'), self.__languageMenuTriggered)
-        self.connect(menu, SIGNAL('aboutToShow()'), self.__showContextMenuLanguages)
-        
-        return menu
-        
-    def __initContextMenuEncodings(self):
-        """
-        Private method used to setup the Encodings context sub menu.
-        """
-        self.supportedEncodings = {}
-        
-        menu = QMenu(self.trUtf8("Encodings"))
-        
-        self.encodingsActGrp = QActionGroup(self)
-        
-        for encoding in sorted(Utilities.supportedCodecs):
-            act = menu.addAction(encoding)
-            act.setCheckable(True)
-            act.setData(encoding)
-            self.supportedEncodings[encoding] = act
-            self.encodingsActGrp.addAction(act)
-        
-        self.connect(menu, SIGNAL('triggered(QAction *)'), self.__encodingsMenuTriggered)
-        self.connect(menu, SIGNAL('aboutToShow()'), self.__showContextMenuEncodings)
-        
-        return menu
-        
-    def __initContextMenuEol(self):
-        """
-        Private method to setup the eol context sub menu.
-        """
-        self.supportedEols = {}
-        
-        menu = QMenu(self.trUtf8("End-of-Line Type"))
-        
-        self.eolActGrp = QActionGroup(self)
-        
-        act = menu.addAction(self.trUtf8("Unix"))
-        act.setCheckable(True)
-        act.setData('\n')
-        self.supportedEols['\n'] = act
-        self.eolActGrp.addAction(act)
-        
-        act = menu.addAction(self.trUtf8("Windows"))
-        act.setCheckable(True)
-        act.setData('\r\n')
-        self.supportedEols['\r\n'] = act
-        self.eolActGrp.addAction(act)
-        
-        act = menu.addAction(self.trUtf8("Macintosh"))
-        act.setCheckable(True)
-        act.setData('\r')
-        self.supportedEols['\r'] = act
-        self.eolActGrp.addAction(act)
-        
-        self.connect(menu, SIGNAL('triggered(QAction *)'), self.__eolMenuTriggered)
-        self.connect(menu, SIGNAL('aboutToShow()'), self.__showContextMenuEol)
-        
-        return menu
-        
-    def __initContextMenuExporters(self):
-        """
-        Private method used to setup the Exporters context sub menu.
-        """
-        menu = QMenu(self.trUtf8("Export as"))
-        
-        supportedExporters = Exporters.getSupportedFormats()
-        exporters = sorted(list(supportedExporters.keys()))
-        for exporter in exporters:
-            act = menu.addAction(supportedExporters[exporter])
-            act.setData(exporter)
-        
-        self.connect(menu, SIGNAL('triggered(QAction *)'), self.__exportMenuTriggered)
-        
-        return menu
-        
-    def __initContextMenuMargins(self):
-        """
-        Private method used to setup the context menu for the margins
-        """
-        self.marginMenuActs = {}
-        
-        if self.__unifiedMargins:
-            self.__initContextMenuUnifiedMargins()
-        else:
-            self.__initContextMenuSeparateMargins()
-        
-    def __initContextMenuSeparateMargins(self):
-        """
-        Private method used to setup the context menu for the separated margins
-        """
-        # bookmark margin
-        self.bmMarginMenu = QMenu()
-        
-        self.bmMarginMenu.addAction(self.trUtf8('Toggle bookmark'),
-            self.menuToggleBookmark)
-        self.marginMenuActs["NextBookmark"] = \
-            self.bmMarginMenu.addAction(self.trUtf8('Next bookmark'),
-                self.nextBookmark)
-        self.marginMenuActs["PreviousBookmark"] = \
-            self.bmMarginMenu.addAction(self.trUtf8('Previous bookmark'),
-                self.previousBookmark)
-        self.marginMenuActs["ClearBookmark"] = \
-            self.bmMarginMenu.addAction(self.trUtf8('Clear all bookmarks'),
-                self.clearBookmarks)
-        
-        self.connect(self.bmMarginMenu, SIGNAL('aboutToShow()'), 
-            self.__showContextMenuMargin)
-        
-        # breakpoint margin
-        self.bpMarginMenu = QMenu()
-        
-        self.marginMenuActs["Breakpoint"] = \
-            self.bpMarginMenu.addAction(self.trUtf8('Toggle breakpoint'), 
-                self.menuToggleBreakpoint)
-        self.marginMenuActs["TempBreakpoint"] = \
-            self.bpMarginMenu.addAction(self.trUtf8('Toggle temporary breakpoint'), 
-                self.__menuToggleTemporaryBreakpoint)
-        self.marginMenuActs["EditBreakpoint"] = \
-            self.bpMarginMenu.addAction(self.trUtf8('Edit breakpoint...'), 
-                self.menuEditBreakpoint)
-        self.marginMenuActs["EnableBreakpoint"] = \
-            self.bpMarginMenu.addAction(self.trUtf8('Enable breakpoint'), 
-                self.__menuToggleBreakpointEnabled)
-        self.marginMenuActs["NextBreakpoint"] = \
-            self.bpMarginMenu.addAction(self.trUtf8('Next breakpoint'), 
-                self.menuNextBreakpoint)
-        self.marginMenuActs["PreviousBreakpoint"] = \
-            self.bpMarginMenu.addAction(self.trUtf8('Previous breakpoint'), 
-                self.menuPreviousBreakpoint)
-        self.marginMenuActs["ClearBreakpoint"] = \
-            self.bpMarginMenu.addAction(self.trUtf8('Clear all breakpoints'), 
-                self.__menuClearBreakpoints)
-        
-        self.connect(self.bpMarginMenu, SIGNAL('aboutToShow()'), 
-            self.__showContextMenuMargin)
-        
-        # indicator margin
-        self.indicMarginMenu = QMenu()
-        
-        self.marginMenuActs["GotoSyntaxError"] = \
-            self.indicMarginMenu.addAction(self.trUtf8('Goto syntax error'),
-                self.gotoSyntaxError)
-        self.marginMenuActs["ShowSyntaxError"] = \
-            self.indicMarginMenu.addAction(self.trUtf8('Show syntax error message'),
-                self.__showSyntaxError)
-        self.marginMenuActs["ClearSyntaxError"] = \
-            self.indicMarginMenu.addAction(self.trUtf8('Clear syntax error'),
-                self.clearSyntaxError)
-        self.indicMarginMenu.addSeparator()
-        self.marginMenuActs["NextCoverageMarker"] = \
-            self.indicMarginMenu.addAction(self.trUtf8('Next uncovered line'),
-                self.nextUncovered)
-        self.marginMenuActs["PreviousCoverageMarker"] = \
-            self.indicMarginMenu.addAction(self.trUtf8('Previous uncovered line'),
-                self.previousUncovered)
-        self.indicMarginMenu.addSeparator()
-        self.marginMenuActs["NextTaskMarker"] = \
-            self.indicMarginMenu.addAction(self.trUtf8('Next task'),
-                self.nextTask)
-        self.marginMenuActs["PreviousTaskMarker"] = \
-            self.indicMarginMenu.addAction(self.trUtf8('Previous task'),
-                self.previousTask)
-        
-        self.connect(self.indicMarginMenu, SIGNAL('aboutToShow()'), 
-            self.__showContextMenuMargin)
-        
-    def __initContextMenuUnifiedMargins(self):
-        """
-        Private method used to setup the context menu for the unified margins
-        """
-        self.marginMenu = QMenu()
-        
-        self.marginMenu.addAction(self.trUtf8('Toggle bookmark'),
-            self.menuToggleBookmark)
-        self.marginMenuActs["NextBookmark"] = \
-            self.marginMenu.addAction(self.trUtf8('Next bookmark'),
-                self.nextBookmark)
-        self.marginMenuActs["PreviousBookmark"] = \
-            self.marginMenu.addAction(self.trUtf8('Previous bookmark'),
-                self.previousBookmark)
-        self.marginMenuActs["ClearBookmark"] = \
-            self.marginMenu.addAction(self.trUtf8('Clear all bookmarks'),
-                self.clearBookmarks)
-        self.marginMenu.addSeparator()
-        self.marginMenuActs["GotoSyntaxError"] = \
-            self.marginMenu.addAction(self.trUtf8('Goto syntax error'),
-                self.gotoSyntaxError)
-        self.marginMenuActs["ShowSyntaxError"] = \
-            self.marginMenu.addAction(self.trUtf8('Show syntax error message'),
-                self.__showSyntaxError)
-        self.marginMenuActs["ClearSyntaxError"] = \
-            self.marginMenu.addAction(self.trUtf8('Clear syntax error'),
-                self.clearSyntaxError)
-        self.marginMenu.addSeparator()
-        self.marginMenuActs["Breakpoint"] = \
-            self.marginMenu.addAction(self.trUtf8('Toggle breakpoint'), 
-                self.menuToggleBreakpoint)
-        self.marginMenuActs["TempBreakpoint"] = \
-            self.marginMenu.addAction(self.trUtf8('Toggle temporary breakpoint'), 
-                self.__menuToggleTemporaryBreakpoint)
-        self.marginMenuActs["EditBreakpoint"] = \
-            self.marginMenu.addAction(self.trUtf8('Edit breakpoint...'), 
-                self.menuEditBreakpoint)
-        self.marginMenuActs["EnableBreakpoint"] = \
-            self.marginMenu.addAction(self.trUtf8('Enable breakpoint'), 
-                self.__menuToggleBreakpointEnabled)
-        self.marginMenuActs["NextBreakpoint"] = \
-            self.marginMenu.addAction(self.trUtf8('Next breakpoint'), 
-                self.menuNextBreakpoint)
-        self.marginMenuActs["PreviousBreakpoint"] = \
-            self.marginMenu.addAction(self.trUtf8('Previous breakpoint'), 
-                self.menuPreviousBreakpoint)
-        self.marginMenuActs["ClearBreakpoint"] = \
-            self.marginMenu.addAction(self.trUtf8('Clear all breakpoints'), 
-                self.__menuClearBreakpoints)
-        self.marginMenu.addSeparator()
-        self.marginMenuActs["NextCoverageMarker"] = \
-            self.marginMenu.addAction(self.trUtf8('Next uncovered line'),
-                self.nextUncovered)
-        self.marginMenuActs["PreviousCoverageMarker"] = \
-            self.marginMenu.addAction(self.trUtf8('Previous uncovered line'),
-                self.previousUncovered)
-        self.marginMenu.addSeparator()
-        self.marginMenuActs["NextTaskMarker"] = \
-            self.marginMenu.addAction(self.trUtf8('Next task'),
-                self.nextTask)
-        self.marginMenuActs["PreviousTaskMarker"] = \
-            self.marginMenu.addAction(self.trUtf8('Previous task'),
-                self.previousTask)
-        self.marginMenu.addSeparator()
-        self.marginMenuActs["LMBbookmarks"] = \
-            self.marginMenu.addAction(self.trUtf8('LMB toggles bookmarks'),
-                self.__lmBbookmarks)
-        self.marginMenuActs["LMBbookmarks"].setCheckable(True)
-        self.marginMenuActs["LMBbookmarks"].setChecked(False)
-        self.marginMenuActs["LMBbreakpoints"] = \
-            self.marginMenu.addAction(self.trUtf8('LMB toggles breakpoints'),
-                self.__lmBbreakpoints)
-        self.marginMenuActs["LMBbreakpoints"].setCheckable(True)
-        self.marginMenuActs["LMBbreakpoints"].setChecked(True)
-        
-        self.connect(self.marginMenu, SIGNAL('aboutToShow()'), 
-            self.__showContextMenuMargin)
-        
-    def __exportMenuTriggered(self, act):
-        """
-        Private method to handle the selection of an export format.
-        
-        @param act reference to the action that was triggered (QAction)
-        """
-        exporterFormat = act.data()
-        self.exportFile(exporterFormat)
-        
-    def exportFile(self, exporterFormat):
-        """
-        Public method to export the file.
-        
-        @param exporterFormat format the file should be exported into (string)
-        """
-        if exporterFormat:
-            exporter = Exporters.getExporter(exporterFormat, self)
-            if exporter:
-                exporter.exportSource()
-            else:
-                QMessageBox.critical(self,
-                    self.trUtf8("Export source"),
-                    self.trUtf8("""<p>No exporter available for the """
-                                """export format <b>{0}</b>. Aborting...</p>""")\
-                        .format(exporterFormat),
-                    QMessageBox.StandardButtons(\
-                        QMessageBox.Ok))
-        else:
-            QMessageBox.critical(self,
-                self.trUtf8("Export source"),
-                self.trUtf8("""No export format given. Aborting..."""),
-                QMessageBox.StandardButtons(\
-                    QMessageBox.Ok))
-        
-    def __showContextMenuLanguages(self):
-        """
-        Private slot handling the aboutToShow signal of the languages context menu.
-        """
-        if self.apiLanguage.startswith("Pygments|"):
-            self.pygmentsSelAct.setText(
-                self.trUtf8("Alternatives ({0})").format(self.getLanguage()))
-        else:
-            self.pygmentsSelAct.setText(self.trUtf8("Alternatives"))
-        self.emit(SIGNAL("showMenu"), "Languages", self.languagesMenu,  self)
-        
-    def __selectPygmentsLexer(self):
-        """
-        Private method to select a specific pygments lexer.
-        
-        @return name of the selected pygments lexer (string)
-        """
-        from pygments.lexers import get_all_lexers
-        lexerList = sorted([l[0] for l in get_all_lexers()])
-        try:
-            lexerSel = lexerList.index(self.getLanguage())
-        except ValueError:
-            lexerSel = 0
-        lexerName, ok = QInputDialog.getItem(\
-            self,
-            self.trUtf8("Pygments Lexer"),
-            self.trUtf8("Select the Pygments lexer to apply."),
-            lexerList,
-            lexerSel, 
-            False)
-        if ok and lexerName:
-            return lexerName
-        else:
-            return ""
-        
-    def __languageMenuTriggered(self, act):
-        """
-        Private method to handle the selection of a lexer language.
-        
-        @param act reference to the action that was triggered (QAction)
-        """
-        if act == self.noLanguageAct:
-            self.__resetLanguage()
-        elif act == self.pygmentsAct:
-            self.setLanguage("dummy.pygments")
-        elif act == self.pygmentsSelAct:
-            language = self.__selectPygmentsLexer()
-            if language:
-                self.setLanguage("dummy.pygments", pyname = language)
-        else:
-            language = act.data()
-            if language:
-                self.setLanguage(self.supportedLanguages[language][1])
-        
-    def languageChanged(self, language, propagate = True):
-        """
-        Public slot handling a change of a connected editor's language.
-        
-        @param language language to be set (string)
-        @keyparam propagate flag indicating to propagate the change (boolean)
-        """
-        if language == '':
-            self.__resetLanguage(propagate = propagate)
-        elif language == "Guessed":
-            self.setLanguage("dummy.pygments")
-        elif language.startswith("Pygments|"):
-            pyname = language.split("|", 1)[1]
-            self.setLanguage("dummy.pygments", pyname = pyname)
-        else:
-            self.setLanguage(self.supportedLanguages[language][1], propagate = propagate)
-        
-    def __resetLanguage(self, propagate = True):
-        """
-        Private method used to reset the language selection.
-        
-        @keyparam propagate flag indicating to propagate the change (boolean)
-        """
-        if self.lexer_ is not None and \
-           (self.lexer_.lexer() == "container" or self.lexer_.lexer() is None):
-            self.disconnect(self, SIGNAL("SCN_STYLENEEDED(int)"), self.__styleNeeded)
-        
-        self.apiLanguage = ""
-        self.lexer_ = None
-        self.__lexerReset = True
-        self.setLexer()
-        self.setMonospaced(self.useMonospaced)
-        if self.completer is not None:
-            self.completer.setEnabled(False)
-            self.completer = None
-        self.__setTextDisplay()
-        
-        if not self.inLanguageChanged and propagate:
-            self.inLanguageChanged = True
-            self.emit(SIGNAL('languageChanged'), self.apiLanguage)
-            self.inLanguageChanged = False
-        
-    def setLanguage(self, filename, initTextDisplay = True, propagate = True, 
-                    pyname = ""):
-        """
-        Public method to set a lexer language.
-        
-        @param filename filename used to determine the associated lexer language (string)
-        @param initTextDisplay flag indicating an initialization of the text display
-            is required as well (boolean)
-        @keyparam propagate flag indicating to propagate the change (boolean)
-        @keyparam pyname name of the pygments lexer to use (string)
-        """
-        self.__lexerReset = False
-        self.__bindLexer(filename, pyname = pyname)
-        self.__bindCompleter(filename)
-        self.recolor()
-        self.__checkLanguage()
-        
-        # set the text display
-        if initTextDisplay:
-            self.__setTextDisplay()
-        
-        # set the autocompletion and calltips function
-        self.__setAutoCompletion()
-        self.__setCallTips()
-        
-        if not self.inLanguageChanged and propagate:
-            self.inLanguageChanged = True
-            self.emit(SIGNAL('languageChanged'), self.apiLanguage)
-            self.inLanguageChanged = False
-    
-    def __checkLanguage(self):
-        """
-        Private method to check the selected language of the language submenu.
-        """
-        if self.apiLanguage == "":
-            self.noLanguageAct.setChecked(True)
-        elif self.apiLanguage == "Guessed":
-            self.pygmentsAct.setChecked(True)
-        elif self.apiLanguage.startswith("Pygments|"):
-            act = self.languagesActGrp.checkedAction()
-            if act:
-                act.setChecked(False)
-        else:
-            self.supportedLanguages[self.apiLanguage][2].setChecked(True)
-    
-    def projectLexerAssociationsChanged(self):
-        """
-        Public slot to handle changes of the project lexer associations.
-        """
-        self.setLanguage(self.fileName)
-    
-    def __showContextMenuEncodings(self):
-        """
-        Private slot handling the aboutToShow signal of the encodings context menu.
-        """
-        self.emit(SIGNAL("showMenu"), "Encodings", self.encodingsMenu,  self)
-        
-    def __encodingsMenuTriggered(self, act):
-        """
-        Private method to handle the selection of an encoding.
-        
-        @param act reference to the action that was triggered (QAction)
-        """
-        encoding = act.data()
-        self.__encodingChanged("%s-selected" % encoding)
-        
-    def __checkEncoding(self):
-        """
-        Private method to check the selected encoding of the encodings submenu.
-        """
-        try:
-            self.supportedEncodings[self.__normalizedEncoding()].setChecked(True)
-        except (AttributeError, KeyError):
-            pass
-        
-    def __encodingChanged(self, encoding, propagate = True):
-        """
-        Private slot to handle a change of the encoding.
-        
-        @keyparam propagate flag indicating to propagate the change (boolean)        
-        """
-        self.encoding = encoding
-        self.__checkEncoding()
-        
-        if not self.inEncodingChanged and propagate:
-            self.inEncodingChanged = True
-            self.emit(SIGNAL("encodingChanged"), self.encoding)
-            self.inEncodingChanged = False
-        
-    def __normalizedEncoding(self):
-        """
-        Private method to calculate the normalized encoding string.
-        
-        @return normalized encoding (string)
-        """
-        return self.encoding.replace("-default", "")\
-                            .replace("-guessed", "")\
-                            .replace("-selected", "")
-        
-    def __showContextMenuEol(self):
-        """
-        Private slot handling the aboutToShow signal of the eol context menu.
-        """
-        self.emit(SIGNAL("showMenu"), "Eol", self.eolMenu,  self)
-        
-    def __eolMenuTriggered(self, act):
-        """
-        Private method to handle the selection of an eol type.
-        
-        @param act reference to the action that was triggered (QAction)
-        """
-        eol = act.data()
-        self.setEolModeByEolString(eol)
-        self.convertEols(self.eolMode())
-        
-    def __checkEol(self):
-        """
-        Private method to check the selected eol type of the eol submenu.
-        """
-        try:
-            self.supportedEols[self.getLineSeparator()].setChecked(True)
-        except AttributeError:
-            pass
-        
-    def __eolChanged(self):
-        """
-        Private slot to handle a change of the eol mode.
-        """
-        self.__checkEol()
-        
-        if not self.inEolChanged:
-            self.inEolChanged = True
-            eol = self.getLineSeparator()
-            self.emit(SIGNAL("eolChanged"), eol)
-            self.inEolChanged = False
-        
-    def __bindLexer(self, filename, pyname = ""):
-        """
-        Private slot to set the correct lexer depending on language.
-        
-        @param filename filename used to determine the associated lexer language (string)
-        @keyparam pyname name of the pygments lexer to use (string)
-        """
-        if self.lexer_ is not None and \
-           (self.lexer_.lexer() == "container" or self.lexer_.lexer() is None):
-            self.disconnect(self, SIGNAL("SCN_STYLENEEDED(int)"), self.__styleNeeded)
-        
-        language = ""
-        project = e5App().getObject("Project")
-        if project.isOpen() and project.isProjectFile(filename):
-            language = project.getEditorLexerAssoc(os.path.basename(filename))
-        if not language:
-            filename = os.path.basename(filename)
-            language = Preferences.getEditorLexerAssoc(filename)
-        if language.startswith("Pygments|"):
-            pyname = language.split("|", 1)[1]
-            language = ""
-        
-        self.lexer_ = Lexers.getLexer(language, self, pyname = pyname)
-        if self.lexer_ is None:
-            self.setLexer()
-            self.apiLanguage = ""
-            return
-        
-        if pyname:
-            self.apiLanguage = "Pygments|%s" % pyname
-        else:
-            self.apiLanguage = self.lexer_.language()
-            if self.apiLanguage == "POV":
-                self.apiLanguage = "Povray"
-        self.setLexer(self.lexer_)
-        self.__setMarginsDisplay()
-        if self.lexer_.lexer() == "container" or self.lexer_.lexer() is None:
-            self.setStyleBits(self.lexer_.styleBitsNeeded())
-            self.connect(self, SIGNAL("SCN_STYLENEEDED(int)"), self.__styleNeeded)
-        
-        # get the font for style 0 and set it as the default font
-        key = 'Scintilla/%s/style0/font' % self.lexer_.language()
-        fdesc = Preferences.Prefs.settings.value(key)
-        if fdesc is not None:
-            font = QFont(fdesc[0], int(fdesc[1]))
-            self.lexer_.setDefaultFont(font)
-        self.lexer_.readSettings(Preferences.Prefs.settings, "Scintilla")
-        
-        # now set the lexer properties
-        self.lexer_.initProperties()
-        
-        # initialize the auto indent style of the lexer
-        ais = self.lexer_.autoIndentStyle()
-        
-        # initialize the lexer APIs settings
-        api = self.vm.getAPIsManager().getAPIs(self.apiLanguage)
-        if api is not None:
-            self.lexer_.setAPIs(api.getQsciAPIs())
-            self.acAPI = True
-        else:
-            self.acAPI = False
-        self.emit(SIGNAL("autoCompletionAPIsAvailable"), self.acAPI)
-        
-    def __styleNeeded(self, position):
-        """
-        Private slot to handle the need for more styling.
-        
-        @param position end position, that needs styling (integer)
-        """
-        self.lexer_.styleText(self.getEndStyled(), position)
-        
-    def getLexer(self):
-        """
-        Public method to retrieve a reference to the lexer object.
-        
-        @return the lexer object (Lexer)
-        """
-        return self.lexer_
-        
-    def getLanguage(self):
-        """
-        Public method to retrieve the language of the editor.
-        
-        @return language of the editor (string)
-        """
-        if self.apiLanguage == "Guessed" or self.apiLanguage.startswith("Pygments|"):
-            return self.lexer_.name()
-        else:
-            return self.apiLanguage
-        
-    def __bindCompleter(self, filename):
-        """
-        Private slot to set the correct typing completer depending on language.
-        
-        @param filename filename used to determine the associated typing
-            completer language (string)
-        """
-        if self.completer is not None:
-            self.completer.setEnabled(False)
-            self.completer = None
-        
-        filename = os.path.basename(filename)
-        apiLanguage = Preferences.getEditorLexerAssoc(filename)
-        
-        self.completer = TypingCompleters.getCompleter(apiLanguage, self)
-        
-    def getCompleter(self):
-        """
-        Public method to retrieve a reference to the completer object.
-        
-        @return the completer object (CompleterBase)
-        """
-        return self.completer
-        
-    def __modificationChanged(self, m):
-        """
-        Private slot to handle the modificationChanged signal. 
-        
-        It emits the signal modificationStatusChanged with parameters
-        m and self.
-        
-        @param m modification status
-        """
-        if not m and self.fileName is not None:
-            self.lastModified = QFileInfo(self.fileName).lastModified()
-        if Preferences.getEditor("AutoCheckSyntax"):
-            self.clearSyntaxError()
-        self.emit(SIGNAL('modificationStatusChanged'), m, self)
-        self.emit(SIGNAL('undoAvailable'), self.isUndoAvailable())
-        self.emit(SIGNAL('redoAvailable'), self.isRedoAvailable())
-        
-    def __cursorPositionChanged(self, line, index):
-        """
-        Private slot to handle the cursorPositionChanged signal. 
-        
-        It emits the signal cursorChanged with parameters fileName, 
-        line and pos.
-        
-        @param line line number of the cursor
-        @param index position in line of the cursor
-        """
-        self.emit(SIGNAL('cursorChanged'), self.fileName, line+1, index)
-        
-        if Preferences.getEditor("MarkOccurrencesEnabled"):
-            self.__markOccurrencesTimer.stop()
-            self.__markOccurrencesTimer.start()
-        
-        if self.spell is not None:
-            # do spell checking
-            doSpelling = True
-            if self.lastLine == line:
-                start, end = self.getWordBoundaries(line, index, useWordChars = False)
-                if start <= self.lastIndex and self.lastIndex <= end:
-                    doSpelling = False
-            if doSpelling:
-                pos = self.positionFromLineIndex(self.lastLine, self.lastIndex)
-                self.spell.checkWord(pos)
-        
-        self.lastLine = line
-        self.lastIndex = index
-        
-    def __modificationReadOnly(self):
-        """
-        Private slot to handle the modificationAttempted signal.
-        """
-        QMessageBox.warning(None,
-            self.trUtf8("Modification of Read Only file"),
-            self.trUtf8("""You are attempting to change a read only file. """
-                        """Please save to a different file first."""))
-        
-    def setNoName(self, noName):
-        """
-        Public method to set the display string for an unnamed editor.
-        
-        @param noName display string for this unnamed editor (string)
-        """
-        self.noName = noName
-        
-    def getNoName(self):
-        """
-        Public method to get the display string for an unnamed editor.
-        
-        @return display string for this unnamed editor (string)
-        """
-        return self.noName
-        
-    def getFileName(self):
-        """
-        Public method to return the name of the file being displayed.
-        
-        @return filename of the displayed file (string)
-        """
-        return self.fileName
-        
-    def getFileType(self):
-        """
-        Public method to return the type of the file being displayed.
-        
-        @return type of the displayed file (string)
-        """
-        return self.filetype
-        
-    def getEncoding(self):
-        """
-        Public method to return the current encoding.
-        
-        @return current encoding (string)
-        """
-        return self.encoding
-        
-    def getFolds(self):
-        """
-        Public method to get a list line numbers of collapsed folds.
-        
-        @return list of line numbers of folded lines (list of integer)
-        """
-        line = 0
-        folds = []
-        maxline = self.lines()
-        while line < maxline:
-            if self.foldHeaderAt(line) and not self.foldExpandedAt(line):
-                folds.append(line)
-            line += 1
-        return folds
-        
-    def isPyFile(self):
-        """
-        Public method to return a flag indicating a Python file.
-        
-        @return flag indicating a Python file (boolean)
-        """
-        return self.filetype == "Python" or \
-            (self.fileName is not None and \
-             os.path.splitext(self.fileName)[1] in self.pyExtensions)
-
-    def isPy3File(self):
-        """
-        Public method to return a flag indicating a Python3 file.
-        
-        @return flag indicating a Python3 file (boolean)
-        """
-        return self.filetype == "Python3" or \
-            (self.fileName is not None and \
-             os.path.splitext(self.fileName)[1] in self.py3Extensions)
-
-    def isRubyFile(self):
-        """
-        Public method to return a flag indicating a Ruby file.
-        
-        @return flag indicating a Ruby file (boolean)
-        """
-        return self.filetype == "Ruby" or \
-            (self.fileName is not None and \
-             os.path.splitext(self.fileName)[1] in self.rbExtensions)
-        
-    def highlightVisible(self):
-        """
-        Public method to make sure that the highlight is visible.
-        """
-        if self.lastHighlight is not None:
-            lineno = self.markerLine(self.lastHighlight)
-            self.ensureVisible(lineno+1)
-        
-    def highlight(self, line = None, error = False, syntaxError = False):
-        """
-        Public method to highlight (or de-highlight) a particular line.
-        
-        @param line line number to highlight (integer)
-        @param error flag indicating whether the error highlight should be used (boolean)
-        @param syntaxError flag indicating a syntax error (boolean)
-        """
-        if line is None:
-            self.lastHighlight = None
-            if self.lastErrorMarker is not None:
-                self.markerDeleteHandle(self.lastErrorMarker)
-            self.lastErrorMarker = None
-            if self.lastCurrMarker is not None:
-                self.markerDeleteHandle(self.lastCurrMarker)
-            self.lastCurrMarker = None
-        else:
-            if error:
-                if self.lastErrorMarker is not None:
-                    self.markerDeleteHandle(self.lastErrorMarker)
-                self.lastErrorMarker = self.markerAdd(line-1, self.errorline)
-                self.lastHighlight = self.lastErrorMarker
-            else:
-                if self.lastCurrMarker is not None:
-                    self.markerDeleteHandle(self.lastCurrMarker)
-                self.lastCurrMarker = self.markerAdd(line-1, self.currentline)
-                self.lastHighlight = self.lastCurrMarker
-            self.setCursorPosition(line-1, 0)
-        
-    def getHighlightPosition(self):
-        """
-        Public method to return the position of the highlight bar.
-        
-        @return line number of the highlight bar (integer)
-        """
-        if self.lastHighlight is not None:
-            return self.markerLine(self.lastHighlight)
-        else:
-            return 1
-    
-    ############################################################################
-    ## Breakpoint handling methods below
-    ############################################################################
-
-    def __linesChanged(self):
-        """
-        Private method to track text changes.
-        
-        This method checks, if lines have been inserted or removed in order to
-        update the breakpoints.
-        """
-        if self.breaks:
-            bps = []    # list of breakpoints
-            for handle, (ln, cond, temp, enabled, ignorecount) in list(self.breaks.items()):
-                line = self.markerLine(handle) + 1
-                bps.append((ln, line, (cond, temp, enabled, ignorecount)))
-                self.markerDeleteHandle(handle)
-            self.breaks = {}
-            for bp in bps:
-                index = self.breakpointModel.getBreakPointIndex(self.fileName, bp[0])
-                self.breakpointModel.setBreakPointByIndex(index, 
-                    self.fileName, bp[1], bp[2])
-        
-    def __restoreBreakpoints(self):
-        """
-        Private method to restore the breakpoints.
-        """
-        for handle in list(self.breaks.keys()):
-            self.markerDeleteHandle(handle)
-        self.__addBreakPoints(QModelIndex(), 0, self.breakpointModel.rowCount() - 1)
-        
-    def __deleteBreakPoints(self, parentIndex, start, end):
-        """
-        Private slot to delete breakpoints.
-        
-        @param parentIndex index of parent item (QModelIndex)
-        @param start start row (integer)
-        @param end end row (integer)
-        """
-        for row in range(start, end + 1):
-            index = self.breakpointModel.index(row, 0, parentIndex)
-            fn, lineno = self.breakpointModel.getBreakPointByIndex(index)[0:2]
-            if fn == self.fileName:
-                self.clearBreakpoint(lineno)
-        
-    def __changeBreakPoints(self, startIndex, endIndex):
-        """
-        Private slot to set changed breakpoints.
-        
-        @param indexes indexes of changed breakpoints.
-        """
-        self.__addBreakPoints(QModelIndex(), startIndex.row(), endIndex.row())
-        
-    def __breakPointDataAboutToBeChanged(self, startIndex, endIndex):
-        """
-        Private slot to handle the dataAboutToBeChanged signal of the breakpoint model.
-        
-        @param startIndex start index of the rows to be changed (QModelIndex)
-        @param endIndex end index of the rows to be changed (QModelIndex)
-        """
-        self.__deleteBreakPoints(QModelIndex(), startIndex.row(), endIndex.row())
-        
-    def __addBreakPoints(self, parentIndex, start, end):
-        """
-        Private slot to add breakpoints.
-        
-        @param parentIndex index of parent item (QModelIndex)
-        @param start start row (integer)
-        @param end end row (integer)
-        """
-        for row in range(start, end + 1):
-            index = self.breakpointModel.index(row, 0, parentIndex)
-            fn, line, cond, temp, enabled, ignorecount = \
-                self.breakpointModel.getBreakPointByIndex(index)[:6]
-            if fn == self.fileName:
-                self.newBreakpointWithProperties(line, (cond, temp, enabled, ignorecount))
-        
-    def clearBreakpoint(self, line):
-        """
-        Public method to clear a breakpoint.
-        
-        Note: This doesn't clear the breakpoint in the debugger,
-        it just deletes it from the editor internal list of breakpoints.
-        
-        @param line linenumber of the breakpoint (integer)
-        """
-        for handle, (ln, _, _, _, _) in list(self.breaks.items()):
-            if self.markerLine(handle) == line-1:
-                break
-        else:
-            # not found, simply ignore it
-            return
-        
-        del self.breaks[handle]
-        self.markerDeleteHandle(handle)
-        
-    def newBreakpointWithProperties(self, line, properties):
-        """
-        Private method to set a new breakpoint and its properties.
-        
-        @param line line number of the breakpoint (integer)
-        @param properties properties for the breakpoint (tuple)
-                (condition, temporary flag, enabled flag, ignore count)
-        """
-        if not properties[2]:
-            marker = self.dbreakpoint
-        elif properties[0]:
-            marker = properties[1] and self.tcbreakpoint or self.cbreakpoint
-        else:
-            marker = properties[1] and self.tbreakpoint or self.breakpoint
-            
-        handle = self.markerAdd(line-1, marker)
-        self.breaks[handle] = (line,) + properties
-        self.emit(SIGNAL('breakpointToggled'), self)
-        
-    def __toggleBreakpoint(self, line, temporary = False):
-        """
-        Private method to toggle a breakpoint.
-        
-        @param line line number of the breakpoint (integer)
-        @param temporary flag indicating a temporary breakpoint (boolean)
-        """
-        for handle, (ln, _, _, _, _) in list(self.breaks.items()):
-            if self.markerLine(handle) == line - 1:
-                # delete breakpoint or toggle it to the next state
-                index = self.breakpointModel.getBreakPointIndex(self.fileName, line)
-                if Preferences.getDebugger("ThreeStateBreakPoints") and \
-                   not self.breakpointModel.isBreakPointTemporaryByIndex(index):
-                    self.breakpointModel.deleteBreakPointByIndex(index)
-                    self.__addBreakPoint(line, True)
-                else:
-                    self.breakpointModel.deleteBreakPointByIndex(index)
-                    self.emit(SIGNAL('breakpointToggled'), self)
-                break
-        else:
-            self.__addBreakPoint(line, temporary)
-
-    def __addBreakPoint(self, line, temporary):
-        """
-        Private method to add a new breakpoint.
-        
-        @param line line number of the breakpoint (integer)
-        @param temporary flag indicating a temporary breakpoint (boolean)
-        """
-        if self.fileName and \
-           (self.isPyFile() or self.isPy3File() or self.isRubyFile()):
-            self.breakpointModel.addBreakPoint(self.fileName, line,
-                ('', temporary, True, 0))
-            self.emit(SIGNAL('breakpointToggled'), self)
-        
-    def __toggleBreakpointEnabled(self, line):
-        """
-        Private method to toggle a breakpoints enabled status.
-        
-        @param line line number of the breakpoint (integer)
-        """
-        for handle, (ln, cond, temp, enabled, ignorecount) in list(self.breaks.items()):
-            if self.markerLine(handle) == line - 1:
-                break
-        else:
-            # no breakpoint found on that line
-            return
-        
-        index = self.breakpointModel.getBreakPointIndex(self.fileName, line)
-        self.breakpointModel.setBreakPointEnabledByIndex(index, not enabled)
-        
-    def curLineHasBreakpoint(self):
-        """
-        Public method to check for the presence of a breakpoint at the current line.
-        
-        @return flag indicating the presence of a breakpoint (boolean)
-        """
-        line, _ = self.getCursorPosition()
-        return self.markersAtLine(line) & self.breakpointMask != 0
-        
-    def hasBreakpoints(self):
-        """
-        Public method to check for the presence of breakpoints.
-        
-        @return flag indicating the presence of breakpoints (boolean)
-        """
-        return len(self.breaks) > 0
-        
-    def __menuToggleTemporaryBreakpoint(self):
-        """
-        Private slot to handle the 'Toggle temporary breakpoint' context menu action.
-        """
-        if self.line < 0:
-            self.line, index = self.getCursorPosition()
-        self.line += 1
-        self.__toggleBreakpoint(self.line, 1)
-        self.line = -1
-        
-    def menuToggleBreakpoint(self):
-        """
-        Public slot to handle the 'Toggle breakpoint' context menu action.
-        """
-        if self.line < 0:
-            self.line, index = self.getCursorPosition()
-        self.line += 1
-        self.__toggleBreakpoint(self.line)
-        self.line = -1
-        
-    def __menuToggleBreakpointEnabled(self):
-        """
-        Private slot to handle the 'Enable/Disable breakpoint' context menu action.
-        """
-        if self.line < 0:
-            self.line, index = self.getCursorPosition()
-        self.line += 1
-        self.__toggleBreakpointEnabled(self.line)
-        self.line = -1
-        
-    def menuEditBreakpoint(self, line = None):
-        """
-        Public slot to handle the 'Edit breakpoint' context menu action.
-        
-        @param line linenumber of the breakpoint to edit
-        """
-        if line is not None:
-            self.line = line - 1
-        if self.line < 0:
-            self.line, index = self.getCursorPosition()
-        found = False
-        for handle, (ln, cond, temp, enabled, ignorecount) in list(self.breaks.items()):
-            if self.markerLine(handle) == self.line:
-                found = True
-                break
-        
-        if found:
-            index = self.breakpointModel.getBreakPointIndex(self.fileName, ln)
-            if not index.isValid():
-                return
-            
-            dlg = EditBreakpointDialog((self.fileName, ln), 
-                (cond, temp, enabled, ignorecount),
-                self.condHistory, self, modal = True)
-            if dlg.exec_() == QDialog.Accepted:
-                cond, temp, enabled, ignorecount = dlg.getData()
-                self.breakpointModel.setBreakPointByIndex(index, 
-                    self.fileName, ln, (cond, temp, enabled, ignorecount))
-        
-        self.line = -1
-        
-    def menuNextBreakpoint(self):
-        """
-        Public slot to handle the 'Next breakpoint' context menu action.
-        """
-        line, index = self.getCursorPosition()
-        if line == self.lines()-1:
-            line = 0
-        else:
-            line += 1
-        bpline = self.markerFindNext(line, self.breakpointMask)
-        if bpline < 0:
-            # wrap around
-            bpline = self.markerFindNext(0, self.breakpointMask)
-        if bpline >= 0:
-            self.setCursorPosition(bpline, 0)
-            self.ensureLineVisible(bpline)
-        
-    def menuPreviousBreakpoint(self):
-        """
-        Public slot to handle the 'Previous breakpoint' context menu action.
-        """
-        line, index = self.getCursorPosition()
-        if line == 0:
-            line = self.lines()-1
-        else:
-            line -= 1
-        bpline = self.markerFindPrevious(line, self.breakpointMask)
-        if bpline < 0:
-            # wrap around
-            bpline = self.markerFindPrevious(self.lines()-1, self.breakpointMask)
-        if bpline >= 0:
-            self.setCursorPosition(bpline, 0)
-            self.ensureLineVisible(bpline)
-        
-    def __menuClearBreakpoints(self):
-        """
-        Private slot to handle the 'Clear all breakpoints' context menu action.
-        """
-        self.__clearBreakpoints(self.fileName)
-        
-    def __clearBreakpoints(self, fileName):
-        """
-        Private slot to clear all breakpoints.
-        """
-        idxList = []
-        for handle, (ln, _, _, _, _) in list(self.breaks.items()):
-            index = self.breakpointModel.getBreakPointIndex(fileName, ln)
-            if index.isValid():
-                idxList.append(index)
-        if idxList:
-            self.breakpointModel.deleteBreakPoints(idxList)
-    
-    ############################################################################
-    ## Bookmark handling methods below
-    ############################################################################
-    
-    def toggleBookmark(self, line):
-        """
-        Public method to toggle a bookmark.
-        
-        @param line line number of the bookmark (integer)
-        """
-        for handle in self.bookmarks:
-            if self.markerLine(handle) == line - 1:
-                break
-        else:
-            # set a new bookmark
-            handle = self.markerAdd(line - 1, self.bookmark)
-            self.bookmarks.append(handle)
-            self.emit(SIGNAL('bookmarkToggled'), self)
-            return
-        
-        self.bookmarks.remove(handle)
-        self.markerDeleteHandle(handle)
-        self.emit(SIGNAL('bookmarkToggled'), self)
-        
-    def getBookmarks(self):
-        """
-        Public method to retrieve the bookmarks.
-        
-        @return sorted list of all lines containing a bookmark
-            (list of integer)
-        """
-        bmlist = []
-        for handle in self.bookmarks:
-            bmlist.append(self.markerLine(handle) + 1)
-        
-        bmlist.sort()
-        return bmlist
-        
-    def hasBookmarks(self):
-        """
-        Public method to check for the presence of bookmarks.
-        
-        @return flag indicating the presence of bookmarks (boolean)
-        """
-        return len(self.bookmarks) > 0
-    
-    def menuToggleBookmark(self):
-        """
-        Public slot to handle the 'Toggle bookmark' context menu action.
-        """
-        if self.line < 0:
-            self.line, index = self.getCursorPosition()
-        self.line += 1
-        self.toggleBookmark(self.line)
-        self.line = -1
-        
-    def nextBookmark(self):
-        """
-        Public slot to handle the 'Next bookmark' context menu action.
-        """
-        line, index = self.getCursorPosition()
-        if line == self.lines()-1:
-            line = 0
-        else:
-            line += 1
-        bmline = self.markerFindNext(line, 1 << self.bookmark)
-        if bmline < 0:
-            # wrap around
-            bmline = self.markerFindNext(0, 1 << self.bookmark)
-        if bmline >= 0:
-            self.setCursorPosition(bmline, 0)
-            self.ensureLineVisible(bmline)
-        
-    def previousBookmark(self):
-        """
-        Public slot to handle the 'Previous bookmark' context menu action.
-        """
-        line, index = self.getCursorPosition()
-        if line == 0:
-            line = self.lines()-1
-        else:
-            line -= 1
-        bmline = self.markerFindPrevious(line, 1 << self.bookmark)
-        if bmline < 0:
-            # wrap around
-            bmline = self.markerFindPrevious(self.lines() - 1, 1 << self.bookmark)
-        if bmline >= 0:
-            self.setCursorPosition(bmline, 0)
-            self.ensureLineVisible(bmline)
-        
-    def clearBookmarks(self):
-        """
-        Public slot to handle the 'Clear all bookmarks' context menu action.
-        """
-        for handle in self.bookmarks:
-            self.markerDeleteHandle(handle)
-        self.bookmarks = []
-        self.emit(SIGNAL('bookmarkToggled'), self)
-    
-    ############################################################################
-    ## Printing methods below
-    ############################################################################
-
-    def printFile(self):
-        """
-        Public slot to print the text.
-        """
-        printer = Printer(mode = QPrinter.HighResolution)
-        sb = e5App().getObject("UserInterface").statusBar()
-        printDialog = QPrintDialog(printer, self)
-        if self.hasSelectedText():
-            printDialog.addEnabledOption(QAbstractPrintDialog.PrintSelection)
-        if printDialog.exec_() == QDialog.Accepted:
-            sb.showMessage(self.trUtf8('Printing...'))
-            QApplication.processEvents()
-            fn = self.getFileName()
-            if fn is not None:
-                printer.setDocName(os.path.basename(fn))
-            else:
-                printer.setDocName(self.noName)
-            if printDialog.printRange() == QAbstractPrintDialog.Selection:
-                # get the selection
-                fromLine, fromIndex, toLine, toIndex = self.getSelection()
-                if toIndex == 0:
-                    toLine -= 1
-                # Qscintilla seems to print one line more than told
-                res = printer.printRange(self, fromLine, toLine-1)
-            else:
-                res = printer.printRange(self)
-            if res:
-                sb.showMessage(self.trUtf8('Printing completed'), 2000)
-            else:
-                sb.showMessage(self.trUtf8('Error while printing'), 2000)
-            QApplication.processEvents()
-        else:
-            sb.showMessage(self.trUtf8('Printing aborted'), 2000)
-            QApplication.processEvents()
-
-    def printPreviewFile(self):
-        """
-        Public slot to show a print preview of the text.
-        """
-        from PyQt4.QtGui import QPrintPreviewDialog
-        
-        printer = Printer(mode = QPrinter.HighResolution)
-        fn = self.getFileName()
-        if fn is not None:
-            printer.setDocName(os.path.basename(fn))
-        else:
-            printer.setDocName(self.noName)
-        preview = QPrintPreviewDialog(printer, self)
-        self.connect(preview, SIGNAL("paintRequested(QPrinter*)"), self.__printPreview)
-        preview.exec_()
-    
-    def __printPreview(self, printer):
-        """
-        Private slot to generate a print preview.
-        
-        @param printer reference to the printer object (QScintilla.Printer.Printer)
-        """
-        printer.printRange(self)
-    
-    ############################################################################
-    ## Task handling methods below
-    ############################################################################
-
-    def hasTaskMarkers(self):
-        """
-        Public method to determine, if this editor contains any task markers.
-        
-        @return flag indicating the presence of task markers (boolean)
-        """
-        return self.__hasTaskMarkers
-        
-    def nextTask(self):
-        """
-        Public slot to handle the 'Next task' context menu action.
-        """
-        line, index = self.getCursorPosition()
-        if line == self.lines()-1:
-            line = 0
-        else:
-            line += 1
-        taskline = self.markerFindNext(line, 1 << self.taskmarker)
-        if taskline < 0:
-            # wrap around
-            taskline = self.markerFindNext(0, 1 << self.taskmarker)
-        if taskline >= 0:
-            self.setCursorPosition(taskline, 0)
-            self.ensureLineVisible(taskline)
-        
-    def previousTask(self):
-        """
-        Public slot to handle the 'Previous task' context menu action.
-        """
-        line, index = self.getCursorPosition()
-        if line == 0:
-            line = self.lines()-1
-        else:
-            line -= 1
-        taskline = self.markerFindPrevious(line, 1 << self.taskmarker)
-        if taskline < 0:
-            # wrap around
-            taskline = self.markerFindPrevious(self.lines() - 1, 1 << self.taskmarker)
-        if taskline >= 0:
-            self.setCursorPosition(taskline, 0)
-            self.ensureLineVisible(taskline)
-        
-    def extractTasks(self):
-        """
-        Public slot to extract all tasks.
-        """
-        todoMarkers = Preferences.getTasks("TasksMarkers").split()
-        bugfixMarkers = Preferences.getTasks("TasksMarkersBugfix").split()
-        txtList = self.text().split(self.getLineSeparator())
-        
-        # clear all task markers and tasks
-        self.markerDeleteAll(self.taskmarker)
-        self.taskViewer.clearFileTasks(self.fileName)
-        self.__hasTaskMarkers = False
-        
-        # now search tasks and record them
-        lineIndex = -1
-        for line in txtList:
-            lineIndex += 1
-            shouldContinue = False
-            # normal tasks first
-            for tasksMarker in todoMarkers:
-                index = line.find(tasksMarker)
-                if index > -1:
-                    task = line[index:]
-                    self.markerAdd(lineIndex, self.taskmarker)
-                    self.taskViewer.addFileTask(task, self.fileName, lineIndex + 1, False)
-                    self.__hasTaskMarkers = True
-                    shouldContinue = True
-                    break
-            if shouldContinue:
-                continue
-            
-            # bugfix tasks second
-            for tasksMarker in bugfixMarkers:
-                index = line.find(tasksMarker)
-                if index > -1:
-                    task = line[index:]
-                    self.markerAdd(lineIndex, self.taskmarker)
-                    self.taskViewer.addFileTask(task, self.fileName, lineIndex+1, True)
-                    self.__hasTaskMarkers = True
-                    break
-        self.emit(SIGNAL('taskMarkersUpdated'), self)
-    
-    ############################################################################
-    ## File handling methods below
-    ############################################################################
-
-    def checkDirty(self):
-        """
-        Public method to check dirty status and open a message window.
-        
-        @return flag indicating successful reset of the dirty flag (boolean)
-        """
-        if self.isModified():
-            fn = self.fileName
-            if fn is None:
-                fn = self.noName
-            res = QMessageBox.warning(self.vm, 
-                self.trUtf8("File Modified"),
-                self.trUtf8("<p>The file <b>{0}</b> has unsaved changes.</p>")
-                    .format(fn),
-                QMessageBox.StandardButtons(\
-                    QMessageBox.Abort | \
-                    QMessageBox.Discard | \
-                    QMessageBox.Save),
-                QMessageBox.Save)
-            if res == QMessageBox.Save:
-                ok, newName = self.saveFile()
-                if ok:
-                    self.vm.setEditorName(self, newName)
-                return ok
-            elif res == QMessageBox.Abort or res == QMessageBox.Cancel:
-                return False
-        
-        return True
-        
-    def revertToUnmodified(self):
-        """
-        Public method to revert back to the last saved state.
-        """
-        undo_ = True
-        while self.isModified():
-            if undo_:
-            # try undo first
-                if self.isUndoAvailable():
-                    self.undo()
-                else:
-                    undo_ = False
-            else:
-            # try redo next
-                if self.isRedoAvailable():
-                    self.redo()
-                else:
-                    break
-                    # Couldn't find the unmodified state
-    
-    def readFile(self, fn, createIt = False):
-        """
-        Public slot to read the text from a file.
-        
-        @param fn filename to read from (string)
-        @param createIt flag indicating the creation of a new file, if the given
-            one doesn't exist (boolean)
-        """
-        QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
-        
-        try:
-            if createIt and not os.path.exists(fn):
-                f = open(fn, "w")
-                f.close()
-            txt, self.encoding = Utilities.readEncodedFile(fn)
-        except (UnicodeDecodeError, IOError) as why:
-            QApplication.restoreOverrideCursor()
-            QMessageBox.critical(self.vm, self.trUtf8('Open File'),
-                self.trUtf8('<p>The file <b>{0}</b> could not be opened.</p>'
-                            '<p>Reason: {1}</p>')
-                    .format(fn, str(why)))
-            QApplication.restoreOverrideCursor()
-            raise
-        fileEol = self.detectEolString(txt)
-        
-        modified = False
-        if (not Preferences.getEditor("TabForIndentation")) and \
-                Preferences.getEditor("ConvertTabsOnLoad") and \
-                not (self.lexer_ and \
-                     self.lexer_.alwaysKeepTabs()):
-            txtExpanded = txt.expandtabs(Preferences.getEditor("TabWidth"))
-            if txtExpanded != txt:
-                modified = True
-            txt = txtExpanded
-            del txtExpanded
-        
-        self.setText(txt)
-        
-        # perform automatic eol conversion
-        if Preferences.getEditor("AutomaticEOLConversion"):
-            self.convertEols(self.eolMode())
-        else:
-            self.setEolModeByEolString(fileEol)
-        
-        self.extractTasks()
-        
-        QApplication.restoreOverrideCursor()
-        
-        self.setModified(modified)
-        self.lastModified = QFileInfo(self.fileName).lastModified()
-        
-    def setEolModeByEolString(self, eolStr):
-        """
-        Public method to set the eol mode given the eol string.
-        
-        @param eolStr eol string (string)
-        """
-        if eolStr == '\r\n':
-            self.setEolMode(QsciScintilla.EolMode(QsciScintilla.EolWindows))
-        elif eolStr == '\n':
-            self.setEolMode(QsciScintilla.EolMode(QsciScintilla.EolUnix))
-        elif eolStr == '\r':
-            self.setEolMode(QsciScintilla.EolMode(QsciScintilla.EolMac))
-        self.__eolChanged()
-        
-    def __removeTrailingWhitespace(self):
-        """
-        Private method to remove trailing whitespace.
-        """
-        searchRE = r"[ \t]+$"    # whitespace at the end of a line
-        
-        ok = self.findFirstTarget(searchRE, True, False, False, 0, 0)
-        self.beginUndoAction()
-        while ok:
-            self.replaceTarget("")
-            ok = self.findNextTarget()
-        self.endUndoAction()
-        
-    def writeFile(self, fn):
-        """
-        Public slot to write the text to a file.
-        
-        @param fn filename to write to (string)
-        @return flag indicating success (boolean)
-        """
-        if Preferences.getEditor("StripTrailingWhitespace"):
-            self.__removeTrailingWhitespace()
-        
-        txt = self.text()
-        # work around glitch in scintilla: always make sure, 
-        # that the last line is terminated properly
-        eol = self.getLineSeparator()
-        if eol:
-            if len(txt) >= len(eol):
-                if txt[-len(eol):] != eol:
-                    txt += eol
-            else:
-                txt += eol
-        
-        # create a backup file, if the option is set
-        createBackup = Preferences.getEditor("CreateBackupFile")
-        if createBackup:
-            if os.path.islink(fn):
-                fn = os.path.realpath(fn)
-            bfn = '%s~' % fn
-            try:
-                permissions = os.stat(fn).st_mode
-                perms_valid = True
-            except EnvironmentError:
-                # if there was an error, ignore it
-                perms_valid = False
-            try:
-                os.remove(bfn)
-            except EnvironmentError:
-                # if there was an error, ignore it
-                pass
-            try:
-                os.rename(fn, bfn)
-            except EnvironmentError:
-                # if there was an error, ignore it
-                pass
-        
-        # now write text to the file fn
-        try:
-            self.encoding = Utilities.writeEncodedFile(fn, txt, self.encoding)
-            if createBackup and perms_valid:
-                os.chmod(fn, permissions)
-            return True
-        except (IOError, Utilities.CodingError, UnicodeError) as why:
-            QMessageBox.critical(self, self.trUtf8('Save File'),
-                self.trUtf8('<p>The file <b>{0}</b> could not be saved.<br/>'
-                            'Reason: {1}</p>')
-                    .format(fn, str(why)))
-            return False
-        
-    def saveFile(self, saveas = False, path = None):
-        """
-        Public slot to save the text to a file.
-        
-        @param saveas flag indicating a 'save as' action (boolean)
-        @param path directory to save the file in (string)
-        @return tuple of two values (boolean, string) giving a success indicator and
-            the name of the saved file
-        """
-        if not saveas and not self.isModified():
-            return (False, None)      # do nothing if text wasn't changed
-            
-        newName = None
-        if saveas or self.fileName is None:
-            saveas = True
-            if not path and self.fileName is not None:
-                path = os.path.dirname(self.fileName)
-            if path is None:
-                path = ""
-            defaultFilter = Preferences.getEditor("DefaultSaveFilter")
-            fn, selectedFilter = QFileDialog.getSaveFileNameAndFilter(
-                self,
-                self.trUtf8("Save File"),
-                path,
-                Lexers.getSaveFileFiltersList(True, True), 
-                defaultFilter,
-                QFileDialog.Options(QFileDialog.DontConfirmOverwrite))
-            
-            if fn:
-                ext = QFileInfo(fn).suffix()
-                if not ext:
-                    ex = selectedFilter.split("(*")[1].split(")")[0]
-                    if ex:
-                        fn += ex
-                if QFileInfo(fn).exists():
-                    res = QMessageBox.warning(self,
-                        self.trUtf8("Save File"),
-                        self.trUtf8("<p>The file <b>{0}</b> already exists.</p>")
-                            .format(fn),
-                        QMessageBox.StandardButtons(\
-                            QMessageBox.Abort | \
-                            QMessageBox.Save),
-                        QMessageBox.Abort)
-                    if res == QMessageBox.Abort or res == QMessageBox.Cancel:
-                        return (False, None)
-                fn = Utilities.toNativeSeparators(fn)
-                newName = fn
-            else:
-                return (False, None)
-        else:
-            fn = self.fileName
-        
-        self.emit(SIGNAL('editorAboutToBeSaved'), self.fileName)
-        if self.writeFile(fn):
-            if saveas:
-                self.__clearBreakpoints(self.fileName)
-            self.fileName = fn
-            self.setModified(False)
-            self.setReadOnly(False)
-            self.setWindowTitle(self.fileName)
-            if self.lexer_ is None and not self.__lexerReset:
-                self.setLanguage(self.fileName)
-            
-            if saveas:
-                self.isResourcesFile = self.fileName.endswith(".qrc")
-                self.__initContextMenu()
-                self.emit(SIGNAL('editorRenamed'), self.fileName)
-            self.lastModified = QFileInfo(self.fileName).lastModified()
-            if newName is not None:
-                self.vm.addToRecentList(newName)
-            self.emit(SIGNAL('editorSaved'), self.fileName)
-            self.__autoSyntaxCheck()
-            self.extractTasks()
-            return (True, self.fileName)
-        else:
-            self.lastModified = QFileInfo(fn).lastModified()
-            return (False, None)
-        
-    def saveFileAs(self, path = None):
-        """
-        Public slot to save a file with a new name.
-        
-        @param path directory to save the file in (string)
-        @return tuple of two values (boolean, string) giving a success indicator and
-            the name of the saved file
-        """
-        return self.saveFile(True, path)
-        
-    def handleRenamed(self, fn):
-        """
-        Public slot to handle the editorRenamed signal.
-        
-        @param fn filename to be set for the editor (string).
-        """
-        self.__clearBreakpoints(fn)
-        
-        self.fileName = fn
-        self.setWindowTitle(self.fileName)
-        
-        if self.lexer_ is None:
-            self.setLanguage(self.fileName)
-        
-        self.lastModified = QFileInfo(self.fileName).lastModified()
-        self.vm.setEditorName(self, self.fileName)
-        self.__updateReadOnly(True)
-        
-    def fileRenamed(self, fn):
-        """
-        Public slot to handle the editorRenamed signal.
-        
-        @param fn filename to be set for the editor (string).
-        """
-        self.handleRenamed(fn)
-        if not self.inFileRenamed:
-            self.inFileRenamed = True
-            self.emit(SIGNAL('editorRenamed'), self.fileName)
-            self.inFileRenamed = False
-    
-    ############################################################################
-    ## Utility methods below
-    ############################################################################
-
-    def ensureVisible(self, line):
-        """
-        Public slot to ensure, that the specified line is visible.
-        
-        @param line line number to make visible
-        """
-        self.ensureLineVisible(line-1)
-        
-    def ensureVisibleTop(self, line):
-        """
-        Public slot to ensure, that the specified line is visible at the top
-        of the editor.
-        
-        @param line line number to make visible
-        """
-        topLine = self.firstVisibleLine()
-        linesToScroll = line - topLine
-        self.scrollVertical(linesToScroll)
-        
-    def __marginClicked(self, margin, line, modifiers):
-        """
-        Private slot to handle the marginClicked signal.
-        
-        @param margin id of the clicked margin (integer)
-        @param line line number of the click (integer)
-        @param modifiers keyboard modifiers (Qt.KeyboardModifiers)
-        """
-        if self.__unifiedMargins:
-            if margin == 1:
-                if modifiers & Qt.KeyboardModifiers(Qt.ShiftModifier):
-                    if self.marginMenuActs["LMBbreakpoints"].isChecked():
-                        self.toggleBookmark(line + 1)
-                    else:
-                        self.__toggleBreakpoint(line + 1)
-                elif modifiers & Qt.KeyboardModifiers(Qt.ControlModifier):
-                    if self.markersAtLine(line) & (1 << self.syntaxerror):
-                        self.__showSyntaxError(line)
-                else:
-                    if self.marginMenuActs["LMBbreakpoints"].isChecked():
-                        self.__toggleBreakpoint(line + 1)
-                    else:
-                        self.toggleBookmark(line + 1)
-        else:
-            if margin == self.__bmMargin:
-                        self.toggleBookmark(line + 1)
-            elif margin == self.__bpMargin:
-                        self.__toggleBreakpoint(line + 1)
-            elif margin == self.__indicMargin:
-                if self.markersAtLine(line) & (1 << self.syntaxerror):
-                    self.__showSyntaxError(line)
-        
-    def handleMonospacedEnable(self):
-        """
-        Private slot to handle the Use Monospaced Font context menu entry.
-        """
-        if self.menuActs["MonospacedFont"].isChecked():
-            self.setMonospaced(True)
-        else:
-            if self.lexer_:
-                self.lexer_.readSettings(Preferences.Prefs.settings, "Scintilla")
-                self.lexer_.initProperties()
-            self.setMonospaced(False)
-            self.__setMarginsDisplay()
-        
-    def getWordBoundaries(self, line, index, useWordChars = True):
-        """
-        Public method to get the word boundaries at a position.
-        
-        @param line number of line to look at (int)
-        @param index position to look at (int)
-        @keyparam useWordChars flag indicating to use the wordCharacters 
-            method (boolean)
-        @return tuple with start and end indices of the word at the position
-            (integer, integer)
-        """
-        text = self.text(line)
-        if self.caseSensitive():
-            cs = Qt.CaseSensitive
-        else:
-            cs = Qt.CaseInsensitive
-        wc = self.wordCharacters()
-        if wc is None or not useWordChars:
-            regExp = QRegExp('[^\w_]', cs)
-        else:
-            regExp = QRegExp('[^%s]' % re.escape(wc), cs)
-        start = regExp.lastIndexIn(text, index) + 1
-        end = regExp.indexIn(text, index)
-        if start == end + 1 and index > 0:
-            # we are on a word boundary, try again
-            start = regExp.lastIndexIn(text, index - 1) + 1
-        if start == -1:
-            start = 0
-        if end == -1:
-            end = len(text)
-        
-        return (start, end)
-        
-    def getWord(self, line, index, direction = 0, useWordChars = True):
-        """
-        Public method to get the word at a position.
-        
-        @param line number of line to look at (int)
-        @param index position to look at (int)
-        @param direction direction to look in (0 = whole word, 1 = left, 2 = right)
-        @keyparam useWordChars flag indicating to use the wordCharacters 
-            method (boolean)
-        @return the word at that position (string)
-        """
-        start, end = self.getWordBoundaries(line, index, useWordChars)
-        if direction == 1:
-            end = index
-        elif direction == 2:
-            start = index
-        if end > start:
-            text = self.text(line)
-            word = text[start:end]
-        else:
-            word = ''
-        return word
-        
-    def getWordLeft(self, line, index):
-        """
-        Public method to get the word to the left of a position.
-        
-        @param line number of line to look at (int)
-        @param index position to look at (int)
-        @return the word to the left of that position (string)
-        """
-        return self.getWord(line, index, 1)
-        
-    def getWordRight(self, line, index):
-        """
-        Public method to get the word to the right of a position.
-        
-        @param line number of line to look at (int)
-        @param index position to look at (int)
-        @return the word to the right of that position (string)
-        """
-        return self.getWord(line, index, 2)
-        
-    def getCurrentWord(self):
-        """
-        Public method to get the word at the current position.
-        
-        @return the word at that current position (string)
-        """
-        line, index = self.getCursorPosition()
-        return self.getWord(line, index)
-        
-    def selectWord(self, line, index):
-        """
-        Public method to select the word at a position.
-        
-        @param line number of line to look at (int)
-        @param index position to look at (int)
-        """
-        start, end = self.getWordBoundaries(line, index)
-        self.setSelection(line, start, line, end)
-        
-    def selectCurrentWord(self):
-        """
-        Public method to select the current word.
-        """
-        line, index = self.getCursorPosition()
-        self.selectWord(line, index)
-        
-    def __getCharacter(self, pos):
-        """
-        Private method to get the character to the left of the current position
-        in the current line.
-        
-        @param pos position to get character at (integer)
-        @return requested character or "", if there are no more (string) and
-            the next position (i.e. pos - 1)
-        """
-        if pos <= 0:
-            return "", pos
-        
-        pos = self.positionBefore(pos)
-        ch = self.charAt(pos)
-        
-        # Don't go past the end of the previous line
-        if ch == '\n' or ch == '\r':
-            return "", pos
-        
-        return ch, pos
-    
-    def getSearchText(self, selectionOnly = False):
-        """
-        Public method to determine the selection or the current word for the next 
-        search operation.
-        
-        @param selectionOnly flag indicating that only selected text should be
-            returned (boolean)
-        @return selection or current word (string)
-        """
-        if self.hasSelectedText():
-            text = self.selectedText()
-            if '\r' in text or '\n' in text:
-                # the selection contains at least a newline, it is
-                # unlikely to be the expression to search for
-                return ''
-            
-            return text
-        
-        if not selectionOnly:
-            # no selected text, determine the word at the current position
-            return self.getCurrentWord()
-        
-        return ''
-        
-    def setSearchIndicator(self, startPos, indicLength):
-        """
-        Public method to set a search indicator for the given range.
-        
-        @param startPos start position of the indicator (integer)
-        @param indicLength length of the indicator (integer)
-        """
-        self.setIndicatorRange(self.searchIndicator, startPos, indicLength)
-        
-    def clearSearchIndicators(self):
-        """
-        Public method to clear all search indicators.
-        """
-        self.clearAllIndicators(self.searchIndicator)
-        self.__markedText = ""
-        
-    def __markOccurrences(self):
-        """
-        Private method to mark all occurrences of the current word.
-        """
-        word = self.getCurrentWord()
-        if not word:
-            self.clearSearchIndicators()
-            return
-        
-        if self.__markedText == word:
-            return
-        
-        self.clearSearchIndicators()
-        ok = self.findFirstTarget(word, False, self.caseSensitive(), True, 0, 0)
-        while ok:
-            tgtPos, tgtLen = self.getFoundTarget()
-            self.setSearchIndicator(tgtPos, tgtLen)
-            ok = self.findNextTarget()
-        self.__markedText = word
-    
-    ############################################################################
-    ## Comment handling methods below
-    ############################################################################
-
-    def commentLine(self):
-        """
-        Public slot to comment the current line.
-        """
-        if self.lexer_ is None or not self.lexer_.canBlockComment():
-            return
-        
-        line, index = self.getCursorPosition()
-        self.beginUndoAction()
-        if Preferences.getEditor("CommentColumn0"):
-            self.insertAt(self.lexer_.commentStr(), line, 0)
-        else:
-            self.insertAt(self.lexer_.commentStr(), line, self.indentation(line))
-        self.endUndoAction()
-        
-    def uncommentLine(self):
-        """
-        Public slot to uncomment the current line.
-        """
-        if self.lexer_ is None or not self.lexer_.canBlockComment():
-            return
-        
-        commentStr = self.lexer_.commentStr()
-        line, index = self.getCursorPosition()
-        
-        # check if line starts with our comment string (i.e. was commented
-        # by our comment...() slots
-        if not self.text(line).strip().startswith(commentStr):
-            return
-        
-        # now remove the comment string
-        self.beginUndoAction()
-        if Preferences.getEditor("CommentColumn0"):
-            self.setSelection(line, 0, line, len(commentStr))
-        else:
-            self.setSelection(line, self.indentation(line), 
-                              line, self.indentation(line) + len(commentStr))
-        self.removeSelectedText()
-        self.endUndoAction()
-        
-    def commentSelection(self):
-        """
-        Public slot to comment the current selection.
-        """
-        if self.lexer_ is None or not self.lexer_.canBlockComment():
-            return
-        
-        if not self.hasSelectedText():
-            return
-        
-        commentStr = self.lexer_.commentStr()
-        
-        # get the selection boundaries
-        lineFrom, indexFrom, lineTo, indexTo = self.getSelection()
-        if indexTo == 0:
-            endLine = lineTo - 1
-        else:
-            endLine = lineTo
-        
-        self.beginUndoAction()
-        # iterate over the lines
-        for line in range(lineFrom, endLine + 1):
-            if Preferences.getEditor("CommentColumn0"):
-                self.insertAt(commentStr, line, 0)
-            else:
-                self.insertAt(commentStr, line, self.indentation(line))
-        
-        # change the selection accordingly
-        self.setSelection(lineFrom, 0, endLine + 1, 0)
-        self.endUndoAction()
-        
-    def uncommentSelection(self):
-        """
-        Public slot to uncomment the current selection. 
-        """
-        if self.lexer_ is None or not self.lexer_.canBlockComment():
-            return
-        
-        if not self.hasSelectedText():
-            return
-        
-        commentStr = self.lexer_.commentStr()
-        
-        # get the selection boundaries
-        lineFrom, indexFrom, lineTo, indexTo = self.getSelection()
-        if indexTo == 0:
-            endLine = lineTo - 1
-        else:
-            endLine = lineTo
-        
-        self.beginUndoAction()
-        # iterate over the lines
-        for line in range(lineFrom, endLine+1):
-            # check if line starts with our comment string (i.e. was commented
-            # by our comment...() slots
-            if not self.text(line).strip().startswith(commentStr):
-                continue
-            
-            if Preferences.getEditor("CommentColumn0"):
-                self.setSelection(line, 0, line, len(commentStr))
-            else:
-                self.setSelection(line, self.indentation(line), 
-                                  line, self.indentation(line) + len(commentStr))
-            self.removeSelectedText()
-            
-            # adjust selection start
-            if line == lineFrom:
-                indexFrom -= len(commentStr)
-                if indexFrom < 0:
-                    indexFrom = 0
-            
-            # adjust selection end
-            if line == lineTo:
-                indexTo -= len(commentStr)
-                if indexTo < 0:
-                    indexTo = 0
-            
-        # change the selection accordingly
-        self.setSelection(lineFrom, indexFrom, lineTo, indexTo)
-        self.endUndoAction()
-        
-    def commentLineOrSelection(self):
-        """
-        Public slot to comment the current line or current selection.
-        """
-        if self.hasSelectedText():
-            self.commentSelection()
-        else:
-            self.commentLine()
-
-    def uncommentLineOrSelection(self):
-        """
-        Public slot to uncomment the current line or current selection.
-        """
-        if self.hasSelectedText():
-            self.uncommentSelection()
-        else:
-            self.uncommentLine()
-
-    def streamCommentLine(self):
-        """
-        Public slot to stream comment the current line.
-        """
-        if self.lexer_ is None or not self.lexer_.canStreamComment():
-            return
-        
-        commentStr = self.lexer_.streamCommentStr()
-        line, index = self.getCursorPosition()
-        
-        self.beginUndoAction()
-        self.insertAt(commentStr['end'], line, self.lineLength(line))
-        self.insertAt(commentStr['start'], line, 0)
-        self.endUndoAction()
-        
-    def streamCommentSelection(self):
-        """
-        Public slot to comment the current selection.
-        """
-        if self.lexer_ is None or not self.lexer_.canStreamComment():
-            return
-        
-        if not self.hasSelectedText():
-            return
-        
-        commentStr = self.lexer_.streamCommentStr()
-        
-        # get the selection boundaries
-        lineFrom, indexFrom, lineTo, indexTo = self.getSelection()
-        if indexTo == 0:
-            endLine = lineTo - 1
-            endIndex = self.lineLength(endLine)
-        else:
-            endLine = lineTo
-            endIndex = indexTo
-        
-        self.beginUndoAction()
-        self.insertAt(commentStr['end'], endLine, endIndex)
-        self.insertAt(commentStr['start'], lineFrom, indexFrom)
-        
-        # change the selection accordingly
-        if indexTo > 0:
-            indexTo += len(commentStr['end'])
-            if lineFrom == endLine:
-                indexTo += len(commentStr['start'])
-        self.setSelection(lineFrom, indexFrom, lineTo, indexTo)
-        self.endUndoAction()
-        
-    def streamCommentLineOrSelection(self):
-        """
-        Public slot to stream comment the current line or current selection.
-        """
-        if self.hasSelectedText():
-            self.streamCommentSelection()
-        else:
-            self.streamCommentLine()
-        
-    def boxCommentLine(self):
-        """
-        Public slot to box comment the current line.
-        """
-        if self.lexer_ is None or not self.lexer_.canBoxComment():
-            return
-        
-        commentStr = self.lexer_.boxCommentStr()
-        line, index = self.getCursorPosition()
-        
-        eol = self.getLineSeparator()
-        self.beginUndoAction()
-        self.insertAt(eol, line, self.lineLength(line))
-        self.insertAt(commentStr['end'], line + 1, 0)
-        self.insertAt(commentStr['middle'], line, 0)
-        self.insertAt(eol, line, 0)
-        self.insertAt(commentStr['start'], line, 0)
-        self.endUndoAction()
-        
-    def boxCommentSelection(self):
-        """
-        Public slot to box comment the current selection.
-        """
-        if self.lexer_ is None or not self.lexer_.canBoxComment():
-            return
-        
-        if not self.hasSelectedText():
-            return
-            
-        commentStr = self.lexer_.boxCommentStr()
-        
-        # get the selection boundaries
-        lineFrom, indexFrom, lineTo, indexTo = self.getSelection()
-        if indexTo == 0:
-            endLine = lineTo - 1
-        else:
-            endLine = lineTo
-        
-        self.beginUndoAction()
-        # iterate over the lines
-        for line in range(lineFrom, endLine + 1):
-            self.insertAt(commentStr['middle'], line, 0)
-        
-        # now do the comments before and after the selection
-        eol = self.getLineSeparator()
-        self.insertAt(eol, endLine, self.lineLength(endLine))
-        self.insertAt(commentStr['end'], endLine + 1, 0)
-        self.insertAt(eol, lineFrom, 0)
-        self.insertAt(commentStr['start'], lineFrom, 0)
-        
-        # change the selection accordingly
-        self.setSelection(lineFrom, 0, endLine + 3, 0)
-        self.endUndoAction()
-        
-    def boxCommentLineOrSelection(self):
-        """
-        Public slot to box comment the current line or current selection.
-        """
-        if self.hasSelectedText():
-            self.boxCommentSelection()
-        else:
-            self.boxCommentLine()
-    
-    ############################################################################
-    ## Indentation handling methods below
-    ############################################################################
-
-    def __indentLine(self, indent = True):
-        """
-        Private method to indent or unindent the current line. 
-        
-        @param indent flag indicating an indent operation (boolean)
-                <br />If the flag is true, an indent operation is performed.
-                Otherwise the current line is unindented.
-        """
-        line, index = self.getCursorPosition()
-        self.beginUndoAction()
-        if indent:
-            self.indent(line)
-        else:
-            self.unindent(line)
-        self.endUndoAction()
-        if indent:
-            self.setCursorPosition(line, index + self.indentationWidth())
-        else:
-            self.setCursorPosition(line, index - self.indentationWidth())
-        
-    def __indentSelection(self, indent = True):
-        """
-        Private method to indent or unindent the current selection. 
-        
-        @param indent flag indicating an indent operation (boolean)
-                <br />If the flag is true, an indent operation is performed.
-                Otherwise the current line is unindented.
-        """
-        if not self.hasSelectedText():
-            return
-        
-        # get the selection
-        lineFrom, indexFrom, lineTo, indexTo = self.getSelection()
-        
-        if indexTo == 0:
-            endLine = lineTo - 1
-        else:
-            endLine = lineTo
-        
-        self.beginUndoAction()
-        # iterate over the lines
-        for line in range(lineFrom, endLine + 1):
-            if indent:
-                self.indent(line)
-            else:
-                self.unindent(line)
-        self.endUndoAction()
-        if indent:
-            if indexTo == 0:
-                self.setSelection(lineFrom, indexFrom + self.indentationWidth(),
-                                  lineTo, 0)
-            else:
-                self.setSelection(lineFrom, indexFrom + self.indentationWidth(),
-                                  lineTo, indexTo + self.indentationWidth())
-        else:
-            indexStart = indexFrom - self.indentationWidth()
-            if indexStart < 0:
-                indexStart = 0
-            indexEnd = indexTo - self.indentationWidth()
-            if indexEnd < 0:
-                indexEnd = 0
-            self.setSelection(lineFrom, indexStart, lineTo, indexEnd)
-        
-    def indentLineOrSelection(self):
-        """
-        Public slot to indent the current line or current selection
-        """
-        if self.hasSelectedText():
-            self.__indentSelection(True)
-        else:
-            self.__indentLine(True)
-        
-    def unindentLineOrSelection(self):
-        """
-        Public slot to unindent the current line or current selection.
-        """
-        if self.hasSelectedText():
-            self.__indentSelection(False)
-        else:
-            self.__indentLine(False)
-        
-    def smartIndentLineOrSelection(self):
-        """
-        Public slot to indent current line smartly.
-        """
-        if self.hasSelectedText():
-            if self.lexer_ and self.lexer_.hasSmartIndent():
-                self.lexer_.smartIndentSelection(self)
-            else:
-                self.__indentSelection(True)
-        else:
-            if self.lexer_ and self.lexer_.hasSmartIndent():
-                self.lexer_.smartIndentLine(self)
-            else:
-                self.__indentLine(True)
-        
-    def gotoLine(self, line):
-        """
-        Public slot to jump to the beginning of a line.
-        
-        @param line line number to go to (integer)
-        """
-        self.setCursorPosition(line - 1, 0)
-        self.ensureVisible(line)
-    
-    ############################################################################
-    ## Setup methods below
-    ############################################################################
-
-    def readSettings(self):
-        """
-        Public slot to read the settings into our lexer.
-        """
-        # read the lexer settings and reinit the properties
-        if self.lexer_ is not None:
-            self.lexer_.readSettings(Preferences.Prefs.settings, "Scintilla")
-            self.lexer_.initProperties()
-            
-            # initialize the auto indent style of the lexer
-            ais = self.lexer_.autoIndentStyle()
-        
-        # read the typing completer settings
-        if self.completer is not None:
-            self.completer.readSettings()
-        
-        # set the margins layout
-        if QSCINTILLA_VERSION() >= 0x020301:
-            self.__unifiedMargins = Preferences.getEditor("UnifiedMargins")
-        
-        # set the line marker colours
-        self.__setLineMarkerColours()
-        
-        # set the text display
-        self.__setTextDisplay()
-        
-        # set margin 0 and 2 configuration
-        self.__setMarginsDisplay()
-        
-        # set the autocompletion and calltips function
-        self.__setAutoCompletion()
-        self.__setCallTips()
-        
-        # set the autosave flags
-        self.autosaveEnabled = Preferences.getEditor("AutosaveInterval") > 0
-        
-        if Preferences.getEditor("MiniContextMenu") != self.miniMenu:
-            # regenerate context menu
-            self.__initContextMenu()
-        else:
-            # set checked context menu items
-            self.menuActs["AutoCompletionEnable"].setChecked(\
-                self.autoCompletionThreshold() != -1)
-            self.menuActs["MonospacedFont"].setChecked(\
-                self.useMonospaced)
-            self.menuActs["AutosaveEnable"].setChecked(\
-                self.autosaveEnabled and not self.autosaveManuallyDisabled)
-        
-        # regenerate the margins context menu(s)
-        self.__initContextMenuMargins()
-        
-        if Preferences.getEditor("MarkOccurrencesEnabled"):
-            self.__markOccurrencesTimer.setInterval(
-                Preferences.getEditor("MarkOccurrencesTimeout"))
-        else:
-            self.__markOccurrencesTimer.stop()
-            self.clearSearchIndicators()
-    
-    def __setLineMarkerColours(self):
-        """
-        Private method to set the line marker colours.
-        """
-        self.setMarkerForegroundColor(Preferences.getEditorColour("CurrentMarker"),
-            self.currentline)
-        self.setMarkerBackgroundColor(Preferences.getEditorColour("CurrentMarker"),
-            self.currentline)
-        self.setMarkerForegroundColor(Preferences.getEditorColour("ErrorMarker"),
-            self.errorline)
-        self.setMarkerBackgroundColor(Preferences.getEditorColour("ErrorMarker"),
-            self.errorline)
-        
-    def __setMarginsDisplay(self):
-        """
-        Private method to configure margins 0 and 2.
-        """
-        # set the settings for all margins
-        self.setMarginsFont(Preferences.getEditorOtherFonts("MarginsFont"))
-        self.setMarginsForegroundColor(Preferences.getEditorColour("MarginsForeground"))
-        self.setMarginsBackgroundColor(Preferences.getEditorColour("MarginsBackground"))
-        
-        # reset standard margins settings
-        for margin in range(5):
-            self.setMarginLineNumbers(margin, False)
-            self.setMarginMarkerMask(margin, 0)
-            self.setMarginWidth(margin, 0)
-            self.setMarginSensitivity(margin, False)
-        
-        # set marker margin(s) settings
-        if self.__unifiedMargins:
-            margin1Mask = (1 << self.breakpoint)   | \
-                          (1 << self.cbreakpoint)  | \
-                          (1 << self.tbreakpoint)  | \
-                          (1 << self.tcbreakpoint) | \
-                          (1 << self.dbreakpoint)  | \
-                          (1 << self.currentline)  | \
-                          (1 << self.errorline)    | \
-                          (1 << self.bookmark)     | \
-                          (1 << self.syntaxerror)  | \
-                          (1 << self.notcovered)   | \
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2002 - 2010 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing the editor component of the eric5 IDE.
+"""
+
+import os
+import re
+import types
+    
+from PyQt4.Qsci import QsciScintilla, QsciMacro
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+from E5Gui.E5Application import e5App
+
+from . import Exporters
+from . import Lexers
+from . import TypingCompleters
+from .QsciScintillaCompat import QsciScintillaCompat, QSCINTILLA_VERSION
+from .SpellChecker import SpellChecker
+from .SpellCheckingDialog import SpellCheckingDialog
+
+from Debugger.EditBreakpointDialog import EditBreakpointDialog
+
+from DebugClients.Python3.coverage import coverage
+
+from DataViews.CodeMetricsDialog import CodeMetricsDialog
+from DataViews.PyCoverageDialog import PyCoverageDialog
+from DataViews.PyProfileDialog import PyProfileDialog
+
+from .Printer import Printer
+
+import Preferences
+import Utilities
+from Utilities.py3flakes.checker import Checker
+from Utilities.py3flakes.messages import ImportStarUsed
+
+import UI.PixmapCache
+
+EditorAutoCompletionListID = 1
+TemplateCompletionListID = 2
+
+class Editor(QsciScintillaCompat):
+    """
+    Class implementing the editor component of the eric5 IDE.
+    
+    @signal modificationStatusChanged(boolean, editor) emitted when the
+            modification status has changed
+    @signal undoAvailable(boolean) emitted to signal the undo availability
+    @signal redoAvailable(boolean) emitted to signal the redo availability
+    @signal cursorChanged(string, int, int) emitted when the cursor position
+            was changed
+    @signal editorAboutToBeSaved(string) emitted before the editor is saved
+    @signal editorSaved(string) emitted after the editor has been saved
+    @signal editorRenamed(string) emitted after the editor got a new name
+            (i.e. after a 'Save As')
+    @signal captionChanged(string, editor) emitted when the caption is
+            updated. Typically due to a readOnly attribute change.
+    @signal breakpointToggled(editor) emitted when a breakpoint is toggled
+    @signal bookmarkToggled(editor) emitted when a bookmark is toggled
+    @signal syntaxerrorToggled(editor) emitted when a syntax error was discovered
+    @signal autoCompletionAPIsAvailable(avail) emitted after the autocompletion
+            function has been configured
+    @signal coverageMarkersShown(boolean) emitted after the coverage markers have been 
+            shown or cleared
+    @signal taskMarkersUpdated(editor) emitted when the task markers were updated
+    @signal showMenu(string, QMenu, editor) emitted when a menu is about to be shown.
+            The name of the menu, a reference to the menu and a reference to the
+            editor are given.
+    @signal languageChanged(language) emitted when the editors language was set. The
+            language is passed as a parameter.
+    @signal eolChanged(eol) emitted when the editors eol type was set. The eol string
+            is passed as a parameter.
+    @signal encodingChanged(encoding) emitted when the editors encoding was set. The 
+            encoding name is passed as a parameter.
+    """
+    ClassID              = 1
+    ClassProtectedID     = 2
+    ClassPrivateID       = 3
+    MethodID             = 4
+    MethodProtectedID    = 5
+    MethodPrivateID      = 6
+    AttributeID          = 7
+    AttributeProtectedID = 8
+    AttributePrivateID   = 9
+    EnumID               = 10
+    
+    FromDocumentID       = 99
+    
+    TemplateImageID      = 100
+    
+    def __init__(self, dbs, fn = None, vm = None,
+                 filetype = "", editor = None, tv = None):
+        """
+        Constructor
+        
+        @param dbs reference to the debug server object
+        @param fn name of the file to be opened (string). If it is None,
+                a new (empty) editor is opened
+        @param vm reference to the view manager object (ViewManager.ViewManager)
+        @param filetype type of the source file (string)
+        @param editor reference to an Editor object, if this is a cloned view
+        @param tv reference to the task viewer object
+        """
+        QsciScintillaCompat.__init__(self)
+        self.setAttribute(Qt.WA_DeleteOnClose)
+        self.setAttribute(Qt.WA_KeyCompression)
+        self.setUtf8(True)
+        
+        self.pyExtensions = dbs.getExtensions('Python')
+        self.py3Extensions = dbs.getExtensions('Python3')
+        self.rbExtensions = dbs.getExtensions('Ruby')
+        
+        self.dbs = dbs
+        self.taskViewer = tv
+        self.fileName = fn
+        self.vm = vm
+        self.filetype = filetype
+        self.noName = ""
+        
+        # clear some variables
+        self.lastHighlight   = None   # remember the last highlighted line
+        self.lastErrorMarker = None   # remember the last error line
+        self.lastCurrMarker  = None   # remember the last current line
+        
+        self.breaks = {}            # key:   marker handle, 
+                                    # value: (lineno, condition, temporary, 
+                                    #         enabled, ignorecount)
+        self.bookmarks = []         # bookmarks are just a list of handles to the
+                                    # bookmark markers
+        self.syntaxerrors = {}      # key:   marker handle
+                                    # value: error message
+        self.warnings = {}          # key:   marker handle
+                                    # value: warning message
+        self.notcoveredMarkers = [] # just a list of marker handles
+        
+        self.condHistory = []
+        self.lexer_ = None
+        self.__lexerReset = False
+        self.completer = None
+        self.encoding = Preferences.getEditor("DefaultEncoding")
+        self.apiLanguage = ''
+        self.lastModified = 0
+        self.line = -1
+        self.inReopenPrompt = False
+            # true if the prompt to reload a changed source is present
+        self.inFileRenamed = False      # true if we are propagating a rename action
+        self.inLanguageChanged = False  # true if we are propagating a language change
+        self.inEolChanged = False       # true if we are propagating an eol change
+        self.inEncodingChanged = False  # true if we are propagating an encoding change
+        self.inDragDrop = False         # true if we are in drop mode
+        self.__hasTaskMarkers = False   # no task markers present
+            
+        self.macros = {}    # list of defined macros
+        self.curMacro = None
+        self.recording = False
+        
+        self.acAPI = False
+        
+        # list of clones
+        self.__clones = []
+        
+        # clear QScintilla defined keyboard commands
+        # we do our own handling through the view manager
+        self.clearAlternateKeys()
+        self.clearKeys()
+        
+        # initialise the mark occurrences timer
+        self.__markOccurrencesTimer = QTimer(self)
+        self.__markOccurrencesTimer.setSingleShot(True)
+        self.__markOccurrencesTimer.setInterval(
+            Preferences.getEditor("MarkOccurrencesTimeout"))
+        self.connect(self.__markOccurrencesTimer, SIGNAL("timeout()"), 
+                     self.__markOccurrences)
+        self.__markedText = ""
+        
+        # initialise some spellchecking stuff
+        self.spell = None
+        self.lastLine = 0
+        self.lastIndex = 0
+        
+        self.connect(self, SIGNAL('modificationChanged(bool)'), 
+                     self.__modificationChanged)
+        self.connect(self, SIGNAL('cursorPositionChanged(int,int)'),
+                     self.__cursorPositionChanged)
+        self.connect(self, SIGNAL('modificationAttempted()'),
+                     self.__modificationReadOnly)
+        self.connect(self, SIGNAL('userListActivated(int, const QString)'),
+                     self.__completionListSelected)
+        
+        # margins layout
+        if QSCINTILLA_VERSION() >= 0x020301:
+            self.__unifiedMargins = Preferences.getEditor("UnifiedMargins")
+        else:
+            self.__unifiedMargins = True
+        
+        # define the margins markers
+        self.breakpoint = \
+            self.markerDefine(UI.PixmapCache.getPixmap("break.png"))
+        self.cbreakpoint = \
+            self.markerDefine(UI.PixmapCache.getPixmap("cBreak.png"))
+        self.tbreakpoint = \
+            self.markerDefine(UI.PixmapCache.getPixmap("tBreak.png"))
+        self.tcbreakpoint = \
+            self.markerDefine(UI.PixmapCache.getPixmap("tCBreak.png"))
+        self.dbreakpoint = \
+            self.markerDefine(UI.PixmapCache.getPixmap("breakDisabled.png"))
+        self.bookmark = \
+            self.markerDefine(UI.PixmapCache.getPixmap("bookmark.png"))
+        self.syntaxerror = \
+            self.markerDefine(UI.PixmapCache.getPixmap("syntaxError.png"))
+        self.notcovered = \
+            self.markerDefine(UI.PixmapCache.getPixmap("notcovered.png"))
+        self.taskmarker = \
+            self.markerDefine(UI.PixmapCache.getPixmap("task.png"))
+        self.warning = \
+            self.markerDefine(UI.PixmapCache.getPixmap("warning.png"))
+        
+        # define the line markers
+        self.currentline = self.markerDefine(QsciScintilla.Background)
+        self.errorline = self.markerDefine(QsciScintilla.Background)
+        self.__setLineMarkerColours()
+        
+        self.breakpointMask = (1 << self.breakpoint)   | \
+                              (1 << self.cbreakpoint)  | \
+                              (1 << self.tbreakpoint)  | \
+                              (1 << self.tcbreakpoint) | \
+                              (1 << self.dbreakpoint)
+        
+        # configure the margins
+        self.__setMarginsDisplay()
+        
+        self.connect(self, SIGNAL('marginClicked(int, int, Qt::KeyboardModifiers)'),
+                    self.__marginClicked)
+        
+        # set the eol mode
+        self.__setEolMode()
+        
+        self.isResourcesFile = False
+        if editor is None:
+            if self.fileName is not None:
+                if (QFileInfo(self.fileName).size() // 1024) > \
+                   Preferences.getEditor("WarnFilesize"):
+                    res = QMessageBox.warning(None,
+                        self.trUtf8("Open File"),
+                        self.trUtf8("""<p>The size of the file <b>{0}</b>"""
+                                    """ is <b>{1} KB</b>."""
+                                    """ Do you really want to load it?</p>""")\
+                                    .format(self.fileName, 
+                                            QFileInfo(self.fileName).size() // 1024),
+                        QMessageBox.StandardButtons(\
+                            QMessageBox.No | \
+                            QMessageBox.Yes),
+                        QMessageBox.No)
+                    if res == QMessageBox.No or res == QMessageBox.Cancel:
+                        raise IOError()
+                self.readFile(self.fileName, True)
+                bindName = self.__bindName(self.text(0))
+                self.__bindLexer(bindName)
+                self.__bindCompleter(bindName)
+                self.__autoSyntaxCheck()
+                self.isResourcesFile = self.fileName.endswith(".qrc")
+                
+                self.recolor()
+        else:
+            # clone the given editor
+            self.setDocument(editor.document())
+            self.breaks = editor.breaks
+            self.bookmarks = editor.bookmarks
+            self.syntaxerrors = editor.syntaxerrors
+            self.notcoveredMarkers = editor.notcoveredMarkers
+            self.isResourcesFile = editor.isResourcesFile
+            self.lastModified = editor.lastModified
+            
+            self.addClone(editor)
+            editor.addClone(self)
+        
+        self.gotoLine(0)
+        
+        # set the text display
+        self.__setTextDisplay()
+        
+        # set the autocompletion and calltips function
+        self.__acHookFunction = None
+        self.__setAutoCompletion()
+        self.__ctHookFunction = None
+        self.__setCallTips()
+        
+        sh = self.sizeHint()
+        if sh.height() < 300:
+            sh.setHeight(300)
+        self.resize(sh)
+        
+        # Make sure tabbing through a QWorkspace works.
+        self.setFocusPolicy(Qt.StrongFocus)
+        
+        self.__updateReadOnly(True)
+        
+        self.setWhatsThis(self.trUtf8(
+            """<b>A Source Editor Window</b>"""
+            """<p>This window is used to display and edit a source file."""
+            """  You can open as many of these as you like. The name of the file"""
+            """ is displayed in the window's titlebar.</p>"""
+            """<p>In order to set breakpoints just click in the space between"""
+            """ the line numbers and the fold markers. Via the context menu"""
+            """ of the margins they may be edited.</p>"""
+            """<p>In order to set bookmarks just Shift click in the space between"""
+            """ the line numbers and the fold markers.</p>"""
+            """<p>These actions can be reversed via the context menu.</p>"""
+            """<p>Ctrl clicking on a syntax error marker shows some info"""
+            """ about this error.</p>"""
+        ))
+        
+        # Set the editors size, if it is too big for the view manager.
+        if self.vm is not None:
+            req = self.size()
+            bnd = req.boundedTo(self.vm.size())
+            
+            if bnd.width() < req.width() or bnd.height() < req.height():
+                self.resize(bnd)
+            
+        # set the autosave flag
+        self.autosaveEnabled = Preferences.getEditor("AutosaveInterval") > 0
+        self.autosaveManuallyDisabled = False
+        
+        self.__initContextMenu()
+        self.__initContextMenuMargins()
+        
+        self.__checkEol()
+        if editor is None:
+            self.__checkLanguage()
+            self.__checkEncoding()
+        else:
+            # it's a clone
+            self.languageChanged(editor.apiLanguage, propagate = False)
+            self.__encodingChanged(editor.encoding, propagate = False)
+        
+        self.coverageMarkersShown = False   # flag remembering the current status of the
+                                            # code coverage markers
+        
+        self.setAcceptDrops(True)
+        
+        # breakpoint handling
+        self.breakpointModel = self.dbs.getBreakPointModel()
+        self.__restoreBreakpoints()
+        self.connect(self.breakpointModel, 
+            SIGNAL("rowsAboutToBeRemoved(const QModelIndex &, int, int)"), 
+            self.__deleteBreakPoints)
+        self.connect(self.breakpointModel,
+            SIGNAL("dataAboutToBeChanged(const QModelIndex &, const QModelIndex &)"),
+            self.__breakPointDataAboutToBeChanged)
+        self.connect(self.breakpointModel,
+            SIGNAL("dataChanged(const QModelIndex &, const QModelIndex &)"),
+            self.__changeBreakPoints)
+        self.connect(self.breakpointModel,
+            SIGNAL("rowsInserted(const QModelIndex &, int, int)"),
+            self.__addBreakPoints)
+        self.connect(self, SIGNAL("linesChanged()"), self.__linesChanged)
+        
+        # establish connection to some ViewManager action groups
+        self.addActions(self.vm.editorActGrp.actions())
+        self.addActions(self.vm.editActGrp.actions())
+        self.addActions(self.vm.copyActGrp.actions())
+        self.addActions(self.vm.viewActGrp.actions())
+        
+        # register images to be shown in autocompletion lists
+        self.__registerImages()
+    
+    def __registerImages(self):
+        """
+        Private method to register images for autocompletion lists.
+        """
+        self.registerImage(self.ClassID, 
+                           UI.PixmapCache.getPixmap("class.png"))
+        self.registerImage(self.ClassProtectedID, 
+                           UI.PixmapCache.getPixmap("class_protected.png"))
+        self.registerImage(self.ClassPrivateID, 
+                           UI.PixmapCache.getPixmap("class_private.png"))
+        self.registerImage(self.MethodID, 
+                           UI.PixmapCache.getPixmap("method.png"))
+        self.registerImage(self.MethodProtectedID, 
+                           UI.PixmapCache.getPixmap("method_protected.png"))
+        self.registerImage(self.MethodPrivateID, 
+                           UI.PixmapCache.getPixmap("method_private.png"))
+        self.registerImage(self.AttributeID, 
+                           UI.PixmapCache.getPixmap("attribute.png"))
+        self.registerImage(self.AttributeProtectedID, 
+                           UI.PixmapCache.getPixmap("attribute_protected.png"))
+        self.registerImage(self.AttributePrivateID, 
+                           UI.PixmapCache.getPixmap("attribute_private.png"))
+        self.registerImage(self.EnumID, 
+                           UI.PixmapCache.getPixmap("enum.png"))
+        
+        self.registerImage(self.FromDocumentID, 
+                           UI.PixmapCache.getPixmap("editor.png"))
+        
+        self.registerImage(self.TemplateImageID, 
+                           UI.PixmapCache.getPixmap("templateViewer.png"))
+    
+    def addClone(self, editor):
+        """
+        Public method to add a clone to our list.
+        
+        @param clone reference to the cloned editor (Editor)
+        """
+        self.__clones.append(editor)
+        
+        self.connect(editor, SIGNAL('editorRenamed'), self.fileRenamed)
+        self.connect(editor, SIGNAL('languageChanged'), self.languageChanged)
+        self.connect(editor, SIGNAL('eolChanged'), self.__eolChanged)
+        self.connect(editor, SIGNAL('encodingChanged'), self.__encodingChanged)
+        
+    def removeClone(self, editor):
+        """
+        Public method to remove a clone from our list.
+        
+        @param clone reference to the cloned editor (Editor)
+        """
+        if editor in self.__clones:
+            self.disconnect(editor, SIGNAL('editorRenamed'), self.fileRenamed)
+            self.disconnect(editor, SIGNAL('languageChanged'), self.languageChanged)
+            self.disconnect(editor, SIGNAL('eolChanged'), self.__eolChanged)
+            self.disconnect(editor, SIGNAL('encodingChanged'), self.__encodingChanged)
+            self.__clones.remove(editor)
+        
+    def __bindName(self, line0):
+        """
+        Private method to generate a dummy filename for binding a lexer.
+        
+        @param line0 first line of text to use in the generation process (string)
+        """
+        bindName = self.fileName
+        
+        if line0.startswith("<?xml"):
+            # override extension for XML files
+            bindName = "dummy.xml"
+        
+        # check filetype
+        if self.filetype == "Python":
+            bindName = "dummy.py"
+        elif self.filetype == "Ruby":
+            bindName = "dummy.rb"
+        elif self.filetype == "D":
+            bindName = "dummy.d"
+        elif self.filetype == "Properties":
+            bindName = "dummy.ini"
+        
+        # #! marker detection
+        if line0.startswith("#!"):
+            if "python3" in line0:
+                bindName = "dummy.py"
+                self.filetype = "Python3"
+            elif "python2" in line0:
+                bindName = "dummy.py"
+                self.filetype = "Python"
+            elif "python" in line0:
+                bindName = "dummy.py"
+                self.filetype = "Python"
+            elif ("/bash" in line0 or "/sh" in line0):
+                bindName = "dummy.sh"
+            elif "ruby" in line0:
+                bindName = "dummy.rb"
+                self.filetype = "Ruby"
+            elif "perl" in line0:
+                bindName = "dummy.pl"
+            elif "lua" in line0:
+                bindName = "dummy.lua"
+            elif "dmd" in line0:
+                bindName = "dummy.d"
+                self.filetype = "D"
+        return bindName
+        
+    def getMenu(self, menuName):
+        """
+        Public method to get a reference to the main context menu or a submenu.
+        
+        @param menuName name of the menu (string)
+        @return reference to the requested menu (QMenu) or None
+        """
+        try:
+            return self.__menus[menuName]
+        except KeyError:
+            return None
+        
+    def hasMiniMenu(self):
+        """
+        Public method to check the miniMenu flag.
+        
+        @return flag indicating a minimized context menu (boolean)
+        """
+        return self.miniMenu
+        
+    def __initContextMenu(self):
+        """
+        Private method used to setup the context menu
+        """
+        self.miniMenu = Preferences.getEditor("MiniContextMenu")
+        
+        self.menuActs = {}
+        self.menu = QMenu()
+        self.__menus = {
+            "Main" : self.menu, 
+        }
+        
+        self.languagesMenu = self.__initContextMenuLanguages()
+        self.__menus["Languages"] = self.languagesMenu
+        if self.isResourcesFile:
+            self.resourcesMenu = self.__initContextMenuResources()
+            self.__menus["Resources"] = self.resourcesMenu
+        else:
+            self.checksMenu = self.__initContextMenuChecks()
+            self.showMenu = self.__initContextMenuShow()
+            self.graphicsMenu = self.__initContextMenuGraphics()
+            self.autocompletionMenu = self.__initContextMenuAutocompletion()
+            self.__menus["Checks"] = self.checksMenu
+            self.__menus["Show"] = self.showMenu
+            self.__menus["Graphics"] = self.graphicsMenu
+            self.__menus["Autocompletion"] = self.autocompletionMenu
+        self.exportersMenu = self.__initContextMenuExporters()
+        self.__menus["Exporters"] = self.exportersMenu
+        self.eolMenu = self.__initContextMenuEol()
+        self.__menus["Eol"] = self.eolMenu
+        self.encodingsMenu = self.__initContextMenuEncodings()
+        self.__menus["Encodings"] = self.encodingsMenu
+        
+        self.menuActs["Undo"] = \
+            self.menu.addAction(UI.PixmapCache.getIcon("editUndo.png"),
+            self.trUtf8('Undo'), self.undo)
+        self.menuActs["Redo"] = \
+            self.menu.addAction(UI.PixmapCache.getIcon("editRedo.png"),
+            self.trUtf8('Redo'), self.redo)
+        self.menuActs["Revert"] = \
+            self.menu.addAction(self.trUtf8("Revert to last saved state"),
+                self.revertToUnmodified)
+        self.menu.addSeparator()
+        self.menuActs["Cut"] = \
+            self.menu.addAction(UI.PixmapCache.getIcon("editCut.png"),
+            self.trUtf8('Cut'), self.cut)
+        self.menuActs["Copy"] = \
+            self.menu.addAction(UI.PixmapCache.getIcon("editCopy.png"),
+            self.trUtf8('Copy'), self.copy)
+        self.menu.addAction(UI.PixmapCache.getIcon("editPaste.png"),
+            self.trUtf8('Paste'), self.paste)
+        if not self.miniMenu:
+            self.menu.addSeparator()
+            self.menu.addAction(UI.PixmapCache.getIcon("editIndent.png"),
+                self.trUtf8('Indent'), self.indentLineOrSelection)
+            self.menu.addAction(UI.PixmapCache.getIcon("editUnindent.png"),
+                self.trUtf8('Unindent'), self.unindentLineOrSelection)
+            self.menuActs["Comment"] = \
+                self.menu.addAction(UI.PixmapCache.getIcon("editComment.png"),
+                    self.trUtf8('Comment'), self.commentLineOrSelection)
+            self.menuActs["Uncomment"] = \
+                self.menu.addAction(UI.PixmapCache.getIcon("editUncomment.png"),
+                    self.trUtf8('Uncomment'), self.uncommentLineOrSelection)
+            self.menuActs["StreamComment"] = \
+                self.menu.addAction(self.trUtf8('Stream Comment'), 
+                    self.streamCommentLineOrSelection)
+            self.menuActs["BoxComment"] = \
+                self.menu.addAction(self.trUtf8('Box Comment'), 
+                    self.boxCommentLineOrSelection)
+            self.menu.addSeparator()
+            self.menu.addAction(self.trUtf8('Select to brace'), 
+                self.selectToMatchingBrace)
+            self.menu.addAction(self.trUtf8('Select all'), self.__selectAll)
+            self.menu.addAction(self.trUtf8('Deselect all'), self.__deselectAll)
+            self.menu.addSeparator()
+        self.menuActs["SpellCheck"] = \
+            self.menu.addAction(UI.PixmapCache.getIcon("spellchecking.png"), 
+                self.trUtf8('Check spelling...'), self.checkSpelling)
+        self.menuActs["SpellCheckSelection"] = \
+            self.menu.addAction(UI.PixmapCache.getIcon("spellchecking.png"), 
+                self.trUtf8('Check spelling of selection...'), 
+                self.__checkSpellingSelection)
+        self.menuActs["SpellCheckRemove"] = \
+            self.menu.addAction(self.trUtf8("Remove from dictionary"), 
+                self.__removeFromSpellingDictionary)
+        self.menu.addSeparator()
+        self.menu.addAction(self.trUtf8('Shorten empty lines'), 
+            self.shortenEmptyLines)
+        self.menu.addSeparator()
+        self.menuActs["Languages"] = self.menu.addMenu(self.languagesMenu)
+        self.menuActs["Encodings"] = self.menu.addMenu(self.encodingsMenu)
+        self.menuActs["Eol"] = self.menu.addMenu(self.eolMenu)
+        self.menu.addSeparator()
+        self.menuActs["MonospacedFont"] = \
+            self.menu.addAction(self.trUtf8("Use Monospaced Font"),
+                self.handleMonospacedEnable)
+        self.menuActs["MonospacedFont"].setCheckable(True)
+        self.menuActs["MonospacedFont"].setChecked(self.useMonospaced)
+        self.menuActs["AutosaveEnable"] = \
+            self.menu.addAction(self.trUtf8("Autosave enabled"),
+                self.__autosaveEnable)
+        self.menuActs["AutosaveEnable"].setCheckable(True)
+        self.menuActs["AutosaveEnable"].setChecked(self.autosaveEnabled)
+        self.menuActs["TypingAidsEnabled"] = \
+            self.menu.addAction(self.trUtf8("Typing aids enabled"), 
+                self.__toggleTypingAids)
+        self.menuActs["TypingAidsEnabled"].setCheckable(True)
+        self.menuActs["TypingAidsEnabled"].setEnabled(self.completer is not None)
+        self.menuActs["TypingAidsEnabled"].setChecked(\
+            self.completer is not None and self.completer.isEnabled())
+        self.menuActs["AutoCompletionEnable"] = \
+            self.menu.addAction(self.trUtf8("Autocompletion enabled"),
+                self.__toggleAutoCompletionEnable)
+        self.menuActs["AutoCompletionEnable"].setCheckable(True)
+        self.menuActs["AutoCompletionEnable"].setChecked(\
+            self.autoCompletionThreshold() != -1)
+        if not self.isResourcesFile:
+            self.menu.addMenu(self.autocompletionMenu)
+        self.menu.addSeparator()
+        if self.isResourcesFile:
+            self.menu.addMenu(self.resourcesMenu)
+        else:
+            self.menuActs["Check"] = self.menu.addMenu(self.checksMenu)
+            self.menu.addSeparator()
+            self.menuActs["Show"] = self.menu.addMenu(self.showMenu)
+            self.menu.addSeparator()
+            self.menuActs["Diagrams"] = self.menu.addMenu(self.graphicsMenu)
+        self.menu.addSeparator()
+        self.menu.addAction(self.trUtf8('New view'), self.__newView)
+        act = self.menu.addAction(self.trUtf8('New view (with new split)'), 
+            self.__newViewNewSplit)
+        if not self.vm.canSplit():
+                act.setEnabled(False)
+        self.menu.addAction(UI.PixmapCache.getIcon("close.png"),
+            self.trUtf8('Close'), self.__contextClose)
+        self.menu.addSeparator()
+        self.menuActs["Save"] = \
+            self.menu.addAction(UI.PixmapCache.getIcon("fileSave.png"),
+            self.trUtf8('Save'), self.__contextSave)
+        self.menu.addAction(UI.PixmapCache.getIcon("fileSaveAs.png"),
+            self.trUtf8('Save As...'), self.__contextSaveAs)
+        if not self.miniMenu:
+            self.menu.addMenu(self.exportersMenu)
+            self.menu.addSeparator()
+            self.menu.addAction(UI.PixmapCache.getIcon("printPreview.png"),
+            self.trUtf8("Print Preview"), self.printPreviewFile)
+            self.menu.addAction(UI.PixmapCache.getIcon("print.png"),
+                self.trUtf8('Print'), self.printFile)
+        
+        self.connect(self.menu, SIGNAL('aboutToShow()'), self.__showContextMenu)
+        
+        self.spellingMenu = QMenu()
+        self.__menus["Spelling"] = self.spellingMenu
+        
+        self.connect(self.spellingMenu, SIGNAL('aboutToShow()'), 
+                     self.__showContextMenuSpelling)
+        self.connect(self.spellingMenu, SIGNAL('triggered(QAction *)'), 
+                     self.__contextMenuSpellingTriggered)
+
+    def __initContextMenuAutocompletion(self):
+        """
+        Private method used to setup the Checks context sub menu.
+        """
+        menu = QMenu(self.trUtf8('Autocomplete'))
+        
+        self.menuActs["acDynamic"] = \
+            menu.addAction(self.trUtf8('dynamic'), 
+                self.autoComplete)
+        menu.addSeparator()
+        menu.addAction(self.trUtf8('from Document'), 
+            self.autoCompleteFromDocument)
+        self.menuActs["acAPI"] = \
+            menu.addAction(self.trUtf8('from APIs'),
+                self.autoCompleteFromAPIs)
+        self.menuActs["acAPIDocument"] = \
+            menu.addAction(self.trUtf8('from Document and APIs'), 
+                self.autoCompleteFromAll)
+        menu.addSeparator()
+        self.menuActs["calltip"] = \
+            menu.addAction(self.trUtf8('Calltip'), self.callTip)
+        
+        self.connect(menu, SIGNAL('aboutToShow()'), self.__showContextMenuAutocompletion)
+        
+        return menu
+
+    def __initContextMenuChecks(self):
+        """
+        Private method used to setup the Checks context sub menu.
+        """
+        menu = QMenu(self.trUtf8('Check'))
+        self.connect(menu, SIGNAL("aboutToShow()"), self.__showContextMenuChecks)
+        return menu
+
+    def __initContextMenuShow(self):
+        """
+        Private method used to setup the Show context sub menu.
+        """
+        menu = QMenu(self.trUtf8('Show'))
+        
+        menu.addAction(self.trUtf8('Code metrics...'), self.__showCodeMetrics)
+        self.coverageMenuAct = \
+            menu.addAction(self.trUtf8('Code coverage...'), self.__showCodeCoverage)
+        self.coverageShowAnnotationMenuAct = \
+            menu.addAction(self.trUtf8('Show code coverage annotations'), 
+                self.__codeCoverageShowAnnotations)
+        self.coverageHideAnnotationMenuAct = \
+            menu.addAction(self.trUtf8('Hide code coverage annotations'), 
+                self.__codeCoverageHideAnnotations)
+        self.profileMenuAct = \
+            menu.addAction(self.trUtf8('Profile data...'), self.__showProfileData)
+        
+        self.connect(menu, SIGNAL('aboutToShow()'), self.__showContextMenuShow)
+        
+        return menu
+        
+    def __initContextMenuGraphics(self):
+        """
+        Private method used to setup the diagrams context sub menu.
+        """
+        menu = QMenu(self.trUtf8('Diagrams'))
+        
+        menu.addAction(self.trUtf8('Class Diagram...'), 
+            self.__showClassDiagram)
+        menu.addAction(self.trUtf8('Package Diagram...'), 
+            self.__showPackageDiagram)
+        menu.addAction(self.trUtf8('Imports Diagram...'), 
+            self.__showImportsDiagram)
+        self.applicationDiagramMenuAct = \
+            menu.addAction(self.trUtf8('Application Diagram...'), 
+                self.__showApplicationDiagram)
+        
+        self.connect(menu, SIGNAL('aboutToShow()'), self.__showContextMenuGraphics)
+        
+        return menu
+
+    def __initContextMenuLanguages(self):
+        """
+        Private method used to setup the Languages context sub menu.
+        """
+        menu = QMenu(self.trUtf8("Languages"))
+        
+        self.languagesActGrp = QActionGroup(self)
+        self.noLanguageAct = menu.addAction(self.trUtf8("No Language"))
+        self.noLanguageAct.setCheckable(True)
+        self.noLanguageAct.setData("None")
+        self.languagesActGrp.addAction(self.noLanguageAct)
+        menu.addSeparator()
+        
+        self.supportedLanguages = {}
+        supportedLanguages = Lexers.getSupportedLanguages()
+        languages = sorted(list(supportedLanguages.keys()))
+        for language in languages:
+            if language != "Guessed":
+                self.supportedLanguages[language] = supportedLanguages[language][:]
+                act = menu.addAction(self.supportedLanguages[language][0])
+                act.setCheckable(True)
+                act.setData(language)
+                self.supportedLanguages[language].append(act)
+                self.languagesActGrp.addAction(act)
+        
+        menu.addSeparator()
+        self.pygmentsAct = menu.addAction(self.trUtf8("Guessed"))
+        self.pygmentsAct.setCheckable(True)
+        self.pygmentsAct.setData("Guessed")
+        self.languagesActGrp.addAction(self.pygmentsAct)
+        self.pygmentsSelAct = menu.addAction(self.trUtf8("Alternatives"))
+        self.pygmentsSelAct.setData("Alternatives")
+        
+        self.connect(menu, SIGNAL('triggered(QAction *)'), self.__languageMenuTriggered)
+        self.connect(menu, SIGNAL('aboutToShow()'), self.__showContextMenuLanguages)
+        
+        return menu
+        
+    def __initContextMenuEncodings(self):
+        """
+        Private method used to setup the Encodings context sub menu.
+        """
+        self.supportedEncodings = {}
+        
+        menu = QMenu(self.trUtf8("Encodings"))
+        
+        self.encodingsActGrp = QActionGroup(self)
+        
+        for encoding in sorted(Utilities.supportedCodecs):
+            act = menu.addAction(encoding)
+            act.setCheckable(True)
+            act.setData(encoding)
+            self.supportedEncodings[encoding] = act
+            self.encodingsActGrp.addAction(act)
+        
+        self.connect(menu, SIGNAL('triggered(QAction *)'), self.__encodingsMenuTriggered)
+        self.connect(menu, SIGNAL('aboutToShow()'), self.__showContextMenuEncodings)
+        
+        return menu
+        
+    def __initContextMenuEol(self):
+        """
+        Private method to setup the eol context sub menu.
+        """
+        self.supportedEols = {}
+        
+        menu = QMenu(self.trUtf8("End-of-Line Type"))
+        
+        self.eolActGrp = QActionGroup(self)
+        
+        act = menu.addAction(self.trUtf8("Unix"))
+        act.setCheckable(True)
+        act.setData('\n')
+        self.supportedEols['\n'] = act
+        self.eolActGrp.addAction(act)
+        
+        act = menu.addAction(self.trUtf8("Windows"))
+        act.setCheckable(True)
+        act.setData('\r\n')
+        self.supportedEols['\r\n'] = act
+        self.eolActGrp.addAction(act)
+        
+        act = menu.addAction(self.trUtf8("Macintosh"))
+        act.setCheckable(True)
+        act.setData('\r')
+        self.supportedEols['\r'] = act
+        self.eolActGrp.addAction(act)
+        
+        self.connect(menu, SIGNAL('triggered(QAction *)'), self.__eolMenuTriggered)
+        self.connect(menu, SIGNAL('aboutToShow()'), self.__showContextMenuEol)
+        
+        return menu
+        
+    def __initContextMenuExporters(self):
+        """
+        Private method used to setup the Exporters context sub menu.
+        """
+        menu = QMenu(self.trUtf8("Export as"))
+        
+        supportedExporters = Exporters.getSupportedFormats()
+        exporters = sorted(list(supportedExporters.keys()))
+        for exporter in exporters:
+            act = menu.addAction(supportedExporters[exporter])
+            act.setData(exporter)
+        
+        self.connect(menu, SIGNAL('triggered(QAction *)'), self.__exportMenuTriggered)
+        
+        return menu
+        
+    def __initContextMenuMargins(self):
+        """
+        Private method used to setup the context menu for the margins
+        """
+        self.marginMenuActs = {}
+        
+        if self.__unifiedMargins:
+            self.__initContextMenuUnifiedMargins()
+        else:
+            self.__initContextMenuSeparateMargins()
+        
+    def __initContextMenuSeparateMargins(self):
+        """
+        Private method used to setup the context menu for the separated margins
+        """
+        # bookmark margin
+        self.bmMarginMenu = QMenu()
+        
+        self.bmMarginMenu.addAction(self.trUtf8('Toggle bookmark'),
+            self.menuToggleBookmark)
+        self.marginMenuActs["NextBookmark"] = \
+            self.bmMarginMenu.addAction(self.trUtf8('Next bookmark'),
+                self.nextBookmark)
+        self.marginMenuActs["PreviousBookmark"] = \
+            self.bmMarginMenu.addAction(self.trUtf8('Previous bookmark'),
+                self.previousBookmark)
+        self.marginMenuActs["ClearBookmark"] = \
+            self.bmMarginMenu.addAction(self.trUtf8('Clear all bookmarks'),
+                self.clearBookmarks)
+        
+        self.connect(self.bmMarginMenu, SIGNAL('aboutToShow()'), 
+            self.__showContextMenuMargin)
+        
+        # breakpoint margin
+        self.bpMarginMenu = QMenu()
+        
+        self.marginMenuActs["Breakpoint"] = \
+            self.bpMarginMenu.addAction(self.trUtf8('Toggle breakpoint'), 
+                self.menuToggleBreakpoint)
+        self.marginMenuActs["TempBreakpoint"] = \
+            self.bpMarginMenu.addAction(self.trUtf8('Toggle temporary breakpoint'), 
+                self.__menuToggleTemporaryBreakpoint)
+        self.marginMenuActs["EditBreakpoint"] = \
+            self.bpMarginMenu.addAction(self.trUtf8('Edit breakpoint...'), 
+                self.menuEditBreakpoint)
+        self.marginMenuActs["EnableBreakpoint"] = \
+            self.bpMarginMenu.addAction(self.trUtf8('Enable breakpoint'), 
+                self.__menuToggleBreakpointEnabled)
+        self.marginMenuActs["NextBreakpoint"] = \
+            self.bpMarginMenu.addAction(self.trUtf8('Next breakpoint'), 
+                self.menuNextBreakpoint)
+        self.marginMenuActs["PreviousBreakpoint"] = \
+            self.bpMarginMenu.addAction(self.trUtf8('Previous breakpoint'), 
+                self.menuPreviousBreakpoint)
+        self.marginMenuActs["ClearBreakpoint"] = \
+            self.bpMarginMenu.addAction(self.trUtf8('Clear all breakpoints'), 
+                self.__menuClearBreakpoints)
+        
+        self.connect(self.bpMarginMenu, SIGNAL('aboutToShow()'), 
+            self.__showContextMenuMargin)
+        
+        # indicator margin
+        self.indicMarginMenu = QMenu()
+        
+        self.marginMenuActs["GotoSyntaxError"] = \
+            self.indicMarginMenu.addAction(self.trUtf8('Goto syntax error'),
+                self.gotoSyntaxError)
+        self.marginMenuActs["ShowSyntaxError"] = \
+            self.indicMarginMenu.addAction(self.trUtf8('Show syntax error message'),
+                self.__showSyntaxError)
+        self.marginMenuActs["ClearSyntaxError"] = \
+            self.indicMarginMenu.addAction(self.trUtf8('Clear syntax error'),
+                self.clearSyntaxError)
+        self.indicMarginMenu.addSeparator()
+        self.marginMenuActs["NextWarningMarker"] = \
+            self.indicMarginMenu.addAction(self.trUtf8("Next warning"), 
+                self.nextFlakesWarning)
+        self.marginMenuActs["PreviousWarningMarker"] = \
+            self.indicMarginMenu.addAction(self.trUtf8("Previous warning"), 
+                self.previousFlakesWarning)
+        self.marginMenuActs["ShowWarning"] = \
+            self.indicMarginMenu.addAction(self.trUtf8('Show warning message'),
+                self.__showFlakesWarning)
+        self.marginMenuActs["ClearWarnings"] = \
+            self.indicMarginMenu.addAction(self.trUtf8('Clear warnings'),
+                self.clearFlakesWarnings)
+        self.indicMarginMenu.addSeparator()
+        self.marginMenuActs["NextCoverageMarker"] = \
+            self.indicMarginMenu.addAction(self.trUtf8('Next uncovered line'),
+                self.nextUncovered)
+        self.marginMenuActs["PreviousCoverageMarker"] = \
+            self.indicMarginMenu.addAction(self.trUtf8('Previous uncovered line'),
+                self.previousUncovered)
+        self.indicMarginMenu.addSeparator()
+        self.marginMenuActs["NextTaskMarker"] = \
+            self.indicMarginMenu.addAction(self.trUtf8('Next task'),
+                self.nextTask)
+        self.marginMenuActs["PreviousTaskMarker"] = \
+            self.indicMarginMenu.addAction(self.trUtf8('Previous task'),
+                self.previousTask)
+        
+        self.connect(self.indicMarginMenu, SIGNAL('aboutToShow()'), 
+            self.__showContextMenuMargin)
+        
+    def __initContextMenuUnifiedMargins(self):
+        """
+        Private method used to setup the context menu for the unified margins
+        """
+        self.marginMenu = QMenu()
+        
+        self.marginMenu.addAction(self.trUtf8('Toggle bookmark'),
+            self.menuToggleBookmark)
+        self.marginMenuActs["NextBookmark"] = \
+            self.marginMenu.addAction(self.trUtf8('Next bookmark'),
+                self.nextBookmark)
+        self.marginMenuActs["PreviousBookmark"] = \
+            self.marginMenu.addAction(self.trUtf8('Previous bookmark'),
+                self.previousBookmark)
+        self.marginMenuActs["ClearBookmark"] = \
+            self.marginMenu.addAction(self.trUtf8('Clear all bookmarks'),
+                self.clearBookmarks)
+        self.marginMenu.addSeparator()
+        self.marginMenuActs["GotoSyntaxError"] = \
+            self.marginMenu.addAction(self.trUtf8('Goto syntax error'),
+                self.gotoSyntaxError)
+        self.marginMenuActs["ShowSyntaxError"] = \
+            self.marginMenu.addAction(self.trUtf8('Show syntax error message'),
+                self.__showSyntaxError)
+        self.marginMenuActs["ClearSyntaxError"] = \
+            self.marginMenu.addAction(self.trUtf8('Clear syntax error'),
+                self.clearSyntaxError)
+        self.marginMenu.addSeparator()
+        self.marginMenuActs["NextWarningMarker"] = \
+            self.marginMenu.addAction(self.trUtf8("Next warning"), 
+                self.nextFlakesWarning)
+        self.marginMenuActs["PreviousWarningMarker"] = \
+            self.marginMenu.addAction(self.trUtf8("Previous warning"), 
+                self.previousFlakesWarning)
+        self.marginMenuActs["ShowWarning"] = \
+            self.marginMenu.addAction(self.trUtf8('Show warning message'),
+                self.__showFlakesWarning)
+        self.marginMenuActs["ClearWarnings"] = \
+            self.marginMenu.addAction(self.trUtf8('Clear warnings'),
+                self.clearFlakesWarnings)
+        self.marginMenu.addSeparator()
+        self.marginMenuActs["Breakpoint"] = \
+            self.marginMenu.addAction(self.trUtf8('Toggle breakpoint'), 
+                self.menuToggleBreakpoint)
+        self.marginMenuActs["TempBreakpoint"] = \
+            self.marginMenu.addAction(self.trUtf8('Toggle temporary breakpoint'), 
+                self.__menuToggleTemporaryBreakpoint)
+        self.marginMenuActs["EditBreakpoint"] = \
+            self.marginMenu.addAction(self.trUtf8('Edit breakpoint...'), 
+                self.menuEditBreakpoint)
+        self.marginMenuActs["EnableBreakpoint"] = \
+            self.marginMenu.addAction(self.trUtf8('Enable breakpoint'), 
+                self.__menuToggleBreakpointEnabled)
+        self.marginMenuActs["NextBreakpoint"] = \
+            self.marginMenu.addAction(self.trUtf8('Next breakpoint'), 
+                self.menuNextBreakpoint)
+        self.marginMenuActs["PreviousBreakpoint"] = \
+            self.marginMenu.addAction(self.trUtf8('Previous breakpoint'), 
+                self.menuPreviousBreakpoint)
+        self.marginMenuActs["ClearBreakpoint"] = \
+            self.marginMenu.addAction(self.trUtf8('Clear all breakpoints'), 
+                self.__menuClearBreakpoints)
+        self.marginMenu.addSeparator()
+        self.marginMenuActs["NextCoverageMarker"] = \
+            self.marginMenu.addAction(self.trUtf8('Next uncovered line'),
+                self.nextUncovered)
+        self.marginMenuActs["PreviousCoverageMarker"] = \
+            self.marginMenu.addAction(self.trUtf8('Previous uncovered line'),
+                self.previousUncovered)
+        self.marginMenu.addSeparator()
+        self.marginMenuActs["NextTaskMarker"] = \
+            self.marginMenu.addAction(self.trUtf8('Next task'),
+                self.nextTask)
+        self.marginMenuActs["PreviousTaskMarker"] = \
+            self.marginMenu.addAction(self.trUtf8('Previous task'),
+                self.previousTask)
+        self.marginMenu.addSeparator()
+        self.marginMenuActs["LMBbookmarks"] = \
+            self.marginMenu.addAction(self.trUtf8('LMB toggles bookmarks'),
+                self.__lmBbookmarks)
+        self.marginMenuActs["LMBbookmarks"].setCheckable(True)
+        self.marginMenuActs["LMBbookmarks"].setChecked(False)
+        self.marginMenuActs["LMBbreakpoints"] = \
+            self.marginMenu.addAction(self.trUtf8('LMB toggles breakpoints'),
+                self.__lmBbreakpoints)
+        self.marginMenuActs["LMBbreakpoints"].setCheckable(True)
+        self.marginMenuActs["LMBbreakpoints"].setChecked(True)
+        
+        self.connect(self.marginMenu, SIGNAL('aboutToShow()'), 
+            self.__showContextMenuMargin)
+        
+    def __exportMenuTriggered(self, act):
+        """
+        Private method to handle the selection of an export format.
+        
+        @param act reference to the action that was triggered (QAction)
+        """
+        exporterFormat = act.data()
+        self.exportFile(exporterFormat)
+        
+    def exportFile(self, exporterFormat):
+        """
+        Public method to export the file.
+        
+        @param exporterFormat format the file should be exported into (string)
+        """
+        if exporterFormat:
+            exporter = Exporters.getExporter(exporterFormat, self)
+            if exporter:
+                exporter.exportSource()
+            else:
+                QMessageBox.critical(self,
+                    self.trUtf8("Export source"),
+                    self.trUtf8("""<p>No exporter available for the """
+                                """export format <b>{0}</b>. Aborting...</p>""")\
+                        .format(exporterFormat),
+                    QMessageBox.StandardButtons(\
+                        QMessageBox.Ok))
+        else:
+            QMessageBox.critical(self,
+                self.trUtf8("Export source"),
+                self.trUtf8("""No export format given. Aborting..."""),
+                QMessageBox.StandardButtons(\
+                    QMessageBox.Ok))
+        
+    def __showContextMenuLanguages(self):
+        """
+        Private slot handling the aboutToShow signal of the languages context menu.
+        """
+        if self.apiLanguage.startswith("Pygments|"):
+            self.pygmentsSelAct.setText(
+                self.trUtf8("Alternatives ({0})").format(self.getLanguage()))
+        else:
+            self.pygmentsSelAct.setText(self.trUtf8("Alternatives"))
+        self.emit(SIGNAL("showMenu"), "Languages", self.languagesMenu,  self)
+        
+    def __selectPygmentsLexer(self):
+        """
+        Private method to select a specific pygments lexer.
+        
+        @return name of the selected pygments lexer (string)
+        """
+        from pygments.lexers import get_all_lexers
+        lexerList = sorted([l[0] for l in get_all_lexers()])
+        try:
+            lexerSel = lexerList.index(self.getLanguage())
+        except ValueError:
+            lexerSel = 0
+        lexerName, ok = QInputDialog.getItem(\
+            self,
+            self.trUtf8("Pygments Lexer"),
+            self.trUtf8("Select the Pygments lexer to apply."),
+            lexerList,
+            lexerSel, 
+            False)
+        if ok and lexerName:
+            return lexerName
+        else:
+            return ""
+        
+    def __languageMenuTriggered(self, act):
+        """
+        Private method to handle the selection of a lexer language.
+        
+        @param act reference to the action that was triggered (QAction)
+        """
+        if act == self.noLanguageAct:
+            self.__resetLanguage()
+        elif act == self.pygmentsAct:
+            self.setLanguage("dummy.pygments")
+        elif act == self.pygmentsSelAct:
+            language = self.__selectPygmentsLexer()
+            if language:
+                self.setLanguage("dummy.pygments", pyname = language)
+        else:
+            language = act.data()
+            if language:
+                self.setLanguage(self.supportedLanguages[language][1])
+        
+    def languageChanged(self, language, propagate = True):
+        """
+        Public slot handling a change of a connected editor's language.
+        
+        @param language language to be set (string)
+        @keyparam propagate flag indicating to propagate the change (boolean)
+        """
+        if language == '':
+            self.__resetLanguage(propagate = propagate)
+        elif language == "Guessed":
+            self.setLanguage("dummy.pygments")
+        elif language.startswith("Pygments|"):
+            pyname = language.split("|", 1)[1]
+            self.setLanguage("dummy.pygments", pyname = pyname)
+        else:
+            self.setLanguage(self.supportedLanguages[language][1], propagate = propagate)
+        
+    def __resetLanguage(self, propagate = True):
+        """
+        Private method used to reset the language selection.
+        
+        @keyparam propagate flag indicating to propagate the change (boolean)
+        """
+        if self.lexer_ is not None and \
+           (self.lexer_.lexer() == "container" or self.lexer_.lexer() is None):
+            self.disconnect(self, SIGNAL("SCN_STYLENEEDED(int)"), self.__styleNeeded)
+        
+        self.apiLanguage = ""
+        self.lexer_ = None
+        self.__lexerReset = True
+        self.setLexer()
+        self.setMonospaced(self.useMonospaced)
+        if self.completer is not None:
+            self.completer.setEnabled(False)
+            self.completer = None
+        self.__setTextDisplay()
+        
+        if not self.inLanguageChanged and propagate:
+            self.inLanguageChanged = True
+            self.emit(SIGNAL('languageChanged'), self.apiLanguage)
+            self.inLanguageChanged = False
+        
+    def setLanguage(self, filename, initTextDisplay = True, propagate = True, 
+                    pyname = ""):
+        """
+        Public method to set a lexer language.
+        
+        @param filename filename used to determine the associated lexer language (string)
+        @param initTextDisplay flag indicating an initialization of the text display
+            is required as well (boolean)
+        @keyparam propagate flag indicating to propagate the change (boolean)
+        @keyparam pyname name of the pygments lexer to use (string)
+        """
+        self.__lexerReset = False
+        self.__bindLexer(filename, pyname = pyname)
+        self.__bindCompleter(filename)
+        self.recolor()
+        self.__checkLanguage()
+        
+        # set the text display
+        if initTextDisplay:
+            self.__setTextDisplay()
+        
+        # set the autocompletion and calltips function
+        self.__setAutoCompletion()
+        self.__setCallTips()
+        
+        if not self.inLanguageChanged and propagate:
+            self.inLanguageChanged = True
+            self.emit(SIGNAL('languageChanged'), self.apiLanguage)
+            self.inLanguageChanged = False
+    
+    def __checkLanguage(self):
+        """
+        Private method to check the selected language of the language submenu.
+        """
+        if self.apiLanguage == "":
+            self.noLanguageAct.setChecked(True)
+        elif self.apiLanguage == "Guessed":
+            self.pygmentsAct.setChecked(True)
+        elif self.apiLanguage.startswith("Pygments|"):
+            act = self.languagesActGrp.checkedAction()
+            if act:
+                act.setChecked(False)
+        else:
+            self.supportedLanguages[self.apiLanguage][2].setChecked(True)
+    
+    def projectLexerAssociationsChanged(self):
+        """
+        Public slot to handle changes of the project lexer associations.
+        """
+        self.setLanguage(self.fileName)
+    
+    def __showContextMenuEncodings(self):
+        """
+        Private slot handling the aboutToShow signal of the encodings context menu.
+        """
+        self.emit(SIGNAL("showMenu"), "Encodings", self.encodingsMenu,  self)
+        
+    def __encodingsMenuTriggered(self, act):
+        """
+        Private method to handle the selection of an encoding.
+        
+        @param act reference to the action that was triggered (QAction)
+        """
+        encoding = act.data()
+        self.__encodingChanged("%s-selected" % encoding)
+        
+    def __checkEncoding(self):
+        """
+        Private method to check the selected encoding of the encodings submenu.
+        """
+        try:
+            self.supportedEncodings[self.__normalizedEncoding()].setChecked(True)
+        except (AttributeError, KeyError):
+            pass
+        
+    def __encodingChanged(self, encoding, propagate = True):
+        """
+        Private slot to handle a change of the encoding.
+        
+        @keyparam propagate flag indicating to propagate the change (boolean)        
+        """
+        self.encoding = encoding
+        self.__checkEncoding()
+        
+        if not self.inEncodingChanged and propagate:
+            self.inEncodingChanged = True
+            self.emit(SIGNAL("encodingChanged"), self.encoding)
+            self.inEncodingChanged = False
+        
+    def __normalizedEncoding(self):
+        """
+        Private method to calculate the normalized encoding string.
+        
+        @return normalized encoding (string)
+        """
+        return self.encoding.replace("-default", "")\
+                            .replace("-guessed", "")\
+                            .replace("-selected", "")
+        
+    def __showContextMenuEol(self):
+        """
+        Private slot handling the aboutToShow signal of the eol context menu.
+        """
+        self.emit(SIGNAL("showMenu"), "Eol", self.eolMenu,  self)
+        
+    def __eolMenuTriggered(self, act):
+        """
+        Private method to handle the selection of an eol type.
+        
+        @param act reference to the action that was triggered (QAction)
+        """
+        eol = act.data()
+        self.setEolModeByEolString(eol)
+        self.convertEols(self.eolMode())
+        
+    def __checkEol(self):
+        """
+        Private method to check the selected eol type of the eol submenu.
+        """
+        try:
+            self.supportedEols[self.getLineSeparator()].setChecked(True)
+        except AttributeError:
+            pass
+        
+    def __eolChanged(self):
+        """
+        Private slot to handle a change of the eol mode.
+        """
+        self.__checkEol()
+        
+        if not self.inEolChanged:
+            self.inEolChanged = True
+            eol = self.getLineSeparator()
+            self.emit(SIGNAL("eolChanged"), eol)
+            self.inEolChanged = False
+        
+    def __bindLexer(self, filename, pyname = ""):
+        """
+        Private slot to set the correct lexer depending on language.
+        
+        @param filename filename used to determine the associated lexer language (string)
+        @keyparam pyname name of the pygments lexer to use (string)
+        """
+        if self.lexer_ is not None and \
+           (self.lexer_.lexer() == "container" or self.lexer_.lexer() is None):
+            self.disconnect(self, SIGNAL("SCN_STYLENEEDED(int)"), self.__styleNeeded)
+        
+        language = ""
+        project = e5App().getObject("Project")
+        if project.isOpen() and project.isProjectFile(filename):
+            language = project.getEditorLexerAssoc(os.path.basename(filename))
+        if not language:
+            filename = os.path.basename(filename)
+            language = Preferences.getEditorLexerAssoc(filename)
+        if language.startswith("Pygments|"):
+            pyname = language.split("|", 1)[1]
+            language = ""
+        
+        self.lexer_ = Lexers.getLexer(language, self, pyname = pyname)
+        if self.lexer_ is None:
+            self.setLexer()
+            self.apiLanguage = ""
+            return
+        
+        if pyname:
+            self.apiLanguage = "Pygments|%s" % pyname
+        else:
+            self.apiLanguage = self.lexer_.language()
+            if self.apiLanguage == "POV":
+                self.apiLanguage = "Povray"
+        self.setLexer(self.lexer_)
+        self.__setMarginsDisplay()
+        if self.lexer_.lexer() == "container" or self.lexer_.lexer() is None:
+            self.setStyleBits(self.lexer_.styleBitsNeeded())
+            self.connect(self, SIGNAL("SCN_STYLENEEDED(int)"), self.__styleNeeded)
+        
+        # get the font for style 0 and set it as the default font
+        key = 'Scintilla/%s/style0/font' % self.lexer_.language()
+        fdesc = Preferences.Prefs.settings.value(key)
+        if fdesc is not None:
+            font = QFont(fdesc[0], int(fdesc[1]))
+            self.lexer_.setDefaultFont(font)
+        self.lexer_.readSettings(Preferences.Prefs.settings, "Scintilla")
+        
+        # now set the lexer properties
+        self.lexer_.initProperties()
+        
+        # initialize the auto indent style of the lexer
+        ais = self.lexer_.autoIndentStyle()
+        
+        # initialize the lexer APIs settings
+        api = self.vm.getAPIsManager().getAPIs(self.apiLanguage)
+        if api is not None:
+            self.lexer_.setAPIs(api.getQsciAPIs())
+            self.acAPI = True
+        else:
+            self.acAPI = False
+        self.emit(SIGNAL("autoCompletionAPIsAvailable"), self.acAPI)
+        
+    def __styleNeeded(self, position):
+        """
+        Private slot to handle the need for more styling.
+        
+        @param position end position, that needs styling (integer)
+        """
+        self.lexer_.styleText(self.getEndStyled(), position)
+        
+    def getLexer(self):
+        """
+        Public method to retrieve a reference to the lexer object.
+        
+        @return the lexer object (Lexer)
+        """
+        return self.lexer_
+        
+    def getLanguage(self):
+        """
+        Public method to retrieve the language of the editor.
+        
+        @return language of the editor (string)
+        """
+        if self.apiLanguage == "Guessed" or self.apiLanguage.startswith("Pygments|"):
+            return self.lexer_.name()
+        else:
+            return self.apiLanguage
+        
+    def __bindCompleter(self, filename):
+        """
+        Private slot to set the correct typing completer depending on language.
+        
+        @param filename filename used to determine the associated typing
+            completer language (string)
+        """
+        if self.completer is not None:
+            self.completer.setEnabled(False)
+            self.completer = None
+        
+        filename = os.path.basename(filename)
+        apiLanguage = Preferences.getEditorLexerAssoc(filename)
+        
+        self.completer = TypingCompleters.getCompleter(apiLanguage, self)
+        
+    def getCompleter(self):
+        """
+        Public method to retrieve a reference to the completer object.
+        
+        @return the completer object (CompleterBase)
+        """
+        return self.completer
+        
+    def __modificationChanged(self, m):
+        """
+        Private slot to handle the modificationChanged signal. 
+        
+        It emits the signal modificationStatusChanged with parameters
+        m and self.
+        
+        @param m modification status
+        """
+        if not m and self.fileName is not None:
+            self.lastModified = QFileInfo(self.fileName).lastModified()
+        if Preferences.getEditor("AutoCheckSyntax"):
+            self.clearSyntaxError()
+        self.emit(SIGNAL('modificationStatusChanged'), m, self)
+        self.emit(SIGNAL('undoAvailable'), self.isUndoAvailable())
+        self.emit(SIGNAL('redoAvailable'), self.isRedoAvailable())
+        
+    def __cursorPositionChanged(self, line, index):
+        """
+        Private slot to handle the cursorPositionChanged signal. 
+        
+        It emits the signal cursorChanged with parameters fileName, 
+        line and pos.
+        
+        @param line line number of the cursor
+        @param index position in line of the cursor
+        """
+        self.emit(SIGNAL('cursorChanged'), self.fileName, line+1, index)
+        
+        if Preferences.getEditor("MarkOccurrencesEnabled"):
+            self.__markOccurrencesTimer.stop()
+            self.__markOccurrencesTimer.start()
+        
+        if self.spell is not None:
+            # do spell checking
+            doSpelling = True
+            if self.lastLine == line:
+                start, end = self.getWordBoundaries(line, index, useWordChars = False)
+                if start <= self.lastIndex and self.lastIndex <= end:
+                    doSpelling = False
+            if doSpelling:
+                pos = self.positionFromLineIndex(self.lastLine, self.lastIndex)
+                self.spell.checkWord(pos)
+        
+        self.lastLine = line
+        self.lastIndex = index
+        
+    def __modificationReadOnly(self):
+        """
+        Private slot to handle the modificationAttempted signal.
+        """
+        QMessageBox.warning(None,
+            self.trUtf8("Modification of Read Only file"),
+            self.trUtf8("""You are attempting to change a read only file. """
+                        """Please save to a different file first."""))
+        
+    def setNoName(self, noName):
+        """
+        Public method to set the display string for an unnamed editor.
+        
+        @param noName display string for this unnamed editor (string)
+        """
+        self.noName = noName
+        
+    def getNoName(self):
+        """
+        Public method to get the display string for an unnamed editor.
+        
+        @return display string for this unnamed editor (string)
+        """
+        return self.noName
+        
+    def getFileName(self):
+        """
+        Public method to return the name of the file being displayed.
+        
+        @return filename of the displayed file (string)
+        """
+        return self.fileName
+        
+    def getFileType(self):
+        """
+        Public method to return the type of the file being displayed.
+        
+        @return type of the displayed file (string)
+        """
+        return self.filetype
+        
+    def getEncoding(self):
+        """
+        Public method to return the current encoding.
+        
+        @return current encoding (string)
+        """
+        return self.encoding
+        
+    def getFolds(self):
+        """
+        Public method to get a list line numbers of collapsed folds.
+        
+        @return list of line numbers of folded lines (list of integer)
+        """
+        line = 0
+        folds = []
+        maxline = self.lines()
+        while line < maxline:
+            if self.foldHeaderAt(line) and not self.foldExpandedAt(line):
+                folds.append(line)
+            line += 1
+        return folds
+        
+    def isPyFile(self):
+        """
+        Public method to return a flag indicating a Python file.
+        
+        @return flag indicating a Python file (boolean)
+        """
+        return self.filetype == "Python" or \
+            (self.fileName is not None and \
+             os.path.splitext(self.fileName)[1] in self.pyExtensions)
+
+    def isPy3File(self):
+        """
+        Public method to return a flag indicating a Python3 file.
+        
+        @return flag indicating a Python3 file (boolean)
+        """
+        return self.filetype == "Python3" or \
+            (self.fileName is not None and \
+             os.path.splitext(self.fileName)[1] in self.py3Extensions)
+
+    def isRubyFile(self):
+        """
+        Public method to return a flag indicating a Ruby file.
+        
+        @return flag indicating a Ruby file (boolean)
+        """
+        return self.filetype == "Ruby" or \
+            (self.fileName is not None and \
+             os.path.splitext(self.fileName)[1] in self.rbExtensions)
+        
+    def highlightVisible(self):
+        """
+        Public method to make sure that the highlight is visible.
+        """
+        if self.lastHighlight is not None:
+            lineno = self.markerLine(self.lastHighlight)
+            self.ensureVisible(lineno+1)
+        
+    def highlight(self, line = None, error = False, syntaxError = False):
+        """
+        Public method to highlight (or de-highlight) a particular line.
+        
+        @param line line number to highlight (integer)
+        @param error flag indicating whether the error highlight should be used (boolean)
+        @param syntaxError flag indicating a syntax error (boolean)
+        """
+        if line is None:
+            self.lastHighlight = None
+            if self.lastErrorMarker is not None:
+                self.markerDeleteHandle(self.lastErrorMarker)
+            self.lastErrorMarker = None
+            if self.lastCurrMarker is not None:
+                self.markerDeleteHandle(self.lastCurrMarker)
+            self.lastCurrMarker = None
+        else:
+            if error:
+                if self.lastErrorMarker is not None:
+                    self.markerDeleteHandle(self.lastErrorMarker)
+                self.lastErrorMarker = self.markerAdd(line-1, self.errorline)
+                self.lastHighlight = self.lastErrorMarker
+            else:
+                if self.lastCurrMarker is not None:
+                    self.markerDeleteHandle(self.lastCurrMarker)
+                self.lastCurrMarker = self.markerAdd(line-1, self.currentline)
+                self.lastHighlight = self.lastCurrMarker
+            self.setCursorPosition(line-1, 0)
+        
+    def getHighlightPosition(self):
+        """
+        Public method to return the position of the highlight bar.
+        
+        @return line number of the highlight bar (integer)
+        """
+        if self.lastHighlight is not None:
+            return self.markerLine(self.lastHighlight)
+        else:
+            return 1
+    
+    ############################################################################
+    ## Breakpoint handling methods below
+    ############################################################################
+
+    def __linesChanged(self):
+        """
+        Private method to track text changes.
+        
+        This method checks, if lines have been inserted or removed in order to
+        update the breakpoints.
+        """
+        if self.breaks:
+            bps = []    # list of breakpoints
+            for handle, (ln, cond, temp, enabled, ignorecount) in list(self.breaks.items()):
+                line = self.markerLine(handle) + 1
+                bps.append((ln, line, (cond, temp, enabled, ignorecount)))
+                self.markerDeleteHandle(handle)
+            self.breaks = {}
+            for bp in bps:
+                index = self.breakpointModel.getBreakPointIndex(self.fileName, bp[0])
+                self.breakpointModel.setBreakPointByIndex(index, 
+                    self.fileName, bp[1], bp[2])
+        
+    def __restoreBreakpoints(self):
+        """
+        Private method to restore the breakpoints.
+        """
+        for handle in list(self.breaks.keys()):
+            self.markerDeleteHandle(handle)
+        self.__addBreakPoints(QModelIndex(), 0, self.breakpointModel.rowCount() - 1)
+        
+    def __deleteBreakPoints(self, parentIndex, start, end):
+        """
+        Private slot to delete breakpoints.
+        
+        @param parentIndex index of parent item (QModelIndex)
+        @param start start row (integer)
+        @param end end row (integer)
+        """
+        for row in range(start, end + 1):
+            index = self.breakpointModel.index(row, 0, parentIndex)
+            fn, lineno = self.breakpointModel.getBreakPointByIndex(index)[0:2]
+            if fn == self.fileName:
+                self.clearBreakpoint(lineno)
+        
+    def __changeBreakPoints(self, startIndex, endIndex):
+        """
+        Private slot to set changed breakpoints.
+        
+        @param indexes indexes of changed breakpoints.
+        """
+        self.__addBreakPoints(QModelIndex(), startIndex.row(), endIndex.row())
+        
+    def __breakPointDataAboutToBeChanged(self, startIndex, endIndex):
+        """
+        Private slot to handle the dataAboutToBeChanged signal of the breakpoint model.
+        
+        @param startIndex start index of the rows to be changed (QModelIndex)
+        @param endIndex end index of the rows to be changed (QModelIndex)
+        """
+        self.__deleteBreakPoints(QModelIndex(), startIndex.row(), endIndex.row())
+        
+    def __addBreakPoints(self, parentIndex, start, end):
+        """
+        Private slot to add breakpoints.
+        
+        @param parentIndex index of parent item (QModelIndex)
+        @param start start row (integer)
+        @param end end row (integer)
+        """
+        for row in range(start, end + 1):
+            index = self.breakpointModel.index(row, 0, parentIndex)
+            fn, line, cond, temp, enabled, ignorecount = \
+                self.breakpointModel.getBreakPointByIndex(index)[:6]
+            if fn == self.fileName:
+                self.newBreakpointWithProperties(line, (cond, temp, enabled, ignorecount))
+        
+    def clearBreakpoint(self, line):
+        """
+        Public method to clear a breakpoint.
+        
+        Note: This doesn't clear the breakpoint in the debugger,
+        it just deletes it from the editor internal list of breakpoints.
+        
+        @param line linenumber of the breakpoint (integer)
+        """
+        for handle, (ln, _, _, _, _) in list(self.breaks.items()):
+            if self.markerLine(handle) == line-1:
+                break
+        else:
+            # not found, simply ignore it
+            return
+        
+        del self.breaks[handle]
+        self.markerDeleteHandle(handle)
+        
+    def newBreakpointWithProperties(self, line, properties):
+        """
+        Private method to set a new breakpoint and its properties.
+        
+        @param line line number of the breakpoint (integer)
+        @param properties properties for the breakpoint (tuple)
+                (condition, temporary flag, enabled flag, ignore count)
+        """
+        if not properties[2]:
+            marker = self.dbreakpoint
+        elif properties[0]:
+            marker = properties[1] and self.tcbreakpoint or self.cbreakpoint
+        else:
+            marker = properties[1] and self.tbreakpoint or self.breakpoint
+            
+        handle = self.markerAdd(line-1, marker)
+        self.breaks[handle] = (line,) + properties
+        self.emit(SIGNAL('breakpointToggled'), self)
+        
+    def __toggleBreakpoint(self, line, temporary = False):
+        """
+        Private method to toggle a breakpoint.
+        
+        @param line line number of the breakpoint (integer)
+        @param temporary flag indicating a temporary breakpoint (boolean)
+        """
+        for handle, (ln, _, _, _, _) in list(self.breaks.items()):
+            if self.markerLine(handle) == line - 1:
+                # delete breakpoint or toggle it to the next state
+                index = self.breakpointModel.getBreakPointIndex(self.fileName, line)
+                if Preferences.getDebugger("ThreeStateBreakPoints") and \
+                   not self.breakpointModel.isBreakPointTemporaryByIndex(index):
+                    self.breakpointModel.deleteBreakPointByIndex(index)
+                    self.__addBreakPoint(line, True)
+                else:
+                    self.breakpointModel.deleteBreakPointByIndex(index)
+                    self.emit(SIGNAL('breakpointToggled'), self)
+                break
+        else:
+            self.__addBreakPoint(line, temporary)
+
+    def __addBreakPoint(self, line, temporary):
+        """
+        Private method to add a new breakpoint.
+        
+        @param line line number of the breakpoint (integer)
+        @param temporary flag indicating a temporary breakpoint (boolean)
+        """
+        if self.fileName and \
+           (self.isPyFile() or self.isPy3File() or self.isRubyFile()):
+            self.breakpointModel.addBreakPoint(self.fileName, line,
+                ('', temporary, True, 0))
+            self.emit(SIGNAL('breakpointToggled'), self)
+        
+    def __toggleBreakpointEnabled(self, line):
+        """
+        Private method to toggle a breakpoints enabled status.
+        
+        @param line line number of the breakpoint (integer)
+        """
+        for handle, (ln, cond, temp, enabled, ignorecount) in list(self.breaks.items()):
+            if self.markerLine(handle) == line - 1:
+                break
+        else:
+            # no breakpoint found on that line
+            return
+        
+        index = self.breakpointModel.getBreakPointIndex(self.fileName, line)
+        self.breakpointModel.setBreakPointEnabledByIndex(index, not enabled)
+        
+    def curLineHasBreakpoint(self):
+        """
+        Public method to check for the presence of a breakpoint at the current line.
+        
+        @return flag indicating the presence of a breakpoint (boolean)
+        """
+        line, _ = self.getCursorPosition()
+        return self.markersAtLine(line) & self.breakpointMask != 0
+        
+    def hasBreakpoints(self):
+        """
+        Public method to check for the presence of breakpoints.
+        
+        @return flag indicating the presence of breakpoints (boolean)
+        """
+        return len(self.breaks) > 0
+        
+    def __menuToggleTemporaryBreakpoint(self):
+        """
+        Private slot to handle the 'Toggle temporary breakpoint' context menu action.
+        """
+        if self.line < 0:
+            self.line, index = self.getCursorPosition()
+        self.line += 1
+        self.__toggleBreakpoint(self.line, 1)
+        self.line = -1
+        
+    def menuToggleBreakpoint(self):
+        """
+        Public slot to handle the 'Toggle breakpoint' context menu action.
+        """
+        if self.line < 0:
+            self.line, index = self.getCursorPosition()
+        self.line += 1
+        self.__toggleBreakpoint(self.line)
+        self.line = -1
+        
+    def __menuToggleBreakpointEnabled(self):
+        """
+        Private slot to handle the 'Enable/Disable breakpoint' context menu action.
+        """
+        if self.line < 0:
+            self.line, index = self.getCursorPosition()
+        self.line += 1
+        self.__toggleBreakpointEnabled(self.line)
+        self.line = -1
+        
+    def menuEditBreakpoint(self, line = None):
+        """
+        Public slot to handle the 'Edit breakpoint' context menu action.
+        
+        @param line linenumber of the breakpoint to edit
+        """
+        if line is not None:
+            self.line = line - 1
+        if self.line < 0:
+            self.line, index = self.getCursorPosition()
+        found = False
+        for handle, (ln, cond, temp, enabled, ignorecount) in list(self.breaks.items()):
+            if self.markerLine(handle) == self.line:
+                found = True
+                break
+        
+        if found:
+            index = self.breakpointModel.getBreakPointIndex(self.fileName, ln)
+            if not index.isValid():
+                return
+            
+            dlg = EditBreakpointDialog((self.fileName, ln), 
+                (cond, temp, enabled, ignorecount),
+                self.condHistory, self, modal = True)
+            if dlg.exec_() == QDialog.Accepted:
+                cond, temp, enabled, ignorecount = dlg.getData()
+                self.breakpointModel.setBreakPointByIndex(index, 
+                    self.fileName, ln, (cond, temp, enabled, ignorecount))
+        
+        self.line = -1
+        
+    def menuNextBreakpoint(self):
+        """
+        Public slot to handle the 'Next breakpoint' context menu action.
+        """
+        line, index = self.getCursorPosition()
+        if line == self.lines()-1:
+            line = 0
+        else:
+            line += 1
+        bpline = self.markerFindNext(line, self.breakpointMask)
+        if bpline < 0:
+            # wrap around
+            bpline = self.markerFindNext(0, self.breakpointMask)
+        if bpline >= 0:
+            self.setCursorPosition(bpline, 0)
+            self.ensureLineVisible(bpline)
+        
+    def menuPreviousBreakpoint(self):
+        """
+        Public slot to handle the 'Previous breakpoint' context menu action.
+        """
+        line, index = self.getCursorPosition()
+        if line == 0:
+            line = self.lines()-1
+        else:
+            line -= 1
+        bpline = self.markerFindPrevious(line, self.breakpointMask)
+        if bpline < 0:
+            # wrap around
+            bpline = self.markerFindPrevious(self.lines()-1, self.breakpointMask)
+        if bpline >= 0:
+            self.setCursorPosition(bpline, 0)
+            self.ensureLineVisible(bpline)
+        
+    def __menuClearBreakpoints(self):
+        """
+        Private slot to handle the 'Clear all breakpoints' context menu action.
+        """
+        self.__clearBreakpoints(self.fileName)
+        
+    def __clearBreakpoints(self, fileName):
+        """
+        Private slot to clear all breakpoints.
+        """
+        idxList = []
+        for handle, (ln, _, _, _, _) in list(self.breaks.items()):
+            index = self.breakpointModel.getBreakPointIndex(fileName, ln)
+            if index.isValid():
+                idxList.append(index)
+        if idxList:
+            self.breakpointModel.deleteBreakPoints(idxList)
+    
+    ############################################################################
+    ## Bookmark handling methods below
+    ############################################################################
+    
+    def toggleBookmark(self, line):
+        """
+        Public method to toggle a bookmark.
+        
+        @param line line number of the bookmark (integer)
+        """
+        for handle in self.bookmarks:
+            if self.markerLine(handle) == line - 1:
+                break
+        else:
+            # set a new bookmark
+            handle = self.markerAdd(line - 1, self.bookmark)
+            self.bookmarks.append(handle)
+            self.emit(SIGNAL('bookmarkToggled'), self)
+            return
+        
+        self.bookmarks.remove(handle)
+        self.markerDeleteHandle(handle)
+        self.emit(SIGNAL('bookmarkToggled'), self)
+        
+    def getBookmarks(self):
+        """
+        Public method to retrieve the bookmarks.
+        
+        @return sorted list of all lines containing a bookmark
+            (list of integer)
+        """
+        bmlist = []
+        for handle in self.bookmarks:
+            bmlist.append(self.markerLine(handle) + 1)
+        
+        bmlist.sort()
+        return bmlist
+        
+    def hasBookmarks(self):
+        """
+        Public method to check for the presence of bookmarks.
+        
+        @return flag indicating the presence of bookmarks (boolean)
+        """
+        return len(self.bookmarks) > 0
+    
+    def menuToggleBookmark(self):
+        """
+        Public slot to handle the 'Toggle bookmark' context menu action.
+        """
+        if self.line < 0:
+            self.line, index = self.getCursorPosition()
+        self.line += 1
+        self.toggleBookmark(self.line)
+        self.line = -1
+        
+    def nextBookmark(self):
+        """
+        Public slot to handle the 'Next bookmark' context menu action.
+        """
+        line, index = self.getCursorPosition()
+        if line == self.lines()-1:
+            line = 0
+        else:
+            line += 1
+        bmline = self.markerFindNext(line, 1 << self.bookmark)
+        if bmline < 0:
+            # wrap around
+            bmline = self.markerFindNext(0, 1 << self.bookmark)
+        if bmline >= 0:
+            self.setCursorPosition(bmline, 0)
+            self.ensureLineVisible(bmline)
+        
+    def previousBookmark(self):
+        """
+        Public slot to handle the 'Previous bookmark' context menu action.
+        """
+        line, index = self.getCursorPosition()
+        if line == 0:
+            line = self.lines()-1
+        else:
+            line -= 1
+        bmline = self.markerFindPrevious(line, 1 << self.bookmark)
+        if bmline < 0:
+            # wrap around
+            bmline = self.markerFindPrevious(self.lines() - 1, 1 << self.bookmark)
+        if bmline >= 0:
+            self.setCursorPosition(bmline, 0)
+            self.ensureLineVisible(bmline)
+        
+    def clearBookmarks(self):
+        """
+        Public slot to handle the 'Clear all bookmarks' context menu action.
+        """
+        for handle in self.bookmarks:
+            self.markerDeleteHandle(handle)
+        self.bookmarks = []
+        self.emit(SIGNAL('bookmarkToggled'), self)
+    
+    ############################################################################
+    ## Printing methods below
+    ############################################################################
+
+    def printFile(self):
+        """
+        Public slot to print the text.
+        """
+        printer = Printer(mode = QPrinter.HighResolution)
+        sb = e5App().getObject("UserInterface").statusBar()
+        printDialog = QPrintDialog(printer, self)
+        if self.hasSelectedText():
+            printDialog.addEnabledOption(QAbstractPrintDialog.PrintSelection)
+        if printDialog.exec_() == QDialog.Accepted:
+            sb.showMessage(self.trUtf8('Printing...'))
+            QApplication.processEvents()
+            fn = self.getFileName()
+            if fn is not None:
+                printer.setDocName(os.path.basename(fn))
+            else:
+                printer.setDocName(self.noName)
+            if printDialog.printRange() == QAbstractPrintDialog.Selection:
+                # get the selection
+                fromLine, fromIndex, toLine, toIndex = self.getSelection()
+                if toIndex == 0:
+                    toLine -= 1
+                # Qscintilla seems to print one line more than told
+                res = printer.printRange(self, fromLine, toLine-1)
+            else:
+                res = printer.printRange(self)
+            if res:
+                sb.showMessage(self.trUtf8('Printing completed'), 2000)
+            else:
+                sb.showMessage(self.trUtf8('Error while printing'), 2000)
+            QApplication.processEvents()
+        else:
+            sb.showMessage(self.trUtf8('Printing aborted'), 2000)
+            QApplication.processEvents()
+
+    def printPreviewFile(self):
+        """
+        Public slot to show a print preview of the text.
+        """
+        from PyQt4.QtGui import QPrintPreviewDialog
+        
+        printer = Printer(mode = QPrinter.HighResolution)
+        fn = self.getFileName()
+        if fn is not None:
+            printer.setDocName(os.path.basename(fn))
+        else:
+            printer.setDocName(self.noName)
+        preview = QPrintPreviewDialog(printer, self)
+        self.connect(preview, SIGNAL("paintRequested(QPrinter*)"), self.__printPreview)
+        preview.exec_()
+    
+    def __printPreview(self, printer):
+        """
+        Private slot to generate a print preview.
+        
+        @param printer reference to the printer object (QScintilla.Printer.Printer)
+        """
+        printer.printRange(self)
+    
+    ############################################################################
+    ## Task handling methods below
+    ############################################################################
+
+    def hasTaskMarkers(self):
+        """
+        Public method to determine, if this editor contains any task markers.
+        
+        @return flag indicating the presence of task markers (boolean)
+        """
+        return self.__hasTaskMarkers
+        
+    def nextTask(self):
+        """
+        Public slot to handle the 'Next task' context menu action.
+        """
+        line, index = self.getCursorPosition()
+        if line == self.lines()-1:
+            line = 0
+        else:
+            line += 1
+        taskline = self.markerFindNext(line, 1 << self.taskmarker)
+        if taskline < 0:
+            # wrap around
+            taskline = self.markerFindNext(0, 1 << self.taskmarker)
+        if taskline >= 0:
+            self.setCursorPosition(taskline, 0)
+            self.ensureLineVisible(taskline)
+        
+    def previousTask(self):
+        """
+        Public slot to handle the 'Previous task' context menu action.
+        """
+        line, index = self.getCursorPosition()
+        if line == 0:
+            line = self.lines()-1
+        else:
+            line -= 1
+        taskline = self.markerFindPrevious(line, 1 << self.taskmarker)
+        if taskline < 0:
+            # wrap around
+            taskline = self.markerFindPrevious(self.lines() - 1, 1 << self.taskmarker)
+        if taskline >= 0:
+            self.setCursorPosition(taskline, 0)
+            self.ensureLineVisible(taskline)
+        
+    def extractTasks(self):
+        """
+        Public slot to extract all tasks.
+        """
+        todoMarkers = Preferences.getTasks("TasksMarkers").split()
+        bugfixMarkers = Preferences.getTasks("TasksMarkersBugfix").split()
+        txtList = self.text().split(self.getLineSeparator())
+        
+        # clear all task markers and tasks
+        self.markerDeleteAll(self.taskmarker)
+        self.taskViewer.clearFileTasks(self.fileName)
+        self.__hasTaskMarkers = False
+        
+        # now search tasks and record them
+        lineIndex = -1
+        for line in txtList:
+            lineIndex += 1
+            shouldContinue = False
+            # normal tasks first
+            for tasksMarker in todoMarkers:
+                index = line.find(tasksMarker)
+                if index > -1:
+                    task = line[index:]
+                    self.markerAdd(lineIndex, self.taskmarker)
+                    self.taskViewer.addFileTask(task, self.fileName, lineIndex + 1, False)
+                    self.__hasTaskMarkers = True
+                    shouldContinue = True
+                    break
+            if shouldContinue:
+                continue
+            
+            # bugfix tasks second
+            for tasksMarker in bugfixMarkers:
+                index = line.find(tasksMarker)
+                if index > -1:
+                    task = line[index:]
+                    self.markerAdd(lineIndex, self.taskmarker)
+                    self.taskViewer.addFileTask(task, self.fileName, lineIndex+1, True)
+                    self.__hasTaskMarkers = True
+                    break
+        self.emit(SIGNAL('taskMarkersUpdated'), self)
+    
+    ############################################################################
+    ## File handling methods below
+    ############################################################################
+
+    def checkDirty(self):
+        """
+        Public method to check dirty status and open a message window.
+        
+        @return flag indicating successful reset of the dirty flag (boolean)
+        """
+        if self.isModified():
+            fn = self.fileName
+            if fn is None:
+                fn = self.noName
+            res = QMessageBox.warning(self.vm, 
+                self.trUtf8("File Modified"),
+                self.trUtf8("<p>The file <b>{0}</b> has unsaved changes.</p>")
+                    .format(fn),
+                QMessageBox.StandardButtons(\
+                    QMessageBox.Abort | \
+                    QMessageBox.Discard | \
+                    QMessageBox.Save),
+                QMessageBox.Save)
+            if res == QMessageBox.Save:
+                ok, newName = self.saveFile()
+                if ok:
+                    self.vm.setEditorName(self, newName)
+                return ok
+            elif res == QMessageBox.Abort or res == QMessageBox.Cancel:
+                return False
+        
+        return True
+        
+    def revertToUnmodified(self):
+        """
+        Public method to revert back to the last saved state.
+        """
+        undo_ = True
+        while self.isModified():
+            if undo_:
+            # try undo first
+                if self.isUndoAvailable():
+                    self.undo()
+                else:
+                    undo_ = False
+            else:
+            # try redo next
+                if self.isRedoAvailable():
+                    self.redo()
+                else:
+                    break
+                    # Couldn't find the unmodified state
+    
+    def readFile(self, fn, createIt = False):
+        """
+        Public slot to read the text from a file.
+        
+        @param fn filename to read from (string)
+        @param createIt flag indicating the creation of a new file, if the given
+            one doesn't exist (boolean)
+        """
+        QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
+        
+        try:
+            if createIt and not os.path.exists(fn):
+                f = open(fn, "w")
+                f.close()
+            txt, self.encoding = Utilities.readEncodedFile(fn)
+        except (UnicodeDecodeError, IOError) as why:
+            QApplication.restoreOverrideCursor()
+            QMessageBox.critical(self.vm, self.trUtf8('Open File'),
+                self.trUtf8('<p>The file <b>{0}</b> could not be opened.</p>'
+                            '<p>Reason: {1}</p>')
+                    .format(fn, str(why)))
+            QApplication.restoreOverrideCursor()
+            raise
+        fileEol = self.detectEolString(txt)
+        
+        modified = False
+        if (not Preferences.getEditor("TabForIndentation")) and \
+                Preferences.getEditor("ConvertTabsOnLoad") and \
+                not (self.lexer_ and \
+                     self.lexer_.alwaysKeepTabs()):
+            txtExpanded = txt.expandtabs(Preferences.getEditor("TabWidth"))
+            if txtExpanded != txt:
+                modified = True
+            txt = txtExpanded
+            del txtExpanded
+        
+        self.setText(txt)
+        
+        # perform automatic eol conversion
+        if Preferences.getEditor("AutomaticEOLConversion"):
+            self.convertEols(self.eolMode())
+        else:
+            self.setEolModeByEolString(fileEol)
+        
+        self.extractTasks()
+        
+        QApplication.restoreOverrideCursor()
+        
+        self.setModified(modified)
+        self.lastModified = QFileInfo(self.fileName).lastModified()
+        
+    def setEolModeByEolString(self, eolStr):
+        """
+        Public method to set the eol mode given the eol string.
+        
+        @param eolStr eol string (string)
+        """
+        if eolStr == '\r\n':
+            self.setEolMode(QsciScintilla.EolMode(QsciScintilla.EolWindows))
+        elif eolStr == '\n':
+            self.setEolMode(QsciScintilla.EolMode(QsciScintilla.EolUnix))
+        elif eolStr == '\r':
+            self.setEolMode(QsciScintilla.EolMode(QsciScintilla.EolMac))
+        self.__eolChanged()
+        
+    def __removeTrailingWhitespace(self):
+        """
+        Private method to remove trailing whitespace.
+        """
+        searchRE = r"[ \t]+$"    # whitespace at the end of a line
+        
+        ok = self.findFirstTarget(searchRE, True, False, False, 0, 0)
+        self.beginUndoAction()
+        while ok:
+            self.replaceTarget("")
+            ok = self.findNextTarget()
+        self.endUndoAction()
+        
+    def writeFile(self, fn):
+        """
+        Public slot to write the text to a file.
+        
+        @param fn filename to write to (string)
+        @return flag indicating success (boolean)
+        """
+        if Preferences.getEditor("StripTrailingWhitespace"):
+            self.__removeTrailingWhitespace()
+        
+        txt = self.text()
+        # work around glitch in scintilla: always make sure, 
+        # that the last line is terminated properly
+        eol = self.getLineSeparator()
+        if eol:
+            if len(txt) >= len(eol):
+                if txt[-len(eol):] != eol:
+                    txt += eol
+            else:
+                txt += eol
+        
+        # create a backup file, if the option is set
+        createBackup = Preferences.getEditor("CreateBackupFile")
+        if createBackup:
+            if os.path.islink(fn):
+                fn = os.path.realpath(fn)
+            bfn = '%s~' % fn
+            try:
+                permissions = os.stat(fn).st_mode
+                perms_valid = True
+            except EnvironmentError:
+                # if there was an error, ignore it
+                perms_valid = False
+            try:
+                os.remove(bfn)
+            except EnvironmentError:
+                # if there was an error, ignore it
+                pass
+            try:
+                os.rename(fn, bfn)
+            except EnvironmentError:
+                # if there was an error, ignore it
+                pass
+        
+        # now write text to the file fn
+        try:
+            self.encoding = Utilities.writeEncodedFile(fn, txt, self.encoding)
+            if createBackup and perms_valid:
+                os.chmod(fn, permissions)
+            return True
+        except (IOError, Utilities.CodingError, UnicodeError) as why:
+            QMessageBox.critical(self, self.trUtf8('Save File'),
+                self.trUtf8('<p>The file <b>{0}</b> could not be saved.<br/>'
+                            'Reason: {1}</p>')
+                    .format(fn, str(why)))
+            return False
+        
+    def saveFile(self, saveas = False, path = None):
+        """
+        Public slot to save the text to a file.
+        
+        @param saveas flag indicating a 'save as' action (boolean)
+        @param path directory to save the file in (string)
+        @return tuple of two values (boolean, string) giving a success indicator and
+            the name of the saved file
+        """
+        if not saveas and not self.isModified():
+            return (False, None)      # do nothing if text wasn't changed
+            
+        newName = None
+        if saveas or self.fileName is None:
+            saveas = True
+            if not path and self.fileName is not None:
+                path = os.path.dirname(self.fileName)
+            if path is None:
+                path = ""
+            defaultFilter = Preferences.getEditor("DefaultSaveFilter")
+            fn, selectedFilter = QFileDialog.getSaveFileNameAndFilter(
+                self,
+                self.trUtf8("Save File"),
+                path,
+                Lexers.getSaveFileFiltersList(True, True), 
+                defaultFilter,
+                QFileDialog.Options(QFileDialog.DontConfirmOverwrite))
+            
+            if fn:
+                ext = QFileInfo(fn).suffix()
+                if not ext:
+                    ex = selectedFilter.split("(*")[1].split(")")[0]
+                    if ex:
+                        fn += ex
+                if QFileInfo(fn).exists():
+                    res = QMessageBox.warning(self,
+                        self.trUtf8("Save File"),
+                        self.trUtf8("<p>The file <b>{0}</b> already exists.</p>")
+                            .format(fn),
+                        QMessageBox.StandardButtons(\
+                            QMessageBox.Abort | \
+                            QMessageBox.Save),
+                        QMessageBox.Abort)
+                    if res == QMessageBox.Abort or res == QMessageBox.Cancel:
+                        return (False, None)
+                fn = Utilities.toNativeSeparators(fn)
+                newName = fn
+            else:
+                return (False, None)
+        else:
+            fn = self.fileName
+        
+        self.emit(SIGNAL('editorAboutToBeSaved'), self.fileName)
+        if self.writeFile(fn):
+            if saveas:
+                self.__clearBreakpoints(self.fileName)
+            self.fileName = fn
+            self.setModified(False)
+            self.setReadOnly(False)
+            self.setWindowTitle(self.fileName)
+            if self.lexer_ is None and not self.__lexerReset:
+                self.setLanguage(self.fileName)
+            
+            if saveas:
+                self.isResourcesFile = self.fileName.endswith(".qrc")
+                self.__initContextMenu()
+                self.emit(SIGNAL('editorRenamed'), self.fileName)
+            self.lastModified = QFileInfo(self.fileName).lastModified()
+            if newName is not None:
+                self.vm.addToRecentList(newName)
+            self.emit(SIGNAL('editorSaved'), self.fileName)
+            self.__autoSyntaxCheck()
+            self.extractTasks()
+            return (True, self.fileName)
+        else:
+            self.lastModified = QFileInfo(fn).lastModified()
+            return (False, None)
+        
+    def saveFileAs(self, path = None):
+        """
+        Public slot to save a file with a new name.
+        
+        @param path directory to save the file in (string)
+        @return tuple of two values (boolean, string) giving a success indicator and
+            the name of the saved file
+        """
+        return self.saveFile(True, path)
+        
+    def handleRenamed(self, fn):
+        """
+        Public slot to handle the editorRenamed signal.
+        
+        @param fn filename to be set for the editor (string).
+        """
+        self.__clearBreakpoints(fn)
+        
+        self.fileName = fn
+        self.setWindowTitle(self.fileName)
+        
+        if self.lexer_ is None:
+            self.setLanguage(self.fileName)
+        
+        self.lastModified = QFileInfo(self.fileName).lastModified()
+        self.vm.setEditorName(self, self.fileName)
+        self.__updateReadOnly(True)
+        
+    def fileRenamed(self, fn):
+        """
+        Public slot to handle the editorRenamed signal.
+        
+        @param fn filename to be set for the editor (string).
+        """
+        self.handleRenamed(fn)
+        if not self.inFileRenamed:
+            self.inFileRenamed = True
+            self.emit(SIGNAL('editorRenamed'), self.fileName)
+            self.inFileRenamed = False
+    
+    ############################################################################
+    ## Utility methods below
+    ############################################################################
+
+    def ensureVisible(self, line):
+        """
+        Public slot to ensure, that the specified line is visible.
+        
+        @param line line number to make visible
+        """
+        self.ensureLineVisible(line-1)
+        
+    def ensureVisibleTop(self, line):
+        """
+        Public slot to ensure, that the specified line is visible at the top
+        of the editor.
+        
+        @param line line number to make visible
+        """
+        topLine = self.firstVisibleLine()
+        linesToScroll = line - topLine
+        self.scrollVertical(linesToScroll)
+        
+    def __marginClicked(self, margin, line, modifiers):
+        """
+        Private slot to handle the marginClicked signal.
+        
+        @param margin id of the clicked margin (integer)
+        @param line line number of the click (integer)
+        @param modifiers keyboard modifiers (Qt.KeyboardModifiers)
+        """
+        if self.__unifiedMargins:
+            if margin == 1:
+                if modifiers & Qt.KeyboardModifiers(Qt.ShiftModifier):
+                    if self.marginMenuActs["LMBbreakpoints"].isChecked():
+                        self.toggleBookmark(line + 1)
+                    else:
+                        self.__toggleBreakpoint(line + 1)
+                elif modifiers & Qt.KeyboardModifiers(Qt.ControlModifier):
+                    if self.markersAtLine(line) & (1 << self.syntaxerror):
+                        self.__showSyntaxError(line)
+                    elif self.markersAtLine(line) & (1 << self.warning):
+                        self.__showFlakesWarning(line)
+                else:
+                    if self.marginMenuActs["LMBbreakpoints"].isChecked():
+                        self.__toggleBreakpoint(line + 1)
+                    else:
+                        self.toggleBookmark(line + 1)
+        else:
+            if margin == self.__bmMargin:
+                        self.toggleBookmark(line + 1)
+            elif margin == self.__bpMargin:
+                        self.__toggleBreakpoint(line + 1)
+            elif margin == self.__indicMargin:
+                if self.markersAtLine(line) & (1 << self.syntaxerror):
+                    self.__showSyntaxError(line)
+                elif self.markersAtLine(line) & (1 << self.warning):
+                    self.__showFlakesWarning(line)
+        
+    def handleMonospacedEnable(self):
+        """
+        Private slot to handle the Use Monospaced Font context menu entry.
+        """
+        if self.menuActs["MonospacedFont"].isChecked():
+            self.setMonospaced(True)
+        else:
+            if self.lexer_:
+                self.lexer_.readSettings(Preferences.Prefs.settings, "Scintilla")
+                self.lexer_.initProperties()
+            self.setMonospaced(False)
+            self.__setMarginsDisplay()
+        
+    def getWordBoundaries(self, line, index, useWordChars = True):
+        """
+        Public method to get the word boundaries at a position.
+        
+        @param line number of line to look at (int)
+        @param index position to look at (int)
+        @keyparam useWordChars flag indicating to use the wordCharacters 
+            method (boolean)
+        @return tuple with start and end indices of the word at the position
+            (integer, integer)
+        """
+        text = self.text(line)
+        if self.caseSensitive():
+            cs = Qt.CaseSensitive
+        else:
+            cs = Qt.CaseInsensitive
+        wc = self.wordCharacters()
+        if wc is None or not useWordChars:
+            regExp = QRegExp('[^\w_]', cs)
+        else:
+            regExp = QRegExp('[^%s]' % re.escape(wc), cs)
+        start = regExp.lastIndexIn(text, index) + 1
+        end = regExp.indexIn(text, index)
+        if start == end + 1 and index > 0:
+            # we are on a word boundary, try again
+            start = regExp.lastIndexIn(text, index - 1) + 1
+        if start == -1:
+            start = 0
+        if end == -1:
+            end = len(text)
+        
+        return (start, end)
+        
+    def getWord(self, line, index, direction = 0, useWordChars = True):
+        """
+        Public method to get the word at a position.
+        
+        @param line number of line to look at (int)
+        @param index position to look at (int)
+        @param direction direction to look in (0 = whole word, 1 = left, 2 = right)
+        @keyparam useWordChars flag indicating to use the wordCharacters 
+            method (boolean)
+        @return the word at that position (string)
+        """
+        start, end = self.getWordBoundaries(line, index, useWordChars)
+        if direction == 1:
+            end = index
+        elif direction == 2:
+            start = index
+        if end > start:
+            text = self.text(line)
+            word = text[start:end]
+        else:
+            word = ''
+        return word
+        
+    def getWordLeft(self, line, index):
+        """
+        Public method to get the word to the left of a position.
+        
+        @param line number of line to look at (int)
+        @param index position to look at (int)
+        @return the word to the left of that position (string)
+        """
+        return self.getWord(line, index, 1)
+        
+    def getWordRight(self, line, index):
+        """
+        Public method to get the word to the right of a position.
+        
+        @param line number of line to look at (int)
+        @param index position to look at (int)
+        @return the word to the right of that position (string)
+        """
+        return self.getWord(line, index, 2)
+        
+    def getCurrentWord(self):
+        """
+        Public method to get the word at the current position.
+        
+        @return the word at that current position (string)
+        """
+        line, index = self.getCursorPosition()
+        return self.getWord(line, index)
+        
+    def selectWord(self, line, index):
+        """
+        Public method to select the word at a position.
+        
+        @param line number of line to look at (int)
+        @param index position to look at (int)
+        """
+        start, end = self.getWordBoundaries(line, index)
+        self.setSelection(line, start, line, end)
+        
+    def selectCurrentWord(self):
+        """
+        Public method to select the current word.
+        """
+        line, index = self.getCursorPosition()
+        self.selectWord(line, index)
+        
+    def __getCharacter(self, pos):
+        """
+        Private method to get the character to the left of the current position
+        in the current line.
+        
+        @param pos position to get character at (integer)
+        @return requested character or "", if there are no more (string) and
+            the next position (i.e. pos - 1)
+        """
+        if pos <= 0:
+            return "", pos
+        
+        pos = self.positionBefore(pos)
+        ch = self.charAt(pos)
+        
+        # Don't go past the end of the previous line
+        if ch == '\n' or ch == '\r':
+            return "", pos
+        
+        return ch, pos
+    
+    def getSearchText(self, selectionOnly = False):
+        """
+        Public method to determine the selection or the current word for the next 
+        search operation.
+        
+        @param selectionOnly flag indicating that only selected text should be
+            returned (boolean)
+        @return selection or current word (string)
+        """
+        if self.hasSelectedText():
+            text = self.selectedText()
+            if '\r' in text or '\n' in text:
+                # the selection contains at least a newline, it is
+                # unlikely to be the expression to search for
+                return ''
+            
+            return text
+        
+        if not selectionOnly:
+            # no selected text, determine the word at the current position
+            return self.getCurrentWord()
+        
+        return ''
+        
+    def setSearchIndicator(self, startPos, indicLength):
+        """
+        Public method to set a search indicator for the given range.
+        
+        @param startPos start position of the indicator (integer)
+        @param indicLength length of the indicator (integer)
+        """
+        self.setIndicatorRange(self.searchIndicator, startPos, indicLength)
+        
+    def clearSearchIndicators(self):
+        """
+        Public method to clear all search indicators.
+        """
+        self.clearAllIndicators(self.searchIndicator)
+        self.__markedText = ""
+        
+    def __markOccurrences(self):
+        """
+        Private method to mark all occurrences of the current word.
+        """
+        word = self.getCurrentWord()
+        if not word:
+            self.clearSearchIndicators()
+            return
+        
+        if self.__markedText == word:
+            return
+        
+        self.clearSearchIndicators()
+        ok = self.findFirstTarget(word, False, self.caseSensitive(), True, 0, 0)
+        while ok:
+            tgtPos, tgtLen = self.getFoundTarget()
+            self.setSearchIndicator(tgtPos, tgtLen)
+            ok = self.findNextTarget()
+        self.__markedText = word
+    
+    ############################################################################
+    ## Comment handling methods below
+    ############################################################################
+
+    def commentLine(self):
+        """
+        Public slot to comment the current line.
+        """
+        if self.lexer_ is None or not self.lexer_.canBlockComment():
+            return
+        
+        line, index = self.getCursorPosition()
+        self.beginUndoAction()
+        if Preferences.getEditor("CommentColumn0"):
+            self.insertAt(self.lexer_.commentStr(), line, 0)
+        else:
+            self.insertAt(self.lexer_.commentStr(), line, self.indentation(line))
+        self.endUndoAction()
+        
+    def uncommentLine(self):
+        """
+        Public slot to uncomment the current line.
+        """
+        if self.lexer_ is None or not self.lexer_.canBlockComment():
+            return
+        
+        commentStr = self.lexer_.commentStr()
+        line, index = self.getCursorPosition()
+        
+        # check if line starts with our comment string (i.e. was commented
+        # by our comment...() slots
+        if not self.text(line).strip().startswith(commentStr):
+            return
+        
+        # now remove the comment string
+        self.beginUndoAction()
+        if Preferences.getEditor("CommentColumn0"):
+            self.setSelection(line, 0, line, len(commentStr))
+        else:
+            self.setSelection(line, self.indentation(line), 
+                              line, self.indentation(line) + len(commentStr))
+        self.removeSelectedText()
+        self.endUndoAction()
+        
+    def commentSelection(self):
+        """
+        Public slot to comment the current selection.
+        """
+        if self.lexer_ is None or not self.lexer_.canBlockComment():
+            return
+        
+        if not self.hasSelectedText():
+            return
+        
+        commentStr = self.lexer_.commentStr()
+        
+        # get the selection boundaries
+        lineFrom, indexFrom, lineTo, indexTo = self.getSelection()
+        if indexTo == 0:
+            endLine = lineTo - 1
+        else:
+            endLine = lineTo
+        
+        self.beginUndoAction()
+        # iterate over the lines
+        for line in range(lineFrom, endLine + 1):
+            if Preferences.getEditor("CommentColumn0"):
+                self.insertAt(commentStr, line, 0)
+            else:
+                self.insertAt(commentStr, line, self.indentation(line))
+        
+        # change the selection accordingly
+        self.setSelection(lineFrom, 0, endLine + 1, 0)
+        self.endUndoAction()
+        
+    def uncommentSelection(self):
+        """
+        Public slot to uncomment the current selection. 
+        """
+        if self.lexer_ is None or not self.lexer_.canBlockComment():
+            return
+        
+        if not self.hasSelectedText():
+            return
+        
+        commentStr = self.lexer_.commentStr()
+        
+        # get the selection boundaries
+        lineFrom, indexFrom, lineTo, indexTo = self.getSelection()
+        if indexTo == 0:
+            endLine = lineTo - 1
+        else:
+            endLine = lineTo
+        
+        self.beginUndoAction()
+        # iterate over the lines
+        for line in range(lineFrom, endLine+1):
+            # check if line starts with our comment string (i.e. was commented
+            # by our comment...() slots
+            if not self.text(line).strip().startswith(commentStr):
+                continue
+            
+            if Preferences.getEditor("CommentColumn0"):
+                self.setSelection(line, 0, line, len(commentStr))
+            else:
+                self.setSelection(line, self.indentation(line), 
+                                  line, self.indentation(line) + len(commentStr))
+            self.removeSelectedText()
+            
+            # adjust selection start
+            if line == lineFrom:
+                indexFrom -= len(commentStr)
+                if indexFrom < 0:
+                    indexFrom = 0
+            
+            # adjust selection end
+            if line == lineTo:
+                indexTo -= len(commentStr)
+                if indexTo < 0:
+                    indexTo = 0
+            
+        # change the selection accordingly
+        self.setSelection(lineFrom, indexFrom, lineTo, indexTo)
+        self.endUndoAction()
+        
+    def commentLineOrSelection(self):
+        """
+        Public slot to comment the current line or current selection.
+        """
+