Merged with default branch to prepare a new release. maintenance release-19.06

Sun, 02 Jun 2019 11:42:48 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sun, 02 Jun 2019 11:42:48 +0200
branch
maintenance
changeset 7035
d2036d7f5ef6
parent 6991
68256afbba26 (current diff)
parent 7034
ca42317bb307 (diff)
child 7036
ee0119c66068

Merged with default branch to prepare a new release.

docs/changelog file | annotate | diff | comparison | revisions
eric6.e4p file | annotate | diff | comparison | revisions
eric6/APIs/Python3/eric6.api file | annotate | diff | comparison | revisions
eric6/Documentation/Help/source.qch file | annotate | diff | comparison | revisions
eric6/Documentation/Help/source.qhp file | annotate | diff | comparison | revisions
eric6/Documentation/Source/eric6.QScintilla.Editor.html file | annotate | diff | comparison | revisions
eric6/Plugins/ViewManagerPlugins/Tabview/Tabview.py file | annotate | diff | comparison | revisions
eric6/Preferences/__init__.py file | annotate | diff | comparison | revisions
eric6/QScintilla/Editor.py file | annotate | diff | comparison | revisions
eric6/ThirdParty/EditorConfig/LICENSE.txt file | annotate | diff | comparison | revisions
eric6/UI/UserInterface.py file | annotate | diff | comparison | revisions
eric6/ViewManager/ViewManager.py file | annotate | diff | comparison | revisions
eric6/i18n/eric6_cs.ts file | annotate | diff | comparison | revisions
eric6/i18n/eric6_de.qm file | annotate | diff | comparison | revisions
eric6/i18n/eric6_de.ts file | annotate | diff | comparison | revisions
eric6/i18n/eric6_empty.ts file | annotate | diff | comparison | revisions
eric6/i18n/eric6_en.ts file | annotate | diff | comparison | revisions
eric6/i18n/eric6_es.qm file | annotate | diff | comparison | revisions
eric6/i18n/eric6_es.ts file | annotate | diff | comparison | revisions
eric6/i18n/eric6_fr.ts file | annotate | diff | comparison | revisions
eric6/i18n/eric6_it.ts file | annotate | diff | comparison | revisions
eric6/i18n/eric6_pt.ts file | annotate | diff | comparison | revisions
eric6/i18n/eric6_ru.qm file | annotate | diff | comparison | revisions
eric6/i18n/eric6_ru.ts file | annotate | diff | comparison | revisions
eric6/i18n/eric6_tr.ts file | annotate | diff | comparison | revisions
eric6/i18n/eric6_zh_CN.ts file | annotate | diff | comparison | revisions
--- a/docs/changelog	Sat May 04 12:04:12 2019 +0200
+++ b/docs/changelog	Sun Jun 02 11:42:48 2019 +0200
@@ -1,5 +1,46 @@
 Change Log
 ----------
+Version 19.6:
+- bug fixes
+- Code Style Checker
+  -- added checks for use of 'gettattr' and 'setattr', bas super() calls and
+     'assert False' statements
+- Editor
+  -- Python Typing
+     --- added support for 'from ... import (...)'
+     --- changed the indentation when the previous line ends with
+         '(', '[' or '{'
+  -- Ruby Typing
+     --- changed the indentation when the previous line ends with
+         '(', '[' or '{'
+- Mercurial Interface
+  -- extended the log browser to start with showing all incoming and the
+     first batch of local changesets
+  -- show different icons for incoming, outgoing and normal changesets
+  -- added capability to search and filter based on the changeset phase
+  -- added support for the 'closehead' extension (as of Mercurial 4.8)
+  -- added support for the '--keep' flag of the shelve command (as of
+     Mercurial 5.0)
+- Shell
+  -- added capability to place the Shell window in the left or right side
+     container
+- setup.py Wizard
+  -- updated the Trove classifiers list
+  -- added capability to retrieve the Trove classifiers list from PyPI
+- Variables Viewer
+  -- reimplemented Variables Viewer using QTreeView with unlimited access to
+     big arrays, dicts, etc. because elements are lazy loaded
+  -- highlighting of still unloaded (default: yellow background) and last
+     changed variable(s) (default: green background)
+  -- colors for highlighting are configurable through Debugger->General
+  -- expand / collapse variables with children on double click on first column,
+     in all other cases display detail window
+  -- handling of dict views improved (can be expanded like lists)
+  -- show tooltips on all elements which don't fit into current column width
+  -- new options in the context menu, e.g. expand / collapse all child nodes
+- Third Party packages
+  -- updated EditorConfig to 0.12.2
+
 Version 19.5:
 - bug fixes
 - General
--- a/eric6.e4p	Sat May 04 12:04:12 2019 +0200
+++ b/eric6.e4p	Sun Jun 02 11:42:48 2019 +0200
@@ -626,6 +626,10 @@
     <Source>eric6/Plugins/VcsPlugins/vcsGit/ProjectHelper.py</Source>
     <Source>eric6/Plugins/VcsPlugins/vcsGit/__init__.py</Source>
     <Source>eric6/Plugins/VcsPlugins/vcsGit/git.py</Source>
+    <Source>eric6/Plugins/VcsPlugins/vcsMercurial/CloseheadExtension/HgCloseHeadSelectionDialog.py</Source>
+    <Source>eric6/Plugins/VcsPlugins/vcsMercurial/CloseheadExtension/ProjectHelper.py</Source>
+    <Source>eric6/Plugins/VcsPlugins/vcsMercurial/CloseheadExtension/__init__.py</Source>
+    <Source>eric6/Plugins/VcsPlugins/vcsMercurial/CloseheadExtension/closehead.py</Source>
     <Source>eric6/Plugins/VcsPlugins/vcsMercurial/Config.py</Source>
     <Source>eric6/Plugins/VcsPlugins/vcsMercurial/ConfigurationPage/MercurialPage.py</Source>
     <Source>eric6/Plugins/VcsPlugins/vcsMercurial/ConfigurationPage/__init__.py</Source>
@@ -1734,6 +1738,7 @@
     <Source>setup.py</Source>
   </Sources>
   <Forms>
+    <Form>eric6/Plugins/VcsPlugins/vcsMercurial/CloseheadExtension/HgCloseHeadSelectionDialog.ui</Form>
     <Form>eric6/CondaInterface/CondaExecDialog.ui</Form>
     <Form>eric6/CondaInterface/CondaExportDialog.ui</Form>
     <Form>eric6/CondaInterface/CondaInfoDialog.ui</Form>
@@ -2284,14 +2289,14 @@
     <Other>docs/THANKS</Other>
     <Other>docs/changelog</Other>
     <Other>eric6.e4p</Other>
-    <Other>eric6/APIs/Python/zope-2.10.7.api</Other>
-    <Other>eric6/APIs/Python/zope-2.11.2.api</Other>
-    <Other>eric6/APIs/Python/zope-3.3.1.api</Other>
     <Other>eric6/APIs/Python3/PyQt4.bas</Other>
     <Other>eric6/APIs/Python3/PyQt5.bas</Other>
     <Other>eric6/APIs/Python3/QScintilla2.bas</Other>
     <Other>eric6/APIs/Python3/eric6.api</Other>
     <Other>eric6/APIs/Python3/eric6.bas</Other>
+    <Other>eric6/APIs/Python/zope-2.10.7.api</Other>
+    <Other>eric6/APIs/Python/zope-2.11.2.api</Other>
+    <Other>eric6/APIs/Python/zope-3.3.1.api</Other>
     <Other>eric6/APIs/QSS/qss.api</Other>
     <Other>eric6/APIs/Ruby/Ruby-1.8.7.api</Other>
     <Other>eric6/APIs/Ruby/Ruby-1.8.7.bas</Other>
@@ -2428,7 +2433,9 @@
     <Other>eric6/Styles</Other>
     <Other>eric6/ThirdParty/CharDet/LICENSE</Other>
     <Other>eric6/ThirdParty/CharDet/README.rst</Other>
-    <Other>eric6/ThirdParty/EditorConfig/LICENSE.txt</Other>
+    <Other>eric6/ThirdParty/EditorConfig/COPYING</Other>
+    <Other>eric6/ThirdParty/EditorConfig/LICENSE.BSD</Other>
+    <Other>eric6/ThirdParty/EditorConfig/LICENSE.PSF</Other>
     <Other>eric6/ThirdParty/EditorConfig/README.rst</Other>
     <Other>eric6/ThirdParty/Jasy/jasy/license.md</Other>
     <Other>eric6/ThirdParty/Pygments/pygments/AUTHORS</Other>
--- a/eric6/APIs/Python3/eric6.api	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/APIs/Python3/eric6.api	Sun Jun 02 11:42:48 2019 +0200
@@ -290,6 +290,7 @@
 eric6.DebugClients.Python.DebugClient.DebugClient?1()
 eric6.DebugClients.Python.DebugClientBase.DebugClientBase.Indicators?7
 eric6.DebugClients.Python.DebugClientBase.DebugClientBase.absPath?4(fn)
+eric6.DebugClients.Python.DebugClientBase.DebugClientBase.arrayTypes?7
 eric6.DebugClients.Python.DebugClientBase.DebugClientBase.clientCapabilities?7
 eric6.DebugClients.Python.DebugClientBase.DebugClientBase.close?4(fd)
 eric6.DebugClients.Python.DebugClientBase.DebugClientBase.connectDebugger?4(port, remoteAddress=None, redirect=True)
@@ -332,6 +333,9 @@
 eric6.DebugClients.Python.DebugClientCapabilities.HasProfiler?7
 eric6.DebugClients.Python.DebugClientCapabilities.HasShell?7
 eric6.DebugClients.Python.DebugClientCapabilities.HasUnittest?7
+eric6.DebugClients.Python.DebugConfig.BatchSize?7
+eric6.DebugClients.Python.DebugConfig.ConfigKnownQtTypes?7
+eric6.DebugClients.Python.DebugConfig.ConfigQtNames?7
 eric6.DebugClients.Python.DebugConfig.ConfigVarTypeStrings?7
 eric6.DebugClients.Python.DebugUtilities.ArgInfo?7
 eric6.DebugClients.Python.DebugUtilities._getfullargs?5(co)
@@ -344,26 +348,25 @@
 eric6.DebugClients.Python.DebugVariables.BaseResolver.getDictionary?4(var)
 eric6.DebugClients.Python.DebugVariables.BaseResolver.resolve?4(var, attribute)
 eric6.DebugClients.Python.DebugVariables.DefaultResolver.getDictionary?4(var)
-eric6.DebugClients.Python.DebugVariables.DefaultResolver.resolve?4(var, attribute)
 eric6.DebugClients.Python.DebugVariables.DictResolver.getDictionary?4(var)
 eric6.DebugClients.Python.DebugVariables.DictResolver.keyToStr?4(key)
 eric6.DebugClients.Python.DebugVariables.DictResolver.resolve?4(var, attribute)
+eric6.DebugClients.Python.DebugVariables.DictViewResolver.getDictionary?4(var)
+eric6.DebugClients.Python.DebugVariables.DictViewResolver.resolve?4(var, attribute)
 eric6.DebugClients.Python.DebugVariables.ListResolver.getDictionary?4(var)
 eric6.DebugClients.Python.DebugVariables.ListResolver.resolve?4(var, attribute)
-eric6.DebugClients.Python.DebugVariables.MaxItemsToHandle?7
 eric6.DebugClients.Python.DebugVariables.MultiValueDictResolver.getDictionary?4(var)
 eric6.DebugClients.Python.DebugVariables.MultiValueDictResolver.resolve?4(var, attribute)
 eric6.DebugClients.Python.DebugVariables.NdArrayResolver.getDictionary?4(var)
 eric6.DebugClients.Python.DebugVariables.NdArrayResolver.resolve?4(var, attribute)
 eric6.DebugClients.Python.DebugVariables.SetResolver.getDictionary?4(var)
 eric6.DebugClients.Python.DebugVariables.SetResolver.resolve?4(var, attribute)
-eric6.DebugClients.Python.DebugVariables.TooLargeAttribute?7
-eric6.DebugClients.Python.DebugVariables.TooLargeMessage?7
 eric6.DebugClients.Python.DebugVariables._TypeMap?8
 eric6.DebugClients.Python.DebugVariables._initTypeMap?5()
 eric6.DebugClients.Python.DebugVariables.arrayResolver?7
 eric6.DebugClients.Python.DebugVariables.defaultResolver?7
 eric6.DebugClients.Python.DebugVariables.dictResolver?7
+eric6.DebugClients.Python.DebugVariables.dictViewResolver?7
 eric6.DebugClients.Python.DebugVariables.getType?4(obj)
 eric6.DebugClients.Python.DebugVariables.listResolver?7
 eric6.DebugClients.Python.DebugVariables.multiValueDictResolver?7
@@ -612,10 +615,11 @@
 eric6.Debugger.DebugViewer.DebugViewer.currentWidget?4()
 eric6.Debugger.DebugViewer.DebugViewer.handleClientStack?4(stack)
 eric6.Debugger.DebugViewer.DebugViewer.handleDebuggingStarted?4()
+eric6.Debugger.DebugViewer.DebugViewer.handlePreferencesChanged?4()
 eric6.Debugger.DebugViewer.DebugViewer.handleResetUI?4()
 eric6.Debugger.DebugViewer.DebugViewer.initCallStackViewer?4(projectMode)
 eric6.Debugger.DebugViewer.DebugViewer.isCallTraceEnabled?4()
-eric6.Debugger.DebugViewer.DebugViewer.preferencesChanged?4()
+eric6.Debugger.DebugViewer.DebugViewer.preferencesChanged?7
 eric6.Debugger.DebugViewer.DebugViewer.setCallTraceToProjectMode?4(enabled)
 eric6.Debugger.DebugViewer.DebugViewer.setCurrentWidget?4(widget)
 eric6.Debugger.DebugViewer.DebugViewer.setDebugger?4(debugUI)
@@ -756,29 +760,40 @@
 eric6.Debugger.VariablesFilterDialog.VariablesFilterDialog.on_buttonBox_clicked?4(button)
 eric6.Debugger.VariablesFilterDialog.VariablesFilterDialog.setSelection?4(lList, gList)
 eric6.Debugger.VariablesFilterDialog.VariablesFilterDialog?1(parent=None, name=None, modal=False)
-eric6.Debugger.VariablesViewer.ArrayElementVarItem?1(parent, dvar, dvalue, dtype)
-eric6.Debugger.VariablesViewer.SpecialArrayElementVarItem?1(parent, dvar, dvalue, dtype, frmnr, globalScope)
-eric6.Debugger.VariablesViewer.SpecialVarItem.expand?4()
-eric6.Debugger.VariablesViewer.SpecialVarItem?1(parent, dvar, dvalue, dtype, frmnr, globalScope)
-eric6.Debugger.VariablesViewer.VariableItem.Indicators?7
+eric6.Debugger.VariablesViewer.SORT_ROLE?7
 eric6.Debugger.VariablesViewer.VariableItem.Type2Indicators?7
-eric6.Debugger.VariablesViewer.VariableItem._buildKey?5()
-eric6.Debugger.VariablesViewer.VariableItem.attachDummy?4()
-eric6.Debugger.VariablesViewer.VariableItem.collapse?4()
-eric6.Debugger.VariablesViewer.VariableItem.data?4(column, role)
-eric6.Debugger.VariablesViewer.VariableItem.deleteChildren?4()
-eric6.Debugger.VariablesViewer.VariableItem.expand?4()
-eric6.Debugger.VariablesViewer.VariableItem.extractId?4(var)
-eric6.Debugger.VariablesViewer.VariableItem.extractIndicators?4(var)
-eric6.Debugger.VariablesViewer.VariableItem.getId?4()
-eric6.Debugger.VariablesViewer.VariableItem.getValue?4()
-eric6.Debugger.VariablesViewer.VariableItem?1(parent, dvar, dvalue, dtype)
-eric6.Debugger.VariablesViewer.VariablesViewer.collapseItem?4(parentItem)
-eric6.Debugger.VariablesViewer.VariablesViewer.expandItem?4(parentItem)
+eric6.Debugger.VariablesViewer.VariableItem.absolutCount?4()
+eric6.Debugger.VariablesViewer.VariableItem.arrayTypes?7
+eric6.Debugger.VariablesViewer.VariableItem.noOfItemsStr?7
+eric6.Debugger.VariablesViewer.VariableItem.nonExpandableTypes?7
+eric6.Debugger.VariablesViewer.VariableItem.populated?4()
+eric6.Debugger.VariablesViewer.VariableItem.rx_nonprintable?7
+eric6.Debugger.VariablesViewer.VariableItem?1(parent, dvar, dtype, dvalue)
+eric6.Debugger.VariablesViewer.VariablesModel.clear?4(reset=False)
+eric6.Debugger.VariablesViewer.VariablesModel.columnCount?4(parent=QModelIndex())
+eric6.Debugger.VariablesViewer.VariablesModel.data?4(index, role=Qt.DisplayRole)
+eric6.Debugger.VariablesViewer.VariablesModel.expand?7
+eric6.Debugger.VariablesViewer.VariablesModel.flags?4(index)
+eric6.Debugger.VariablesViewer.VariablesModel.getMore?4()
+eric6.Debugger.VariablesViewer.VariablesModel.handlePreferencesChanged?4()
+eric6.Debugger.VariablesViewer.VariablesModel.hasChildren?4(parent=QModelIndex())
+eric6.Debugger.VariablesViewer.VariablesModel.headerData?4(section, orientation, role=Qt.DisplayRole)
+eric6.Debugger.VariablesViewer.VariablesModel.index?4(row, column, parent=QModelIndex())
+eric6.Debugger.VariablesViewer.VariablesModel.parent?4(child)
+eric6.Debugger.VariablesViewer.VariablesModel.resetModifiedMarker?4(parentIdx=QModelIndex(), pathlist=())
+eric6.Debugger.VariablesViewer.VariablesModel.rowCount?4(parent=QModelIndex())
+eric6.Debugger.VariablesViewer.VariablesModel.setExpanded?4(index, state)
+eric6.Debugger.VariablesViewer.VariablesModel.showVariables?4(vlist, frmnr, pathlist=None)
+eric6.Debugger.VariablesViewer.VariablesModel?1(treeView, globalScope)
+eric6.Debugger.VariablesViewer.VariablesProxyModel.hasChildren?4(parent)
+eric6.Debugger.VariablesViewer.VariablesProxyModel.setExpanded?4(index, state)
+eric6.Debugger.VariablesViewer.VariablesProxyModel?1(parent=None)
 eric6.Debugger.VariablesViewer.VariablesViewer.handleResetUI?4()
-eric6.Debugger.VariablesViewer.VariablesViewer.mouseDoubleClickEvent?4(mouseEvent)
+eric6.Debugger.VariablesViewer.VariablesViewer.preferencesChanged?7
+eric6.Debugger.VariablesViewer.VariablesViewer.resizeEvent?4(event)
 eric6.Debugger.VariablesViewer.VariablesViewer.showVariable?4(vlist)
 eric6.Debugger.VariablesViewer.VariablesViewer.showVariables?4(vlist, frmnr)
+eric6.Debugger.VariablesViewer.VariablesViewer.verticalScrollbarValueChanged?4(value)
 eric6.Debugger.VariablesViewer.VariablesViewer?1(viewer, globalScope, parent=None)
 eric6.Debugger.WatchPointModel.WatchPointModel.addWatchPoint?4(cond, special, properties)
 eric6.Debugger.WatchPointModel.WatchPointModel.columnCount?4(parent=None)
@@ -4264,10 +4279,12 @@
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.DocStyleContext?1(source, startLine, contextType)
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.BugBearVisitor.NodeWindowSize?7
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.BugBearVisitor.visit?4(node)
+eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.BugBearVisitor.visit_Assert?4(node)
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.BugBearVisitor.visit_Assign?4(node)
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.BugBearVisitor.visit_Attribute?4(node)
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.BugBearVisitor.visit_Call?4(node)
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.BugBearVisitor.visit_For?4(node)
+eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.BugBearVisitor.visit_JoinedStr?4(node)
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.BugBearVisitor.visit_UAdd?4(node)
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.BugBearVisitor?1()
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.LoggingVisitor.LoggingLevels?7
@@ -5695,6 +5712,15 @@
 eric6.Plugins.VcsPlugins.vcsGit.git.Git.vcsTag?4(name, revision=None, tagName=None)
 eric6.Plugins.VcsPlugins.vcsGit.git.Git.vcsUpdate?4(name, noDialog=False, revision=None)
 eric6.Plugins.VcsPlugins.vcsGit.git.Git?1(plugin, parent=None, name=None)
+eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.HgCloseHeadSelectionDialog.HgCloseHeadSelectionDialog.getData?4()
+eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.HgCloseHeadSelectionDialog.HgCloseHeadSelectionDialog.on_headsList_itemSelectionChanged?4()
+eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.HgCloseHeadSelectionDialog.HgCloseHeadSelectionDialog?1(vcs, ppath, parent=None)
+eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper.CloseheadProjectHelper.initActions?4()
+eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper.CloseheadProjectHelper.initMenu?4(mainMenu)
+eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper.CloseheadProjectHelper.menuTitle?4()
+eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper.CloseheadProjectHelper?1()
+eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.closehead.Closehead.hgCloseheads?4(name, revisions=None)
+eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.closehead.Closehead?1(vcs)
 eric6.Plugins.VcsPlugins.vcsMercurial.Config.ConfigHgSchemes?7
 eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage.MercurialPage.MercurialPage.on_configButton_clicked?4()
 eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage.MercurialPage.MercurialPage.save?4()
@@ -5956,7 +5982,7 @@
 eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.HgLogBrowserDialog.on_modeComboBox_currentIndexChanged?4(index)
 eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.HgLogBrowserDialog.on_nextButton_clicked?4()
 eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.HgLogBrowserDialog.on_passwordCheckBox_toggled?4(isOn)
-eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.HgLogBrowserDialog.on_refreshButton_clicked?4()
+eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.HgLogBrowserDialog.on_refreshButton_clicked?4(addNext=False)
 eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.HgLogBrowserDialog.on_rxEdit_returnPressed?4()
 eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.HgLogBrowserDialog.on_rxEdit_textChanged?4(txt)
 eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.HgLogBrowserDialog.on_saveLabel_linkActivated?4(link)
@@ -5967,7 +5993,7 @@
 eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.HgLogBrowserDialog.on_upButton_clicked?4()
 eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.HgLogBrowserDialog.show?4()
 eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.HgLogBrowserDialog.start?4(fn, bundle=None, isFile=False, noEntries=0)
-eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.HgLogBrowserDialog?1(vcs, mode="log", parent=None)
+eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.HgLogBrowserDialog?1(vcs, mode="", parent=None)
 eric6.Plugins.VcsPlugins.vcsMercurial.HgMergeDialog.HgMergeDialog.getParameters?4()
 eric6.Plugins.VcsPlugins.vcsMercurial.HgMergeDialog.HgMergeDialog.on_bookmarkButton_toggled?4(checked)
 eric6.Plugins.VcsPlugins.vcsMercurial.HgMergeDialog.HgMergeDialog.on_bookmarkCombo_editTextChanged?4(txt)
@@ -6322,7 +6348,7 @@
 eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.HgShelveBrowserDialog.HgShelveBrowserDialog.start?4(projectDir)
 eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.HgShelveBrowserDialog.HgShelveBrowserDialog?1(vcs, parent=None)
 eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.HgShelveDataDialog.HgShelveDataDialog.getData?4()
-eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.HgShelveDataDialog.HgShelveDataDialog?1(parent=None)
+eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.HgShelveDataDialog.HgShelveDataDialog?1(version, parent=None)
 eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.HgShelvesSelectionDialog.HgShelvesSelectionDialog.getSelectedShelves?4()
 eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.HgShelvesSelectionDialog.HgShelvesSelectionDialog.on_shelvesList_itemSelectionChanged?4()
 eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.HgShelvesSelectionDialog.HgShelvesSelectionDialog?1(message, shelveNames, parent=None)
@@ -7263,6 +7289,7 @@
 eric6.Plugins.WizardPlugins.QRegularExpressionWizard.QRegularExpressionWizardServer.main?4()
 eric6.Plugins.WizardPlugins.QRegularExpressionWizard.QRegularExpressionWizardServer.rxExecute?4(regexp, options, text, startpos)
 eric6.Plugins.WizardPlugins.QRegularExpressionWizard.QRegularExpressionWizardServer.rxValidate?4(regexp, options)
+eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.SetupWizardDialog.ClassifiersUrl?7
 eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.SetupWizardDialog.getCode?4(indLevel, indString)
 eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.SetupWizardDialog.on_addExludePatternButton_clicked?4()
 eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.SetupWizardDialog.on_addModuleButton_clicked?4()
@@ -7276,6 +7303,7 @@
 eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.SetupWizardDialog.on_excludePatternEdit_returnPressed?4()
 eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.SetupWizardDialog.on_excludePatternEdit_textChanged?4(txt)
 eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.SetupWizardDialog.on_excludePatternList_itemSelectionChanged?4()
+eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.SetupWizardDialog.on_localClassifiersButton_clicked?4()
 eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.SetupWizardDialog.on_modulesList_itemSelectionChanged?4()
 eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.SetupWizardDialog.on_packageDirButton_clicked?4()
 eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.SetupWizardDialog.on_packageEdit_returnPressed?4()
@@ -7336,6 +7364,7 @@
 eric6.Preferences.ConfigurationPages.CondaPage.CondaPage.save?4()
 eric6.Preferences.ConfigurationPages.CondaPage.CondaPage?1()
 eric6.Preferences.ConfigurationPages.CondaPage.create?4(dlg)
+eric6.Preferences.ConfigurationPages.ConfigurationPageBase.ConfigurationPageBase.colourChanged?7
 eric6.Preferences.ConfigurationPages.ConfigurationPageBase.ConfigurationPageBase.initColour?4(colourKey, button, prefMethod, byName=False, hasAlpha=False)
 eric6.Preferences.ConfigurationPages.ConfigurationPageBase.ConfigurationPageBase.polishPage?4()
 eric6.Preferences.ConfigurationPages.ConfigurationPageBase.ConfigurationPageBase.saveColours?4(prefMethod)
@@ -7359,6 +7388,14 @@
 eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.DebuggerGeneralPage.on_editAllowedHostButton_clicked?4()
 eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.DebuggerGeneralPage.save?4()
 eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.DebuggerGeneralPage?1()
+eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.PreviewModel.columnCount?4(parent=QModelIndex())
+eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.PreviewModel.data?4(index, role=Qt.DisplayRole)
+eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.PreviewModel.flags?4(index)
+eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.PreviewModel.index?4(row, column, parent=QModelIndex())
+eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.PreviewModel.parent?4(child)
+eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.PreviewModel.rowCount?4(parent=QModelIndex())
+eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.PreviewModel.setColor?4(key, bgcolour)
+eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.PreviewModel?1()
 eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.create?4(dlg)
 eric6.Preferences.ConfigurationPages.DebuggerPython2Page.DebuggerPython2Page.on_refreshButton_clicked?4()
 eric6.Preferences.ConfigurationPages.DebuggerPython2Page.DebuggerPython2Page.on_venvDlgButton_clicked?4()
@@ -8095,7 +8132,7 @@
 eric6.Project.Project.Project.hasProjectType?4(type_, progLanguage="")
 eric6.Project.Project.Project.initActions?4()
 eric6.Project.Project.Project.initFileTypes?4()
-eric6.Project.Project.Project.initMenu?4()
+eric6.Project.Project.Project.initMenus?4()
 eric6.Project.Project.Project.initToolbars?4(toolbarManager)
 eric6.Project.Project.Project.initVCS?4(vcsSystem=None, nooverride=False)
 eric6.Project.Project.Project.isDebugPropertiesLoaded?4()
@@ -10222,6 +10259,7 @@
 eric6.UI.UserInterface.UserInterface.masterPasswordChanged?7
 eric6.UI.UserInterface.UserInterface.maxFilePathLen?7
 eric6.UI.UserInterface.UserInterface.maxMenuFilePathLen?7
+eric6.UI.UserInterface.UserInterface.networkAccessManager?4()
 eric6.UI.UserInterface.UserInterface.notificationsEnabled?4()
 eric6.UI.UserInterface.UserInterface.onlineStateChanged?7
 eric6.UI.UserInterface.UserInterface.performVersionCheck?4(manual=True, alternative=0, showVersions=False)
@@ -10837,6 +10875,7 @@
 eric6.ViewManager.ViewManager.ViewManager.initFileMenu?4()
 eric6.ViewManager.ViewManager.ViewManager.initFileToolbar?4(toolbarManager)
 eric6.ViewManager.ViewManager.ViewManager.initMacroMenu?4()
+eric6.ViewManager.ViewManager.ViewManager.initSearchMenu?4()
 eric6.ViewManager.ViewManager.ViewManager.initSearchToolbars?4(toolbarManager)
 eric6.ViewManager.ViewManager.ViewManager.initSpellingToolbar?4(toolbarManager)
 eric6.ViewManager.ViewManager.ViewManager.initViewMenu?4()
--- a/eric6/APIs/Python3/eric6.bas	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/APIs/Python3/eric6.bas	Sun Jun 02 11:42:48 2019 +0200
@@ -27,7 +27,6 @@
 ApplicationDiagramBuilder UMLDiagramBuilder
 ApplicationPage ConfigurationPageBase Ui_ApplicationPage
 ArgumentsError RuntimeError
-ArrayElementVarItem VariableItem
 ArrayResolver BaseResolver
 AssociationItem E5ArrowItem
 Attribute ClbrBaseClasses.Attribute VisibilityMixin
@@ -80,6 +79,8 @@
 ClickToFlashPlugin WebPluginInterface
 ClickToFlashWhitelistDialog QDialog Ui_ClickToFlashWhitelistDialog
 ClosedTabsManager QObject
+Closehead HgExtension
+CloseheadProjectHelper HgExtensionProjectHelper
 CodeDocumentationViewer QWidget
 CodeMetricsDialog QDialog Ui_CodeMetricsDialog
 CodeStyleAddBuiltinIgnoreDialog QDialog Ui_CodeStyleAddBuiltinIgnoreDialog
@@ -143,6 +144,7 @@
 DelayedFileWatcher QFileSystemWatcher
 DeleteFilesConfirmationDialog QDialog Ui_DeleteFilesConfirmationDialog
 DictResolver BaseResolver
+DictViewResolver ListResolver
 DiffColoursPage ConfigurationPageBase Ui_DiffColoursPage
 DiffDialog QWidget Ui_DiffDialog
 DiffHighlighter E5GenericDiffHighlighter
@@ -435,6 +437,7 @@
 HgBundleDialog QDialog Ui_HgBundleDialog
 HgClient QObject
 HgClientPromptDialog QDialog Ui_HgClientPromptDialog
+HgCloseHeadSelectionDialog QDialog Ui_HgCloseHeadSelectionDialog
 HgCommandDialog QDialog Ui_HgCommandDialog
 HgCommitDialog QWidget Ui_HgCommitDialog
 HgConflictsListDialog QWidget Ui_HgConflictsListDialog
@@ -708,6 +711,7 @@
 PreferencesLexer QObject
 PreferencesLexerError Exception
 PreferencesLexerLanguageError PreferencesLexerError
+PreviewModel QAbstractItemModel
 PreviewProcessingThread QThread
 Previewer QStackedWidget
 PreviewerHTML QWidget
@@ -840,8 +844,6 @@
 SnapshotTimer QWidget
 SnapshotWaylandGrabber QObject
 SortOptionsDialog QDialog Ui_SortOptionsDialog
-SpecialArrayElementVarItem SpecialVarItem
-SpecialVarItem VariableItem
 SpeedDial QObject
 SpeedDialReader QXmlStreamReader
 SpeedDialWriter QXmlStreamWriter
@@ -985,9 +987,10 @@
 Value str
 ValueChars str
 VariableDetailDialog QDialog Ui_VariableDetailDialog
-VariableItem QTreeWidgetItem
 VariablesFilterDialog QDialog Ui_VariablesFilterDialog
-VariablesViewer QTreeWidget
+VariablesModel QAbstractItemModel
+VariablesProxyModel QSortFilterProxyModel
+VariablesViewer QTreeView
 VcsCommandOptionsDialog QDialog Ui_VcsCommandOptionsDialog
 VcsGitPlugin QObject
 VcsMercurialPlugin QObject
--- a/eric6/CondaInterface/Conda.py	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/CondaInterface/Conda.py	Sun Jun 02 11:42:48 2019 +0200
@@ -283,7 +283,10 @@
                             package["build_string"]
                         ))
                     else:
-                        packages.append(tuple(package.rsplit("-", 2)))
+                        parts = package.rsplit("-", 2)
+                        while len(parts) < 3:
+                            parts.append("")
+                        packages.append(tuple(parts))
         
         return packages
     
@@ -349,7 +352,10 @@
                             ))
                         else:
                             package = linkEntry.split()[0]
-                            packages.append(tuple(package.rsplit("-", 2)))
+                            parts = package.rsplit("-", 2)
+                            while len(parts) < 3:
+                                parts.append("")
+                            packages.append(tuple(parts))
         
         return packages
     
--- a/eric6/DebugClients/Python/DebugClientBase.py	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/DebugClients/Python/DebugClientBase.py	Sun Jun 02 11:42:48 2019 +0200
@@ -26,7 +26,7 @@
 import DebugVariables
 from DebugBase import setRecursionLimit, printerr   # __IGNORE_WARNING__
 from AsyncFile import AsyncFile, AsyncPendingWrite
-from DebugConfig import ConfigVarTypeStrings
+from DebugConfig import ConfigQtNames, ConfigVarTypeStrings
 from FlexCompleter import Completer
 from DebugUtilities import prepareJsonCommand
 from BreakpointWatch import Breakpoint, Watch
@@ -181,6 +181,10 @@
     
     # keep these in sync with VariablesViewer.VariableItem.Indicators
     Indicators = ("()", "[]", "{:}", "{}")      # __IGNORE_WARNING_M613__
+    arrayTypes = {
+        'list', 'tuple', 'dict', 'set', 'frozenset', "class 'dict_items'",
+        "class 'dict_keys'", "class 'dict_values'"
+    }
     
     def __init__(self):
         """
@@ -379,14 +383,12 @@
         
         if method == "RequestVariables":
             self.__dumpVariables(
-                params["frameNumber"], params["scope"], params["filters"],
-                params["maxSize"])
+                params["frameNumber"], params["scope"], params["filters"])
         
         elif method == "RequestVariable":
             self.__dumpVariable(
                 params["variable"], params["frameNumber"],
-                params["scope"], params["filters"],
-                params["maxSize"])
+                params["scope"], params["filters"])
         
         elif method == "RequestThreadList":
             self.dumpThreadList()
@@ -1429,7 +1431,7 @@
         # reset coding
         self.__coding = self.defaultCoding
 
-    def __dumpVariables(self, frmnr, scope, filterList, maxSize):
+    def __dumpVariables(self, frmnr, scope, filterList):
         """
         Private method to return the variables of a frame to the debug server.
         
@@ -1439,14 +1441,11 @@
         @type int
         @param filterList the indices of variable types to be filtered
         @type list of int
-        @param maxSize maximum size the formatted value of a variable will
-            be shown. If it is bigger than that, a 'too big' indication will
-            be given.
-        @type int
         """
         if self.currentThread is None:
             return
         
+        self.resolverCache = [{}, {}]
         frmnr += self.currentThread.skipFrames
         if scope == 0:
             self.framenr = frmnr
@@ -1468,22 +1467,18 @@
             scope = -1
         else:
             varDict = f.f_locals
-            
-        varlist = []
         
-        if scope != -1:
-            keylist = varDict.keys()
-            
-            vlist = self.__formatVariablesList(
-                keylist, varDict, scope, filterList, maxSize=maxSize)
-            varlist.extend(vlist)
+        if scope == -1:
+            varlist = []
+        else:
+            varlist = self.__formatVariablesList(varDict, scope, filterList)
         
         self.sendJsonCommand("ResponseVariables", {
             "scope": scope,
             "variables": varlist,
         })
     
-    def __dumpVariable(self, var, frmnr, scope, filterList, maxSize):
+    def __dumpVariable(self, var, frmnr, scope, filterList):
         """
         Private method to return the variables of a frame to the debug server.
         
@@ -1491,13 +1486,10 @@
         @type list of strings
         @param frmnr distance of frame reported on. 0 is the current frame
         @type int
-        @param scope 1 to report global variables, 0 for local variables (int)
+        @param scope 1 to report global variables, 0 for local variables
+        @type int
         @param filterList the indices of variable types to be filtered
         @type list of int
-        @param maxSize maximum size the formatted value of a variable will
-            be shown. If it is bigger than that, a 'too big' indication will
-            be given.
-        @type int
         """
         if self.currentThread is None:
             return
@@ -1523,12 +1515,16 @@
         
         varlist = []
         
-        if scope != -1:
+        if scope != -1 and str(var) in self.resolverCache[scope]:
+            varGen = self.resolverCache[scope][str(var)]
+            idx, varDict = next(varGen)
+            var.insert(0, idx)
+            varlist = self.__formatVariablesList(varDict, scope, filterList)
+        elif scope != -1:
             variable = varDict
+            # Lookup the wanted attribute
             for attribute in var:
-                attribute = self.__extractIndicators(attribute)[0]
-                typeObject, typeName, typeStr, resolver = \
-                    DebugVariables.getType(variable)
+                _, _, resolver = DebugVariables.getType(variable)
                 if resolver:
                     variable = resolver.resolve(variable, attribute)
                     if variable is None:
@@ -1536,26 +1532,35 @@
                     
                 else:
                     break
-                
+            
+            idx = -3  # Requested variable doesn't exist anymore
+            # If found, get the details of attribute
             if variable is not None:
-                typeObject, typeName, typeStr, resolver = \
-                    DebugVariables.getType(variable)
-                if typeStr.startswith(("PyQt5.", "PyQt4.")):
-                    vlist = self.__formatQtVariable(variable, typeName)
-                    varlist.extend(vlist)
-                elif resolver:
-                    varDict = resolver.getDictionary(variable)
-                    vlist = self.__formatVariablesList(
-                        list(varDict.keys()), varDict, scope, filterList,
-                        maxSize=maxSize)
-                    varlist.extend(vlist)
+                typeName, typeStr, resolver = DebugVariables.getType(variable)
+                if resolver:
+                    varGen = resolver.getDictionary(variable)
+                    self.resolverCache[scope][str(var)] = varGen
+                    
+                    idx, varDict = next(varGen)
+                    varlist = self.__formatVariablesList(
+                        varDict, scope, filterList)
+                else:
+                    # Gently handle exception which could occure as special
+                    # cases, e.g. already deleted C++ objects, str conversion..
+                    try:
+                        varlist = self.__formatQtVariable(variable, typeName)
+                    except Exception:
+                        varlist = []
+                    idx = -1
+            
+            var.insert(0, idx)
         
         self.sendJsonCommand("ResponseVariable", {
             "scope": scope,
             "variable": var,
             "variables": varlist,
         })
-        
+    
     def __extractIndicators(self, var):
         """
         Private method to extract the indicator string from a variable text.
@@ -1702,7 +1707,7 @@
             varlist.append(("data", "str", "{0}".format(value.data())))
         elif qttype == 'QDomComment':
             varlist.append(("data", "str", "{0}".format(value.data())))
-        elif qttype == "QDomDocument":
+        elif qttype == 'QDomDocument':
             varlist.append(("text", "str", "{0}".format(value.toString())))
         elif qttype == 'QDomElement':
             varlist.append(("tagName", "str", "{0}".format(value.tagName())))
@@ -1715,10 +1720,14 @@
             varlist.append(
                 ("address", "QHostAddress", "{0}".format(value.toString())))
             
+        # PySide specific
+        elif qttype == 'EnumType':  # Not in PyQt possible
+            for key, value in value.values.items():
+                varlist.append((key, qttype, "{0}".format(int(value))))
+        
         return varlist
     
-    def __formatVariablesList(self, keylist, dict_, scope, filterList=None,
-                              formatSequences=False, maxSize=0):
+    def __formatVariablesList(self, dict_, scope, filterList=None):
         """
         Private method to produce a formated variables list.
         
@@ -1728,8 +1737,6 @@
         expressions. The formated variables list (a list of tuples of 3
         values) is returned.
         
-        @param keylist keys of the dictionary to be formatted
-        @type list of str
         @param dict_ the dictionary to be scanned
         @type dict
         @param scope 1 to filter using the globals filter, 0 using the locals
@@ -1741,14 +1748,6 @@
             Variables are only added to the list, if their type is not
             contained in the filter list.
         @type list of int
-        @param formatSequences flag indicating, that sequence or dictionary
-            variables should be formatted. If it is 0 (or false), just the
-            number of items contained in these variables is returned.
-        @type bool
-        @param maxSize maximum size the formatted value of a variable will
-            be shown. If it is bigger than that, a 'too big' indication will
-            be placed in the value field.
-        @type int
         @return A tuple consisting of a list of formatted variables. Each
             variable entry is a tuple of three elements, the variable name,
             its type and value.
@@ -1761,8 +1760,14 @@
             patternFilterObjects = self.globalsFilterObjects
         else:
             patternFilterObjects = self.localsFilterObjects
+        if type(dict_) == dict:
+            dict_ = dict_.items()
         
-        for key in keylist:
+        for key, value in dict_:
+            # no more elements available
+            if key == -2:
+                break
+            
             # filter based on the filter pattern
             matched = False
             for pat in patternFilterObjects:
@@ -1773,95 +1778,80 @@
                 continue
             
             # filter hidden attributes (filter #0)
-            if 0 in filterList and str(key)[:2] == '__' and not (
-                key == "___len___" and
-                    DebugVariables.TooLargeAttribute in keylist):
+            if 0 in filterList and str(key)[:2] == '__':
                 continue
             
             # special handling for '__builtins__' (it's way too big)
             if key == '__builtins__':
                 rvalue = '<module __builtin__ (built-in)>'
                 valtype = 'module'
+                if ConfigVarTypeStrings.index(valtype) in filterList:
+                    continue
             else:
-                value = dict_[key]
+                isQt = False
+                # valtypestr, e.g. class 'PyQt5.QtCore.QPoint'
                 valtypestr = str(type(value))[1:-1]
                 _, valtype = valtypestr.split(' ', 1)
+                # valtype, e.g. PyQt5.QtCore.QPoint
                 valtype = valtype[1:-1]
+                # Strip 'instance' to be equal with Python 3
+                if valtype == "instancemethod":
+                    valtype = "method"
+                elif valtype == "type" or valtype == "classobj":
+                    valtype = "class"
+                
+                # valtypename, e.g. QPoint
                 valtypename = type(value).__name__
-                if valtype not in ConfigVarTypeStrings:
-                    if valtype in ["numpy.ndarray", "array.array"]:
+                try:
+                    if ConfigVarTypeStrings.index(valtype) in filterList:
+                        continue
+                except ValueError:
+                    if valtype == "sip.enumtype":
+                        if ConfigVarTypeStrings.index('class') in filterList:
+                            continue
+                    elif (valtype == "sip.methoddescriptor" or
+                            valtype == "method_descriptor"):
+                        if ConfigVarTypeStrings.index('method') in filterList:
+                            continue
+                    elif valtype in ("numpy.ndarray", "array.array"):
                         if ConfigVarTypeStrings.index('list') in filterList:
                             continue
                     elif valtypename == "MultiValueDict":
                         if ConfigVarTypeStrings.index('dict') in filterList:
                             continue
-                    elif valtype == "sip.methoddescriptor":
-                        if ConfigVarTypeStrings.index(
-                                'method') in filterList:
-                            continue
-                    elif valtype == "sip.enumtype":
-                        if ConfigVarTypeStrings.index('class') in filterList:
-                            continue
                     elif ConfigVarTypeStrings.index('instance') in filterList:
                         continue
                     
+                    isQt = valtype.startswith(ConfigQtNames)
                     if (not valtypestr.startswith('type ') and
-                            valtypename not in
-                            ["ndarray", "MultiValueDict", "array"]):
+                        valtypename not in ("ndarray", "MultiValueDict",
+                                            "array", "defaultdict") and
+                            not isQt):
                         valtype = valtypestr
-                else:
-                    try:
-                        # Strip 'instance' to be equal with Python 3
-                        if valtype == "instancemethod":
-                            valtype = "method"
-                        
-                        if ConfigVarTypeStrings.index(valtype) in filterList:
-                            continue
-                    except ValueError:
-                        if valtype == "classobj":
-                            if ConfigVarTypeStrings.index(
-                                    'instance') in filterList:
-                                continue
-                        elif valtype == "sip.methoddescriptor":
-                            if ConfigVarTypeStrings.index(
-                                    'method') in filterList:
-                                continue
-                        elif valtype == "sip.enumtype":
-                            if ConfigVarTypeStrings.index('class') in \
-                                    filterList:
-                                continue
-                        elif not valtype.startswith("PySide") and \
-                            (ConfigVarTypeStrings.index('other') in
-                             filterList):
-                            continue
                 
                 try:
-                    if valtype in ['list', 'tuple', 'dict', 'set',
-                                   'frozenset', 'array.array']:
-                        if valtype == 'dict':
-                            rvalue = "{0:d}".format(len(value.keys()))
-                        else:
-                            rvalue = "{0:d}".format(len(value))
+                    if valtype in self.arrayTypes:
+                        rvalue = "{0:d}".format(len(value))
+                    elif valtype == 'array.array':
+                        rvalue = "{0:d}|{1}".format(
+                            len(value), value.typecode)
+                    elif valtype == 'collections.defaultdict':
+                        rvalue = "{0:d}|{1}".format(
+                            len(value), value.default_factory.__name__)
                     elif valtype == "numpy.ndarray":
-                        rvalue = "{0:d}".format(value.size)
+                        rvalue = "x".join(str(x) for x in value.shape)
                     elif valtypename == "MultiValueDict":
                         rvalue = "{0:d}".format(len(value.keys()))
                         valtype = "django.MultiValueDict"  # shortened type
                     else:
                         rvalue = repr(value)
-                        if valtype.startswith('class') and \
-                           rvalue[0] in ['{', '(', '[']:
+                        if valtype.startswith('class') and rvalue[0] in '{([':
                             rvalue = ""
-                        elif maxSize and len(rvalue) > maxSize:
-                            rvalue = "@@TOO_BIG_TO_SHOW@@"
+                        elif (isQt and rvalue.startswith("<class '")):
+                            rvalue = rvalue[8:-2]
                 except Exception:
                     rvalue = ''
             
-            if formatSequences:
-                if str(key) == key:
-                    key = "'{0!s}'".format(key)
-                else:
-                    key = str(key)
             varlist.append((key, valtype, rvalue))
         
         return varlist
--- a/eric6/DebugClients/Python/DebugConfig.py	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/DebugClients/Python/DebugConfig.py	Sun Jun 02 11:42:48 2019 +0200
@@ -18,11 +18,24 @@
     'slice', 'buffer', 'class', 'instance',
     'method', 'property', 'generator',
     'function', 'builtin_function_or_method', 'code', 'module',
-    'ellipsis', 'traceback', 'frame', 'other', 'frozenset',
+    'ellipsis', 'traceback', 'frame', 'other', 'frozenset', 'bytes',
     # Special case for Python 2: don't add 'instancemethod' to
     # ConfigVarTypeFilters and leave it always at last position
     'instancemethod'
 ]
 
+BatchSize = 200
+ConfigQtNames = (
+    'PyQt5.', 'PyQt4.', 'PySide2.', 'PySide.', 'Shiboken.EnumType'
+)
+ConfigKnownQtTypes = (
+    '.QChar', '.QByteArray', '.QString', '.QStringList', '.QPoint', '.QPointF',
+    '.QRect', '.QRectF', '.QSize', '.QSizeF', '.QColor', '.QDate', '.QTime',
+    '.QDateTime', '.QDir', '.QFile', '.QFont', '.QUrl', '.QModelIndex',
+    '.QRegExp', '.QAction', '.QKeySequence', '.QDomAttr', '.QDomCharacterData',
+    '.QDomComment', '.QDomDocument', '.QDomElement', '.QDomText',
+    '.QHostAddress', '.EnumType'
+)
+
 #
 # eflag: noqa = M702
--- a/eric6/DebugClients/Python/DebugVariables.py	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/DebugClients/Python/DebugVariables.py	Sun Jun 02 11:42:48 2019 +0200
@@ -7,14 +7,16 @@
 Module implementing classes and functions to dump variable contents.
 """
 
+import sys
+
+from DebugConfig import ConfigQtNames, ConfigKnownQtTypes, BatchSize
+
 #
 # This code was inspired by pydevd.
 #
 
-MaxItemsToHandle = 300
-TooLargeMessage = ("Too large to show contents. Max items to show: " +
-                   str(MaxItemsToHandle))
-TooLargeAttribute = "Too large to be handled."
+if sys.version_info[0] > 2:
+    basestring = str
 
 ############################################################
 ## Classes implementing resolvers for various compund types
@@ -35,44 +37,6 @@
         @type str
         @return value of the attribute
         @rtype any
-        @exception NotImplementedError raised to indicate a missing
-            implementation
-        """     # __IGNORE_WARNING_D235__
-        raise NotImplementedError
-    
-    def getDictionary(self, var):
-        """
-        Public method to get the attributes of a variable as a dictionary.
-        
-        @param var variable to be converted
-        @type any
-        @return dictionary containing the variable attributes
-        @rtype dict
-        @exception NotImplementedError raised to indicate a missing
-            implementation
-        """     # __IGNORE_WARNING_D235__
-        raise NotImplementedError
-
-
-############################################################
-## Default Resolver
-############################################################
-
-
-class DefaultResolver(BaseResolver):
-    """
-    Class used to resolve the default way.
-    """
-    def resolve(self, var, attribute):
-        """
-        Public method to get an attribute from a variable.
-        
-        @param var variable to extract an attribute or value from
-        @type any
-        @param attribute name of the attribute to extract
-        @type str
-        @return value of the attribute
-        @rtype any
         """
         return getattr(var, attribute, None)
     
@@ -101,6 +65,41 @@
 
 
 ############################################################
+## Default Resolver
+############################################################
+
+
+class DefaultResolver(BaseResolver):
+    """
+    Class used to resolve the default way.
+    """
+    def getDictionary(self, var):
+        """
+        Public method to get the attributes of a variable as a dictionary.
+        
+        @param var variable to be converted
+        @type any
+        @return dictionary containing the variable attributes
+        @rtype dict
+        """
+        names = dir(var)
+        if not names and hasattr(var, "__members__"):
+            names = var.__members__
+        
+        d = {}
+        for name in names:
+            try:
+                attribute = getattr(var, name)
+                d[name] = attribute
+            except Exception:
+                pass    # if we can't get it, simply ignore it
+        
+        yield -1, d
+        while True:
+            yield -2, {}
+
+
+############################################################
 ## Resolver for Dictionaries
 ############################################################
 
@@ -120,16 +119,13 @@
         @return value of the attribute
         @rtype any
         """
-        if attribute in ('___len___', TooLargeAttribute):
-            return None
-        
-        if "(ID:" not in attribute:
+        if " (ID:" not in attribute:
             try:
                 return var[attribute]
             except Exception:
                 return getattr(var, attribute, None)
         
-        expectedID = int(attribute.split("(ID:")[-1][:-1])
+        expectedID = int(attribute.split(" (ID:")[-1][:-1])
         for key, value in var.items():
             if id(key) == expectedID:
                 return value
@@ -145,10 +141,14 @@
         @return string representation of the given key
         @rtype str
         """
-        if isinstance(key, str):
-            return repr(key)
-        else:
-            return key
+        if isinstance(key, basestring):
+            key = repr(key)
+            # Special handling for Python2 unicode strings and bytes object
+            # Raw and f-Strings are always converted to (unicode) str
+            if key[0] in 'ub':
+                key = key[1:]
+
+        return key  # __IGNORE_WARNING_M834__
     
     def getDictionary(self, var):
         """
@@ -160,22 +160,34 @@
         @rtype dict
         """
         d = {}
-        count = 0
-        for key, value in var.items():
-            count += 1
+        start = count = 0
+        allItems = list(var.items())
+        try:
+            # Fast path: all items from same type
+            allItems.sort(key=lambda x: x[0])
+        except TypeError:
+            # Slow path: only sort items with same type (Py3 only)
+            allItems.sort(key=lambda x: (str(x[0]), x[0]))
+        
+        for key, value in allItems:
             key = "{0} (ID:{1})".format(self.keyToStr(key), id(key))
             d[key] = value
-            if count > MaxItemsToHandle:
-                d[TooLargeAttribute] = TooLargeMessage
-                break
+            count += 1
+            if count >= BatchSize:
+                yield start, d
+                start += count
+                count = 0
+                d = {}
         
-        d["___len___"] = len(var)
+        if d:
+            yield start, d
         
         # in case it has additional fields
-        additionals = defaultResolver.getDictionary(var)
-        d.update(additionals)
+        d = super(DictResolver, self).getDictionary(var)
+        yield -1, d
         
-        return d
+        while True:
+            yield -2, {}
 
 
 ############################################################
@@ -198,9 +210,6 @@
         @return value of the attribute
         @rtype any
         """
-        if attribute in ('___len___', TooLargeAttribute):
-            return None
-
         try:
             return var[int(attribute)]
         except Exception:
@@ -216,21 +225,59 @@
         @rtype dict
         """
         d = {}
-        count = 0
-        for value in var:
-            d[str(count)] = value
+        start = count = 0
+        for idx, value in enumerate(var):
+            d[str(idx)] = value
             count += 1
-            if count > MaxItemsToHandle:
-                d[TooLargeAttribute] = TooLargeMessage
-                break
+            if count >= BatchSize:
+                yield start, d
+                start = idx + 1
+                count = 0
+                d = {}
         
-        d["___len___"] = len(var)
+        if d:
+            yield start, d
         
         # in case it has additional fields
-        additionals = defaultResolver.getDictionary(var)
-        d.update(additionals)
+        d = super(ListResolver, self).getDictionary(var)
+        yield -1, d
+        
+        while True:
+            yield -2, {}
+    
+
+############################################################
+## Resolver for dict_items, dict_keys and dict_values
+############################################################
+
+
+class DictViewResolver(ListResolver):
+    """
+    Class used to resolve from dict views.
+    """
+    def resolve(self, var, attribute):
+        """
+        Public method to get an attribute from a variable.
         
-        return d
+        @param var variable to extract an attribute or value from
+        @type tuple or list
+        @param attribute id of the value to extract
+        @type str
+        @return value of the attribute
+        @rtype any
+        """
+        return super(DictViewResolver, self).resolve(list(var), attribute)
+    
+    def getDictionary(self, var):
+        """
+        Public method to get the attributes of a variable as a dictionary.
+        
+        @param var variable to be converted
+        @type any
+        @return dictionary containing the variable attributes
+        @rtype dict
+        """
+        return super(DictViewResolver, self).getDictionary(list(var))
 
 
 ############################################################
@@ -253,11 +300,8 @@
         @return value of the attribute
         @rtype any
         """
-        if attribute in ('___len___', TooLargeAttribute):
-            return None
-
-        if attribute.startswith("ID: "):
-            attribute = attribute.split(None, 1)[1]
+        if attribute.startswith("'ID: "):
+            attribute = attribute.split(None, 1)[1][:-1]
         try:
             attribute = int(attribute)
         except Exception:
@@ -279,22 +323,26 @@
         @rtype dict
         """
         d = {}
-        count = 0
+        start = count = 0
         for value in var:
             count += 1
-            d["ID: " + str(id(value))] = value
-            if count > MaxItemsToHandle:
-                d[TooLargeAttribute] = TooLargeMessage
-                break
-
-        d["___len___"] = len(var)
+            d["'ID: {0}'".format(id(value))] = value
+            if count >= BatchSize:
+                yield start, d
+                start += count
+                count = 0
+                d = {}
+        
+        if d:
+            yield start, d
         
         # in case it has additional fields
-        additionals = defaultResolver.getDictionary(var)
-        d.update(additionals)
+        additionals = super(SetResolver, self).getDictionary(var)
+        yield -1, additionals
         
-        return d
-
+        while True:
+            yield -2, {}
+    
 
 ############################################################
 ## Resolver for Numpy Arrays
@@ -330,9 +378,6 @@
         @return value of the attribute
         @rtype any
         """
-        if attribute == '__internals__':
-            return defaultResolver.getDictionary(var)
-        
         if attribute == 'min':
             if self.__isNumeric(var):
                 return var.min()
@@ -351,25 +396,10 @@
             else:
                 return None
         
-        if attribute == 'shape':
-            return var.shape
-        
-        if attribute == 'dtype':
-            return var.dtype
-        
-        if attribute == 'size':
-            return var.size
-        
-        if attribute.startswith('['):
-            container = NdArrayItemsContainer()
-            count = 0
-            for element in var:
-                setattr(container, str(count), element)
-                count += 1
-                if count > MaxItemsToHandle:
-                    setattr(container, TooLargeAttribute, TooLargeMessage)
-                    break
-            return container
+        try:
+            return var[int(attribute)]
+        except Exception:
+            return getattr(var, attribute, None)
         
         return None
     
@@ -383,38 +413,49 @@
         @rtype dict
         """
         d = {}
-        d['__internals__'] = defaultResolver.getDictionary(var)
+        start = count = 0
+        allItems = var.tolist()
+        
+        for idx, value in enumerate(allItems):
+            d[str(idx)] = value
+            count += 1
+            if count >= BatchSize:
+                yield start, d
+                start += count
+                count = 0
+                d = {}
+        
+        if d:
+            yield start, d
+        
+        # in case it has additional fields
+        d = super(NdArrayResolver, self).getDictionary(var)
+        
         if var.size > 1024 * 1024:
             d['min'] = 'ndarray too big, calculating min would slow down' \
                        ' debugging'
             d['max'] = 'ndarray too big, calculating max would slow down' \
                        ' debugging'
-        else:
-            if self.__isNumeric(var):
-                if var.size == 0:
-                    d['min'] = 'empty array'
-                    d['max'] = 'empty array'
-                    d['mean'] = 'empty array'
-                else:
-                    d['min'] = var.min()
-                    d['max'] = var.max()
-                    d['mean'] = var.mean()
+            d['mean'] = 'ndarray too big, calculating mean would slow down' \
+                        ' debugging'
+        elif self.__isNumeric(var):
+            if var.size == 0:
+                d['min'] = 'empty array'
+                d['max'] = 'empty array'
+                d['mean'] = 'empty array'
             else:
-                d['min'] = 'not a numeric object'
-                d['max'] = 'not a numeric object'
-                d['mean'] = 'not a numeric object'
-        d['shape'] = var.shape
-        d['dtype'] = var.dtype
-        d['size'] = var.size
-        d['[0:{0}]'.format(len(var) - 1)] = list(var[0:MaxItemsToHandle])
-        return d
-
-
-class NdArrayItemsContainer:
-    """
-    Class to store ndarray items.
-    """
-    pass
+                d['min'] = var.min()
+                d['max'] = var.max()
+                d['mean'] = var.mean()
+        else:
+            d['min'] = 'not a numeric object'
+            d['max'] = 'not a numeric object'
+            d['mean'] = 'not a numeric object'
+        
+        yield -1, d
+        
+        while True:
+            yield -2, {}
 
 
 ############################################################
@@ -437,20 +478,16 @@
         @return value of the attribute
         @rtype any
         """
-        if attribute in ('___len___', TooLargeAttribute):
-            return None
-        
-        if "(ID:" not in attribute:
+        if " (ID:" not in attribute:
             try:
                 return var[attribute]
             except Exception:
                 return getattr(var, attribute, None)
         
-        expectedID = int(attribute.split("(ID:")[-1][:-1])
+        expectedID = int(attribute.split(" (ID:")[-1][:-1])
         for key in var.keys():
             if id(key) == expectedID:
-                value = var.getlist(key)
-                return value
+                return var.getlist(key)
         
         return None
     
@@ -464,20 +501,35 @@
         @rtype dict
         """
         d = {}
-        count = 0
-        for key in var.keys():
+        start = count = 0
+        allKeys = list(var.keys())
+        try:
+            # Fast path: all items from same type
+            allKeys.sort()
+        except TypeError:
+            # Slow path: only sort items with same type (Py3 only)
+            allKeys.sort(key=lambda x: (str(x), x))
+        
+        for key in allKeys:
+            dkey = "{0} (ID:{1})".format(self.keyToStr(key), id(key))
+            d[dkey] = var.getlist(key)
             count += 1
-            value = var.getlist(key)
-            key = "{0} (ID:{1})".format(self.keyToStr(key), id(key))
-            d[key] = value
-            if count > MaxItemsToHandle:
-                d[TooLargeAttribute] = TooLargeMessage
-                break
+            if count >= BatchSize:
+                yield start, d
+                start += count
+                count = 0
+                d = {}
         
-        d["___len___"] = len(var)
+        if d:
+            yield start, d
         
-        return d
-
+        # in case it has additional fields
+        d = super(DictResolver, self).getDictionary(var)
+        yield -1, d
+        
+        while True:
+            yield -2, {}
+    
 
 ############################################################
 ## Resolver for array.array
@@ -515,28 +567,10 @@
         @return value of the attribute
         @rtype any
         """
-        if attribute == 'itemsize':
-            return var.itemsize
-        
-        if attribute == 'typecode':
-            return var.typecode
-        
-        if attribute == 'type':
-            if var.typecode in ArrayResolver.TypeCodeMap:
-                return ArrayResolver.TypeCodeMap[var.typecode]
-            else:
-                return 'illegal type'
-        
-        if attribute.startswith('['):
-            container = ArrayItemsContainer()
-            count = 0
-            for element in var:
-                setattr(container, str(count), element)
-                count += 1
-                if count > MaxItemsToHandle:
-                    setattr(container, TooLargeAttribute, TooLargeMessage)
-                    break
-            return container
+        try:
+            return var[int(attribute)]
+        except Exception:
+            return getattr(var, attribute, None)
         
         return None
     
@@ -550,26 +584,37 @@
         @rtype dict
         """
         d = {}
-        d['typecode'] = var.typecode
-        if var.typecode in ArrayResolver.TypeCodeMap:
-            d['type'] = ArrayResolver.TypeCodeMap[var.typecode]
-        else:
-            d['type'] = 'illegal type'
-        d['itemsize'] = var.itemsize
-        d['[0:{0}]'.format(len(var) - 1)] = var.tolist()[0:MaxItemsToHandle]
-        return d
-
-
-class ArrayItemsContainer:
-    """
-    Class to store array.array items.
-    """
-    pass
+        start = count = 0
+        allItems = var.tolist()
+        
+        for idx, value in enumerate(allItems):
+            d[str(idx)] = value
+            count += 1
+            if count >= BatchSize:
+                yield start, d
+                start += count
+                count = 0
+                d = {}
+        
+        if d:
+            yield start, d
+        
+        # in case it has additional fields
+        d = super(ArrayResolver, self).getDictionary(var)
+        
+        # Special data for array type: convert typecode to readable text
+        d['type'] = self.TypeCodeMap.get(var.typecode, 'illegal type')
+        
+        yield -1, d
+        
+        while True:
+            yield -2, {}
 
 
 defaultResolver = DefaultResolver()
 dictResolver = DictResolver()
 listResolver = ListResolver()
+dictViewResolver = DictViewResolver()
 setResolver = SetResolver()
 ndarrayResolver = NdArrayResolver()
 multiValueDictResolver = MultiValueDictResolver()
@@ -598,29 +643,21 @@
         (tuple, listResolver),
         (list, listResolver),
         (dict, dictResolver),
+        (set, setResolver),
+        (frozenset, setResolver),
     ]
     
     try:
         _TypeMap.append((long, None))           # __IGNORE_WARNING__
     except Exception:
-        pass    # not available on all python versions
+        pass    # not available on all Python versions
 
     try:
         _TypeMap.append((unicode, None))        # __IGNORE_WARNING__
     except Exception:
-        pass    # not available on all python versions
+        pass    # not available on all Python versions
 
     try:
-        _TypeMap.append((set, setResolver))     # __IGNORE_WARNING__
-    except Exception:
-        pass    # not available on all python versions
-
-    try:
-        _TypeMap.append((frozenset, setResolver))     # __IGNORE_WARNING__
-    except Exception:
-        pass    # not available on all python versions
-    
-    try:
         import array
         _TypeMap.append((array.array, arrayResolver))
     except ImportError:
@@ -634,10 +671,18 @@
     
     try:
         from django.utils.datastructures import MultiValueDict
+        # it should go before dict
         _TypeMap.insert(0, (MultiValueDict, multiValueDictResolver))
-        # it should go before dict
     except ImportError:
         pass  # django may not be installed
+    
+    try:
+        from collections.abc import ItemsView, KeysView, ValuesView
+        _TypeMap.append((ItemsView, dictViewResolver))
+        _TypeMap.append((KeysView, dictViewResolver))
+        _TypeMap.append((ValuesView, dictViewResolver))
+    except ImportError:
+        pass  # not available on all Python versions
 
 
 def getType(obj):
@@ -646,27 +691,29 @@
     
     @param obj object to get type information for
     @type any
-    @return tuple containing the type, type name, type string and resolver
-    @rtype tuple of type, str, str, BaseResolver
+    @return tuple containing the type name, type string and resolver
+    @rtype tuple of str, str, BaseResolver
     """
     typeObject = type(obj)
     typeName = typeObject.__name__
-    typeStr = str(typeObject)[8:-2]
+    # Between PyQt and PySide the returned type is different (class vs. type)
+    typeStr = str(typeObject).split(' ', 1)[-1]
+    typeStr = typeStr[1:-2]
     
-    if typeStr.startswith(("PyQt5.", "PyQt4.")):
+    if (typeStr.startswith(ConfigQtNames) and
+            typeStr.endswith(ConfigKnownQtTypes)):
         resolver = None
     else:
         if _TypeMap is None:
             _initTypeMap()
         
-        for typeData in _TypeMap:
-            if isinstance(obj, typeData[0]):
-                resolver = typeData[1]
+        for typeData, resolver in _TypeMap:  # __IGNORE_WARNING_M507__
+            if isinstance(obj, typeData):
                 break
         else:
             resolver = defaultResolver
     
-    return typeObject, typeName, typeStr, resolver
+    return typeName, typeStr, resolver
 
 #
 # eflag: noqa = M702
--- a/eric6/Debugger/BreakPointModel.py	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Debugger/BreakPointModel.py	Sun Jun 02 11:42:48 2019 +0200
@@ -260,9 +260,10 @@
                 rows.append(index.row())
         rows.sort(reverse=True)
         for row in rows:
-            self.beginRemoveRows(QModelIndex(), row, row)
-            del self.breakpoints[row]
-            self.endRemoveRows()
+            if row < len(self.breakpoints):
+                self.beginRemoveRows(QModelIndex(), row, row)
+                del self.breakpoints[row]
+                self.endRemoveRows()
 
     def deleteAll(self):
         """
--- a/eric6/Debugger/Config.py	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Debugger/Config.py	Sun Jun 02 11:42:48 2019 +0200
@@ -48,7 +48,7 @@
     'ellipsis': QT_TRANSLATE_NOOP('Variable Types', 'Ellipsis'),
     'traceback': QT_TRANSLATE_NOOP('Variable Types', 'Traceback'),
     'frame': QT_TRANSLATE_NOOP('Variable Types', 'Frame'),
-    'other': QT_TRANSLATE_NOOP('Variable Types', 'Other'),
+    'bytes': QT_TRANSLATE_NOOP('Variable Types', 'Bytes'),
 }
 
 
@@ -84,6 +84,7 @@
     'ellipsis': 28,
     'traceback': 29,
     'frame': 30,
-    'other': 31,
+    'other': 31,  # Not used anymore but keep to avoid reassignment
     'frozenset': 32,
+    'bytes': 33,
 }
--- a/eric6/Debugger/DebugUI.py	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Debugger/DebugUI.py	Sun Jun 02 11:42:48 2019 +0200
@@ -1305,7 +1305,7 @@
         elif scope == 0:
             self.debugViewer.showVariables(variables, False)
         elif scope == -1:
-            vlist = [('None', '', '')]
+            vlist = [(self.tr('No locals available.'), '', '')]
             self.debugViewer.showVariables(vlist, False)
         
     def __clientVariable(self, scope, variables):
--- a/eric6/Debugger/DebugViewer.py	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Debugger/DebugViewer.py	Sun Jun 02 11:42:48 2019 +0200
@@ -45,8 +45,10 @@
     the exception logger. Additionally a list of all threads is shown.
     
     @signal sourceFile(string, int) emitted to open a source file at a line
+    @signal preferencesChanged() emitted to react on changed preferences
     """
     sourceFile = pyqtSignal(str, int)
+    preferencesChanged = pyqtSignal()
     
     def __init__(self, debugServer, parent=None):
         """
@@ -166,6 +168,10 @@
         self.setLocalsFilterButton.clicked.connect(self.setLocalsFilter)
         self.localsFilterEdit.returnPressed.connect(self.setLocalsFilter)
         
+        self.preferencesChanged.connect(self.handlePreferencesChanged)
+        self.preferencesChanged.connect(self.globalsViewer.preferencesChanged)
+        self.preferencesChanged.connect(self.localsViewer.preferencesChanged)
+        
         from .CallStackViewer import CallStackViewer
         # add the call stack viewer
         self.callStackViewer = CallStackViewer(self.debugServer)
@@ -244,7 +250,7 @@
         self.__autoViewSource = Preferences.getDebugger("AutoViewSourceCode")
         self.sourceButton.setVisible(not self.__autoViewSource)
         
-    def preferencesChanged(self):
+    def handlePreferencesChanged(self):
         """
         Public slot to handle the preferencesChanged signal.
         """
--- a/eric6/Debugger/VariablesViewer.py	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Debugger/VariablesViewer.py	Sun Jun 02 11:42:48 2019 +0200
@@ -4,33 +4,38 @@
 #
 
 """
-Module implementing the variables viewer widget.
+Module implementing the variables viewer view based on QTreeView.
 """
 
 from __future__ import unicode_literals
+
 try:
     str = unicode
 except NameError:
     pass
 
-from PyQt5.QtCore import Qt, QRegExp, QCoreApplication
-from PyQt5.QtWidgets import QTreeWidget, QTreeWidgetItem, QAbstractItemView, \
-    QMenu
+import ast
+    
+from PyQt5.QtCore import (Qt, QAbstractItemModel, QModelIndex, QRegExp,
+                          QCoreApplication, QSortFilterProxyModel, pyqtSignal)
+from PyQt5.QtGui import QBrush, QFontMetrics
+from PyQt5.QtWidgets import QTreeView, QAbstractItemView, QToolTip, QMenu
 
 from E5Gui.E5Application import e5App
 
 from .Config import ConfigVarTypeDispStrings
+from DebugClients.Python.DebugConfig import ConfigQtNames, ConfigKnownQtTypes
 
 import Preferences
 import Utilities
-from Globals import qVersionTuple
+
+SORT_ROLE = Qt.UserRole
 
 
-class VariableItem(QTreeWidgetItem):
+class VariableItem(object):
     """
-    Class implementing the data structure for variable items.
+    Class implementing the data structure for all variable items.
     """
-    Indicators = ("()", "[]", "{:}", "{}")      # __IGNORE_WARNING_M613__
     Type2Indicators = {
         # Python types
         'list': '[]',
@@ -38,330 +43,918 @@
         'dict': '{:}',                          # __IGNORE_WARNING_M613__
         'set': '{}',                            # __IGNORE_WARNING_M613__
         'frozenset': '{}',                      # __IGNORE_WARNING_M613__
+        'numpy.ndarray': '[ndarray]',           # __IGNORE_WARNING_M613__
     }
     
-    def __init__(self, parent, dvar, dvalue, dtype):
+    # Initialize regular expression for unprintable strings
+    rx_nonprintable = QRegExp(r"""(\\x\d\d)+""")
+    
+    noOfItemsStr = QCoreApplication.translate("VariablesViewer", "{0} items")
+    
+    arrayTypes = {
+        'list', 'tuple', 'dict', 'set', 'frozenset', 'numpy.ndarray',
+        'django.MultiValueDict', 'array.array', 'collections.defaultdict',
+        "class 'dict_items'", "class 'dict_keys'", "class 'dict_values'",
+    }
+    
+    nonExpandableTypes = (
+        'method_descriptor', 'wrapper_descriptor', '', 'getset_descriptor',
+        'method-wrapper', 'member_descriptor',
+    )
+    
+    def __init__(self, parent, dvar, dtype, dvalue):
         """
         Constructor
         
         @param parent reference to the parent item
-        @param dvar variable name (string)
-        @param dvalue value string (string)
-        @param dtype type string (string)
+        @type VariableItem
+        @param dvar variable name
+        @type str
+        @param dtype type string
+        @type str
+        @param dvalue value string
+        @type str
+        """
+        self.parent = parent
+        # Take the additional methods into account for childCount
+        self.methodCount = 0
+        self.childCount = 0
+        self.currentCount = -1  # -1 indicates to (re)load children
+        # Indicator that there are children
+        self.hasChildren = False
+        # Indicator that item was at least once fully populated
+        self.wasPopulated = False
+        
+        self.children = []
+        # Flag to prevent endless reloading of current item while waiting on
+        # a response from debugger
+        self.pendigFetch = False
+        
+        # Set of child items, which are displayed the first time or changed
+        self.newItems = set()
+        self.changedItems = set()
+        # Name including its ID if it's a dict, set, etc.
+        self.nameWithId = dvar
+        
+        self.name = ''
+        self.sort = ''
+        self.type = ''
+        self.indicator = ''
+        self.value = None
+        self.valueShort = None
+        self.tooltip = ''
+        
+        self.__getName(dvar)
+        self.__getType(dtype)
+        self.__getValue(dtype, dvalue)
+    
+    def __getName(self, dvar):
+        """
+        Private method to extract the variable name.
+        
+        @param dvar name of variable maybe with ID
+        @type str
+        """
+        try:
+            idx = dvar.index(" (ID:")
+            dvar = dvar[:idx]
+        except ValueError:
+            pass
+        
+        self.name = dvar
+        try:
+            # Convert numbers to strings with preceding zeros
+            sort = int(dvar)
+            sort = "{0:06}".format(sort)
+        except ValueError:
+            sort = dvar.lower()
+        
+        self.sort = sort
+    
+    def __getType(self, dtype):
         """
-        dvar, self.__varID = VariableItem.extractId(dvar)
+        Private method to process the type of the variable.
+        
+        If type is known to have children, the corresponding flag is set.
+        
+        @param dtype type string
+        @type str
+        """
+        # Python class?
+        if dtype.startswith('class '):
+            dtype = dtype[7:-1]
+        # Qt related stuff?
+        elif (dtype.startswith(ConfigQtNames) and
+                dtype.endswith(ConfigKnownQtTypes)):
+            self.hasChildren = True
+            
+        elif dtype in ('instance', 'class'):
+            self.hasChildren = True
+        
+        # Special Qt types should not be expanded infinite
+        elif ".{0}".format(dtype) in ConfigKnownQtTypes:
+            self.type = dtype  # It's a Qt type, so skipping translation is ok
+            return
+        
+        vtype = ConfigVarTypeDispStrings.get(dtype, dtype)
+        # Unkown types should be expandable by default
+        if vtype is dtype and dtype not in self.nonExpandableTypes:
+            self.hasChildren = True
+        self.type = QCoreApplication.translate("VariablesViewer", vtype)
+    
+    def __getValue(self, dtype, dvalue):
+        """
+        Private method to process the variables value.
+        
+        Define and limit value, set tooltip text. If type is known to have
+        children, the corresponding flag is set.
         
-        self.__value = dvalue
-        if len(dvalue) > 2048:     # 1024 * 2
+        @param dtype type string
+        @type str
+        @param dvalue value of variable encoded as utf-8
+        @type str
+        """
+        if dtype == 'collections.defaultdict':
+            dvalue, default_factory = dvalue.split('|')
+            self.indicator = '{{:<{0}>}}'.format(default_factory)
+        elif dtype == 'array.array':
+            dvalue, typecode = dvalue.split('|')
+            self.indicator = '[<{0}>]'.format(typecode)
+        else:
+            self.indicator = VariableItem.Type2Indicators.get(dtype, '')
+        
+        if dtype == 'numpy.ndarray':
+            self.childCount = int(dvalue.split('x')[0])
+            dvalue = VariableItem.noOfItemsStr.format(dvalue)
+            self.hasChildren = True
+        elif dtype in VariableItem.arrayTypes:
+            self.childCount = int(dvalue)
+            dvalue = VariableItem.noOfItemsStr.format(dvalue)
+            self.hasChildren = True
+            
+        elif dtype == "Shiboken.EnumType":
+            self.hasChildren = True
+            
+        elif dtype in ['str', 'unicode']:
+            if VariableItem.rx_nonprintable.indexIn(dvalue) == -1:
+                try:
+                    dvalue = ast.literal_eval(dvalue)
+                except Exception:
+                    pass
+            try:
+                dvalue = str(dvalue)
+            except UnicodeDecodeError:  # Never reached under Python 3
+                dvalue = unicode(dvalue, 'utf-8')  # __IGNORE_WARNING__
+        
+        self.value = dvalue
+        
+        if len(dvalue) > 2048:     # 2 kB
+            self.tooltip = dvalue[:2048]
             dvalue = QCoreApplication.translate(
                 "VariableItem", "<double click to show value>")
-            self.__tooltip = dvalue
-        elif dvalue == "@@TOO_BIG_TO_SHOW@@":
-            dvalue = QCoreApplication.translate(
-                "VariableItem", "<variable value is too big>")
         else:
-            if Qt.mightBeRichText(dvalue):
-                self.__tooltip = Utilities.html_encode(dvalue)
-            else:
-                self.__tooltip = dvalue
-            lines = dvalue.splitlines()
-            if len(lines) > 1:
-                # only show the first non-empty line;
-                # indicate skipped lines by <...> at the
-                # beginning and/or end
-                index = 0
-                while index < len(lines) - 1 and lines[index] == "":
-                    index += 1
-                dvalue = ""
-                if index > 0:
-                    dvalue += "<...>"
-                dvalue += lines[index]
-                if index < len(lines) - 1:
-                    dvalue += "<...>"
-        
-        super(VariableItem, self).__init__(parent, [dvar, dvalue, dtype])
-        
-        self.populated = True
-        
-    def getValue(self):
-        """
-        Public method to return the value of the item.
+            self.tooltip = dvalue
         
-        @return value of the item (string)
-        """
-        return self.__value
-    
-    def getId(self):
-        """
-        Public method to get the ID string.
-        
-        @return ID string
-        @rtype str
-        """
-        return self.__varID
-    
-    @classmethod
-    def extractId(cls, var):
-        """
-        Class method to extract the ID string from a variable text.
-        
-        @param var variable text
-        @type str
-        @return tuple containing the variable text without ID and the ID string
-        @rtype tuple of two str
-        """
-        if " (ID:" in var:
-            dvar, varID = var.rsplit(None, 1)
-            if varID.endswith(VariableItem.Indicators):
-                varID, indicators = VariableItem.extractIndicators(varID)
-                dvar += indicators
-        else:
-            dvar = var
-            varID = None
-        
-        return dvar, varID
-    
-    @classmethod
-    def extractIndicators(cls, var):
-        """
-        Class method to extract the indicator string from a variable text.
+        lines = dvalue[:2048].splitlines()
+        if len(lines) > 1:
+            # only show the first non-empty line;
+            # indicate skipped lines by <...> at the
+            # beginning and/or end
+            index = 0
+            while index < len(lines) - 1 and lines[index].strip(' \t') == "":
+                index += 1
+            
+            dvalue = ""
+            if index > 0:
+                dvalue += "<...>"
+            dvalue += lines[index]
+            if index < len(lines) - 1 or len(dvalue) > 2048:
+                dvalue += "<...>"
         
-        @param var variable text
-        @type str
-        @return tuple containing the variable text without indicators and the
-            indicator string
-        @rtype tuple of two str
-        """
-        for indicator in VariableItem.Indicators:
-            if var.endswith(indicator):
-                return var[:-len(indicator)], indicator
-        
-        return var, ""
+        self.valueShort = dvalue
     
-    def _buildKey(self):
+    @property
+    def absolutCount(self):
         """
-        Protected method to build the access key for the variable.
-        
-        @return access key
-        @rtype str
-        """
-        indicators = ""
-        txt = self.text(0)
-        if txt.endswith(VariableItem.Indicators):
-            txt, indicators = VariableItem.extractIndicators(txt)
-        if self.__varID:
-            txt = "{0} {1}{2}".format(txt, self.__varID, indicators)
-        else:
-            txt = "{0}{1}".format(txt, indicators)
-        return txt
-    
-    def data(self, column, role):
-        """
-        Public method to return the data for the requested role.
-        
-        This implementation changes the original behavior in a way, that the
-        display data is returned as the tooltip for column 1.
+        Public property to get the total number of children.
         
-        @param column column number (integer)
-        @param role data role (Qt.ItemDataRole)
-        @return requested data
-        """
-        if column == 1 and role == Qt.ToolTipRole:
-            return self.__tooltip
-        return super(VariableItem, self).data(column, role)
-        
-    def attachDummy(self):
-        """
-        Public method to attach a dummy sub item to allow for lazy population.
-        """
-        QTreeWidgetItem(self, ["DUMMY"])
-        
-    def deleteChildren(self):
-        """
-        Public method to delete all children (cleaning the subtree).
+        @return total number of children
+        @rtype int
         """
-        for itm in self.takeChildren():
-            del itm
-        
-    def expand(self):
-        """
-        Public method to expand the item.
-        
-        Note: This is just a do nothing and should be overwritten.
+        return self.childCount + self.methodCount
+    
+    @property
+    def populated(self):
         """
-        return
+        Public property returning a flag indicating if item is fully populated.
         
-    def collapse(self):
+        @return item is fully populated
+        @rtype bool
         """
-        Public method to collapse the item.
-        
-        Note: This is just a do nothing and should be overwritten.
-        """
-        return
+        return self.currentCount >= (self.childCount + self.methodCount)
 
 
-class SpecialVarItem(VariableItem):
+class VariablesModel(QAbstractItemModel):
     """
-    Class implementing a VariableItem that represents a special variable node.
+    Class implementing the data model for QTreeView.
     
-    These special variable nodes are generated for classes, lists,
-    tuples and dictionaries.
+    @signal expand trigger QTreeView to expand given index
     """
-    def __init__(self, parent, dvar, dvalue, dtype, frmnr, globalScope):
+    expand = pyqtSignal(QModelIndex)
+    
+    def __init__(self, treeView, globalScope):
         """
         Constructor
         
-        @param parent parent of this item
-        @param dvar variable name (string)
-        @param dvalue value string (string)
-        @param dtype type string (string)
-        @param frmnr frame number (0 is the current frame) (int)
+        @param treeView QTreeView showing the data
+        @type VariablesViewer
         @param globalScope flag indicating global (True) or local (False)
             variables
+        @type bool
         """
-        VariableItem.__init__(self, parent, dvar, dvalue, dtype)
-        self.attachDummy()
-        self.populated = False
+        super(VariablesModel, self).__init__()
+        self.treeView = treeView
+        self.proxyModel = treeView.proxyModel
+        
+        self.framenr = -1
+        self.openItems = []
+        self.closedItems = []
+        
+        if globalScope:
+            visibility = self.tr("Globals")
+        else:
+            visibility = self.tr("Locals")
+        
+        self.rootNode = VariableItem(None, visibility, self.tr("Type"),
+                                     self.tr("Value"))
+        
+        self.__globalScope = globalScope
+    
+    def clear(self, reset=False):
+        """
+        Public method to clear the complete data model.
+        
+        @param reset flag to clear the expanded keys also
+        @type bool
+        """
+        self.beginResetModel()
+        self.rootNode.children = []
+        self.rootNode.newItems.clear()
+        self.rootNode.changedItems.clear()
+        self.rootNode.wasPopulated = False
+        if reset:
+            self.openItems = []
+            self.closedItems = []
+        self.endResetModel()
+    
+    def __findVariable(self, pathlist):
+        """
+        Private method to get to the given variable.
+        
+        @param pathlist full path to the variable
+        @type list of str
+        @return the found variable or None if it doesn't exist
+        @rtype VariableItem or None
+        """
+        node = self.rootNode
+        
+        for childName in pathlist or []:
+            for item in node.children:
+                if item.nameWithId == childName:
+                    node = item
+                    break
+            else:
+                return None
+        
+        return node  # __IGNORE_WARNING_M834__
+    
+    def showVariables(self, vlist, frmnr, pathlist=None):
+        """
+        Public method to update the data model of variable in pathlist.
+        
+        @param vlist the list of variables to be displayed. Each
+                list entry is a tuple of three values.
+                <ul>
+                <li>the variable name (string)</li>
+                <li>the variables type (string)</li>
+                <li>the variables value (string)</li>
+                </ul>
+        @type list of str
+        @param frmnr frame number (0 is the current frame)
+        @type int
+        @param pathlist full path to the variable
+        @type list of str
+        """
+        if pathlist:
+            itemStartIndex = pathlist.pop(0)
+        else:
+            itemStartIndex = -1
+            if self.framenr != frmnr:
+                self.clear()
+                self.framenr = frmnr
+        
+        parent = self.__findVariable(pathlist)
+        if parent is None:
+            return
+        
+        parent.pendigFetch = False
+        
+        if parent == self.rootNode:
+            parentIdx = QModelIndex()
+            parent.methodCount = len(vlist)
+        else:
+            row = parent.parent.children.index(parent)
+            parentIdx = self.createIndex(row, 0, parent)
+        
+        if itemStartIndex == -3:
+            # Item doesn't exist any more
+            parentIdx = self.parent(parentIdx)
+            self.beginRemoveRows(parentIdx, row, row)
+            del parent.parent.children[row]
+            self.endRemoveRows()
+            parent.parent.childCount -= 1
+            return
+            
+        elif itemStartIndex == -2:
+            parent.wasPopulated = True
+            parent.currentCount = parent.absolutCount
+            # Remove items which are left over at the end of child list
+            self.__cleanupParentList(parent, parentIdx)
+            return
+            
+        elif itemStartIndex == -1:
+            parent.methodCount = len(vlist)
+            idx = parent.childCount = parent.currentCount + 1
+            parent.currentCount += 1 + len(vlist)
+        else:
+            idx = parent.currentCount + 1
+            parent.currentCount += len(vlist)
         
-        self.framenr = frmnr
-        self.globalScope = globalScope
-
-    def expand(self):
+        # Sort items for Python versions where dict doesn't retain order
+        vlist.sort(key=lambda x: x[0])
+        # Now update the table
+        endIndex = idx + len(vlist)
+        newChild = None
+        knownChildrenCount = len(parent.children)
+        while idx < endIndex:
+            # Fetch next old item from last cycle
+            try:
+                child = parent.children[idx]
+            except IndexError:
+                child = None
+            
+            # Fetch possible new item
+            if not newChild and vlist:
+                newChild = vlist.pop(0)
+                
+                # Process parameters of new item
+                newItem = VariableItem(parent, *newChild)
+                sort = newItem.sort
+            
+            # Append or insert before already existing item
+            if child is None or newChild and sort < child.sort:
+                self.beginInsertRows(parentIdx, idx, idx)
+                parent.children.insert(idx, newItem)
+                if knownChildrenCount <= idx and not parent.wasPopulated:
+                    parent.newItems.add(newItem)
+                    knownChildrenCount += 1
+                else:
+                    parent.changedItems.add(newItem)
+                self.endInsertRows()
+                
+                idx += 1
+                newChild = None
+                continue
+                
+            # Check if same name, type and afterwards value
+            elif sort == child.sort and child.type == newItem.type:
+                # Check if value has changed
+                if child.value != newItem.value:
+                    child.value = newItem.value
+                    child.valueShort = newItem.valueShort
+                    child.tooltip = newItem.tooltip
+                    
+                    child.currentCount = -1
+                    child.childCount = newItem.childCount
+                    
+                    # Highlight item because it has changed
+                    parent.changedItems.add(child)
+                    
+                    changedIndexStart = self.index(idx, 0, parentIdx)
+                    changedIndexEnd = self.index(idx, 2, parentIdx)
+                    self.dataChanged.emit(changedIndexStart, changedIndexEnd)
+                
+                newChild = None
+                idx += 1
+                continue
+            
+            # Remove obsolete item
+            self.beginRemoveRows(parentIdx, idx, idx)
+            parent.children.remove(child)
+            self.endRemoveRows()
+            # idx stay unchanged
+            knownChildrenCount -= 1
+        
+        # Remove items which are left over at the end of child list
+        if itemStartIndex == -1:
+            parent.wasPopulated = True
+            self.__cleanupParentList(parent, parentIdx)
+        
+        # Request data for any expanded node
+        self.getMore()
+    
+    def __cleanupParentList(self, parent, parentIdx):
+        """
+        Private method to remove items which are left over at the end of the
+        child list.
+        
+        @param parent to clean up
+        @type VariableItem
+        @param parentIdx the parent index as QModelIndex
+        @type QModelIndex
         """
-        Public method to expand the item.
+        end = len(parent.children)
+        if end > parent.absolutCount:
+            self.beginRemoveRows(parentIdx, parent.absolutCount, end)
+            del parent.children[parent.absolutCount:]
+            self.endRemoveRows()
+    
+    def resetModifiedMarker(self, parentIdx=QModelIndex(), pathlist=()):
+        """
+        Public method to remove the modified marker from changed items.
+        
+        @param parentIdx item to reset marker
+        @type QModelIndex
+        @param pathlist full path to the variable
+        @type list of str
+        """
+        if parentIdx.isValid():
+            parent = parentIdx.internalPointer()
+        else:
+            parent = self.rootNode
+        
+        parent.newItems.clear()
+        parent.changedItems.clear()
+        
+        pll = len(pathlist)
+        posPaths = {x for x in self.openItems if len(x) > pll}
+        posPaths |= {x for x in self.closedItems if len(x) > pll}
+        posPaths = {x[pll] for x in posPaths if x[:pll] == pathlist}
+        
+        if posPaths:
+            for child in parent.children:
+                if child.hasChildren and child.nameWithId in posPaths:
+                    if child.currentCount >= 0:
+                        # Discard loaded elements and refresh if still expanded
+                        child.currentCount = -1
+                        row = parent.children.index(child)
+                        newParentIdx = self.index(row, 0, parentIdx)
+                        self.resetModifiedMarker(
+                            newParentIdx, pathlist + (child.nameWithId,))
+        
+        self.closedItems = []
+        
+        # Little quirk: Refresh all visible items to clear the changed marker
+        if parentIdx == QModelIndex():
+            self.rootNode.currentCount = -1
+            idxStart = self.index(0, 0, QModelIndex())
+            idxEnd = self.index(0, 2, QModelIndex())
+            self.dataChanged.emit(idxStart, idxEnd)
+    
+    def columnCount(self, parent=QModelIndex()):
+        """
+        Public method to get the column count.
+        
+        @param parent the model parent
+        @type QModelIndex
+        @return number of columns
+        @rtype int
+        """
+        return 3
+    
+    def rowCount(self, parent=QModelIndex()):
+        """
+        Public method to get the row count.
+        
+        @param parent the model parent
+        @type QModelIndex
+        @return number of rows
+        @rtype int
+        """
+        if parent.isValid():
+            node = parent.internalPointer()
+        else:
+            node = self.rootNode
+        
+        return len(node.children)
+    
+    def flags(self, index):
+        """
+        Public method to get the item flags.
+        
+        @param index of item
+        @type QModelIndex
+        @return item flags
+        @rtype QtCore.Qt.ItemFlag
         """
-        self.deleteChildren()
-        self.populated = True
+        if not index.isValid():
+            return Qt.NoItemFlags
+
+        return Qt.ItemIsEnabled | Qt.ItemIsSelectable
+    
+    def hasChildren(self, parent=QModelIndex()):
+        """
+        Public method to get a flag if parent has children.
+        
+        @param parent the model parent
+        @type QModelIndex
+        @return flag indicating parent has children
+        @rtype bool
+        """
+        if not parent.isValid():
+            return self.rootNode.children != []
+        
+        return parent.internalPointer().hasChildren
+    
+    def index(self, row, column, parent=QModelIndex()):
+        """
+        Public method to get the index of item at row:column of parent.
+        
+        @param row number of rows
+        @type int
+        @param column number of columns
+        @type int
+        @param parent the model parent
+        @type QModelIndex
+        @return new model index for child
+        @rtype QModelIndex
+        """
+        if not self.hasIndex(row, column, parent):
+            return QModelIndex()
+        
+        if not parent.isValid():
+            node = self.rootNode
+        else:
+            node = parent.internalPointer()
+        
+        return self.createIndex(row, column, node.children[row])
+    
+    def parent(self, child):
+        """
+        Public method to get the parent of the given child.
+        
+        @param child the model child node
+        @type QModelIndex
+        @return new model index for parent
+        @rtype QModelIndex
+        """
+        if not child.isValid():
+            return QModelIndex()
+
+        childNode = child.internalPointer()
+        if childNode == self.rootNode:
+            return QModelIndex()
+        
+        parentNode = childNode.parent
+        
+        if parentNode == self.rootNode:
+            return QModelIndex()
+        
+        row = parentNode.parent.children.index(parentNode)
+        return self.createIndex(row, 0, parentNode)
+    
+    def data(self, index, role=Qt.DisplayRole):
+        """
+        Public method get the role data of item.
         
-        pathlist = [self._buildKey()]
-        par = self.parent()
+        @param index the model index
+        @type QModelIndex
+        @param role the requested data role
+        @type QtCore.Qt.ItemDataRole
+        @return role data of item
+        @rtype Any
+        """
+        if not index.isValid() or index.row() < 0:
+            return None
+        
+        node = index.internalPointer()
+        column = index.column()
+        
+        if role in (Qt.DisplayRole, SORT_ROLE, Qt.EditRole):
+            try:
+                if column == 0:
+                    # Sort first column with values from third column
+                    if role == SORT_ROLE:
+                        return node.sort
+                    return node.name + node.indicator
+                elif column == 1:
+                    return node.valueShort
+                elif column == 2:
+                    return node.type
+                elif column == 3:
+                    return node.sort
+                else:
+                    return None
+            except AttributeError:
+                return ['None', '', '', ''][column]
+        
+        elif role == Qt.BackgroundRole:
+            if node in node.parent.changedItems:
+                return self.__bgColorChanged
+            elif node in node.parent.newItems:
+                return self.__bgColorNew
+        
+        elif role == Qt.ToolTipRole:
+            if column == 0:
+                tooltip = node.name + node.indicator
+            elif column == 1:
+                tooltip = node.tooltip
+            elif column == 2:
+                tooltip = node.type
+            elif column == 3:
+                tooltip = node.sort
+            else:
+                return None
+
+            if Qt.mightBeRichText(tooltip):
+                tooltip = Utilities.html_encode(tooltip)
+            
+            if column == 0:
+                indentation = self.treeView.indentation()
+                indentCount = 0
+                currentNode = node
+                while currentNode.parent:
+                    indentCount += 1
+                    currentNode = currentNode.parent
+                
+                indentation *= indentCount
+            else:
+                indentation = 0
+            # Check if text is longer than available space
+            fontMetrics = QFontMetrics(self.treeView.font())
+            textSize = fontMetrics.width(tooltip)
+            textSize += indentation + 5  # How to determine border size?
+            header = self.treeView.header()
+            if textSize >= header.sectionSize(column):
+                return tooltip
+            else:
+                QToolTip.hideText()
         
-        # step 1: get a pathlist up to the requested variable
-        while par is not None:
-            pathlist.insert(0, par._buildKey())
-            par = par.parent()
+        return None
+    
+    def headerData(self, section, orientation, role=Qt.DisplayRole):
+        """
+        Public method get the header names.
+        
+        @param section the header section (row/coulumn)
+        @type int
+        @param orientation the header's orientation
+        @type QtCore.Qt.Orientation
+        @param role the requested data role
+        @type QtCore.Qt.ItemDataRole
+        @return header name
+        @rtype str or None
+        """
+        if role != Qt.DisplayRole or orientation != Qt.Horizontal:
+            return None
+        
+        if section == 0:
+            return self.rootNode.name
+        elif section == 1:
+            return self.rootNode.value
+        elif section == 2:
+            return self.rootNode.type
+        elif section == 3:
+            return self.rootNode.sort
+        
+        return None
+    
+    def __findPendingItem(self, parent=None, pathlist=()):
+        """
+        Private method to find the next item to request data from debugger.
+        
+        @param parent the model parent
+        @type VariableItem
+        @param pathlist full path to the variable
+        @type list of str
+        @return next item index to request data from debugger
+        @rtype QModelIndex
+        """
+        if parent is None:
+            parent = self.rootNode
+        
+        for child in parent.children:
+            if not child.hasChildren:
+                continue
+            
+            if pathlist + (child.nameWithId,) in self.openItems:
+                if child.populated:
+                    index = None
+                else:
+                    idx = parent.children.index(child)
+                    index = self.createIndex(idx, 0, child)
+                    self.expand.emit(index)
+                
+                if child.currentCount < 0:
+                    return index
+                
+                possibleIndex = self.__findPendingItem(
+                    child, pathlist + (child.nameWithId,))
+                
+                if (possibleIndex or index) is None:
+                    continue
+                
+                return possibleIndex or index
         
-        # step 2: request the variable from the debugger
+        return None
+    
+    def getMore(self):
+        """
+        Public method to fetch the next variable from debugger.
+        """
+        # step 1: find expanded but not populated items
+        item = self.__findPendingItem()
+        if not item or not item.isValid():
+            return
+        
+        # step 2: check if data has to be retrieved
+        node = item.internalPointer()
+        lastVisibleItem = self.index(node.currentCount - 1, 0, item)
+        lastVisibleItem = self.proxyModel.mapFromSource(lastVisibleItem)
+        rect = self.treeView.visualRect(lastVisibleItem)
+        if rect.y() > self.treeView.height() or node.pendigFetch:
+            return
+        
+        node.pendigFetch = True
+        # step 3: get a pathlist up to the requested variable
+        pathlist = self.__buildTreePath(node)
+        # step 4: request the variable from the debugger
         variablesFilter = e5App().getObject("DebugUI").variablesFilter(
-            self.globalScope)
+            self.__globalScope)
         e5App().getObject("DebugServer").remoteClientVariable(
-            self.globalScope, variablesFilter, pathlist, self.framenr)
+            self.__globalScope, variablesFilter, pathlist, self.framenr)
+    
+    def setExpanded(self, index, state):
+        """
+        Public method to set the expanded state of item.
+        
+        @param index item to change expanded state
+        @type QModelIndex
+        @param state state of the item
+        @type bool
+        """
+        node = index.internalPointer()
+        pathlist = self.__buildTreePath(node)
+        if state:
+            if pathlist not in self.openItems:
+                self.openItems.append(pathlist)
+                if pathlist in self.closedItems:
+                    self.closedItems.remove(pathlist)
+                self.getMore()
+        else:
+            self.openItems.remove(pathlist)
+            self.closedItems.append(pathlist)
+    
+    def __buildTreePath(self, parent):
+        """
+        Private method to build up a path from the root to parent.
+        
+        @param parent item to build the path for
+        @type VariableItem
+        @return list of names denoting the path from the root
+        @rtype tuple of str
+        """
+        pathlist = []
+        
+        # build up a path from the top to the item
+        while parent.parent:
+            pathlist.append(parent.nameWithId)
+            parent = parent.parent
+        
+        pathlist.reverse()
+        return tuple(pathlist)
+    
+    def handlePreferencesChanged(self):
+        """
+        Public slot to handle the preferencesChanged signal.
+        """
+        self.__bgColorNew = QBrush(Preferences.getDebugger("BgColorNew"))
+        self.__bgColorChanged = QBrush(
+            Preferences.getDebugger("BgColorChanged"))
+        
+        idxStart = self.index(0, 0, QModelIndex())
+        idxEnd = self.index(0, 2, QModelIndex())
+        self.dataChanged.emit(idxStart, idxEnd)
 
 
-class ArrayElementVarItem(VariableItem):
+class VariablesProxyModel(QSortFilterProxyModel):
     """
-    Class implementing a VariableItem that represents an array element.
+    Class for handling the sort operations.
     """
-    def __init__(self, parent, dvar, dvalue, dtype):
+    def __init__(self, parent=None):
         """
         Constructor
         
-        @param parent parent of this item
-        @param dvar variable name (string)
-        @param dvalue value string (string)
-        @param dtype type string (string)
+        @param parent the parent model index
+        @type QModelIndex
         """
-        VariableItem.__init__(self, parent, dvar, dvalue, dtype)
-        
+        super(VariablesProxyModel, self).__init__(parent)
+        self.setSortRole(SORT_ROLE)
+    
+    def hasChildren(self, parent):
         """
-        Array elements have numbers as names, but the key must be
-        right justified and zero filled to 6 decimal places. Then
-        element 2 will have a key of '000002' and appear before
-        element 10 with a key of '000010'
+        Public method to get a flag if parent has children.
+        
+        The given model index has to be transformed to the underlying source
+        model to get the correct result.
+        
+        @param parent the model parent
+        @type QModelIndex
+        @return flag if parent has children
+        @rtype bool
         """
-        col0Str = self.text(0)
-        self.setText(0, "{0:6d}".format(int(col0Str)))
+        return self.sourceModel().hasChildren(self.mapToSource(parent))
+    
+    def setExpanded(self, index, state):
+        """
+        Public slot to get a flag if parent has children.
+        
+        The given model index has to be transformed to the underlying source
+        model to get the correct result.
+        @param index item to change expanded state
+        @type QModelIndex
+        @param state state of the item
+        @type bool
+        """
+        self.sourceModel().setExpanded(self.mapToSource(index), state)
 
 
-class SpecialArrayElementVarItem(SpecialVarItem):
-    """
-    Class implementing a QTreeWidgetItem that represents a special array
-    variable node.
+class VariablesViewer(QTreeView):
     """
-    def __init__(self, parent, dvar, dvalue, dtype, frmnr, globalScope):
-        """
-        Constructor
-        
-        @param parent parent of this item
-        @param dvar variable name (string)
-        @param dvalue value string (string)
-        @param dtype type string (string)
-        @param frmnr frame number (0 is the current frame) (int)
-        @param globalScope flag indicating global (True) or local (False)
-            variables
-        """
-        SpecialVarItem.__init__(self, parent, dvar, dvalue, dtype, frmnr,
-                                globalScope)
-        
-        """
-        Array elements have numbers as names, but the key must be
-        right justified and zero filled to 6 decimal places. Then
-        element 2 will have a key of '000002' and appear before
-        element 10 with a key of '000010'
-        """
-        # strip off [], () or {}
-        col0Str, indicators = VariableItem.extractIndicators(self.text(0))
-        self.setText(0, "{0:6d}{1}".format(int(col0Str), indicators))
-
-
-class VariablesViewer(QTreeWidget):
-    """
-    Class implementing the variables viewer widget.
+    Class implementing the variables viewer view.
     
-    This widget is used to display the variables of the program being
+    This view is used to display the variables of the program being
     debugged in a tree. Compound types will be shown with
     their main entry first. Once the subtree has been expanded, the
     individual entries will be shown. Double clicking an entry will
+    expand or collapse the item, if it has children and the double click
+    was performed on the first column of the tree, otherwise it'll
     popup a dialog showing the variables parameters in a more readable
     form. This is especially useful for lengthy strings.
     
-    This widget has two modes for displaying the global and the local
+    This view has two modes for displaying the global and the local
     variables.
+    
+    @signal preferencesChanged() to inform model about new background colours
     """
+    preferencesChanged = pyqtSignal()
+    
     def __init__(self, viewer, globalScope, parent=None):
         """
         Constructor
         
-        @param viewer reference to the debug viewer object (DebugViewer)
+        @param viewer reference to the debug viewer object
+        @type DebugViewer
         @param globalScope flag indicating global (True) or local (False)
             variables
-        @param parent the parent (QWidget)
+        @type bool
+        @param parent the parent
+        @type QWidget
         """
         super(VariablesViewer, self).__init__(parent)
         
         self.__debugViewer = viewer
         self.__globalScope = globalScope
-        
-        indicatorPattern = "|".join([QRegExp.escape(indicator)
-                                     for indicator in VariableItem.Indicators])
-        self.rx_class = QRegExp('<.*(instance|object) at 0x.*>')
-        self.rx_class2 = QRegExp('class .*')
-        self.rx_class3 = QRegExp('<class .* at 0x.*>')
-        self.dvar_rx_class1 = QRegExp(
-            r'<.*(instance|object) at 0x.*>({0})'.format(indicatorPattern))
-        self.dvar_rx_class2 = QRegExp(
-            r'<class .* at 0x.*>({0})'.format(indicatorPattern))
-        self.dvar_rx_array_element = QRegExp(r'^\d+$')
-        self.dvar_rx_special_array_element = QRegExp(
-            r'^\d+({0})$'.format(indicatorPattern))
-        self.rx_nonprintable = QRegExp(r"""(\\x\d\d)+""")
-        
         self.framenr = 0
         
-        self.loc = Preferences.getSystem("StringEncoding")
+        # Massive performance gain
+        self.setUniformRowHeights(True)
+        
+        # Implements sorting and filtering
+        self.proxyModel = VariablesProxyModel()
+        # Variable model implements the underlying data model
+        self.varModel = VariablesModel(self, globalScope)
+        self.preferencesChanged.connect(self.varModel.handlePreferencesChanged)
+        self.preferencesChanged.emit()  # Force initialization of colors
+        self.proxyModel.setSourceModel(self.varModel)
+        self.setModel(self.proxyModel)
         
-        self.openItems = []
+        self.expanded.connect(
+            lambda idx: self.proxyModel.setExpanded(idx, True))
+        self.collapsed.connect(
+            lambda idx: self.proxyModel.setExpanded(idx, False))
         
-        self.setRootIsDecorated(True)
+        self.setExpandsOnDoubleClick(False)
+        self.doubleClicked.connect(self.__itemDoubleClicked)
+        
+        self.varModel.expand.connect(self.__mdlRequestExpand)
+        
+        self.setSortingEnabled(True)
         self.setAlternatingRowColors(True)
         self.setSelectionBehavior(QAbstractItemView.SelectRows)
         
         if self.__globalScope:
             self.setWindowTitle(self.tr("Global Variables"))
-            self.setHeaderLabels([
-                self.tr("Globals"),
-                self.tr("Value"),
-                self.tr("Type")])
             self.setWhatsThis(self.tr(
                 """<b>The Global Variables Viewer Window</b>"""
                 """<p>This window displays the global variables"""
@@ -369,10 +962,6 @@
             ))
         else:
             self.setWindowTitle(self.tr("Local Variables"))
-            self.setHeaderLabels([
-                self.tr("Locals"),
-                self.tr("Value"),
-                self.tr("Type")])
             self.setWhatsThis(self.tr(
                 """<b>The Local Variables Viewer Window</b>"""
                 """<p>This window displays the local variables"""
@@ -382,290 +971,171 @@
         header = self.header()
         header.setSortIndicator(0, Qt.AscendingOrder)
         header.setSortIndicatorShown(True)
-        if qVersionTuple() >= (5, 0, 0):
+        
+        try:
             header.setSectionsClickable(True)
-        else:
+        except Exception:
             header.setClickable(True)
-        header.sectionClicked.connect(self.__sectionClicked)
-        header.resizeSection(0, 120)    # variable column
-        header.resizeSection(1, 150)    # value column
+        
+        header.resizeSection(0, 130)    # variable column
+        header.resizeSection(1, 180)    # value column
+        header.resizeSection(2, 50)     # type column
+        
+        header.sortIndicatorChanged.connect(lambda *x: self.varModel.getMore())
         
         self.__createPopupMenus()
         self.setContextMenuPolicy(Qt.CustomContextMenu)
         self.customContextMenuRequested.connect(self.__showContextMenu)
         
-        self.itemExpanded.connect(self.__expandItemSignal)
-        self.itemCollapsed.connect(self.collapseItem)
-        
         self.resortEnabled = True
-        
-    def __createPopupMenus(self):
-        """
-        Private method to generate the popup menus.
-        """
-        self.menu = QMenu()
-        self.menu.addAction(self.tr("Show Details..."), self.__showDetails)
-        self.menu.addAction(self.tr("Refresh"), self.__refreshView)
-        self.menu.addSeparator()
-        self.menu.addAction(self.tr("Configure..."), self.__configure)
-        
-        self.backMenu = QMenu()
-        self.backMenu.addAction(self.tr("Refresh"), self.__refreshView)
-        self.backMenu.addSeparator()
-        self.backMenu.addAction(self.tr("Configure..."), self.__configure)
-        
-    def __showContextMenu(self, coord):
-        """
-        Private slot to show the context menu.
-        
-        @param coord the position of the mouse pointer (QPoint)
-        """
-        gcoord = self.mapToGlobal(coord)
-        if self.itemAt(coord) is not None:
-            self.menu.popup(gcoord)
-        else:
-            self.backMenu.popup(gcoord)
-        
-    def __findItem(self, slist, column, node=None):
-        """
-        Private method to search for an item.
-        
-        It is used to find a specific item in column,
-        that is a child of node. If node is None, a child of the
-        QTreeWidget is searched.
-        
-        @param slist searchlist (list of strings)
-        @param column index of column to search in (int)
-        @param node start point of the search
-        @return the found item or None
-        """
-        if node is None:
-            count = self.topLevelItemCount()
-        else:
-            count = node.childCount()
-        
-        if column == 0:
-            searchStr = VariableItem.extractId(slist[0])[0]
-        else:
-            searchStr = slist[0]
-        
-        for index in range(count):
-            if node is None:
-                itm = self.topLevelItem(index)
-            else:
-                itm = node.child(index)
-            if itm.text(column) == searchStr:
-                if len(slist) > 1:
-                    itm = self.__findItem(slist[1:], column, itm)
-                return itm
-        
-        return None
-        
+    
     def showVariables(self, vlist, frmnr):
         """
         Public method to show variables in a list.
         
         @param vlist the list of variables to be displayed. Each
-                listentry is a tuple of three values.
+                list entry is a tuple of three values.
                 <ul>
                 <li>the variable name (string)</li>
                 <li>the variables type (string)</li>
                 <li>the variables value (string)</li>
                 </ul>
-        @param frmnr frame number (0 is the current frame) (int)
+        @type list
+        @param frmnr frame number (0 is the current frame)
+        @type int
         """
-        self.current = self.currentItem()
-        if self.current:
-            self.curpathlist = self.__buildTreePath(self.current)
-        self.clear()
-        self.__scrollToItem = None
-        self.framenr = frmnr
-        
-        if len(vlist):
-            self.resortEnabled = False
-            for (var, vtype, value) in vlist:
-                self.__addItem(None, vtype, var, value)
-            
-            # re-expand tree
-            openItems = sorted(self.openItems[:])
-            self.openItems = []
-            for itemPath in openItems:
-                itm = self.__findItem(itemPath, 0)
-                if itm is not None:
-                    self.expandItem(itm)
-                else:
-                    self.openItems.append(itemPath)
-            
-            if self.current:
-                citm = self.__findItem(self.curpathlist, 0)
-                if citm:
-                    self.setCurrentItem(citm)
-                    citm.setSelected(True)
-                    self.scrollToItem(citm, QAbstractItemView.PositionAtTop)
-                    self.current = None
-            
-            self.resortEnabled = True
-            self.__resort()
-
+        self.varModel.resetModifiedMarker()
+        self.varModel.showVariables(vlist, frmnr)
+    
     def showVariable(self, vlist):
         """
         Public method to show variables in a list.
         
         @param vlist the list of subitems to be displayed.
                 The first element gives the path of the
-                parent variable. Each other listentry is
+                parent variable. Each other list entry is
                 a tuple of three values.
                 <ul>
                 <li>the variable name (string)</li>
                 <li>the variables type (string)</li>
                 <li>the variables value (string)</li>
                 </ul>
+        @type list
         """
-        resortEnabled = self.resortEnabled
-        self.resortEnabled = False
-        if self.current is None:
-            self.current = self.currentItem()
-            if self.current:
-                self.curpathlist = self.__buildTreePath(self.current)
+        self.varModel.showVariables(vlist[1:], 0, vlist[0])
+    
+    def handleResetUI(self):
+        """
+        Public method to reset the VariablesViewer.
+        """
+        self.varModel.clear(True)
+    
+    def verticalScrollbarValueChanged(self, value):
+        """
+        Public slot informing about the scrollbar change.
+        
+        @param value current value of the vertical scrollbar
+        @type int
+        """
+        self.varModel.getMore()
+        super(VariablesViewer, self).verticalScrollbarValueChanged(value)
+    
+    def resizeEvent(self, event):
+        """
+        Protected slot informing about the widget size change.
         
-        if vlist:
-            itm = self.__findItem(vlist[0], 0)
-            for var, vtype, value in vlist[1:]:
-                self.__addItem(itm, vtype, var, value)
-
-        # re-expand tree
-        openItems = sorted(self.openItems[:])
-        self.openItems = []
-        for itemPath in openItems:
-            itm = self.__findItem(itemPath, 0)
-            if itm is not None and not itm.isExpanded():
-                if itm.populated:
-                    self.blockSignals(True)
-                    itm.setExpanded(True)
-                    self.blockSignals(False)
-                else:
-                    self.expandItem(itm)
-        self.openItems = openItems[:]
-            
-        if self.current:
-            citm = self.__findItem(self.curpathlist, 0)
-            if citm:
-                self.setCurrentItem(citm)
-                citm.setSelected(True)
-                if self.__scrollToItem:
-                    self.scrollToItem(self.__scrollToItem,
-                                      QAbstractItemView.PositionAtTop)
-                else:
-                    self.scrollToItem(citm, QAbstractItemView.PositionAtTop)
-                self.current = None
-        elif self.__scrollToItem:
-            self.scrollToItem(self.__scrollToItem,
-                              QAbstractItemView.PositionAtTop)
+        @param event information
+        @type QResizeEvent
+        """
+        self.varModel.getMore()
+        super(VariablesViewer, self).resizeEvent(event)
+    
+    def __itemDoubleClicked(self, index):
+        """
+        Private method called if an item was double clicked.
         
-        self.resortEnabled = resortEnabled
-        self.__resort()
-
-    def __generateItem(self, parent, dvar, dvalue, dtype, isSpecial=False):
+        @param index the double clicked item
+        @type QModelIndex
         """
-        Private method used to generate a VariableItem.
-        
-        @param parent parent of the item to be generated
-        @param dvar variable name (string)
-        @param dvalue value string (string)
-        @param dtype type string (string)
-        @param isSpecial flag indicating that a special node should be
-            generated (boolean)
-        @return The item that was generated (VariableItem).
+        node = self.proxyModel.mapToSource(index).internalPointer()
+        if node.hasChildren and index.column() == 0:
+            state = self.isExpanded(index)
+            self.setExpanded(index, not state)
+        else:
+            self.__showVariableDetails(index)
+    
+    def __mdlRequestExpand(self, modelIndex):
         """
-        if isSpecial and \
-           (self.dvar_rx_class1.exactMatch(dvar) or
-                self.dvar_rx_class2.exactMatch(dvar)):
-            isSpecial = False
+        Private method to inform the view about items to be expand.
         
-        if self.rx_class2.exactMatch(dtype):
-            return SpecialVarItem(
-                parent, dvar, dvalue, dtype[7:-1], self.framenr,
-                self.__globalScope)
-        elif dtype != "void *" and \
-            (self.rx_class.exactMatch(dvalue) or
-             self.rx_class3.exactMatch(dvalue) or
-             isSpecial):
-            if self.dvar_rx_special_array_element.exactMatch(dvar):
-                return SpecialArrayElementVarItem(
-                    parent, dvar, dvalue, dtype, self.framenr,
-                    self.__globalScope)
-            else:
-                return SpecialVarItem(parent, dvar, dvalue, dtype,
-                                      self.framenr, self.__globalScope)
-        elif dtype in ["numpy.ndarray", "django.MultiValueDict",
-                       "array.array"]:
-            return SpecialVarItem(
-                parent, dvar, self.tr("{0} items").format(dvalue), dtype,
-                self.framenr, self.__globalScope)
-        else:
-            if self.dvar_rx_array_element.exactMatch(dvar):
-                return ArrayElementVarItem(parent, dvar, dvalue, dtype)
-            else:
-                return VariableItem(parent, dvar, dvalue, dtype)
+        @param modelIndex the model index
+        @type QModelIndex
+        """
+        index = self.proxyModel.mapFromSource(modelIndex)
+        self.expand(index)
+    
+    def __createPopupMenus(self):
+        """
+        Private method to generate the popup menus.
+        """
+        self.menu = QMenu()
+        self.menu.addAction(self.tr("Show Details..."), self.__showDetails)
+        self.menu.addSeparator()
+        self.menu.addAction(self.tr("Expand"), self.__expandChildren)
+        self.menu.addAction(self.tr("Collapse"), self.__collapseChildren)
+        self.menu.addAction(self.tr("Collapse All"), self.collapseAll)
+        self.menu.addSeparator()
+        self.menu.addAction(self.tr("Refresh"), self.__refreshView)
+        self.menu.addSeparator()
+        self.menu.addAction(self.tr("Configure..."), self.__configure)
+        self.menu.addAction(self.tr("Variables Type Filter..."),
+                            self.__configureFilter)
         
-    def __addItem(self, parent, vtype, var, value):
-        """
-        Private method used to add an item to the list.
-        
-        If the item is of a type with subelements (i.e. list, dictionary,
-        tuple), these subelements are added by calling this method recursively.
-        
-        @param parent the parent of the item to be added
-            (QTreeWidgetItem or None)
-        @param vtype the type of the item to be added
-            (string)
-        @param var the variable name (string)
-        @param value the value string (string)
-        @return The item that was added to the listview (QTreeWidgetItem).
+        self.backMenu = QMenu()
+        self.backMenu.addAction(self.tr("Refresh"), self.__refreshView)
+        self.backMenu.addSeparator()
+        self.backMenu.addAction(self.tr("Configure..."), self.__configure)
+        self.backMenu.addAction(self.tr("Variables Type Filter..."),
+                                self.__configureFilter)
+    
+    def __showContextMenu(self, coord):
         """
-        if parent is None:
-            parent = self
-        try:
-            dvar = '{0}{1}'.format(var, VariableItem.Type2Indicators[vtype])
-        except KeyError:
-            dvar = var
-        dvtype = self.__getDispType(vtype)
-        
-        if vtype in ['list', 'tuple', 'dict', 'set', 'frozenset']:
-            itm = self.__generateItem(parent, dvar,
-                                      self.tr("{0} items").format(value),
-                                      dvtype, True)
-        elif vtype in ['unicode', 'str']:
-            if self.rx_nonprintable.indexIn(value) != -1:
-                sval = value
-            else:
-                try:
-                    sval = eval(value)
-                except Exception:
-                    sval = value
-            itm = self.__generateItem(parent, dvar, str(sval), dvtype)
+        Private slot to show the context menu.
         
+        @param coord the position of the mouse pointer
+        @type QPoint
+        """
+        gcoord = self.mapToGlobal(coord)
+        if self.indexAt(coord).isValid():
+            self.menu.popup(gcoord)
         else:
-            itm = self.__generateItem(parent, dvar, value, dvtype)
-            
-        return itm
-
-    def __getDispType(self, vtype):
+            self.backMenu.popup(gcoord)
+    
+    def __expandChildren(self):
+        """
+        Private slot to expand all child items of current parent.
         """
-        Private method used to get the display string for type vtype.
-        
-        @param vtype the type, the display string should be looked up for
-              (string)
-        @return displaystring (string)
+        index = self.currentIndex()
+        node = self.proxyModel.mapToSource(index).internalPointer()
+        for child in node.children:
+            if child.hasChildren:
+                row = node.children.index(child)
+                idx = self.varModel.createIndex(row, 0, child)
+                idx = self.proxyModel.mapFromSource(idx)
+                self.expand(idx)
+    
+    def __collapseChildren(self):
         """
-        try:
-            dvtype = self.tr(ConfigVarTypeDispStrings[vtype])
-        except KeyError:
-            if vtype == 'classobj':
-                dvtype = self.tr(ConfigVarTypeDispStrings['instance'])
-            else:
-                dvtype = vtype
-        return dvtype
+        Private slot to collapse all child items of current parent.
+        """
+        index = self.currentIndex()
+        node = self.proxyModel.mapToSource(index).internalPointer()
+        for child in node.children:
+            row = node.children.index(child)
+            idx = self.varModel.createIndex(row, 0, child)
+            idx = self.proxyModel.mapFromSource(idx)
+            if self.isExpanded(idx):
+                self.collapse(idx)
     
     def __refreshView(self):
         """
@@ -676,63 +1146,42 @@
         else:
             self.__debugViewer.setLocalsFilter()
     
-    def mouseDoubleClickEvent(self, mouseEvent):
-        """
-        Protected method of QAbstractItemView.
-        
-        Reimplemented to disable expanding/collapsing of items when
-        double-clicking. Instead the double-clicked entry is opened.
-        
-        @param mouseEvent the mouse event object (QMouseEvent)
-        """
-        itm = self.itemAt(mouseEvent.pos())
-        self.__showVariableDetails(itm)
-        
     def __showDetails(self):
         """
         Private slot to show details about the selected variable.
         """
-        itm = self.currentItem()
-        self.__showVariableDetails(itm)
-        
-    def __showVariableDetails(self, itm):
+        idx = self.currentIndex()
+        self.__showVariableDetails(idx)
+    
+    def __showVariableDetails(self, index):
         """
         Private method to show details about a variable.
         
-        @param itm reference to the variable item
+        @param index reference to the variable item
+        @type QModelIndex
         """
-        if itm is None:
-            return
-        
-        val = itm.getValue()
+        node = self.proxyModel.mapToSource(index).internalPointer()
         
-        if not val:
-            return  # do not display anything, if the variable has no value
-            
-        vtype = itm.text(2)
-        name = VariableItem.extractIndicators(itm.text(0).strip())[0]
+        val = node.value
+        vtype = node.type
+        name = node.name
         
-        par = itm.parent()
-        if name.startswith("["):    # numpy.ndarray, array.array
-            nlist = []
-        else:
-            nlist = [name]
+        par = node.parent
+        nlist = [name]
         
         # build up the fully qualified name
-        while par is not None:
-            pname, indicators = VariableItem.extractIndicators(
-                par.text(0).strip())
-            if indicators:
+        while par.parent is not None:
+            pname = par.name
+            if par.indicator:
                 if nlist[0].endswith("."):
                     nlist[0] = '[{0}].'.format(nlist[0][:-1])
                 else:
                     nlist[0] = '[{0}]'.format(nlist[0])
-                if not pname.startswith("["):   # numpy.ndarray, array.array
-                    nlist.insert(0, pname)
+                nlist.insert(0, pname)
             else:
-                if par.text(2) == "django.MultiValueDict":
+                if par.type == "django.MultiValueDict":
                     nlist[0] = 'getlist({0})'.format(nlist[0])
-                elif par.text(2) == "numpy.ndarray":
+                elif par.type == "numpy.ndarray":
                     if nlist and nlist[0][0].isalpha():
                         if nlist[0] in ["min", "max", "mean"]:
                             nlist[0] = ".{0}()".format(nlist[0])
@@ -741,106 +1190,26 @@
                     nlist.insert(0, pname)
                 else:
                     nlist.insert(0, '{0}.'.format(pname))
-            par = par.parent()
-            
+            par = par.parent
+        
         name = ''.join(nlist)
         # now show the dialog
         from .VariableDetailDialog import VariableDetailDialog
         dlg = VariableDetailDialog(name, vtype, val)
         dlg.exec_()
     
-    def __buildTreePath(self, itm):
-        """
-        Private method to build up a path from the top to an item.
-        
-        @param itm item to build the path for (QTreeWidgetItem)
-        @return list of names denoting the path from the top (list of strings)
-        """
-        name = itm.text(0)
-        pathlist = [name]
-        
-        par = itm.parent()
-        # build up a path from the top to the item
-        while par is not None:
-            pname = par.text(0)
-            pathlist.insert(0, pname)
-            par = par.parent()
-        
-        return pathlist[:]
-    
-    def __expandItemSignal(self, parentItem):
-        """
-        Private slot to handle the expanded signal.
-        
-        @param parentItem reference to the item being expanded
-            (QTreeWidgetItem)
-        """
-        self.expandItem(parentItem)
-        self.__scrollToItem = parentItem
-        
-    def expandItem(self, parentItem):
-        """
-        Public slot to handle the expanded signal.
-        
-        @param parentItem reference to the item being expanded
-            (QTreeWidgetItem)
-        """
-        pathlist = self.__buildTreePath(parentItem)
-        self.openItems.append(pathlist)
-        if parentItem.populated:
-            return
-        
-        try:
-            parentItem.expand()
-        except AttributeError:
-            super(VariablesViewer, self).expandItem(parentItem)
-
-    def collapseItem(self, parentItem):
-        """
-        Public slot to handle the collapsed signal.
-        
-        @param parentItem reference to the item being collapsed
-            (QTreeWidgetItem)
-        """
-        pathlist = self.__buildTreePath(parentItem)
-        self.openItems.remove(pathlist)
-        
-        try:
-            parentItem.collapse()
-        except AttributeError:
-            super(VariablesViewer, self).collapseItem(parentItem)
-    
-    def __sectionClicked(self):
-        """
-        Private method handling a click onto a header section.
-        """
-        self.__resort()
-    
-    def __resort(self, parent=None):
-        """
-        Private method to resort the tree.
-        
-        @param parent reference to a parent item
-        @type QTreeWidgetItem
-        """
-        if self.resortEnabled:
-            if parent is not None:
-                parent.sortChildren(self.sortColumn(),
-                                    self.header().sortIndicatorOrder())
-            else:
-                self.sortItems(self.sortColumn(),
-                               self.header().sortIndicatorOrder())
-    
-    def handleResetUI(self):
-        """
-        Public method to reset the VariablesViewer.
-        """
-        self.clear()
-        self.openItems = []
-    
     def __configure(self):
         """
         Private method to open the configuration dialog.
         """
         e5App().getObject("UserInterface")\
             .showPreferences("debuggerGeneralPage")
+    
+    def __configureFilter(self):
+        """
+        Private method to open the variables filter dialog.
+        """
+        e5App().getObject("DebugUI").dbgFilterAct.triggered.emit()
+
+#
+# eflag: noqa = M822
--- a/eric6/Debugger/WatchPointModel.py	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Debugger/WatchPointModel.py	Sun Jun 02 11:42:48 2019 +0200
@@ -243,9 +243,10 @@
                 rows.append(index.row())
         rows.sort(reverse=True)
         for row in rows:
-            self.beginRemoveRows(QModelIndex(), row, row)
-            del self.watchpoints[row]
-            self.endRemoveRows()
+            if row < len(self.breakpoints):
+                self.beginRemoveRows(QModelIndex(), row, row)
+                del self.watchpoints[row]
+                self.endRemoveRows()
 
     def deleteAll(self):
         """
Binary file eric6/Documentation/Help/source.qch has changed
--- a/eric6/Documentation/Help/source.qhp	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Documentation/Help/source.qhp	Sun Jun 02 11:42:48 2019 +0200
@@ -622,6 +622,11 @@
                 <section title="eric6.Plugins.VcsPlugins.vcsGit.git" ref="eric6.Plugins.VcsPlugins.vcsGit.git.html" />
               </section>
               <section title="eric6.Plugins.VcsPlugins.vcsMercurial" ref="index-eric6.Plugins.VcsPlugins.vcsMercurial.html">
+                <section title="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension" ref="index-eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.html">
+                  <section title="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.HgCloseHeadSelectionDialog" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.HgCloseHeadSelectionDialog.html" />
+                  <section title="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper.html" />
+                  <section title="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.closehead" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.closehead.html" />
+                </section>
                 <section title="eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage" ref="index-eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage.html">
                   <section title="eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage.MercurialPage" ref="eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage.MercurialPage.html" />
                 </section>
@@ -2087,9 +2092,6 @@
       <keyword name="ArgumentsError (Constructor)" id="ArgumentsError (Constructor)" ref="eric6.E5Gui.E5Action.html#ArgumentsError.__init__" />
       <keyword name="ArgumentsError.__repr__" id="ArgumentsError.__repr__" ref="eric6.E5Gui.E5Action.html#ArgumentsError.__repr__" />
       <keyword name="ArgumentsError.__str__" id="ArgumentsError.__str__" ref="eric6.E5Gui.E5Action.html#ArgumentsError.__str__" />
-      <keyword name="ArrayElementVarItem" id="ArrayElementVarItem" ref="eric6.Debugger.VariablesViewer.html#ArrayElementVarItem" />
-      <keyword name="ArrayElementVarItem (Constructor)" id="ArrayElementVarItem (Constructor)" ref="eric6.Debugger.VariablesViewer.html#ArrayElementVarItem.__init__" />
-      <keyword name="ArrayItemsContainer" id="ArrayItemsContainer" ref="eric6.DebugClients.Python.DebugVariables.html#ArrayItemsContainer" />
       <keyword name="ArrayResolver" id="ArrayResolver" ref="eric6.DebugClients.Python.DebugVariables.html#ArrayResolver" />
       <keyword name="ArrayResolver.getDictionary" id="ArrayResolver.getDictionary" ref="eric6.DebugClients.Python.DebugVariables.html#ArrayResolver.getDictionary" />
       <keyword name="ArrayResolver.resolve" id="ArrayResolver.resolve" ref="eric6.DebugClients.Python.DebugVariables.html#ArrayResolver.resolve" />
@@ -2779,10 +2781,12 @@
       <keyword name="BugBearVisitor.__checkForM502" id="BugBearVisitor.__checkForM502" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html#BugBearVisitor.__checkForM502" />
       <keyword name="BugBearVisitor.__checkForM507" id="BugBearVisitor.__checkForM507" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html#BugBearVisitor.__checkForM507" />
       <keyword name="BugBearVisitor.visit" id="BugBearVisitor.visit" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html#BugBearVisitor.visit" />
+      <keyword name="BugBearVisitor.visit_Assert" id="BugBearVisitor.visit_Assert" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html#BugBearVisitor.visit_Assert" />
       <keyword name="BugBearVisitor.visit_Assign" id="BugBearVisitor.visit_Assign" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html#BugBearVisitor.visit_Assign" />
       <keyword name="BugBearVisitor.visit_Attribute" id="BugBearVisitor.visit_Attribute" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html#BugBearVisitor.visit_Attribute" />
       <keyword name="BugBearVisitor.visit_Call" id="BugBearVisitor.visit_Call" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html#BugBearVisitor.visit_Call" />
       <keyword name="BugBearVisitor.visit_For" id="BugBearVisitor.visit_For" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html#BugBearVisitor.visit_For" />
+      <keyword name="BugBearVisitor.visit_JoinedStr" id="BugBearVisitor.visit_JoinedStr" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html#BugBearVisitor.visit_JoinedStr" />
       <keyword name="BugBearVisitor.visit_UAdd" id="BugBearVisitor.visit_UAdd" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html#BugBearVisitor.visit_UAdd" />
       <keyword name="CallStackViewer" id="CallStackViewer" ref="eric6.Debugger.CallStackViewer.html#CallStackViewer" />
       <keyword name="CallStackViewer (Constructor)" id="CallStackViewer (Constructor)" ref="eric6.Debugger.CallStackViewer.html#CallStackViewer.__init__" />
@@ -3004,6 +3008,16 @@
       <keyword name="ClosedTabsManager.isClosedTabAvailable" id="ClosedTabsManager.isClosedTabAvailable" ref="eric6.WebBrowser.ClosedTabsManager.html#ClosedTabsManager.isClosedTabAvailable" />
       <keyword name="ClosedTabsManager.recordBrowser" id="ClosedTabsManager.recordBrowser" ref="eric6.Helpviewer.ClosedTabsManager.html#ClosedTabsManager.recordBrowser" />
       <keyword name="ClosedTabsManager.recordBrowser" id="ClosedTabsManager.recordBrowser" ref="eric6.WebBrowser.ClosedTabsManager.html#ClosedTabsManager.recordBrowser" />
+      <keyword name="Closehead" id="Closehead" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.closehead.html#Closehead" />
+      <keyword name="Closehead (Constructor)" id="Closehead (Constructor)" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.closehead.html#Closehead.__init__" />
+      <keyword name="Closehead.hgCloseheads" id="Closehead.hgCloseheads" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.closehead.html#Closehead.hgCloseheads" />
+      <keyword name="CloseheadExtension (Package)" id="CloseheadExtension (Package)" ref="index-eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.html" />
+      <keyword name="CloseheadProjectHelper" id="CloseheadProjectHelper" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper.html#CloseheadProjectHelper" />
+      <keyword name="CloseheadProjectHelper (Constructor)" id="CloseheadProjectHelper (Constructor)" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper.html#CloseheadProjectHelper.__init__" />
+      <keyword name="CloseheadProjectHelper.__hgClosehead" id="CloseheadProjectHelper.__hgClosehead" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper.html#CloseheadProjectHelper.__hgClosehead" />
+      <keyword name="CloseheadProjectHelper.initActions" id="CloseheadProjectHelper.initActions" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper.html#CloseheadProjectHelper.initActions" />
+      <keyword name="CloseheadProjectHelper.initMenu" id="CloseheadProjectHelper.initMenu" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper.html#CloseheadProjectHelper.initMenu" />
+      <keyword name="CloseheadProjectHelper.menuTitle" id="CloseheadProjectHelper.menuTitle" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper.html#CloseheadProjectHelper.menuTitle" />
       <keyword name="CodeDocumentationViewer" id="CodeDocumentationViewer" ref="eric6.UI.CodeDocumentationViewer.html#CodeDocumentationViewer" />
       <keyword name="CodeDocumentationViewer (Constructor)" id="CodeDocumentationViewer (Constructor)" ref="eric6.UI.CodeDocumentationViewer.html#CodeDocumentationViewer.__init__" />
       <keyword name="CodeDocumentationViewer (Module)" id="CodeDocumentationViewer (Module)" ref="eric6.UI.CodeDocumentationViewer.html" />
@@ -3981,10 +3995,10 @@
       <keyword name="DebugViewer.currentWidget" id="DebugViewer.currentWidget" ref="eric6.Debugger.DebugViewer.html#DebugViewer.currentWidget" />
       <keyword name="DebugViewer.handleClientStack" id="DebugViewer.handleClientStack" ref="eric6.Debugger.DebugViewer.html#DebugViewer.handleClientStack" />
       <keyword name="DebugViewer.handleDebuggingStarted" id="DebugViewer.handleDebuggingStarted" ref="eric6.Debugger.DebugViewer.html#DebugViewer.handleDebuggingStarted" />
+      <keyword name="DebugViewer.handlePreferencesChanged" id="DebugViewer.handlePreferencesChanged" ref="eric6.Debugger.DebugViewer.html#DebugViewer.handlePreferencesChanged" />
       <keyword name="DebugViewer.handleResetUI" id="DebugViewer.handleResetUI" ref="eric6.Debugger.DebugViewer.html#DebugViewer.handleResetUI" />
       <keyword name="DebugViewer.initCallStackViewer" id="DebugViewer.initCallStackViewer" ref="eric6.Debugger.DebugViewer.html#DebugViewer.initCallStackViewer" />
       <keyword name="DebugViewer.isCallTraceEnabled" id="DebugViewer.isCallTraceEnabled" ref="eric6.Debugger.DebugViewer.html#DebugViewer.isCallTraceEnabled" />
-      <keyword name="DebugViewer.preferencesChanged" id="DebugViewer.preferencesChanged" ref="eric6.Debugger.DebugViewer.html#DebugViewer.preferencesChanged" />
       <keyword name="DebugViewer.setCallTraceToProjectMode" id="DebugViewer.setCallTraceToProjectMode" ref="eric6.Debugger.DebugViewer.html#DebugViewer.setCallTraceToProjectMode" />
       <keyword name="DebugViewer.setCurrentWidget" id="DebugViewer.setCurrentWidget" ref="eric6.Debugger.DebugViewer.html#DebugViewer.setCurrentWidget" />
       <keyword name="DebugViewer.setDebugger" id="DebugViewer.setDebugger" ref="eric6.Debugger.DebugViewer.html#DebugViewer.setDebugger" />
@@ -4137,7 +4151,6 @@
       <keyword name="DeepLEngine.supportedLanguages" id="DeepLEngine.supportedLanguages" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.DeepLEngine.html#DeepLEngine.supportedLanguages" />
       <keyword name="DefaultResolver" id="DefaultResolver" ref="eric6.DebugClients.Python.DebugVariables.html#DefaultResolver" />
       <keyword name="DefaultResolver.getDictionary" id="DefaultResolver.getDictionary" ref="eric6.DebugClients.Python.DebugVariables.html#DefaultResolver.getDictionary" />
-      <keyword name="DefaultResolver.resolve" id="DefaultResolver.resolve" ref="eric6.DebugClients.Python.DebugVariables.html#DefaultResolver.resolve" />
       <keyword name="DefaultSearchEngines (Package)" id="DefaultSearchEngines (Package)" ref="index-eric6.Helpviewer.OpenSearch.DefaultSearchEngines.html" />
       <keyword name="DefaultSearchEngines (Package)" id="DefaultSearchEngines (Package)" ref="index-eric6.WebBrowser.OpenSearch.DefaultSearchEngines.html" />
       <keyword name="DelayedFileWatcher" id="DelayedFileWatcher" ref="eric6.WebBrowser.Tools.DelayedFileWatcher.html#DelayedFileWatcher" />
@@ -4155,6 +4168,9 @@
       <keyword name="DictResolver.getDictionary" id="DictResolver.getDictionary" ref="eric6.DebugClients.Python.DebugVariables.html#DictResolver.getDictionary" />
       <keyword name="DictResolver.keyToStr" id="DictResolver.keyToStr" ref="eric6.DebugClients.Python.DebugVariables.html#DictResolver.keyToStr" />
       <keyword name="DictResolver.resolve" id="DictResolver.resolve" ref="eric6.DebugClients.Python.DebugVariables.html#DictResolver.resolve" />
+      <keyword name="DictViewResolver" id="DictViewResolver" ref="eric6.DebugClients.Python.DebugVariables.html#DictViewResolver" />
+      <keyword name="DictViewResolver.getDictionary" id="DictViewResolver.getDictionary" ref="eric6.DebugClients.Python.DebugVariables.html#DictViewResolver.getDictionary" />
+      <keyword name="DictViewResolver.resolve" id="DictViewResolver.resolve" ref="eric6.DebugClients.Python.DebugVariables.html#DictViewResolver.resolve" />
       <keyword name="DiffColoursPage" id="DiffColoursPage" ref="eric6.Preferences.ConfigurationPages.DiffColoursPage.html#DiffColoursPage" />
       <keyword name="DiffColoursPage (Constructor)" id="DiffColoursPage (Constructor)" ref="eric6.Preferences.ConfigurationPages.DiffColoursPage.html#DiffColoursPage.__init__" />
       <keyword name="DiffColoursPage (Module)" id="DiffColoursPage (Module)" ref="eric6.Preferences.ConfigurationPages.DiffColoursPage.html" />
@@ -8852,6 +8868,12 @@
       <keyword name="HgClientPromptDialog.isPassword" id="HgClientPromptDialog.isPassword" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgClientPromptDialog.html#HgClientPromptDialog.isPassword" />
       <keyword name="HgClientPromptDialog.on_inputEdit_textChanged" id="HgClientPromptDialog.on_inputEdit_textChanged" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgClientPromptDialog.html#HgClientPromptDialog.on_inputEdit_textChanged" />
       <keyword name="HgClientPromptDialog.on_passwordCheckBox_toggled" id="HgClientPromptDialog.on_passwordCheckBox_toggled" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgClientPromptDialog.html#HgClientPromptDialog.on_passwordCheckBox_toggled" />
+      <keyword name="HgCloseHeadSelectionDialog" id="HgCloseHeadSelectionDialog" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.HgCloseHeadSelectionDialog.html#HgCloseHeadSelectionDialog" />
+      <keyword name="HgCloseHeadSelectionDialog (Constructor)" id="HgCloseHeadSelectionDialog (Constructor)" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.HgCloseHeadSelectionDialog.html#HgCloseHeadSelectionDialog.__init__" />
+      <keyword name="HgCloseHeadSelectionDialog (Module)" id="HgCloseHeadSelectionDialog (Module)" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.HgCloseHeadSelectionDialog.html" />
+      <keyword name="HgCloseHeadSelectionDialog.__getHeads" id="HgCloseHeadSelectionDialog.__getHeads" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.HgCloseHeadSelectionDialog.html#HgCloseHeadSelectionDialog.__getHeads" />
+      <keyword name="HgCloseHeadSelectionDialog.getData" id="HgCloseHeadSelectionDialog.getData" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.HgCloseHeadSelectionDialog.html#HgCloseHeadSelectionDialog.getData" />
+      <keyword name="HgCloseHeadSelectionDialog.on_headsList_itemSelectionChanged" id="HgCloseHeadSelectionDialog.on_headsList_itemSelectionChanged" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.HgCloseHeadSelectionDialog.html#HgCloseHeadSelectionDialog.on_headsList_itemSelectionChanged" />
       <keyword name="HgCommandDialog" id="HgCommandDialog" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgCommandDialog.html#HgCommandDialog" />
       <keyword name="HgCommandDialog (Constructor)" id="HgCommandDialog (Constructor)" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgCommandDialog.html#HgCommandDialog.__init__" />
       <keyword name="HgCommandDialog (Module)" id="HgCommandDialog (Module)" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgCommandDialog.html" />
@@ -9083,6 +9105,7 @@
       <keyword name="HgLogBrowserDialog.__bookmarkMoveActTriggered" id="HgLogBrowserDialog.__bookmarkMoveActTriggered" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.html#HgLogBrowserDialog.__bookmarkMoveActTriggered" />
       <keyword name="HgLogBrowserDialog.__branchColor" id="HgLogBrowserDialog.__branchColor" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.html#HgLogBrowserDialog.__branchColor" />
       <keyword name="HgLogBrowserDialog.__bundleActTriggered" id="HgLogBrowserDialog.__bundleActTriggered" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.html#HgLogBrowserDialog.__bundleActTriggered" />
+      <keyword name="HgLogBrowserDialog.__closeHeadsActTriggered" id="HgLogBrowserDialog.__closeHeadsActTriggered" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.html#HgLogBrowserDialog.__closeHeadsActTriggered" />
       <keyword name="HgLogBrowserDialog.__fetchActTriggered" id="HgLogBrowserDialog.__fetchActTriggered" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.html#HgLogBrowserDialog.__fetchActTriggered" />
       <keyword name="HgLogBrowserDialog.__filterLogs" id="HgLogBrowserDialog.__filterLogs" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.html#HgLogBrowserDialog.__filterLogs" />
       <keyword name="HgLogBrowserDialog.__findItem" id="HgLogBrowserDialog.__findItem" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.html#HgLogBrowserDialog.__findItem" />
@@ -9095,6 +9118,7 @@
       <keyword name="HgLogBrowserDialog.__generatorFinished" id="HgLogBrowserDialog.__generatorFinished" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.html#HgLogBrowserDialog.__generatorFinished" />
       <keyword name="HgLogBrowserDialog.__getClosedBranches" id="HgLogBrowserDialog.__getClosedBranches" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.html#HgLogBrowserDialog.__getClosedBranches" />
       <keyword name="HgLogBrowserDialog.__getColor" id="HgLogBrowserDialog.__getColor" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.html#HgLogBrowserDialog.__getColor" />
+      <keyword name="HgLogBrowserDialog.__getHeads" id="HgLogBrowserDialog.__getHeads" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.html#HgLogBrowserDialog.__getHeads" />
       <keyword name="HgLogBrowserDialog.__getLogEntries" id="HgLogBrowserDialog.__getLogEntries" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.html#HgLogBrowserDialog.__getLogEntries" />
       <keyword name="HgLogBrowserDialog.__getParents" id="HgLogBrowserDialog.__getParents" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.html#HgLogBrowserDialog.__getParents" />
       <keyword name="HgLogBrowserDialog.__getRevisionOfTag" id="HgLogBrowserDialog.__getRevisionOfTag" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.html#HgLogBrowserDialog.__getRevisionOfTag" />
@@ -9599,6 +9623,7 @@
       <keyword name="HgTagBranchListDialog (Constructor)" id="HgTagBranchListDialog (Constructor)" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgTagBranchListDialog.html#HgTagBranchListDialog.__init__" />
       <keyword name="HgTagBranchListDialog (Module)" id="HgTagBranchListDialog (Module)" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgTagBranchListDialog.html" />
       <keyword name="HgTagBranchListDialog.__closeBranch" id="HgTagBranchListDialog.__closeBranch" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgTagBranchListDialog.html#HgTagBranchListDialog.__closeBranch" />
+      <keyword name="HgTagBranchListDialog.__closeBranchHeads" id="HgTagBranchListDialog.__closeBranchHeads" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgTagBranchListDialog.html#HgTagBranchListDialog.__closeBranchHeads" />
       <keyword name="HgTagBranchListDialog.__finish" id="HgTagBranchListDialog.__finish" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgTagBranchListDialog.html#HgTagBranchListDialog.__finish" />
       <keyword name="HgTagBranchListDialog.__generateItem" id="HgTagBranchListDialog.__generateItem" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgTagBranchListDialog.html#HgTagBranchListDialog.__generateItem" />
       <keyword name="HgTagBranchListDialog.__highlightCurrentBranch" id="HgTagBranchListDialog.__highlightCurrentBranch" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgTagBranchListDialog.html#HgTagBranchListDialog.__highlightCurrentBranch" />
@@ -10321,6 +10346,7 @@
       <keyword name="InterfacePage (Constructor)" id="InterfacePage (Constructor)" ref="eric6.Preferences.ConfigurationPages.InterfacePage.html#InterfacePage.__init__" />
       <keyword name="InterfacePage (Module)" id="InterfacePage (Module)" ref="eric6.Preferences.ConfigurationPages.InterfacePage.html" />
       <keyword name="InterfacePage.__populateLanguageCombo" id="InterfacePage.__populateLanguageCombo" ref="eric6.Preferences.ConfigurationPages.InterfacePage.html#InterfacePage.__populateLanguageCombo" />
+      <keyword name="InterfacePage.__populateShellPositionCombo" id="InterfacePage.__populateShellPositionCombo" ref="eric6.Preferences.ConfigurationPages.InterfacePage.html#InterfacePage.__populateShellPositionCombo" />
       <keyword name="InterfacePage.__populateStyleCombo" id="InterfacePage.__populateStyleCombo" ref="eric6.Preferences.ConfigurationPages.InterfacePage.html#InterfacePage.__populateStyleCombo" />
       <keyword name="InterfacePage.on_resetLayoutButton_clicked" id="InterfacePage.on_resetLayoutButton_clicked" ref="eric6.Preferences.ConfigurationPages.InterfacePage.html#InterfacePage.on_resetLayoutButton_clicked" />
       <keyword name="InterfacePage.save" id="InterfacePage.save" ref="eric6.Preferences.ConfigurationPages.InterfacePage.html#InterfacePage.save" />
@@ -11640,7 +11666,6 @@
       <keyword name="NavigationContainer (Constructor)" id="NavigationContainer (Constructor)" ref="eric6.WebBrowser.Navigation.NavigationContainer.html#NavigationContainer.__init__" />
       <keyword name="NavigationContainer (Module)" id="NavigationContainer (Module)" ref="eric6.WebBrowser.Navigation.NavigationContainer.html" />
       <keyword name="NavigationContainer.addWidget" id="NavigationContainer.addWidget" ref="eric6.WebBrowser.Navigation.NavigationContainer.html#NavigationContainer.addWidget" />
-      <keyword name="NdArrayItemsContainer" id="NdArrayItemsContainer" ref="eric6.DebugClients.Python.DebugVariables.html#NdArrayItemsContainer" />
       <keyword name="NdArrayResolver" id="NdArrayResolver" ref="eric6.DebugClients.Python.DebugVariables.html#NdArrayResolver" />
       <keyword name="NdArrayResolver.__isNumeric" id="NdArrayResolver.__isNumeric" ref="eric6.DebugClients.Python.DebugVariables.html#NdArrayResolver.__isNumeric" />
       <keyword name="NdArrayResolver.getDictionary" id="NdArrayResolver.getDictionary" ref="eric6.DebugClients.Python.DebugVariables.html#NdArrayResolver.getDictionary" />
@@ -12749,6 +12774,15 @@
       <keyword name="Prefs" id="Prefs" ref="eric6.Preferences.__init__.html#Prefs" />
       <keyword name="Prefs.initWebEngineSettingsDefaults" id="Prefs.initWebEngineSettingsDefaults" ref="eric6.Preferences.__init__.html#Prefs.initWebEngineSettingsDefaults" />
       <keyword name="Prefs.initWebSettingsDefaults" id="Prefs.initWebSettingsDefaults" ref="eric6.Preferences.__init__.html#Prefs.initWebSettingsDefaults" />
+      <keyword name="PreviewModel" id="PreviewModel" ref="eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.html#PreviewModel" />
+      <keyword name="PreviewModel (Constructor)" id="PreviewModel (Constructor)" ref="eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.html#PreviewModel.__init__" />
+      <keyword name="PreviewModel.columnCount" id="PreviewModel.columnCount" ref="eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.html#PreviewModel.columnCount" />
+      <keyword name="PreviewModel.data" id="PreviewModel.data" ref="eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.html#PreviewModel.data" />
+      <keyword name="PreviewModel.flags" id="PreviewModel.flags" ref="eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.html#PreviewModel.flags" />
+      <keyword name="PreviewModel.index" id="PreviewModel.index" ref="eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.html#PreviewModel.index" />
+      <keyword name="PreviewModel.parent" id="PreviewModel.parent" ref="eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.html#PreviewModel.parent" />
+      <keyword name="PreviewModel.rowCount" id="PreviewModel.rowCount" ref="eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.html#PreviewModel.rowCount" />
+      <keyword name="PreviewModel.setColor" id="PreviewModel.setColor" ref="eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.html#PreviewModel.setColor" />
       <keyword name="PreviewProcessingThread" id="PreviewProcessingThread" ref="eric6.UI.Previewers.PreviewerHTML.html#PreviewProcessingThread" />
       <keyword name="PreviewProcessingThread (Constructor)" id="PreviewProcessingThread (Constructor)" ref="eric6.UI.Previewers.PreviewerHTML.html#PreviewProcessingThread.__init__" />
       <keyword name="PreviewProcessingThread.__convertMarkdown" id="PreviewProcessingThread.__convertMarkdown" ref="eric6.UI.Previewers.PreviewerHTML.html#PreviewProcessingThread.__convertMarkdown" />
@@ -12969,7 +13003,7 @@
       <keyword name="Project.hasProjectType" id="Project.hasProjectType" ref="eric6.Project.Project.html#Project.hasProjectType" />
       <keyword name="Project.initActions" id="Project.initActions" ref="eric6.Project.Project.html#Project.initActions" />
       <keyword name="Project.initFileTypes" id="Project.initFileTypes" ref="eric6.Project.Project.html#Project.initFileTypes" />
-      <keyword name="Project.initMenu" id="Project.initMenu" ref="eric6.Project.Project.html#Project.initMenu" />
+      <keyword name="Project.initMenus" id="Project.initMenus" ref="eric6.Project.Project.html#Project.initMenus" />
       <keyword name="Project.initToolbars" id="Project.initToolbars" ref="eric6.Project.Project.html#Project.initToolbars" />
       <keyword name="Project.initVCS" id="Project.initVCS" ref="eric6.Project.Project.html#Project.initVCS" />
       <keyword name="Project.isDebugPropertiesLoaded" id="Project.isDebugPropertiesLoaded" ref="eric6.Project.Project.html#Project.isDebugPropertiesLoaded" />
@@ -13185,6 +13219,7 @@
       <keyword name="ProjectFormsBrowser.getUiCompiler" id="ProjectFormsBrowser.getUiCompiler" ref="eric6.Project.ProjectFormsBrowser.html#ProjectFormsBrowser.getUiCompiler" />
       <keyword name="ProjectFormsBrowser.handlePreferencesChanged" id="ProjectFormsBrowser.handlePreferencesChanged" ref="eric6.Project.ProjectFormsBrowser.html#ProjectFormsBrowser.handlePreferencesChanged" />
       <keyword name="ProjectHelper (Module)" id="ProjectHelper (Module)" ref="eric6.Plugins.VcsPlugins.vcsGit.ProjectHelper.html" />
+      <keyword name="ProjectHelper (Module)" id="ProjectHelper (Module)" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper.html" />
       <keyword name="ProjectHelper (Module)" id="ProjectHelper (Module)" ref="eric6.Plugins.VcsPlugins.vcsMercurial.FetchExtension.ProjectHelper.html" />
       <keyword name="ProjectHelper (Module)" id="ProjectHelper (Module)" ref="eric6.Plugins.VcsPlugins.vcsMercurial.GpgExtension.ProjectHelper.html" />
       <keyword name="ProjectHelper (Module)" id="ProjectHelper (Module)" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HisteditExtension.ProjectHelper.html" />
@@ -14508,10 +14543,12 @@
       <keyword name="SetupWizardDialog (Module)" id="SetupWizardDialog (Module)" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html" />
       <keyword name="SetupWizardDialog.__addClassifierEntry" id="SetupWizardDialog.__addClassifierEntry" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html#SetupWizardDialog.__addClassifierEntry" />
       <keyword name="SetupWizardDialog.__addPackage" id="SetupWizardDialog.__addPackage" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html#SetupWizardDialog.__addPackage" />
+      <keyword name="SetupWizardDialog.__classifiersDownloadDone" id="SetupWizardDialog.__classifiersDownloadDone" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html#SetupWizardDialog.__classifiersDownloadDone" />
       <keyword name="SetupWizardDialog.__enableOkButton" id="SetupWizardDialog.__enableOkButton" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html#SetupWizardDialog.__enableOkButton" />
       <keyword name="SetupWizardDialog.__getLicenseText" id="SetupWizardDialog.__getLicenseText" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html#SetupWizardDialog.__getLicenseText" />
       <keyword name="SetupWizardDialog.__getStartDir" id="SetupWizardDialog.__getStartDir" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html#SetupWizardDialog.__getStartDir" />
-      <keyword name="SetupWizardDialog.__populateFromTroveLists" id="SetupWizardDialog.__populateFromTroveLists" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html#SetupWizardDialog.__populateFromTroveLists" />
+      <keyword name="SetupWizardDialog.__loadClassifiersFromPyPI" id="SetupWizardDialog.__loadClassifiersFromPyPI" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html#SetupWizardDialog.__loadClassifiersFromPyPI" />
+      <keyword name="SetupWizardDialog.__populateClassifiers" id="SetupWizardDialog.__populateClassifiers" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html#SetupWizardDialog.__populateClassifiers" />
       <keyword name="SetupWizardDialog.getCode" id="SetupWizardDialog.getCode" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html#SetupWizardDialog.getCode" />
       <keyword name="SetupWizardDialog.on_addExludePatternButton_clicked" id="SetupWizardDialog.on_addExludePatternButton_clicked" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html#SetupWizardDialog.on_addExludePatternButton_clicked" />
       <keyword name="SetupWizardDialog.on_addModuleButton_clicked" id="SetupWizardDialog.on_addModuleButton_clicked" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html#SetupWizardDialog.on_addModuleButton_clicked" />
@@ -14525,6 +14562,7 @@
       <keyword name="SetupWizardDialog.on_excludePatternEdit_returnPressed" id="SetupWizardDialog.on_excludePatternEdit_returnPressed" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html#SetupWizardDialog.on_excludePatternEdit_returnPressed" />
       <keyword name="SetupWizardDialog.on_excludePatternEdit_textChanged" id="SetupWizardDialog.on_excludePatternEdit_textChanged" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html#SetupWizardDialog.on_excludePatternEdit_textChanged" />
       <keyword name="SetupWizardDialog.on_excludePatternList_itemSelectionChanged" id="SetupWizardDialog.on_excludePatternList_itemSelectionChanged" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html#SetupWizardDialog.on_excludePatternList_itemSelectionChanged" />
+      <keyword name="SetupWizardDialog.on_localClassifiersButton_clicked" id="SetupWizardDialog.on_localClassifiersButton_clicked" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html#SetupWizardDialog.on_localClassifiersButton_clicked" />
       <keyword name="SetupWizardDialog.on_modulesList_itemSelectionChanged" id="SetupWizardDialog.on_modulesList_itemSelectionChanged" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html#SetupWizardDialog.on_modulesList_itemSelectionChanged" />
       <keyword name="SetupWizardDialog.on_packageDirButton_clicked" id="SetupWizardDialog.on_packageDirButton_clicked" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html#SetupWizardDialog.on_packageDirButton_clicked" />
       <keyword name="SetupWizardDialog.on_packageEdit_returnPressed" id="SetupWizardDialog.on_packageEdit_returnPressed" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html#SetupWizardDialog.on_packageEdit_returnPressed" />
@@ -14930,11 +14968,6 @@
       <keyword name="SourceStat.inc" id="SourceStat.inc" ref="eric6.DataViews.CodeMetrics.html#SourceStat.inc" />
       <keyword name="SourceStat.indent" id="SourceStat.indent" ref="eric6.DataViews.CodeMetrics.html#SourceStat.indent" />
       <keyword name="SourceStat.push" id="SourceStat.push" ref="eric6.DataViews.CodeMetrics.html#SourceStat.push" />
-      <keyword name="SpecialArrayElementVarItem" id="SpecialArrayElementVarItem" ref="eric6.Debugger.VariablesViewer.html#SpecialArrayElementVarItem" />
-      <keyword name="SpecialArrayElementVarItem (Constructor)" id="SpecialArrayElementVarItem (Constructor)" ref="eric6.Debugger.VariablesViewer.html#SpecialArrayElementVarItem.__init__" />
-      <keyword name="SpecialVarItem" id="SpecialVarItem" ref="eric6.Debugger.VariablesViewer.html#SpecialVarItem" />
-      <keyword name="SpecialVarItem (Constructor)" id="SpecialVarItem (Constructor)" ref="eric6.Debugger.VariablesViewer.html#SpecialVarItem.__init__" />
-      <keyword name="SpecialVarItem.expand" id="SpecialVarItem.expand" ref="eric6.Debugger.VariablesViewer.html#SpecialVarItem.expand" />
       <keyword name="SpeedDial" id="SpeedDial" ref="eric6.Helpviewer.SpeedDial.SpeedDial.html#SpeedDial" />
       <keyword name="SpeedDial" id="SpeedDial" ref="eric6.WebBrowser.SpeedDial.SpeedDial.html#SpeedDial" />
       <keyword name="SpeedDial (Constructor)" id="SpeedDial (Constructor)" ref="eric6.Helpviewer.SpeedDial.SpeedDial.html#SpeedDial.__init__" />
@@ -17397,6 +17430,7 @@
       <keyword name="UserInterface.handleUrl" id="UserInterface.handleUrl" ref="eric6.UI.UserInterface.html#UserInterface.handleUrl" />
       <keyword name="UserInterface.isOnline" id="UserInterface.isOnline" ref="eric6.UI.UserInterface.html#UserInterface.isOnline" />
       <keyword name="UserInterface.launchHelpViewer" id="UserInterface.launchHelpViewer" ref="eric6.UI.UserInterface.html#UserInterface.launchHelpViewer" />
+      <keyword name="UserInterface.networkAccessManager" id="UserInterface.networkAccessManager" ref="eric6.UI.UserInterface.html#UserInterface.networkAccessManager" />
       <keyword name="UserInterface.notificationsEnabled" id="UserInterface.notificationsEnabled" ref="eric6.UI.UserInterface.html#UserInterface.notificationsEnabled" />
       <keyword name="UserInterface.performVersionCheck" id="UserInterface.performVersionCheck" ref="eric6.UI.UserInterface.html#UserInterface.performVersionCheck" />
       <keyword name="UserInterface.processArgs" id="UserInterface.processArgs" ref="eric6.UI.UserInterface.html#UserInterface.processArgs" />
@@ -17438,45 +17472,60 @@
       <keyword name="VariableDetailDialog (Module)" id="VariableDetailDialog (Module)" ref="eric6.Debugger.VariableDetailDialog.html" />
       <keyword name="VariableItem" id="VariableItem" ref="eric6.Debugger.VariablesViewer.html#VariableItem" />
       <keyword name="VariableItem (Constructor)" id="VariableItem (Constructor)" ref="eric6.Debugger.VariablesViewer.html#VariableItem.__init__" />
-      <keyword name="VariableItem._buildKey" id="VariableItem._buildKey" ref="eric6.Debugger.VariablesViewer.html#VariableItem._buildKey" />
-      <keyword name="VariableItem.attachDummy" id="VariableItem.attachDummy" ref="eric6.Debugger.VariablesViewer.html#VariableItem.attachDummy" />
-      <keyword name="VariableItem.collapse" id="VariableItem.collapse" ref="eric6.Debugger.VariablesViewer.html#VariableItem.collapse" />
-      <keyword name="VariableItem.data" id="VariableItem.data" ref="eric6.Debugger.VariablesViewer.html#VariableItem.data" />
-      <keyword name="VariableItem.deleteChildren" id="VariableItem.deleteChildren" ref="eric6.Debugger.VariablesViewer.html#VariableItem.deleteChildren" />
-      <keyword name="VariableItem.expand" id="VariableItem.expand" ref="eric6.Debugger.VariablesViewer.html#VariableItem.expand" />
-      <keyword name="VariableItem.extractId" id="VariableItem.extractId" ref="eric6.Debugger.VariablesViewer.html#VariableItem.extractId" />
-      <keyword name="VariableItem.extractIndicators" id="VariableItem.extractIndicators" ref="eric6.Debugger.VariablesViewer.html#VariableItem.extractIndicators" />
-      <keyword name="VariableItem.getId" id="VariableItem.getId" ref="eric6.Debugger.VariablesViewer.html#VariableItem.getId" />
-      <keyword name="VariableItem.getValue" id="VariableItem.getValue" ref="eric6.Debugger.VariablesViewer.html#VariableItem.getValue" />
+      <keyword name="VariableItem.__getName" id="VariableItem.__getName" ref="eric6.Debugger.VariablesViewer.html#VariableItem.__getName" />
+      <keyword name="VariableItem.__getType" id="VariableItem.__getType" ref="eric6.Debugger.VariablesViewer.html#VariableItem.__getType" />
+      <keyword name="VariableItem.__getValue" id="VariableItem.__getValue" ref="eric6.Debugger.VariablesViewer.html#VariableItem.__getValue" />
+      <keyword name="VariableItem.absolutCount" id="VariableItem.absolutCount" ref="eric6.Debugger.VariablesViewer.html#VariableItem.absolutCount" />
+      <keyword name="VariableItem.populated" id="VariableItem.populated" ref="eric6.Debugger.VariablesViewer.html#VariableItem.populated" />
       <keyword name="VariablesFilterDialog" id="VariablesFilterDialog" ref="eric6.Debugger.VariablesFilterDialog.html#VariablesFilterDialog" />
       <keyword name="VariablesFilterDialog (Constructor)" id="VariablesFilterDialog (Constructor)" ref="eric6.Debugger.VariablesFilterDialog.html#VariablesFilterDialog.__init__" />
       <keyword name="VariablesFilterDialog (Module)" id="VariablesFilterDialog (Module)" ref="eric6.Debugger.VariablesFilterDialog.html" />
       <keyword name="VariablesFilterDialog.getSelection" id="VariablesFilterDialog.getSelection" ref="eric6.Debugger.VariablesFilterDialog.html#VariablesFilterDialog.getSelection" />
       <keyword name="VariablesFilterDialog.on_buttonBox_clicked" id="VariablesFilterDialog.on_buttonBox_clicked" ref="eric6.Debugger.VariablesFilterDialog.html#VariablesFilterDialog.on_buttonBox_clicked" />
       <keyword name="VariablesFilterDialog.setSelection" id="VariablesFilterDialog.setSelection" ref="eric6.Debugger.VariablesFilterDialog.html#VariablesFilterDialog.setSelection" />
+      <keyword name="VariablesModel" id="VariablesModel" ref="eric6.Debugger.VariablesViewer.html#VariablesModel" />
+      <keyword name="VariablesModel (Constructor)" id="VariablesModel (Constructor)" ref="eric6.Debugger.VariablesViewer.html#VariablesModel.__init__" />
+      <keyword name="VariablesModel.__buildTreePath" id="VariablesModel.__buildTreePath" ref="eric6.Debugger.VariablesViewer.html#VariablesModel.__buildTreePath" />
+      <keyword name="VariablesModel.__cleanupParentList" id="VariablesModel.__cleanupParentList" ref="eric6.Debugger.VariablesViewer.html#VariablesModel.__cleanupParentList" />
+      <keyword name="VariablesModel.__findPendingItem" id="VariablesModel.__findPendingItem" ref="eric6.Debugger.VariablesViewer.html#VariablesModel.__findPendingItem" />
+      <keyword name="VariablesModel.__findVariable" id="VariablesModel.__findVariable" ref="eric6.Debugger.VariablesViewer.html#VariablesModel.__findVariable" />
+      <keyword name="VariablesModel.clear" id="VariablesModel.clear" ref="eric6.Debugger.VariablesViewer.html#VariablesModel.clear" />
+      <keyword name="VariablesModel.columnCount" id="VariablesModel.columnCount" ref="eric6.Debugger.VariablesViewer.html#VariablesModel.columnCount" />
+      <keyword name="VariablesModel.data" id="VariablesModel.data" ref="eric6.Debugger.VariablesViewer.html#VariablesModel.data" />
+      <keyword name="VariablesModel.flags" id="VariablesModel.flags" ref="eric6.Debugger.VariablesViewer.html#VariablesModel.flags" />
+      <keyword name="VariablesModel.getMore" id="VariablesModel.getMore" ref="eric6.Debugger.VariablesViewer.html#VariablesModel.getMore" />
+      <keyword name="VariablesModel.handlePreferencesChanged" id="VariablesModel.handlePreferencesChanged" ref="eric6.Debugger.VariablesViewer.html#VariablesModel.handlePreferencesChanged" />
+      <keyword name="VariablesModel.hasChildren" id="VariablesModel.hasChildren" ref="eric6.Debugger.VariablesViewer.html#VariablesModel.hasChildren" />
+      <keyword name="VariablesModel.headerData" id="VariablesModel.headerData" ref="eric6.Debugger.VariablesViewer.html#VariablesModel.headerData" />
+      <keyword name="VariablesModel.index" id="VariablesModel.index" ref="eric6.Debugger.VariablesViewer.html#VariablesModel.index" />
+      <keyword name="VariablesModel.parent" id="VariablesModel.parent" ref="eric6.Debugger.VariablesViewer.html#VariablesModel.parent" />
+      <keyword name="VariablesModel.resetModifiedMarker" id="VariablesModel.resetModifiedMarker" ref="eric6.Debugger.VariablesViewer.html#VariablesModel.resetModifiedMarker" />
+      <keyword name="VariablesModel.rowCount" id="VariablesModel.rowCount" ref="eric6.Debugger.VariablesViewer.html#VariablesModel.rowCount" />
+      <keyword name="VariablesModel.setExpanded" id="VariablesModel.setExpanded" ref="eric6.Debugger.VariablesViewer.html#VariablesModel.setExpanded" />
+      <keyword name="VariablesModel.showVariables" id="VariablesModel.showVariables" ref="eric6.Debugger.VariablesViewer.html#VariablesModel.showVariables" />
+      <keyword name="VariablesProxyModel" id="VariablesProxyModel" ref="eric6.Debugger.VariablesViewer.html#VariablesProxyModel" />
+      <keyword name="VariablesProxyModel (Constructor)" id="VariablesProxyModel (Constructor)" ref="eric6.Debugger.VariablesViewer.html#VariablesProxyModel.__init__" />
+      <keyword name="VariablesProxyModel.hasChildren" id="VariablesProxyModel.hasChildren" ref="eric6.Debugger.VariablesViewer.html#VariablesProxyModel.hasChildren" />
+      <keyword name="VariablesProxyModel.setExpanded" id="VariablesProxyModel.setExpanded" ref="eric6.Debugger.VariablesViewer.html#VariablesProxyModel.setExpanded" />
       <keyword name="VariablesViewer" id="VariablesViewer" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer" />
       <keyword name="VariablesViewer (Constructor)" id="VariablesViewer (Constructor)" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__init__" />
       <keyword name="VariablesViewer (Module)" id="VariablesViewer (Module)" ref="eric6.Debugger.VariablesViewer.html" />
-      <keyword name="VariablesViewer.__addItem" id="VariablesViewer.__addItem" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__addItem" />
-      <keyword name="VariablesViewer.__buildTreePath" id="VariablesViewer.__buildTreePath" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__buildTreePath" />
+      <keyword name="VariablesViewer.__collapseChildren" id="VariablesViewer.__collapseChildren" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__collapseChildren" />
       <keyword name="VariablesViewer.__configure" id="VariablesViewer.__configure" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__configure" />
+      <keyword name="VariablesViewer.__configureFilter" id="VariablesViewer.__configureFilter" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__configureFilter" />
       <keyword name="VariablesViewer.__createPopupMenus" id="VariablesViewer.__createPopupMenus" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__createPopupMenus" />
-      <keyword name="VariablesViewer.__expandItemSignal" id="VariablesViewer.__expandItemSignal" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__expandItemSignal" />
-      <keyword name="VariablesViewer.__findItem" id="VariablesViewer.__findItem" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__findItem" />
-      <keyword name="VariablesViewer.__generateItem" id="VariablesViewer.__generateItem" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__generateItem" />
-      <keyword name="VariablesViewer.__getDispType" id="VariablesViewer.__getDispType" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__getDispType" />
+      <keyword name="VariablesViewer.__expandChildren" id="VariablesViewer.__expandChildren" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__expandChildren" />
+      <keyword name="VariablesViewer.__itemDoubleClicked" id="VariablesViewer.__itemDoubleClicked" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__itemDoubleClicked" />
+      <keyword name="VariablesViewer.__mdlRequestExpand" id="VariablesViewer.__mdlRequestExpand" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__mdlRequestExpand" />
       <keyword name="VariablesViewer.__refreshView" id="VariablesViewer.__refreshView" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__refreshView" />
-      <keyword name="VariablesViewer.__resort" id="VariablesViewer.__resort" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__resort" />
-      <keyword name="VariablesViewer.__sectionClicked" id="VariablesViewer.__sectionClicked" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__sectionClicked" />
       <keyword name="VariablesViewer.__showContextMenu" id="VariablesViewer.__showContextMenu" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__showContextMenu" />
       <keyword name="VariablesViewer.__showDetails" id="VariablesViewer.__showDetails" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__showDetails" />
       <keyword name="VariablesViewer.__showVariableDetails" id="VariablesViewer.__showVariableDetails" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__showVariableDetails" />
-      <keyword name="VariablesViewer.collapseItem" id="VariablesViewer.collapseItem" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.collapseItem" />
-      <keyword name="VariablesViewer.expandItem" id="VariablesViewer.expandItem" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.expandItem" />
       <keyword name="VariablesViewer.handleResetUI" id="VariablesViewer.handleResetUI" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.handleResetUI" />
-      <keyword name="VariablesViewer.mouseDoubleClickEvent" id="VariablesViewer.mouseDoubleClickEvent" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.mouseDoubleClickEvent" />
+      <keyword name="VariablesViewer.resizeEvent" id="VariablesViewer.resizeEvent" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.resizeEvent" />
       <keyword name="VariablesViewer.showVariable" id="VariablesViewer.showVariable" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.showVariable" />
       <keyword name="VariablesViewer.showVariables" id="VariablesViewer.showVariables" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.showVariables" />
+      <keyword name="VariablesViewer.verticalScrollbarValueChanged" id="VariablesViewer.verticalScrollbarValueChanged" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.verticalScrollbarValueChanged" />
       <keyword name="VcsCommandOptionsDialog" id="VcsCommandOptionsDialog" ref="eric6.VCS.CommandOptionsDialog.html#VcsCommandOptionsDialog" />
       <keyword name="VcsCommandOptionsDialog (Constructor)" id="VcsCommandOptionsDialog (Constructor)" ref="eric6.VCS.CommandOptionsDialog.html#VcsCommandOptionsDialog.__init__" />
       <keyword name="VcsCommandOptionsDialog.getOptions" id="VcsCommandOptionsDialog.getOptions" ref="eric6.VCS.CommandOptionsDialog.html#VcsCommandOptionsDialog.getOptions" />
@@ -17862,6 +17911,7 @@
       <keyword name="ViewManager.initFileMenu" id="ViewManager.initFileMenu" ref="eric6.ViewManager.ViewManager.html#ViewManager.initFileMenu" />
       <keyword name="ViewManager.initFileToolbar" id="ViewManager.initFileToolbar" ref="eric6.ViewManager.ViewManager.html#ViewManager.initFileToolbar" />
       <keyword name="ViewManager.initMacroMenu" id="ViewManager.initMacroMenu" ref="eric6.ViewManager.ViewManager.html#ViewManager.initMacroMenu" />
+      <keyword name="ViewManager.initSearchMenu" id="ViewManager.initSearchMenu" ref="eric6.ViewManager.ViewManager.html#ViewManager.initSearchMenu" />
       <keyword name="ViewManager.initSearchToolbars" id="ViewManager.initSearchToolbars" ref="eric6.ViewManager.ViewManager.html#ViewManager.initSearchToolbars" />
       <keyword name="ViewManager.initSpellingToolbar" id="ViewManager.initSpellingToolbar" ref="eric6.ViewManager.ViewManager.html#ViewManager.initSpellingToolbar" />
       <keyword name="ViewManager.initViewMenu" id="ViewManager.initViewMenu" ref="eric6.ViewManager.ViewManager.html#ViewManager.initViewMenu" />
@@ -19050,6 +19100,7 @@
       <keyword name="cleanupSource (Module)" id="cleanupSource (Module)" ref="cleanupSource.html" />
       <keyword name="clearPrivateData" id="clearPrivateData" ref="eric6.Plugins.PluginVcsGit.html#clearPrivateData" />
       <keyword name="clearPrivateData" id="clearPrivateData" ref="eric6.Plugins.PluginVcsMercurial.html#clearPrivateData" />
+      <keyword name="closehead (Module)" id="closehead (Module)" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.closehead.html" />
       <keyword name="codeStyleBatchCheck" id="codeStyleBatchCheck" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleChecker.html#codeStyleBatchCheck" />
       <keyword name="codeStyleCheck" id="codeStyleCheck" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleChecker.html#codeStyleCheck" />
       <keyword name="compactPath" id="compactPath" ref="eric6.Utilities.__init__.html#compactPath" />
@@ -20399,6 +20450,9 @@
       <file>eric6.Plugins.VcsPlugins.vcsGit.ProjectBrowserHelper.html</file>
       <file>eric6.Plugins.VcsPlugins.vcsGit.ProjectHelper.html</file>
       <file>eric6.Plugins.VcsPlugins.vcsGit.git.html</file>
+      <file>eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.HgCloseHeadSelectionDialog.html</file>
+      <file>eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper.html</file>
+      <file>eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.closehead.html</file>
       <file>eric6.Plugins.VcsPlugins.vcsMercurial.Config.html</file>
       <file>eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage.MercurialPage.html</file>
       <file>eric6.Plugins.VcsPlugins.vcsMercurial.FetchExtension.HgFetchDialog.html</file>
@@ -21168,6 +21222,7 @@
       <file>index-eric6.Plugins.VcsPlugins.html</file>
       <file>index-eric6.Plugins.VcsPlugins.vcsGit.ConfigurationPage.html</file>
       <file>index-eric6.Plugins.VcsPlugins.vcsGit.html</file>
+      <file>index-eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.html</file>
       <file>index-eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage.html</file>
       <file>index-eric6.Plugins.VcsPlugins.vcsMercurial.FetchExtension.html</file>
       <file>index-eric6.Plugins.VcsPlugins.vcsMercurial.GpgExtension.html</file>
--- a/eric6/Documentation/Source/eric6.DebugClients.Python.DebugClientBase.html	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Documentation/Source/eric6.DebugClients.Python.DebugClientBase.html	Sun Jun 02 11:42:48 2019 +0200
@@ -77,7 +77,7 @@
 object
 <h3>Class Attributes</h3>
 <table>
-<tr><td>Indicators</td></tr><tr><td>clientCapabilities</td></tr>
+<tr><td>Indicators</td></tr><tr><td>arrayTypes</td></tr><tr><td>clientCapabilities</td></tr>
 </table>
 <h3>Class Methods</h3>
 <table>
@@ -299,7 +299,7 @@
 </dd>
 </dl><a NAME="DebugClientBase.__dumpVariable" ID="DebugClientBase.__dumpVariable"></a>
 <h4>DebugClientBase.__dumpVariable</h4>
-<b>__dumpVariable</b>(<i>var, frmnr, scope, filterList, maxSize</i>)
+<b>__dumpVariable</b>(<i>var, frmnr, scope, filterList</i>)
 <p>
         Private method to return the variables of a frame to the debug server.
 </p><dl>
@@ -309,21 +309,16 @@
 </dd><dt><i>frmnr</i> (int)</dt>
 <dd>
 distance of frame reported on. 0 is the current frame
-</dd><dt><i>scope</i></dt>
+</dd><dt><i>scope</i> (int)</dt>
 <dd>
-1 to report global variables, 0 for local variables (int)
+1 to report global variables, 0 for local variables
 </dd><dt><i>filterList</i> (list of int)</dt>
 <dd>
 the indices of variable types to be filtered
-</dd><dt><i>maxSize</i> (int)</dt>
-<dd>
-maximum size the formatted value of a variable will
-            be shown. If it is bigger than that, a 'too big' indication will
-            be given.
 </dd>
 </dl><a NAME="DebugClientBase.__dumpVariables" ID="DebugClientBase.__dumpVariables"></a>
 <h4>DebugClientBase.__dumpVariables</h4>
-<b>__dumpVariables</b>(<i>frmnr, scope, filterList, maxSize</i>)
+<b>__dumpVariables</b>(<i>frmnr, scope, filterList</i>)
 <p>
         Private method to return the variables of a frame to the debug server.
 </p><dl>
@@ -336,11 +331,6 @@
 </dd><dt><i>filterList</i> (list of int)</dt>
 <dd>
 the indices of variable types to be filtered
-</dd><dt><i>maxSize</i> (int)</dt>
-<dd>
-maximum size the formatted value of a variable will
-            be shown. If it is bigger than that, a 'too big' indication will
-            be given.
 </dd>
 </dl><a NAME="DebugClientBase.__extractIndicators" ID="DebugClientBase.__extractIndicators"></a>
 <h4>DebugClientBase.__extractIndicators</h4>
@@ -385,7 +375,7 @@
 </dd>
 </dl><a NAME="DebugClientBase.__formatVariablesList" ID="DebugClientBase.__formatVariablesList"></a>
 <h4>DebugClientBase.__formatVariablesList</h4>
-<b>__formatVariablesList</b>(<i>keylist, dict_, scope, filterList=None, formatSequences=False, maxSize=0</i>)
+<b>__formatVariablesList</b>(<i>dict_, scope, filterList=None</i>)
 <p>
         Private method to produce a formated variables list.
 </p><p>
@@ -395,10 +385,7 @@
         expressions. The formated variables list (a list of tuples of 3
         values) is returned.
 </p><dl>
-<dt><i>keylist</i> (list of str)</dt>
-<dd>
-keys of the dictionary to be formatted
-</dd><dt><i>dict_</i> (dict)</dt>
+<dt><i>dict_</i> (dict)</dt>
 <dd>
 the dictionary to be scanned
 </dd><dt><i>scope</i> (int)</dt>
@@ -412,16 +399,6 @@
 the indices of variable types to be filtered.
             Variables are only added to the list, if their type is not
             contained in the filter list.
-</dd><dt><i>formatSequences</i> (bool)</dt>
-<dd>
-flag indicating, that sequence or dictionary
-            variables should be formatted. If it is 0 (or false), just the
-            number of items contained in these variables is returned.
-</dd><dt><i>maxSize</i> (int)</dt>
-<dd>
-maximum size the formatted value of a variable will
-            be shown. If it is bigger than that, a 'too big' indication will
-            be placed in the value field.
 </dd>
 </dl><dl>
 <dt>Returns:</dt>
--- a/eric6/Documentation/Source/eric6.DebugClients.Python.DebugConfig.html	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Documentation/Source/eric6.DebugClients.Python.DebugConfig.html	Sun Jun 02 11:42:48 2019 +0200
@@ -25,7 +25,7 @@
 </p>
 <h3>Global Attributes</h3>
 <table>
-<tr><td>ConfigVarTypeStrings</td></tr>
+<tr><td>BatchSize</td></tr><tr><td>ConfigKnownQtTypes</td></tr><tr><td>ConfigQtNames</td></tr><tr><td>ConfigVarTypeStrings</td></tr>
 </table>
 <h3>Classes</h3>
 <table>
--- a/eric6/Documentation/Source/eric6.DebugClients.Python.DebugVariables.html	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Documentation/Source/eric6.DebugClients.Python.DebugVariables.html	Sun Jun 02 11:42:48 2019 +0200
@@ -25,14 +25,11 @@
 </p>
 <h3>Global Attributes</h3>
 <table>
-<tr><td>MaxItemsToHandle</td></tr><tr><td>TooLargeAttribute</td></tr><tr><td>TooLargeMessage</td></tr><tr><td>_TypeMap</td></tr><tr><td>arrayResolver</td></tr><tr><td>defaultResolver</td></tr><tr><td>dictResolver</td></tr><tr><td>listResolver</td></tr><tr><td>multiValueDictResolver</td></tr><tr><td>ndarrayResolver</td></tr><tr><td>setResolver</td></tr>
+<tr><td>_TypeMap</td></tr><tr><td>arrayResolver</td></tr><tr><td>defaultResolver</td></tr><tr><td>dictResolver</td></tr><tr><td>dictViewResolver</td></tr><tr><td>listResolver</td></tr><tr><td>multiValueDictResolver</td></tr><tr><td>ndarrayResolver</td></tr><tr><td>setResolver</td></tr>
 </table>
 <h3>Classes</h3>
 <table>
 <tr>
-<td><a href="#ArrayItemsContainer">ArrayItemsContainer</a></td>
-<td>Class to store array.array items.</td>
-</tr><tr>
 <td><a href="#ArrayResolver">ArrayResolver</a></td>
 <td>Class used to resolve from array.array including some meta data.</td>
 </tr><tr>
@@ -45,15 +42,15 @@
 <td><a href="#DictResolver">DictResolver</a></td>
 <td>Class used to resolve from a dictionary.</td>
 </tr><tr>
+<td><a href="#DictViewResolver">DictViewResolver</a></td>
+<td>Class used to resolve from dict views.</td>
+</tr><tr>
 <td><a href="#ListResolver">ListResolver</a></td>
 <td>Class used to resolve from a tuple or list.</td>
 </tr><tr>
 <td><a href="#MultiValueDictResolver">MultiValueDictResolver</a></td>
 <td>Class used to resolve from Django multi value dictionaries.</td>
 </tr><tr>
-<td><a href="#NdArrayItemsContainer">NdArrayItemsContainer</a></td>
-<td>Class to store ndarray items.</td>
-</tr><tr>
 <td><a href="#NdArrayResolver">NdArrayResolver</a></td>
 <td>Class used to resolve from numpy ndarray including some meta data.</td>
 </tr><tr>
@@ -72,32 +69,6 @@
 </tr>
 </table>
 <hr /><hr />
-<a NAME="ArrayItemsContainer" ID="ArrayItemsContainer"></a>
-<h2>ArrayItemsContainer</h2>
-<p>
-    Class to store array.array items.
-</p>
-<h3>Derived from</h3>
-None
-<h3>Class Attributes</h3>
-<table>
-<tr><td>None</td></tr>
-</table>
-<h3>Class Methods</h3>
-<table>
-<tr><td>None</td></tr>
-</table>
-<h3>Methods</h3>
-<table>
-<tr><td>None</td></tr>
-</table>
-<h3>Static Methods</h3>
-<table>
-<tr><td>None</td></tr>
-</table>
-
-<div align="right"><a href="#top">Up</a></div>
-<hr /><hr />
 <a NAME="ArrayResolver" ID="ArrayResolver"></a>
 <h2>ArrayResolver</h2>
 <p>
@@ -222,12 +193,6 @@
 <dd>
 dict
 </dd>
-</dl><dl>
-<dt>Raises <b>NotImplementedError</b>:</dt>
-<dd>
-raised to indicate a missing
-            implementation
-</dd>
 </dl><a NAME="BaseResolver.resolve" ID="BaseResolver.resolve"></a>
 <h4>BaseResolver.resolve</h4>
 <b>resolve</b>(<i>var, attribute</i>)
@@ -251,12 +216,6 @@
 <dd>
 any
 </dd>
-</dl><dl>
-<dt>Raises <b>NotImplementedError</b>:</dt>
-<dd>
-raised to indicate a missing
-            implementation
-</dd>
 </dl>
 <div align="right"><a href="#top">Up</a></div>
 <hr /><hr />
@@ -280,9 +239,6 @@
 <tr>
 <td><a href="#DefaultResolver.getDictionary">getDictionary</a></td>
 <td>Public method to get the attributes of a variable as a dictionary.</td>
-</tr><tr>
-<td><a href="#DefaultResolver.resolve">resolve</a></td>
-<td>Public method to get an attribute from a variable.</td>
 </tr>
 </table>
 <h3>Static Methods</h3>
@@ -309,29 +265,6 @@
 <dd>
 dict
 </dd>
-</dl><a NAME="DefaultResolver.resolve" ID="DefaultResolver.resolve"></a>
-<h4>DefaultResolver.resolve</h4>
-<b>resolve</b>(<i>var, attribute</i>)
-<p>
-        Public method to get an attribute from a variable.
-</p><dl>
-<dt><i>var</i> (any)</dt>
-<dd>
-variable to extract an attribute or value from
-</dd><dt><i>attribute</i> (str)</dt>
-<dd>
-name of the attribute to extract
-</dd>
-</dl><dl>
-<dt>Returns:</dt>
-<dd>
-value of the attribute
-</dd>
-</dl><dl>
-<dt>Return Type:</dt>
-<dd>
-any
-</dd>
 </dl>
 <div align="right"><a href="#top">Up</a></div>
 <hr /><hr />
@@ -433,6 +366,81 @@
 </dl>
 <div align="right"><a href="#top">Up</a></div>
 <hr /><hr />
+<a NAME="DictViewResolver" ID="DictViewResolver"></a>
+<h2>DictViewResolver</h2>
+<p>
+    Class used to resolve from dict views.
+</p>
+<h3>Derived from</h3>
+ListResolver
+<h3>Class Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Class Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#DictViewResolver.getDictionary">getDictionary</a></td>
+<td>Public method to get the attributes of a variable as a dictionary.</td>
+</tr><tr>
+<td><a href="#DictViewResolver.resolve">resolve</a></td>
+<td>Public method to get an attribute from a variable.</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<a NAME="DictViewResolver.getDictionary" ID="DictViewResolver.getDictionary"></a>
+<h4>DictViewResolver.getDictionary</h4>
+<b>getDictionary</b>(<i>var</i>)
+<p>
+        Public method to get the attributes of a variable as a dictionary.
+</p><dl>
+<dt><i>var</i> (any)</dt>
+<dd>
+variable to be converted
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+dictionary containing the variable attributes
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+dict
+</dd>
+</dl><a NAME="DictViewResolver.resolve" ID="DictViewResolver.resolve"></a>
+<h4>DictViewResolver.resolve</h4>
+<b>resolve</b>(<i>var, attribute</i>)
+<p>
+        Public method to get an attribute from a variable.
+</p><dl>
+<dt><i>var</i> (tuple or list)</dt>
+<dd>
+variable to extract an attribute or value from
+</dd><dt><i>attribute</i> (str)</dt>
+<dd>
+id of the value to extract
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+value of the attribute
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+any
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
 <a NAME="ListResolver" ID="ListResolver"></a>
 <h2>ListResolver</h2>
 <p>
@@ -583,32 +591,6 @@
 </dl>
 <div align="right"><a href="#top">Up</a></div>
 <hr /><hr />
-<a NAME="NdArrayItemsContainer" ID="NdArrayItemsContainer"></a>
-<h2>NdArrayItemsContainer</h2>
-<p>
-    Class to store ndarray items.
-</p>
-<h3>Derived from</h3>
-None
-<h3>Class Attributes</h3>
-<table>
-<tr><td>None</td></tr>
-</table>
-<h3>Class Methods</h3>
-<table>
-<tr><td>None</td></tr>
-</table>
-<h3>Methods</h3>
-<table>
-<tr><td>None</td></tr>
-</table>
-<h3>Static Methods</h3>
-<table>
-<tr><td>None</td></tr>
-</table>
-
-<div align="right"><a href="#top">Up</a></div>
-<hr /><hr />
 <a NAME="NdArrayResolver" ID="NdArrayResolver"></a>
 <h2>NdArrayResolver</h2>
 <p>
@@ -803,12 +785,12 @@
 </dl><dl>
 <dt>Returns:</dt>
 <dd>
-tuple containing the type, type name, type string and resolver
+tuple containing the type name, type string and resolver
 </dd>
 </dl><dl>
 <dt>Return Type:</dt>
 <dd>
-tuple of type, str, str, BaseResolver
+tuple of str, str, BaseResolver
 </dd>
 </dl>
 <div align="right"><a href="#top">Up</a></div>
--- a/eric6/Documentation/Source/eric6.Debugger.DebugViewer.html	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Documentation/Source/eric6.Debugger.DebugViewer.html	Sun Jun 02 11:42:48 2019 +0200
@@ -63,7 +63,10 @@
     the exception logger. Additionally a list of all threads is shown.
 </p><h3>Signals</h3>
 <dl>
-<dt>sourceFile(string, int)</dt>
+<dt>preferencesChanged()</dt>
+<dd>
+emitted to react on changed preferences
+</dd><dt>sourceFile(string, int)</dt>
 <dd>
 emitted to open a source file at a line
 </dd>
@@ -108,6 +111,9 @@
 <td><a href="#DebugViewer.handleDebuggingStarted">handleDebuggingStarted</a></td>
 <td>Public slot to handle the start of a debugging session.</td>
 </tr><tr>
+<td><a href="#DebugViewer.handlePreferencesChanged">handlePreferencesChanged</a></td>
+<td>Public slot to handle the preferencesChanged signal.</td>
+</tr><tr>
 <td><a href="#DebugViewer.handleResetUI">handleResetUI</a></td>
 <td>Public method to reset the SBVviewer.</td>
 </tr><tr>
@@ -117,9 +123,6 @@
 <td><a href="#DebugViewer.isCallTraceEnabled">isCallTraceEnabled</a></td>
 <td>Public method to get the state of the call trace function.</td>
 </tr><tr>
-<td><a href="#DebugViewer.preferencesChanged">preferencesChanged</a></td>
-<td>Public slot to handle the preferencesChanged signal.</td>
-</tr><tr>
 <td><a href="#DebugViewer.setCallTraceToProjectMode">setCallTraceToProjectMode</a></td>
 <td>Public slot to set the call trace viewer to project mode.</td>
 </tr><tr>
@@ -242,6 +245,11 @@
         Public slot to handle the start of a debugging session.
 </p><p>
         This slot sets the variables filter expressions.
+</p><a NAME="DebugViewer.handlePreferencesChanged" ID="DebugViewer.handlePreferencesChanged"></a>
+<h4>DebugViewer.handlePreferencesChanged</h4>
+<b>handlePreferencesChanged</b>(<i></i>)
+<p>
+        Public slot to handle the preferencesChanged signal.
 </p><a NAME="DebugViewer.handleResetUI" ID="DebugViewer.handleResetUI"></a>
 <h4>DebugViewer.handleResetUI</h4>
 <b>handleResetUI</b>(<i></i>)
@@ -267,12 +275,7 @@
 <dd>
 flag indicating the state of the call trace function (boolean)
 </dd>
-</dl><a NAME="DebugViewer.preferencesChanged" ID="DebugViewer.preferencesChanged"></a>
-<h4>DebugViewer.preferencesChanged</h4>
-<b>preferencesChanged</b>(<i></i>)
-<p>
-        Public slot to handle the preferencesChanged signal.
-</p><a NAME="DebugViewer.setCallTraceToProjectMode" ID="DebugViewer.setCallTraceToProjectMode"></a>
+</dl><a NAME="DebugViewer.setCallTraceToProjectMode" ID="DebugViewer.setCallTraceToProjectMode"></a>
 <h4>DebugViewer.setCallTraceToProjectMode</h4>
 <b>setCallTraceToProjectMode</b>(<i>enabled</i>)
 <p>
--- a/eric6/Documentation/Source/eric6.Debugger.VariablesViewer.html	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Documentation/Source/eric6.Debugger.VariablesViewer.html	Sun Jun 02 11:42:48 2019 +0200
@@ -21,29 +21,26 @@
 <body><a NAME="top" ID="top"></a>
 <h1>eric6.Debugger.VariablesViewer</h1>
 <p>
-Module implementing the variables viewer widget.
+Module implementing the variables viewer view based on QTreeView.
 </p>
 <h3>Global Attributes</h3>
 <table>
-<tr><td>None</td></tr>
+<tr><td>SORT_ROLE</td></tr>
 </table>
 <h3>Classes</h3>
 <table>
 <tr>
-<td><a href="#ArrayElementVarItem">ArrayElementVarItem</a></td>
-<td>Class implementing a VariableItem that represents an array element.</td>
-</tr><tr>
-<td><a href="#SpecialArrayElementVarItem">SpecialArrayElementVarItem</a></td>
-<td>Class implementing a QTreeWidgetItem that represents a special array variable node.</td>
+<td><a href="#VariableItem">VariableItem</a></td>
+<td>Class implementing the data structure for all variable items.</td>
 </tr><tr>
-<td><a href="#SpecialVarItem">SpecialVarItem</a></td>
-<td>Class implementing a VariableItem that represents a special variable node.</td>
+<td><a href="#VariablesModel">VariablesModel</a></td>
+<td>Class implementing the data model for QTreeView.</td>
 </tr><tr>
-<td><a href="#VariableItem">VariableItem</a></td>
-<td>Class implementing the data structure for variable items.</td>
+<td><a href="#VariablesProxyModel">VariablesProxyModel</a></td>
+<td>Class for handling the sort operations.</td>
 </tr><tr>
 <td><a href="#VariablesViewer">VariablesViewer</a></td>
-<td>Class implementing the variables viewer widget.</td>
+<td>Class implementing the variables viewer view.</td>
 </tr>
 </table>
 <h3>Functions</h3>
@@ -51,16 +48,16 @@
 <tr><td>None</td></tr>
 </table>
 <hr /><hr />
-<a NAME="ArrayElementVarItem" ID="ArrayElementVarItem"></a>
-<h2>ArrayElementVarItem</h2>
+<a NAME="VariableItem" ID="VariableItem"></a>
+<h2>VariableItem</h2>
 <p>
-    Class implementing a VariableItem that represents an array element.
+    Class implementing the data structure for all variable items.
 </p>
 <h3>Derived from</h3>
-VariableItem
+object
 <h3>Class Attributes</h3>
 <table>
-<tr><td>None</td></tr>
+<tr><td>Type2Indicators</td></tr><tr><td>arrayTypes</td></tr><tr><td>noOfItemsStr</td></tr><tr><td>nonExpandableTypes</td></tr><tr><td>rx_nonprintable</td></tr>
 </table>
 <h3>Class Methods</h3>
 <table>
@@ -69,102 +66,132 @@
 <h3>Methods</h3>
 <table>
 <tr>
-<td><a href="#ArrayElementVarItem.__init__">ArrayElementVarItem</a></td>
+<td><a href="#VariableItem.__init__">VariableItem</a></td>
 <td>Constructor</td>
+</tr><tr>
+<td><a href="#VariableItem.__getName">__getName</a></td>
+<td>Private method to extract the variable name.</td>
+</tr><tr>
+<td><a href="#VariableItem.__getType">__getType</a></td>
+<td>Private method to process the type of the variable.</td>
+</tr><tr>
+<td><a href="#VariableItem.__getValue">__getValue</a></td>
+<td>Private method to process the variables value.</td>
+</tr><tr>
+<td><a href="#VariableItem.absolutCount">absolutCount</a></td>
+<td>Public property to get the total number of children.</td>
+</tr><tr>
+<td><a href="#VariableItem.populated">populated</a></td>
+<td>Public property returning a flag indicating if item is fully populated.</td>
 </tr>
 </table>
 <h3>Static Methods</h3>
 <table>
 <tr><td>None</td></tr>
 </table>
-<a NAME="ArrayElementVarItem.__init__" ID="ArrayElementVarItem.__init__"></a>
-<h4>ArrayElementVarItem (Constructor)</h4>
-<b>ArrayElementVarItem</b>(<i>parent, dvar, dvalue, dtype</i>)
+<a NAME="VariableItem.__init__" ID="VariableItem.__init__"></a>
+<h4>VariableItem (Constructor)</h4>
+<b>VariableItem</b>(<i>parent, dvar, dtype, dvalue</i>)
 <p>
         Constructor
 </p><dl>
-<dt><i>parent</i></dt>
+<dt><i>parent</i> (VariableItem)</dt>
+<dd>
+reference to the parent item
+</dd><dt><i>dvar</i> (str)</dt>
+<dd>
+variable name
+</dd><dt><i>dtype</i> (str)</dt>
+<dd>
+type string
+</dd><dt><i>dvalue</i> (str)</dt>
 <dd>
-parent of this item
-</dd><dt><i>dvar</i></dt>
+value string
+</dd>
+</dl><a NAME="VariableItem.__getName" ID="VariableItem.__getName"></a>
+<h4>VariableItem.__getName</h4>
+<b>__getName</b>(<i>dvar</i>)
+<p>
+        Private method to extract the variable name.
+</p><dl>
+<dt><i>dvar</i> (str)</dt>
+<dd>
+name of variable maybe with ID
+</dd>
+</dl><a NAME="VariableItem.__getType" ID="VariableItem.__getType"></a>
+<h4>VariableItem.__getType</h4>
+<b>__getType</b>(<i>dtype</i>)
+<p>
+        Private method to process the type of the variable.
+</p><p>
+        If type is known to have children, the corresponding flag is set.
+</p><dl>
+<dt><i>dtype</i> (str)</dt>
 <dd>
-variable name (string)
-</dd><dt><i>dvalue</i></dt>
+type string
+</dd>
+</dl><a NAME="VariableItem.__getValue" ID="VariableItem.__getValue"></a>
+<h4>VariableItem.__getValue</h4>
+<b>__getValue</b>(<i>dtype, dvalue</i>)
+<p>
+        Private method to process the variables value.
+</p><p>
+        Define and limit value, set tooltip text. If type is known to have
+        children, the corresponding flag is set.
+</p><dl>
+<dt><i>dtype</i> (str)</dt>
+<dd>
+type string
+</dd><dt><i>dvalue</i> (str)</dt>
 <dd>
-value string (string)
-</dd><dt><i>dtype</i></dt>
+value of variable encoded as utf-8
+</dd>
+</dl><a NAME="VariableItem.absolutCount" ID="VariableItem.absolutCount"></a>
+<h4>VariableItem.absolutCount</h4>
+<b>absolutCount</b>(<i></i>)
+<p>
+        Public property to get the total number of children.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+total number of children
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
 <dd>
-type string (string)
+int
+</dd>
+</dl><a NAME="VariableItem.populated" ID="VariableItem.populated"></a>
+<h4>VariableItem.populated</h4>
+<b>populated</b>(<i></i>)
+<p>
+        Public property returning a flag indicating if item is fully populated.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+item is fully populated
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+bool
 </dd>
 </dl>
 <div align="right"><a href="#top">Up</a></div>
 <hr /><hr />
-<a NAME="SpecialArrayElementVarItem" ID="SpecialArrayElementVarItem"></a>
-<h2>SpecialArrayElementVarItem</h2>
+<a NAME="VariablesModel" ID="VariablesModel"></a>
+<h2>VariablesModel</h2>
 <p>
-    Class implementing a QTreeWidgetItem that represents a special array
-    variable node.
-</p>
-<h3>Derived from</h3>
-SpecialVarItem
-<h3>Class Attributes</h3>
-<table>
-<tr><td>None</td></tr>
-</table>
-<h3>Class Methods</h3>
-<table>
-<tr><td>None</td></tr>
-</table>
-<h3>Methods</h3>
-<table>
-<tr>
-<td><a href="#SpecialArrayElementVarItem.__init__">SpecialArrayElementVarItem</a></td>
-<td>Constructor</td>
-</tr>
-</table>
-<h3>Static Methods</h3>
-<table>
-<tr><td>None</td></tr>
-</table>
-<a NAME="SpecialArrayElementVarItem.__init__" ID="SpecialArrayElementVarItem.__init__"></a>
-<h4>SpecialArrayElementVarItem (Constructor)</h4>
-<b>SpecialArrayElementVarItem</b>(<i>parent, dvar, dvalue, dtype, frmnr, globalScope</i>)
-<p>
-        Constructor
-</p><dl>
-<dt><i>parent</i></dt>
+    Class implementing the data model for QTreeView.
+</p><h3>Signals</h3>
+<dl>
+<dt>expand</dt>
 <dd>
-parent of this item
-</dd><dt><i>dvar</i></dt>
-<dd>
-variable name (string)
-</dd><dt><i>dvalue</i></dt>
-<dd>
-value string (string)
-</dd><dt><i>dtype</i></dt>
-<dd>
-type string (string)
-</dd><dt><i>frmnr</i></dt>
-<dd>
-frame number (0 is the current frame) (int)
-</dd><dt><i>globalScope</i></dt>
-<dd>
-flag indicating global (True) or local (False)
-            variables
+trigger QTreeView to expand given index
 </dd>
 </dl>
-<div align="right"><a href="#top">Up</a></div>
-<hr /><hr />
-<a NAME="SpecialVarItem" ID="SpecialVarItem"></a>
-<h2>SpecialVarItem</h2>
-<p>
-    Class implementing a VariableItem that represents a special variable node.
-</p><p>
-    These special variable nodes are generated for classes, lists,
-    tuples and dictionaries.
-</p>
 <h3>Derived from</h3>
-VariableItem
+QAbstractItemModel
 <h3>Class Attributes</h3>
 <table>
 <tr><td>None</td></tr>
@@ -176,251 +203,485 @@
 <h3>Methods</h3>
 <table>
 <tr>
-<td><a href="#SpecialVarItem.__init__">SpecialVarItem</a></td>
+<td><a href="#VariablesModel.__init__">VariablesModel</a></td>
 <td>Constructor</td>
 </tr><tr>
-<td><a href="#SpecialVarItem.expand">expand</a></td>
-<td>Public method to expand the item.</td>
-</tr>
-</table>
-<h3>Static Methods</h3>
-<table>
-<tr><td>None</td></tr>
-</table>
-<a NAME="SpecialVarItem.__init__" ID="SpecialVarItem.__init__"></a>
-<h4>SpecialVarItem (Constructor)</h4>
-<b>SpecialVarItem</b>(<i>parent, dvar, dvalue, dtype, frmnr, globalScope</i>)
-<p>
-        Constructor
-</p><dl>
-<dt><i>parent</i></dt>
-<dd>
-parent of this item
-</dd><dt><i>dvar</i></dt>
-<dd>
-variable name (string)
-</dd><dt><i>dvalue</i></dt>
-<dd>
-value string (string)
-</dd><dt><i>dtype</i></dt>
-<dd>
-type string (string)
-</dd><dt><i>frmnr</i></dt>
-<dd>
-frame number (0 is the current frame) (int)
-</dd><dt><i>globalScope</i></dt>
-<dd>
-flag indicating global (True) or local (False)
-            variables
-</dd>
-</dl><a NAME="SpecialVarItem.expand" ID="SpecialVarItem.expand"></a>
-<h4>SpecialVarItem.expand</h4>
-<b>expand</b>(<i></i>)
-<p>
-        Public method to expand the item.
-</p>
-<div align="right"><a href="#top">Up</a></div>
-<hr /><hr />
-<a NAME="VariableItem" ID="VariableItem"></a>
-<h2>VariableItem</h2>
-<p>
-    Class implementing the data structure for variable items.
-</p>
-<h3>Derived from</h3>
-QTreeWidgetItem
-<h3>Class Attributes</h3>
-<table>
-<tr><td>Indicators</td></tr><tr><td>Type2Indicators</td></tr>
-</table>
-<h3>Class Methods</h3>
-<table>
-<tr>
-<td><a href="#VariableItem.extractId">extractId</a></td>
-<td>Class method to extract the ID string from a variable text.</td>
+<td><a href="#VariablesModel.__buildTreePath">__buildTreePath</a></td>
+<td>Private method to build up a path from the root to parent.</td>
+</tr><tr>
+<td><a href="#VariablesModel.__cleanupParentList">__cleanupParentList</a></td>
+<td>Private method to remove items which are left over at the end of the child list.</td>
+</tr><tr>
+<td><a href="#VariablesModel.__findPendingItem">__findPendingItem</a></td>
+<td>Private method to find the next item to request data from debugger.</td>
+</tr><tr>
+<td><a href="#VariablesModel.__findVariable">__findVariable</a></td>
+<td>Private method to get to the given variable.</td>
+</tr><tr>
+<td><a href="#VariablesModel.clear">clear</a></td>
+<td>Public method to clear the complete data model.</td>
+</tr><tr>
+<td><a href="#VariablesModel.columnCount">columnCount</a></td>
+<td>Public method to get the column count.</td>
+</tr><tr>
+<td><a href="#VariablesModel.data">data</a></td>
+<td>Public method get the role data of item.</td>
+</tr><tr>
+<td><a href="#VariablesModel.flags">flags</a></td>
+<td>Public method to get the item flags.</td>
+</tr><tr>
+<td><a href="#VariablesModel.getMore">getMore</a></td>
+<td>Public method to fetch the next variable from debugger.</td>
 </tr><tr>
-<td><a href="#VariableItem.extractIndicators">extractIndicators</a></td>
-<td>Class method to extract the indicator string from a variable text.</td>
-</tr>
-</table>
-<h3>Methods</h3>
-<table>
-<tr>
-<td><a href="#VariableItem.__init__">VariableItem</a></td>
-<td>Constructor</td>
+<td><a href="#VariablesModel.handlePreferencesChanged">handlePreferencesChanged</a></td>
+<td>Public slot to handle the preferencesChanged signal.</td>
+</tr><tr>
+<td><a href="#VariablesModel.hasChildren">hasChildren</a></td>
+<td>Public method to get a flag if parent has children.</td>
 </tr><tr>
-<td><a href="#VariableItem._buildKey">_buildKey</a></td>
-<td>Protected method to build the access key for the variable.</td>
+<td><a href="#VariablesModel.headerData">headerData</a></td>
+<td>Public method get the header names.</td>
 </tr><tr>
-<td><a href="#VariableItem.attachDummy">attachDummy</a></td>
-<td>Public method to attach a dummy sub item to allow for lazy population.</td>
+<td><a href="#VariablesModel.index">index</a></td>
+<td>Public method to get the index of item at row:column of parent.</td>
 </tr><tr>
-<td><a href="#VariableItem.collapse">collapse</a></td>
-<td>Public method to collapse the item.</td>
+<td><a href="#VariablesModel.parent">parent</a></td>
+<td>Public method to get the parent of the given child.</td>
 </tr><tr>
-<td><a href="#VariableItem.data">data</a></td>
-<td>Public method to return the data for the requested role.</td>
-</tr><tr>
-<td><a href="#VariableItem.deleteChildren">deleteChildren</a></td>
-<td>Public method to delete all children (cleaning the subtree).</td>
+<td><a href="#VariablesModel.resetModifiedMarker">resetModifiedMarker</a></td>
+<td>Public method to remove the modified marker from changed items.</td>
 </tr><tr>
-<td><a href="#VariableItem.expand">expand</a></td>
-<td>Public method to expand the item.</td>
+<td><a href="#VariablesModel.rowCount">rowCount</a></td>
+<td>Public method to get the row count.</td>
 </tr><tr>
-<td><a href="#VariableItem.getId">getId</a></td>
-<td>Public method to get the ID string.</td>
+<td><a href="#VariablesModel.setExpanded">setExpanded</a></td>
+<td>Public method to set the expanded state of item.</td>
 </tr><tr>
-<td><a href="#VariableItem.getValue">getValue</a></td>
-<td>Public method to return the value of the item.</td>
+<td><a href="#VariablesModel.showVariables">showVariables</a></td>
+<td>Public method to update the data model of variable in pathlist.</td>
 </tr>
 </table>
 <h3>Static Methods</h3>
 <table>
 <tr><td>None</td></tr>
 </table>
-<a NAME="VariableItem.extractId" ID="VariableItem.extractId"></a>
-<h4>VariableItem.extractId (class method)</h4>
-<b>extractId</b>(<i>var</i>)
+<a NAME="VariablesModel.__init__" ID="VariablesModel.__init__"></a>
+<h4>VariablesModel (Constructor)</h4>
+<b>VariablesModel</b>(<i>treeView, globalScope</i>)
 <p>
-        Class method to extract the ID string from a variable text.
+        Constructor
 </p><dl>
-<dt><i>var</i> (str)</dt>
+<dt><i>treeView</i> (VariablesViewer)</dt>
+<dd>
+QTreeView showing the data
+</dd><dt><i>globalScope</i> (bool)</dt>
 <dd>
-variable text
+flag indicating global (True) or local (False)
+            variables
+</dd>
+</dl><a NAME="VariablesModel.__buildTreePath" ID="VariablesModel.__buildTreePath"></a>
+<h4>VariablesModel.__buildTreePath</h4>
+<b>__buildTreePath</b>(<i>parent</i>)
+<p>
+        Private method to build up a path from the root to parent.
+</p><dl>
+<dt><i>parent</i> (VariableItem)</dt>
+<dd>
+item to build the path for
 </dd>
 </dl><dl>
 <dt>Returns:</dt>
 <dd>
-tuple containing the variable text without ID and the ID string
+list of names denoting the path from the root
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of str
+</dd>
+</dl><a NAME="VariablesModel.__cleanupParentList" ID="VariablesModel.__cleanupParentList"></a>
+<h4>VariablesModel.__cleanupParentList</h4>
+<b>__cleanupParentList</b>(<i>parent, parentIdx</i>)
+<p>
+        Private method to remove items which are left over at the end of the
+        child list.
+</p><dl>
+<dt><i>parent</i> (VariableItem)</dt>
+<dd>
+to clean up
+</dd><dt><i>parentIdx</i> (QModelIndex)</dt>
+<dd>
+the parent index as QModelIndex
+</dd>
+</dl><a NAME="VariablesModel.__findPendingItem" ID="VariablesModel.__findPendingItem"></a>
+<h4>VariablesModel.__findPendingItem</h4>
+<b>__findPendingItem</b>(<i>parent=None, pathlist=()</i>)
+<p>
+        Private method to find the next item to request data from debugger.
+</p><dl>
+<dt><i>parent</i> (VariableItem)</dt>
+<dd>
+the model parent
+</dd><dt><i>pathlist</i> (list of str)</dt>
+<dd>
+full path to the variable
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+next item index to request data from debugger
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+QModelIndex
+</dd>
+</dl><a NAME="VariablesModel.__findVariable" ID="VariablesModel.__findVariable"></a>
+<h4>VariablesModel.__findVariable</h4>
+<b>__findVariable</b>(<i>pathlist</i>)
+<p>
+        Private method to get to the given variable.
+</p><dl>
+<dt><i>pathlist</i> (list of str)</dt>
+<dd>
+full path to the variable
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+the found variable or None if it doesn't exist
 </dd>
 </dl><dl>
 <dt>Return Type:</dt>
 <dd>
-tuple of two str
+VariableItem or None
 </dd>
-</dl><a NAME="VariableItem.extractIndicators" ID="VariableItem.extractIndicators"></a>
-<h4>VariableItem.extractIndicators (class method)</h4>
-<b>extractIndicators</b>(<i>var</i>)
+</dl><a NAME="VariablesModel.clear" ID="VariablesModel.clear"></a>
+<h4>VariablesModel.clear</h4>
+<b>clear</b>(<i>reset=False</i>)
+<p>
+        Public method to clear the complete data model.
+</p><dl>
+<dt><i>reset</i> (bool)</dt>
+<dd>
+flag to clear the expanded keys also
+</dd>
+</dl><a NAME="VariablesModel.columnCount" ID="VariablesModel.columnCount"></a>
+<h4>VariablesModel.columnCount</h4>
+<b>columnCount</b>(<i>parent=QModelIndex()</i>)
 <p>
-        Class method to extract the indicator string from a variable text.
+        Public method to get the column count.
 </p><dl>
-<dt><i>var</i> (str)</dt>
+<dt><i>parent</i> (QModelIndex)</dt>
+<dd>
+the model parent
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+number of columns
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
 <dd>
-variable text
+int
+</dd>
+</dl><a NAME="VariablesModel.data" ID="VariablesModel.data"></a>
+<h4>VariablesModel.data</h4>
+<b>data</b>(<i>index, role=Qt.DisplayRole</i>)
+<p>
+        Public method get the role data of item.
+</p><dl>
+<dt><i>index</i> (QModelIndex)</dt>
+<dd>
+the model index
+</dd><dt><i>role</i> (QtCore.Qt.ItemDataRole)</dt>
+<dd>
+the requested data role
 </dd>
 </dl><dl>
 <dt>Returns:</dt>
 <dd>
-tuple containing the variable text without indicators and the
-            indicator string
+role data of item
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+Any
+</dd>
+</dl><a NAME="VariablesModel.flags" ID="VariablesModel.flags"></a>
+<h4>VariablesModel.flags</h4>
+<b>flags</b>(<i>index</i>)
+<p>
+        Public method to get the item flags.
+</p><dl>
+<dt><i>index</i> (QModelIndex)</dt>
+<dd>
+of item
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+item flags
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+QtCore.Qt.ItemFlag
+</dd>
+</dl><a NAME="VariablesModel.getMore" ID="VariablesModel.getMore"></a>
+<h4>VariablesModel.getMore</h4>
+<b>getMore</b>(<i></i>)
+<p>
+        Public method to fetch the next variable from debugger.
+</p><a NAME="VariablesModel.handlePreferencesChanged" ID="VariablesModel.handlePreferencesChanged"></a>
+<h4>VariablesModel.handlePreferencesChanged</h4>
+<b>handlePreferencesChanged</b>(<i></i>)
+<p>
+        Public slot to handle the preferencesChanged signal.
+</p><a NAME="VariablesModel.hasChildren" ID="VariablesModel.hasChildren"></a>
+<h4>VariablesModel.hasChildren</h4>
+<b>hasChildren</b>(<i>parent=QModelIndex()</i>)
+<p>
+        Public method to get a flag if parent has children.
+</p><dl>
+<dt><i>parent</i> (QModelIndex)</dt>
+<dd>
+the model parent
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+flag indicating parent has children
 </dd>
 </dl><dl>
 <dt>Return Type:</dt>
 <dd>
-tuple of two str
+bool
 </dd>
-</dl><a NAME="VariableItem.__init__" ID="VariableItem.__init__"></a>
-<h4>VariableItem (Constructor)</h4>
-<b>VariableItem</b>(<i>parent, dvar, dvalue, dtype</i>)
+</dl><a NAME="VariablesModel.headerData" ID="VariablesModel.headerData"></a>
+<h4>VariablesModel.headerData</h4>
+<b>headerData</b>(<i>section, orientation, role=Qt.DisplayRole</i>)
 <p>
-        Constructor
+        Public method get the header names.
 </p><dl>
-<dt><i>parent</i></dt>
+<dt><i>section</i> (int)</dt>
+<dd>
+the header section (row/coulumn)
+</dd><dt><i>orientation</i> (QtCore.Qt.Orientation)</dt>
 <dd>
-reference to the parent item
-</dd><dt><i>dvar</i></dt>
+the header's orientation
+</dd><dt><i>role</i> (QtCore.Qt.ItemDataRole)</dt>
+<dd>
+the requested data role
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
 <dd>
-variable name (string)
-</dd><dt><i>dvalue</i></dt>
-<dd>
-value string (string)
-</dd><dt><i>dtype</i></dt>
+header name
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
 <dd>
-type string (string)
+str or None
 </dd>
-</dl><a NAME="VariableItem._buildKey" ID="VariableItem._buildKey"></a>
-<h4>VariableItem._buildKey</h4>
-<b>_buildKey</b>(<i></i>)
+</dl><a NAME="VariablesModel.index" ID="VariablesModel.index"></a>
+<h4>VariablesModel.index</h4>
+<b>index</b>(<i>row, column, parent=QModelIndex()</i>)
 <p>
-        Protected method to build the access key for the variable.
+        Public method to get the index of item at row:column of parent.
 </p><dl>
+<dt><i>row</i> (int)</dt>
+<dd>
+number of rows
+</dd><dt><i>column</i> (int)</dt>
+<dd>
+number of columns
+</dd><dt><i>parent</i> (QModelIndex)</dt>
+<dd>
+the model parent
+</dd>
+</dl><dl>
 <dt>Returns:</dt>
 <dd>
-access key
+new model index for child
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+QModelIndex
+</dd>
+</dl><a NAME="VariablesModel.parent" ID="VariablesModel.parent"></a>
+<h4>VariablesModel.parent</h4>
+<b>parent</b>(<i>child</i>)
+<p>
+        Public method to get the parent of the given child.
+</p><dl>
+<dt><i>child</i> (QModelIndex)</dt>
+<dd>
+the model child node
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+new model index for parent
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+QModelIndex
+</dd>
+</dl><a NAME="VariablesModel.resetModifiedMarker" ID="VariablesModel.resetModifiedMarker"></a>
+<h4>VariablesModel.resetModifiedMarker</h4>
+<b>resetModifiedMarker</b>(<i>parentIdx=QModelIndex(), pathlist=()</i>)
+<p>
+        Public method to remove the modified marker from changed items.
+</p><dl>
+<dt><i>parentIdx</i> (QModelIndex)</dt>
+<dd>
+item to reset marker
+</dd><dt><i>pathlist</i> (list of str)</dt>
+<dd>
+full path to the variable
+</dd>
+</dl><a NAME="VariablesModel.rowCount" ID="VariablesModel.rowCount"></a>
+<h4>VariablesModel.rowCount</h4>
+<b>rowCount</b>(<i>parent=QModelIndex()</i>)
+<p>
+        Public method to get the row count.
+</p><dl>
+<dt><i>parent</i> (QModelIndex)</dt>
+<dd>
+the model parent
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+number of rows
 </dd>
 </dl><dl>
 <dt>Return Type:</dt>
 <dd>
-str
+int
+</dd>
+</dl><a NAME="VariablesModel.setExpanded" ID="VariablesModel.setExpanded"></a>
+<h4>VariablesModel.setExpanded</h4>
+<b>setExpanded</b>(<i>index, state</i>)
+<p>
+        Public method to set the expanded state of item.
+</p><dl>
+<dt><i>index</i> (QModelIndex)</dt>
+<dd>
+item to change expanded state
+</dd><dt><i>state</i> (bool)</dt>
+<dd>
+state of the item
 </dd>
-</dl><a NAME="VariableItem.attachDummy" ID="VariableItem.attachDummy"></a>
-<h4>VariableItem.attachDummy</h4>
-<b>attachDummy</b>(<i></i>)
+</dl><a NAME="VariablesModel.showVariables" ID="VariablesModel.showVariables"></a>
+<h4>VariablesModel.showVariables</h4>
+<b>showVariables</b>(<i>vlist, frmnr, pathlist=None</i>)
+<p>
+        Public method to update the data model of variable in pathlist.
+</p><dl>
+<dt><i>vlist</i> (list of str)</dt>
+<dd>
+the list of variables to be displayed. Each
+                list entry is a tuple of three values.
+                <ul>
+                <li>the variable name (string)</li>
+                <li>the variables type (string)</li>
+                <li>the variables value (string)</li>
+                </ul>
+</dd><dt><i>frmnr</i> (int)</dt>
+<dd>
+frame number (0 is the current frame)
+</dd><dt><i>pathlist</i> (list of str)</dt>
+<dd>
+full path to the variable
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
+<a NAME="VariablesProxyModel" ID="VariablesProxyModel"></a>
+<h2>VariablesProxyModel</h2>
 <p>
-        Public method to attach a dummy sub item to allow for lazy population.
-</p><a NAME="VariableItem.collapse" ID="VariableItem.collapse"></a>
-<h4>VariableItem.collapse</h4>
-<b>collapse</b>(<i></i>)
+    Class for handling the sort operations.
+</p>
+<h3>Derived from</h3>
+QSortFilterProxyModel
+<h3>Class Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Class Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#VariablesProxyModel.__init__">VariablesProxyModel</a></td>
+<td>Constructor</td>
+</tr><tr>
+<td><a href="#VariablesProxyModel.hasChildren">hasChildren</a></td>
+<td>Public method to get a flag if parent has children.</td>
+</tr><tr>
+<td><a href="#VariablesProxyModel.setExpanded">setExpanded</a></td>
+<td>Public slot to get a flag if parent has children.</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<a NAME="VariablesProxyModel.__init__" ID="VariablesProxyModel.__init__"></a>
+<h4>VariablesProxyModel (Constructor)</h4>
+<b>VariablesProxyModel</b>(<i>parent=None</i>)
 <p>
-        Public method to collapse the item.
+        Constructor
+</p><dl>
+<dt><i>parent</i> (QModelIndex)</dt>
+<dd>
+the parent model index
+</dd>
+</dl><a NAME="VariablesProxyModel.hasChildren" ID="VariablesProxyModel.hasChildren"></a>
+<h4>VariablesProxyModel.hasChildren</h4>
+<b>hasChildren</b>(<i>parent</i>)
+<p>
+        Public method to get a flag if parent has children.
 </p><p>
-        Note: This is just a do nothing and should be overwritten.
-</p><a NAME="VariableItem.data" ID="VariableItem.data"></a>
-<h4>VariableItem.data</h4>
-<b>data</b>(<i>column, role</i>)
-<p>
-        Public method to return the data for the requested role.
-</p><p>
-        This implementation changes the original behavior in a way, that the
-        display data is returned as the tooltip for column 1.
+        The given model index has to be transformed to the underlying source
+        model to get the correct result.
 </p><dl>
-<dt><i>column</i></dt>
+<dt><i>parent</i> (QModelIndex)</dt>
 <dd>
-column number (integer)
-</dd><dt><i>role</i></dt>
-<dd>
-data role (Qt.ItemDataRole)
+the model parent
 </dd>
 </dl><dl>
 <dt>Returns:</dt>
 <dd>
-requested data
-</dd>
-</dl><a NAME="VariableItem.deleteChildren" ID="VariableItem.deleteChildren"></a>
-<h4>VariableItem.deleteChildren</h4>
-<b>deleteChildren</b>(<i></i>)
-<p>
-        Public method to delete all children (cleaning the subtree).
-</p><a NAME="VariableItem.expand" ID="VariableItem.expand"></a>
-<h4>VariableItem.expand</h4>
-<b>expand</b>(<i></i>)
-<p>
-        Public method to expand the item.
-</p><p>
-        Note: This is just a do nothing and should be overwritten.
-</p><a NAME="VariableItem.getId" ID="VariableItem.getId"></a>
-<h4>VariableItem.getId</h4>
-<b>getId</b>(<i></i>)
-<p>
-        Public method to get the ID string.
-</p><dl>
-<dt>Returns:</dt>
-<dd>
-ID string
+flag if parent has children
 </dd>
 </dl><dl>
 <dt>Return Type:</dt>
 <dd>
-str
+bool
 </dd>
-</dl><a NAME="VariableItem.getValue" ID="VariableItem.getValue"></a>
-<h4>VariableItem.getValue</h4>
-<b>getValue</b>(<i></i>)
+</dl><a NAME="VariablesProxyModel.setExpanded" ID="VariablesProxyModel.setExpanded"></a>
+<h4>VariablesProxyModel.setExpanded</h4>
+<b>setExpanded</b>(<i>index, state</i>)
 <p>
-        Public method to return the value of the item.
+        Public slot to get a flag if parent has children.
+</p><p>
+        The given model index has to be transformed to the underlying source
+        model to get the correct result.
 </p><dl>
-<dt>Returns:</dt>
+<dt><i>index</i> (QModelIndex)</dt>
 <dd>
-value of the item (string)
+item to change expanded state
+</dd><dt><i>state</i> (bool)</dt>
+<dd>
+state of the item
 </dd>
 </dl>
 <div align="right"><a href="#top">Up</a></div>
@@ -428,20 +689,28 @@
 <a NAME="VariablesViewer" ID="VariablesViewer"></a>
 <h2>VariablesViewer</h2>
 <p>
-    Class implementing the variables viewer widget.
+    Class implementing the variables viewer view.
 </p><p>
-    This widget is used to display the variables of the program being
+    This view is used to display the variables of the program being
     debugged in a tree. Compound types will be shown with
     their main entry first. Once the subtree has been expanded, the
     individual entries will be shown. Double clicking an entry will
+    expand or collapse the item, if it has children and the double click
+    was performed on the first column of the tree, otherwise it'll
     popup a dialog showing the variables parameters in a more readable
     form. This is especially useful for lengthy strings.
 </p><p>
-    This widget has two modes for displaying the global and the local
+    This view has two modes for displaying the global and the local
     variables.
-</p>
+</p><h3>Signals</h3>
+<dl>
+<dt>preferencesChanged()</dt>
+<dd>
+to inform model about new background colours
+</dd>
+</dl>
 <h3>Derived from</h3>
-QTreeWidget
+QTreeView
 <h3>Class Attributes</h3>
 <table>
 <tr><td>None</td></tr>
@@ -456,39 +725,30 @@
 <td><a href="#VariablesViewer.__init__">VariablesViewer</a></td>
 <td>Constructor</td>
 </tr><tr>
-<td><a href="#VariablesViewer.__addItem">__addItem</a></td>
-<td>Private method used to add an item to the list.</td>
-</tr><tr>
-<td><a href="#VariablesViewer.__buildTreePath">__buildTreePath</a></td>
-<td>Private method to build up a path from the top to an item.</td>
+<td><a href="#VariablesViewer.__collapseChildren">__collapseChildren</a></td>
+<td>Private slot to collapse all child items of current parent.</td>
 </tr><tr>
 <td><a href="#VariablesViewer.__configure">__configure</a></td>
 <td>Private method to open the configuration dialog.</td>
 </tr><tr>
+<td><a href="#VariablesViewer.__configureFilter">__configureFilter</a></td>
+<td>Private method to open the variables filter dialog.</td>
+</tr><tr>
 <td><a href="#VariablesViewer.__createPopupMenus">__createPopupMenus</a></td>
 <td>Private method to generate the popup menus.</td>
 </tr><tr>
-<td><a href="#VariablesViewer.__expandItemSignal">__expandItemSignal</a></td>
-<td>Private slot to handle the expanded signal.</td>
-</tr><tr>
-<td><a href="#VariablesViewer.__findItem">__findItem</a></td>
-<td>Private method to search for an item.</td>
+<td><a href="#VariablesViewer.__expandChildren">__expandChildren</a></td>
+<td>Private slot to expand all child items of current parent.</td>
 </tr><tr>
-<td><a href="#VariablesViewer.__generateItem">__generateItem</a></td>
-<td>Private method used to generate a VariableItem.</td>
+<td><a href="#VariablesViewer.__itemDoubleClicked">__itemDoubleClicked</a></td>
+<td>Private method called if an item was double clicked.</td>
 </tr><tr>
-<td><a href="#VariablesViewer.__getDispType">__getDispType</a></td>
-<td>Private method used to get the display string for type vtype.</td>
+<td><a href="#VariablesViewer.__mdlRequestExpand">__mdlRequestExpand</a></td>
+<td>Private method to inform the view about items to be expand.</td>
 </tr><tr>
 <td><a href="#VariablesViewer.__refreshView">__refreshView</a></td>
 <td>Private slot to refresh the view.</td>
 </tr><tr>
-<td><a href="#VariablesViewer.__resort">__resort</a></td>
-<td>Private method to resort the tree.</td>
-</tr><tr>
-<td><a href="#VariablesViewer.__sectionClicked">__sectionClicked</a></td>
-<td>Private method handling a click onto a header section.</td>
-</tr><tr>
 <td><a href="#VariablesViewer.__showContextMenu">__showContextMenu</a></td>
 <td>Private slot to show the context menu.</td>
 </tr><tr>
@@ -498,23 +758,20 @@
 <td><a href="#VariablesViewer.__showVariableDetails">__showVariableDetails</a></td>
 <td>Private method to show details about a variable.</td>
 </tr><tr>
-<td><a href="#VariablesViewer.collapseItem">collapseItem</a></td>
-<td>Public slot to handle the collapsed signal.</td>
-</tr><tr>
-<td><a href="#VariablesViewer.expandItem">expandItem</a></td>
-<td>Public slot to handle the expanded signal.</td>
-</tr><tr>
 <td><a href="#VariablesViewer.handleResetUI">handleResetUI</a></td>
 <td>Public method to reset the VariablesViewer.</td>
 </tr><tr>
-<td><a href="#VariablesViewer.mouseDoubleClickEvent">mouseDoubleClickEvent</a></td>
-<td>Protected method of QAbstractItemView.</td>
+<td><a href="#VariablesViewer.resizeEvent">resizeEvent</a></td>
+<td>Protected slot informing about the widget size change.</td>
 </tr><tr>
 <td><a href="#VariablesViewer.showVariable">showVariable</a></td>
 <td>Public method to show variables in a list.</td>
 </tr><tr>
 <td><a href="#VariablesViewer.showVariables">showVariables</a></td>
 <td>Public method to show variables in a list.</td>
+</tr><tr>
+<td><a href="#VariablesViewer.verticalScrollbarValueChanged">verticalScrollbarValueChanged</a></td>
+<td>Public slot informing about the scrollbar change.</td>
 </tr>
 </table>
 <h3>Static Methods</h3>
@@ -527,180 +784,76 @@
 <p>
         Constructor
 </p><dl>
-<dt><i>viewer</i></dt>
+<dt><i>viewer</i> (DebugViewer)</dt>
 <dd>
-reference to the debug viewer object (DebugViewer)
-</dd><dt><i>globalScope</i></dt>
+reference to the debug viewer object
+</dd><dt><i>globalScope</i> (bool)</dt>
 <dd>
 flag indicating global (True) or local (False)
             variables
-</dd><dt><i>parent</i></dt>
-<dd>
-the parent (QWidget)
-</dd>
-</dl><a NAME="VariablesViewer.__addItem" ID="VariablesViewer.__addItem"></a>
-<h4>VariablesViewer.__addItem</h4>
-<b>__addItem</b>(<i>parent, vtype, var, value</i>)
-<p>
-        Private method used to add an item to the list.
-</p><p>
-        If the item is of a type with subelements (i.e. list, dictionary,
-        tuple), these subelements are added by calling this method recursively.
-</p><dl>
-<dt><i>parent</i></dt>
-<dd>
-the parent of the item to be added
-            (QTreeWidgetItem or None)
-</dd><dt><i>vtype</i></dt>
-<dd>
-the type of the item to be added
-            (string)
-</dd><dt><i>var</i></dt>
+</dd><dt><i>parent</i> (QWidget)</dt>
 <dd>
-the variable name (string)
-</dd><dt><i>value</i></dt>
-<dd>
-the value string (string)
-</dd>
-</dl><dl>
-<dt>Returns:</dt>
-<dd>
-The item that was added to the listview (QTreeWidgetItem).
+the parent
 </dd>
-</dl><a NAME="VariablesViewer.__buildTreePath" ID="VariablesViewer.__buildTreePath"></a>
-<h4>VariablesViewer.__buildTreePath</h4>
-<b>__buildTreePath</b>(<i>itm</i>)
+</dl><a NAME="VariablesViewer.__collapseChildren" ID="VariablesViewer.__collapseChildren"></a>
+<h4>VariablesViewer.__collapseChildren</h4>
+<b>__collapseChildren</b>(<i></i>)
 <p>
-        Private method to build up a path from the top to an item.
-</p><dl>
-<dt><i>itm</i></dt>
-<dd>
-item to build the path for (QTreeWidgetItem)
-</dd>
-</dl><dl>
-<dt>Returns:</dt>
-<dd>
-list of names denoting the path from the top (list of strings)
-</dd>
-</dl><a NAME="VariablesViewer.__configure" ID="VariablesViewer.__configure"></a>
+        Private slot to collapse all child items of current parent.
+</p><a NAME="VariablesViewer.__configure" ID="VariablesViewer.__configure"></a>
 <h4>VariablesViewer.__configure</h4>
 <b>__configure</b>(<i></i>)
 <p>
         Private method to open the configuration dialog.
+</p><a NAME="VariablesViewer.__configureFilter" ID="VariablesViewer.__configureFilter"></a>
+<h4>VariablesViewer.__configureFilter</h4>
+<b>__configureFilter</b>(<i></i>)
+<p>
+        Private method to open the variables filter dialog.
 </p><a NAME="VariablesViewer.__createPopupMenus" ID="VariablesViewer.__createPopupMenus"></a>
 <h4>VariablesViewer.__createPopupMenus</h4>
 <b>__createPopupMenus</b>(<i></i>)
 <p>
         Private method to generate the popup menus.
-</p><a NAME="VariablesViewer.__expandItemSignal" ID="VariablesViewer.__expandItemSignal"></a>
-<h4>VariablesViewer.__expandItemSignal</h4>
-<b>__expandItemSignal</b>(<i>parentItem</i>)
-<p>
-        Private slot to handle the expanded signal.
-</p><dl>
-<dt><i>parentItem</i></dt>
-<dd>
-reference to the item being expanded
-            (QTreeWidgetItem)
-</dd>
-</dl><a NAME="VariablesViewer.__findItem" ID="VariablesViewer.__findItem"></a>
-<h4>VariablesViewer.__findItem</h4>
-<b>__findItem</b>(<i>slist, column, node=None</i>)
+</p><a NAME="VariablesViewer.__expandChildren" ID="VariablesViewer.__expandChildren"></a>
+<h4>VariablesViewer.__expandChildren</h4>
+<b>__expandChildren</b>(<i></i>)
 <p>
-        Private method to search for an item.
-</p><p>
-        It is used to find a specific item in column,
-        that is a child of node. If node is None, a child of the
-        QTreeWidget is searched.
-</p><dl>
-<dt><i>slist</i></dt>
-<dd>
-searchlist (list of strings)
-</dd><dt><i>column</i></dt>
-<dd>
-index of column to search in (int)
-</dd><dt><i>node</i></dt>
-<dd>
-start point of the search
-</dd>
-</dl><dl>
-<dt>Returns:</dt>
-<dd>
-the found item or None
-</dd>
-</dl><a NAME="VariablesViewer.__generateItem" ID="VariablesViewer.__generateItem"></a>
-<h4>VariablesViewer.__generateItem</h4>
-<b>__generateItem</b>(<i>parent, dvar, dvalue, dtype, isSpecial=False</i>)
+        Private slot to expand all child items of current parent.
+</p><a NAME="VariablesViewer.__itemDoubleClicked" ID="VariablesViewer.__itemDoubleClicked"></a>
+<h4>VariablesViewer.__itemDoubleClicked</h4>
+<b>__itemDoubleClicked</b>(<i>index</i>)
 <p>
-        Private method used to generate a VariableItem.
+        Private method called if an item was double clicked.
 </p><dl>
-<dt><i>parent</i></dt>
-<dd>
-parent of the item to be generated
-</dd><dt><i>dvar</i></dt>
+<dt><i>index</i> (QModelIndex)</dt>
 <dd>
-variable name (string)
-</dd><dt><i>dvalue</i></dt>
-<dd>
-value string (string)
-</dd><dt><i>dtype</i></dt>
-<dd>
-type string (string)
-</dd><dt><i>isSpecial</i></dt>
-<dd>
-flag indicating that a special node should be
-            generated (boolean)
+the double clicked item
 </dd>
-</dl><dl>
-<dt>Returns:</dt>
-<dd>
-The item that was generated (VariableItem).
-</dd>
-</dl><a NAME="VariablesViewer.__getDispType" ID="VariablesViewer.__getDispType"></a>
-<h4>VariablesViewer.__getDispType</h4>
-<b>__getDispType</b>(<i>vtype</i>)
+</dl><a NAME="VariablesViewer.__mdlRequestExpand" ID="VariablesViewer.__mdlRequestExpand"></a>
+<h4>VariablesViewer.__mdlRequestExpand</h4>
+<b>__mdlRequestExpand</b>(<i>modelIndex</i>)
 <p>
-        Private method used to get the display string for type vtype.
+        Private method to inform the view about items to be expand.
 </p><dl>
-<dt><i>vtype</i></dt>
+<dt><i>modelIndex</i> (QModelIndex)</dt>
 <dd>
-the type, the display string should be looked up for
-              (string)
-</dd>
-</dl><dl>
-<dt>Returns:</dt>
-<dd>
-displaystring (string)
+the model index
 </dd>
 </dl><a NAME="VariablesViewer.__refreshView" ID="VariablesViewer.__refreshView"></a>
 <h4>VariablesViewer.__refreshView</h4>
 <b>__refreshView</b>(<i></i>)
 <p>
         Private slot to refresh the view.
-</p><a NAME="VariablesViewer.__resort" ID="VariablesViewer.__resort"></a>
-<h4>VariablesViewer.__resort</h4>
-<b>__resort</b>(<i>parent=None</i>)
-<p>
-        Private method to resort the tree.
-</p><dl>
-<dt><i>parent</i> (QTreeWidgetItem)</dt>
-<dd>
-reference to a parent item
-</dd>
-</dl><a NAME="VariablesViewer.__sectionClicked" ID="VariablesViewer.__sectionClicked"></a>
-<h4>VariablesViewer.__sectionClicked</h4>
-<b>__sectionClicked</b>(<i></i>)
-<p>
-        Private method handling a click onto a header section.
 </p><a NAME="VariablesViewer.__showContextMenu" ID="VariablesViewer.__showContextMenu"></a>
 <h4>VariablesViewer.__showContextMenu</h4>
 <b>__showContextMenu</b>(<i>coord</i>)
 <p>
         Private slot to show the context menu.
 </p><dl>
-<dt><i>coord</i></dt>
+<dt><i>coord</i> (QPoint)</dt>
 <dd>
-the position of the mouse pointer (QPoint)
+the position of the mouse pointer
 </dd>
 </dl><a NAME="VariablesViewer.__showDetails" ID="VariablesViewer.__showDetails"></a>
 <h4>VariablesViewer.__showDetails</h4>
@@ -709,53 +862,28 @@
         Private slot to show details about the selected variable.
 </p><a NAME="VariablesViewer.__showVariableDetails" ID="VariablesViewer.__showVariableDetails"></a>
 <h4>VariablesViewer.__showVariableDetails</h4>
-<b>__showVariableDetails</b>(<i>itm</i>)
+<b>__showVariableDetails</b>(<i>index</i>)
 <p>
         Private method to show details about a variable.
 </p><dl>
-<dt><i>itm</i></dt>
+<dt><i>index</i> (QModelIndex)</dt>
 <dd>
 reference to the variable item
 </dd>
-</dl><a NAME="VariablesViewer.collapseItem" ID="VariablesViewer.collapseItem"></a>
-<h4>VariablesViewer.collapseItem</h4>
-<b>collapseItem</b>(<i>parentItem</i>)
-<p>
-        Public slot to handle the collapsed signal.
-</p><dl>
-<dt><i>parentItem</i></dt>
-<dd>
-reference to the item being collapsed
-            (QTreeWidgetItem)
-</dd>
-</dl><a NAME="VariablesViewer.expandItem" ID="VariablesViewer.expandItem"></a>
-<h4>VariablesViewer.expandItem</h4>
-<b>expandItem</b>(<i>parentItem</i>)
-<p>
-        Public slot to handle the expanded signal.
-</p><dl>
-<dt><i>parentItem</i></dt>
-<dd>
-reference to the item being expanded
-            (QTreeWidgetItem)
-</dd>
 </dl><a NAME="VariablesViewer.handleResetUI" ID="VariablesViewer.handleResetUI"></a>
 <h4>VariablesViewer.handleResetUI</h4>
 <b>handleResetUI</b>(<i></i>)
 <p>
         Public method to reset the VariablesViewer.
-</p><a NAME="VariablesViewer.mouseDoubleClickEvent" ID="VariablesViewer.mouseDoubleClickEvent"></a>
-<h4>VariablesViewer.mouseDoubleClickEvent</h4>
-<b>mouseDoubleClickEvent</b>(<i>mouseEvent</i>)
+</p><a NAME="VariablesViewer.resizeEvent" ID="VariablesViewer.resizeEvent"></a>
+<h4>VariablesViewer.resizeEvent</h4>
+<b>resizeEvent</b>(<i>event</i>)
 <p>
-        Protected method of QAbstractItemView.
-</p><p>
-        Reimplemented to disable expanding/collapsing of items when
-        double-clicking. Instead the double-clicked entry is opened.
+        Protected slot informing about the widget size change.
 </p><dl>
-<dt><i>mouseEvent</i></dt>
+<dt><i>event</i> (QResizeEvent)</dt>
 <dd>
-the mouse event object (QMouseEvent)
+information
 </dd>
 </dl><a NAME="VariablesViewer.showVariable" ID="VariablesViewer.showVariable"></a>
 <h4>VariablesViewer.showVariable</h4>
@@ -763,11 +891,11 @@
 <p>
         Public method to show variables in a list.
 </p><dl>
-<dt><i>vlist</i></dt>
+<dt><i>vlist</i> (list)</dt>
 <dd>
 the list of subitems to be displayed.
                 The first element gives the path of the
-                parent variable. Each other listentry is
+                parent variable. Each other list entry is
                 a tuple of three values.
                 <ul>
                 <li>the variable name (string)</li>
@@ -781,18 +909,28 @@
 <p>
         Public method to show variables in a list.
 </p><dl>
-<dt><i>vlist</i></dt>
+<dt><i>vlist</i> (list)</dt>
 <dd>
 the list of variables to be displayed. Each
-                listentry is a tuple of three values.
+                list entry is a tuple of three values.
                 <ul>
                 <li>the variable name (string)</li>
                 <li>the variables type (string)</li>
                 <li>the variables value (string)</li>
                 </ul>
-</dd><dt><i>frmnr</i></dt>
+</dd><dt><i>frmnr</i> (int)</dt>
 <dd>
-frame number (0 is the current frame) (int)
+frame number (0 is the current frame)
+</dd>
+</dl><a NAME="VariablesViewer.verticalScrollbarValueChanged" ID="VariablesViewer.verticalScrollbarValueChanged"></a>
+<h4>VariablesViewer.verticalScrollbarValueChanged</h4>
+<b>verticalScrollbarValueChanged</b>(<i>value</i>)
+<p>
+        Public slot informing about the scrollbar change.
+</p><dl>
+<dt><i>value</i> (int)</dt>
+<dd>
+current value of the vertical scrollbar
 </dd>
 </dl>
 <div align="right"><a href="#top">Up</a></div>
--- a/eric6/Documentation/Source/eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Documentation/Source/eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html	Sun Jun 02 11:42:48 2019 +0200
@@ -87,6 +87,9 @@
 <td><a href="#BugBearVisitor.visit">visit</a></td>
 <td>Public method to traverse a given AST node.</td>
 </tr><tr>
+<td><a href="#BugBearVisitor.visit_Assert">visit_Assert</a></td>
+<td>Public method to handle 'assert' statements.</td>
+</tr><tr>
 <td><a href="#BugBearVisitor.visit_Assign">visit_Assign</a></td>
 <td>Public method to handle assignments.</td>
 </tr><tr>
@@ -99,6 +102,9 @@
 <td><a href="#BugBearVisitor.visit_For">visit_For</a></td>
 <td>Public method to handle 'for' statements.</td>
 </tr><tr>
+<td><a href="#BugBearVisitor.visit_JoinedStr">visit_JoinedStr</a></td>
+<td>Public method to handle f-string arguments.</td>
+</tr><tr>
 <td><a href="#BugBearVisitor.visit_UAdd">visit_UAdd</a></td>
 <td>Public method to handle unary additions.</td>
 </tr>
@@ -142,6 +148,16 @@
 <dd>
 AST node to be traversed
 </dd>
+</dl><a NAME="BugBearVisitor.visit_Assert" ID="BugBearVisitor.visit_Assert"></a>
+<h4>BugBearVisitor.visit_Assert</h4>
+<b>visit_Assert</b>(<i>node</i>)
+<p>
+        Public method to handle 'assert' statements.
+</p><dl>
+<dt><i>node</i> (ast.Assert)</dt>
+<dd>
+reference to the node to be processed
+</dd>
 </dl><a NAME="BugBearVisitor.visit_Assign" ID="BugBearVisitor.visit_Assign"></a>
 <h4>BugBearVisitor.visit_Assign</h4>
 <b>visit_Assign</b>(<i>node</i>)
@@ -182,6 +198,16 @@
 <dd>
 reference to the node to be processed
 </dd>
+</dl><a NAME="BugBearVisitor.visit_JoinedStr" ID="BugBearVisitor.visit_JoinedStr"></a>
+<h4>BugBearVisitor.visit_JoinedStr</h4>
+<b>visit_JoinedStr</b>(<i>node</i>)
+<p>
+        Public method to handle f-string arguments.
+</p><dl>
+<dt><i>node</i> (ast.JoinedStr)</dt>
+<dd>
+reference to the node to be processed
+</dd>
 </dl><a NAME="BugBearVisitor.visit_UAdd" ID="BugBearVisitor.visit_UAdd"></a>
 <h4>BugBearVisitor.visit_UAdd</h4>
 <b>visit_UAdd</b>(<i>node</i>)
@@ -399,7 +425,7 @@
 <td>Constructor</td>
 </tr><tr>
 <td><a href="#MiscellaneousChecker.__checkBugBear">__checkBugBear</a></td>
-<td>Private method to bugbear checks.</td>
+<td>Private method for bugbear checks.</td>
 </tr><tr>
 <td><a href="#MiscellaneousChecker.__checkBuiltins">__checkBuiltins</a></td>
 <td>Private method to check, if built-ins are shadowed.</td>
@@ -501,7 +527,7 @@
 <h4>MiscellaneousChecker.__checkBugBear</h4>
 <b>__checkBugBear</b>(<i></i>)
 <p>
-        Private method to bugbear checks.
+        Private method for bugbear checks.
 </p><a NAME="MiscellaneousChecker.__checkBuiltins" ID="MiscellaneousChecker.__checkBuiltins"></a>
 <h4>MiscellaneousChecker.__checkBuiltins</h4>
 <b>__checkBuiltins</b>(<i></i>)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/Documentation/Source/eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.HgCloseHeadSelectionDialog.html	Sun Jun 02 11:42:48 2019 +0200
@@ -0,0 +1,141 @@
+<!DOCTYPE html>
+<html><head>
+<title>eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.HgCloseHeadSelectionDialog</title>
+<meta charset="UTF-8">
+<style>
+body {
+    background: #EDECE6;
+    margin: 0em 1em 10em 1em;
+    color: black;
+}
+
+h1 { color: white; background: #85774A; }
+h2 { color: white; background: #85774A; }
+h3 { color: white; background: #9D936E; }
+h4 { color: white; background: #9D936E; }
+    
+a { color: #BA6D36; }
+
+</style>
+</head>
+<body><a NAME="top" ID="top"></a>
+<h1>eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.HgCloseHeadSelectionDialog</h1>
+<p>
+Module implementing a dialog to select the heads to be closed.
+</p>
+<h3>Global Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Classes</h3>
+<table>
+<tr>
+<td><a href="#HgCloseHeadSelectionDialog">HgCloseHeadSelectionDialog</a></td>
+<td>Class implementing a dialog to select the heads to be closed.</td>
+</tr>
+</table>
+<h3>Functions</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<hr /><hr />
+<a NAME="HgCloseHeadSelectionDialog" ID="HgCloseHeadSelectionDialog"></a>
+<h2>HgCloseHeadSelectionDialog</h2>
+<p>
+    Class implementing a dialog to select the heads to be closed.
+</p>
+<h3>Derived from</h3>
+QDialog, Ui_HgCloseHeadSelectionDialog
+<h3>Class Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Class Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#HgCloseHeadSelectionDialog.__init__">HgCloseHeadSelectionDialog</a></td>
+<td>Constructor</td>
+</tr><tr>
+<td><a href="#HgCloseHeadSelectionDialog.__getHeads">__getHeads</a></td>
+<td>Private method to get the open heads.</td>
+</tr><tr>
+<td><a href="#HgCloseHeadSelectionDialog.getData">getData</a></td>
+<td>Public method to retrieve the entered data.</td>
+</tr><tr>
+<td><a href="#HgCloseHeadSelectionDialog.on_headsList_itemSelectionChanged">on_headsList_itemSelectionChanged</a></td>
+<td>Private slot handling changes of the selection.</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<a NAME="HgCloseHeadSelectionDialog.__init__" ID="HgCloseHeadSelectionDialog.__init__"></a>
+<h4>HgCloseHeadSelectionDialog (Constructor)</h4>
+<b>HgCloseHeadSelectionDialog</b>(<i>vcs, ppath, parent=None</i>)
+<p>
+        Constructor
+</p><dl>
+<dt><i>vcs</i> (Hg)</dt>
+<dd>
+reference to the VCS object
+</dd><dt><i>ppath</i> (str)</dt>
+<dd>
+directory containing the repository
+</dd><dt><i>parent</i> (QWidget)</dt>
+<dd>
+reference to the parent widget
+</dd>
+</dl><a NAME="HgCloseHeadSelectionDialog.__getHeads" ID="HgCloseHeadSelectionDialog.__getHeads"></a>
+<h4>HgCloseHeadSelectionDialog.__getHeads</h4>
+<b>__getHeads</b>(<i>vcs, ppath</i>)
+<p>
+        Private method to get the open heads.
+</p><dl>
+<dt><i>vcs</i> (Hg)</dt>
+<dd>
+reference to the VCS object
+</dd><dt><i>ppath</i> (str)</dt>
+<dd>
+directory containing the repository
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+list of tuples containing the revision and the corresponding
+            branch name
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+list of tuples of (str, str)
+</dd>
+</dl><a NAME="HgCloseHeadSelectionDialog.getData" ID="HgCloseHeadSelectionDialog.getData"></a>
+<h4>HgCloseHeadSelectionDialog.getData</h4>
+<b>getData</b>(<i></i>)
+<p>
+        Public method to retrieve the entered data.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+tuple containing a list of selected revisions and the commit
+            message
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (list of str, str)
+</dd>
+</dl><a NAME="HgCloseHeadSelectionDialog.on_headsList_itemSelectionChanged" ID="HgCloseHeadSelectionDialog.on_headsList_itemSelectionChanged"></a>
+<h4>HgCloseHeadSelectionDialog.on_headsList_itemSelectionChanged</h4>
+<b>on_headsList_itemSelectionChanged</b>(<i></i>)
+<p>
+        Private slot handling changes of the selection.
+</p>
+<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/eric6/Documentation/Source/eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper.html	Sun Jun 02 11:42:48 2019 +0200
@@ -0,0 +1,128 @@
+<!DOCTYPE html>
+<html><head>
+<title>eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper</title>
+<meta charset="UTF-8">
+<style>
+body {
+    background: #EDECE6;
+    margin: 0em 1em 10em 1em;
+    color: black;
+}
+
+h1 { color: white; background: #85774A; }
+h2 { color: white; background: #85774A; }
+h3 { color: white; background: #9D936E; }
+h4 { color: white; background: #9D936E; }
+    
+a { color: #BA6D36; }
+
+</style>
+</head>
+<body><a NAME="top" ID="top"></a>
+<h1>eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper</h1>
+<p>
+Module implementing the closehead extension project helper.
+</p>
+<h3>Global Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Classes</h3>
+<table>
+<tr>
+<td><a href="#CloseheadProjectHelper">CloseheadProjectHelper</a></td>
+<td>Class implementing the closehead extension project helper.</td>
+</tr>
+</table>
+<h3>Functions</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<hr /><hr />
+<a NAME="CloseheadProjectHelper" ID="CloseheadProjectHelper"></a>
+<h2>CloseheadProjectHelper</h2>
+<p>
+    Class implementing the closehead extension project helper.
+</p>
+<h3>Derived from</h3>
+HgExtensionProjectHelper
+<h3>Class Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Class Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#CloseheadProjectHelper.__init__">CloseheadProjectHelper</a></td>
+<td>Constructor</td>
+</tr><tr>
+<td><a href="#CloseheadProjectHelper.__hgClosehead">__hgClosehead</a></td>
+<td>Private slot used to close arbitrary heads.</td>
+</tr><tr>
+<td><a href="#CloseheadProjectHelper.initActions">initActions</a></td>
+<td>Public method to generate the action objects.</td>
+</tr><tr>
+<td><a href="#CloseheadProjectHelper.initMenu">initMenu</a></td>
+<td>Public method to generate the extension menu.</td>
+</tr><tr>
+<td><a href="#CloseheadProjectHelper.menuTitle">menuTitle</a></td>
+<td>Public method to get the menu title.</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<a NAME="CloseheadProjectHelper.__init__" ID="CloseheadProjectHelper.__init__"></a>
+<h4>CloseheadProjectHelper (Constructor)</h4>
+<b>CloseheadProjectHelper</b>(<i></i>)
+<p>
+        Constructor
+</p><a NAME="CloseheadProjectHelper.__hgClosehead" ID="CloseheadProjectHelper.__hgClosehead"></a>
+<h4>CloseheadProjectHelper.__hgClosehead</h4>
+<b>__hgClosehead</b>(<i></i>)
+<p>
+        Private slot used to close arbitrary heads.
+</p><a NAME="CloseheadProjectHelper.initActions" ID="CloseheadProjectHelper.initActions"></a>
+<h4>CloseheadProjectHelper.initActions</h4>
+<b>initActions</b>(<i></i>)
+<p>
+        Public method to generate the action objects.
+</p><a NAME="CloseheadProjectHelper.initMenu" ID="CloseheadProjectHelper.initMenu"></a>
+<h4>CloseheadProjectHelper.initMenu</h4>
+<b>initMenu</b>(<i>mainMenu</i>)
+<p>
+        Public method to generate the extension menu.
+</p><dl>
+<dt><i>mainMenu</i> (QMenu)</dt>
+<dd>
+reference to the main menu
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+populated menu (QMenu)
+</dd>
+</dl><a NAME="CloseheadProjectHelper.menuTitle" ID="CloseheadProjectHelper.menuTitle"></a>
+<h4>CloseheadProjectHelper.menuTitle</h4>
+<b>menuTitle</b>(<i></i>)
+<p>
+        Public method to get the menu title.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+title of the menu
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+str
+</dd>
+</dl>
+<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/eric6/Documentation/Source/eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.closehead.html	Sun Jun 02 11:42:48 2019 +0200
@@ -0,0 +1,97 @@
+<!DOCTYPE html>
+<html><head>
+<title>eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.closehead</title>
+<meta charset="UTF-8">
+<style>
+body {
+    background: #EDECE6;
+    margin: 0em 1em 10em 1em;
+    color: black;
+}
+
+h1 { color: white; background: #85774A; }
+h2 { color: white; background: #85774A; }
+h3 { color: white; background: #9D936E; }
+h4 { color: white; background: #9D936E; }
+    
+a { color: #BA6D36; }
+
+</style>
+</head>
+<body><a NAME="top" ID="top"></a>
+<h1>eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.closehead</h1>
+<p>
+Module implementing the closehead extension interface.
+</p>
+<h3>Global Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Classes</h3>
+<table>
+<tr>
+<td><a href="#Closehead">Closehead</a></td>
+<td>Class implementing the strip extension interface.</td>
+</tr>
+</table>
+<h3>Functions</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<hr /><hr />
+<a NAME="Closehead" ID="Closehead"></a>
+<h2>Closehead</h2>
+<p>
+    Class implementing the strip extension interface.
+</p>
+<h3>Derived from</h3>
+HgExtension
+<h3>Class Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Class Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#Closehead.__init__">Closehead</a></td>
+<td>Constructor</td>
+</tr><tr>
+<td><a href="#Closehead.hgCloseheads">hgCloseheads</a></td>
+<td>Public method to close arbitrary heads.</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<a NAME="Closehead.__init__" ID="Closehead.__init__"></a>
+<h4>Closehead (Constructor)</h4>
+<b>Closehead</b>(<i>vcs</i>)
+<p>
+        Constructor
+</p><dl>
+<dt><i>vcs</i> (Hg)</dt>
+<dd>
+reference to the Mercurial vcs object
+</dd>
+</dl><a NAME="Closehead.hgCloseheads" ID="Closehead.hgCloseheads"></a>
+<h4>Closehead.hgCloseheads</h4>
+<b>hgCloseheads</b>(<i>name, revisions=None</i>)
+<p>
+        Public method to close arbitrary heads.
+</p><dl>
+<dt><i>name</i> (str)</dt>
+<dd>
+file/directory name
+</dd><dt><i>revisions</i> (str)</dt>
+<dd>
+revisions of branch heads to be closed
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+</body></html>
\ No newline at end of file
--- a/eric6/Documentation/Source/eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.html	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Documentation/Source/eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.html	Sun Jun 02 11:42:48 2019 +0200
@@ -81,6 +81,9 @@
 <td><a href="#HgLogBrowserDialog.__bundleActTriggered">__bundleActTriggered</a></td>
 <td>Private slot to create a changegroup file.</td>
 </tr><tr>
+<td><a href="#HgLogBrowserDialog.__closeHeadsActTriggered">__closeHeadsActTriggered</a></td>
+<td>Private slot to close the selected head revisions.</td>
+</tr><tr>
 <td><a href="#HgLogBrowserDialog.__fetchActTriggered">__fetchActTriggered</a></td>
 <td>Private slot to fetch changes from a remote repository.</td>
 </tr><tr>
@@ -117,6 +120,9 @@
 <td><a href="#HgLogBrowserDialog.__getColor">__getColor</a></td>
 <td>Private method to get the (rotating) name of the color given an index.</td>
 </tr><tr>
+<td><a href="#HgLogBrowserDialog.__getHeads">__getHeads</a></td>
+<td>Private method to get the list of all heads.</td>
+</tr><tr>
 <td><a href="#HgLogBrowserDialog.__getLogEntries">__getLogEntries</a></td>
 <td>Private method to retrieve log entries from the repository.</td>
 </tr><tr>
@@ -325,19 +331,19 @@
 </table>
 <a NAME="HgLogBrowserDialog.__init__" ID="HgLogBrowserDialog.__init__"></a>
 <h4>HgLogBrowserDialog (Constructor)</h4>
-<b>HgLogBrowserDialog</b>(<i>vcs, mode="log", parent=None</i>)
+<b>HgLogBrowserDialog</b>(<i>vcs, mode="", parent=None</i>)
 <p>
         Constructor
 </p><dl>
-<dt><i>vcs</i></dt>
+<dt><i>vcs</i> (Hg)</dt>
 <dd>
 reference to the vcs object
-</dd><dt><i>mode</i></dt>
+</dd><dt><i>mode</i> (str (one of log, full_log, incoming, outgoing))</dt>
 <dd>
-mode of the dialog (string; one of log, incoming, outgoing)
-</dd><dt><i>parent</i></dt>
+mode of the dialog
+</dd><dt><i>parent</i> (QWidget)</dt>
 <dd>
-parent widget (QWidget)
+parent widget
 </dd>
 </dl><a NAME="HgLogBrowserDialog.__actionMode" ID="HgLogBrowserDialog.__actionMode"></a>
 <h4>HgLogBrowserDialog.__actionMode</h4>
@@ -402,6 +408,11 @@
 <b>__bundleActTriggered</b>(<i></i>)
 <p>
         Private slot to create a changegroup file.
+</p><a NAME="HgLogBrowserDialog.__closeHeadsActTriggered" ID="HgLogBrowserDialog.__closeHeadsActTriggered"></a>
+<h4>HgLogBrowserDialog.__closeHeadsActTriggered</h4>
+<b>__closeHeadsActTriggered</b>(<i></i>)
+<p>
+        Private slot to close the selected head revisions.
 </p><a NAME="HgLogBrowserDialog.__fetchActTriggered" ID="HgLogBrowserDialog.__fetchActTriggered"></a>
 <h4>HgLogBrowserDialog.__fetchActTriggered</h4>
 <b>__fetchActTriggered</b>(<i></i>)
@@ -485,41 +496,47 @@
 </dd>
 </dl><a NAME="HgLogBrowserDialog.__generateIcon" ID="HgLogBrowserDialog.__generateIcon"></a>
 <h4>HgLogBrowserDialog.__generateIcon</h4>
-<b>__generateIcon</b>(<i>column, color, bottomedges, topedges, dotColor, currentRev, closed</i>)
+<b>__generateIcon</b>(<i>column, color, bottomedges, topedges, dotColor, currentRev, closed, isDraft</i>)
 <p>
         Private method to generate an icon containing the revision tree for the
         given data.
 </p><dl>
-<dt><i>column</i></dt>
+<dt><i>column</i> (int)</dt>
 <dd>
-column index of the revision (integer)
-</dd><dt><i>color</i></dt>
+column index of the revision
+</dd><dt><i>color</i> (int)</dt>
 <dd>
-color of the node (integer)
-</dd><dt><i>bottomedges</i></dt>
+color of the node
+</dd><dt><i>bottomedges</i> (list of tuples of (int, int, int))</dt>
 <dd>
 list of edges for the bottom of the node
-            (list of tuples of three integers)
-</dd><dt><i>topedges</i></dt>
+</dd><dt><i>topedges</i> (list of tuples of (int, int, int))</dt>
 <dd>
 list of edges for the top of the node
-            (list of tuples of three integers)
-</dd><dt><i>dotColor</i></dt>
+</dd><dt><i>dotColor</i> (QColor)</dt>
 <dd>
-color to be used for the dot (QColor)
-</dd><dt><i>currentRev</i></dt>
+color to be used for the dot
+</dd><dt><i>currentRev</i> (bool)</dt>
 <dd>
 flag indicating to draw the icon for the
-            current revision (boolean)
-</dd><dt><i>closed</i></dt>
+            current revision
+</dd><dt><i>closed</i> (bool)</dt>
 <dd>
 flag indicating to draw an icon for a closed
-            branch (boolean)
+            branch
+</dd><dt><i>isDraft</i> (bool)</dt>
+<dd>
+flag indicating an entry of phase 'draft'
 </dd>
 </dl><dl>
 <dt>Returns:</dt>
 <dd>
-icon for the node (QIcon)
+icon for the node
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+QIcon
 </dd>
 </dl><a NAME="HgLogBrowserDialog.__generateLogItem" ID="HgLogBrowserDialog.__generateLogItem"></a>
 <h4>HgLogBrowserDialog.__generateLogItem</h4>
@@ -593,7 +610,12 @@
 <dd>
 color name (string)
 </dd>
-</dl><a NAME="HgLogBrowserDialog.__getLogEntries" ID="HgLogBrowserDialog.__getLogEntries"></a>
+</dl><a NAME="HgLogBrowserDialog.__getHeads" ID="HgLogBrowserDialog.__getHeads"></a>
+<h4>HgLogBrowserDialog.__getHeads</h4>
+<b>__getHeads</b>(<i></i>)
+<p>
+        Private method to get the list of all heads.
+</p><a NAME="HgLogBrowserDialog.__getLogEntries" ID="HgLogBrowserDialog.__getLogEntries"></a>
 <h4>HgLogBrowserDialog.__getLogEntries</h4>
 <b>__getLogEntries</b>(<i>startRev=None, noEntries=0</i>)
 <p>
@@ -1035,10 +1057,16 @@
 </dd>
 </dl><a NAME="HgLogBrowserDialog.on_refreshButton_clicked" ID="HgLogBrowserDialog.on_refreshButton_clicked"></a>
 <h4>HgLogBrowserDialog.on_refreshButton_clicked</h4>
-<b>on_refreshButton_clicked</b>(<i></i>)
+<b>on_refreshButton_clicked</b>(<i>addNext=False</i>)
 <p>
         Private slot to refresh the log.
-</p><a NAME="HgLogBrowserDialog.on_rxEdit_returnPressed" ID="HgLogBrowserDialog.on_rxEdit_returnPressed"></a>
+</p><dl>
+<dt><i>addNext</i> (bool)</dt>
+<dd>
+flag indicating to get a second batch of log entries as
+            well
+</dd>
+</dl><a NAME="HgLogBrowserDialog.on_rxEdit_returnPressed" ID="HgLogBrowserDialog.on_rxEdit_returnPressed"></a>
 <h4>HgLogBrowserDialog.on_rxEdit_returnPressed</h4>
 <b>on_rxEdit_returnPressed</b>(<i></i>)
 <p>
--- a/eric6/Documentation/Source/eric6.Plugins.VcsPlugins.vcsMercurial.HgTagBranchListDialog.html	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Documentation/Source/eric6.Plugins.VcsPlugins.vcsMercurial.HgTagBranchListDialog.html	Sun Jun 02 11:42:48 2019 +0200
@@ -63,6 +63,9 @@
 <td><a href="#HgTagBranchListDialog.__closeBranch">__closeBranch</a></td>
 <td>Private slot to close the selected branch.</td>
 </tr><tr>
+<td><a href="#HgTagBranchListDialog.__closeBranchHeads">__closeBranchHeads</a></td>
+<td>Private slot to close the selected branches.</td>
+</tr><tr>
 <td><a href="#HgTagBranchListDialog.__finish">__finish</a></td>
 <td>Private slot called when the process finished or the user pressed the button.</td>
 </tr><tr>
@@ -146,6 +149,11 @@
 <b>__closeBranch</b>(<i></i>)
 <p>
         Private slot to close the selected branch.
+</p><a NAME="HgTagBranchListDialog.__closeBranchHeads" ID="HgTagBranchListDialog.__closeBranchHeads"></a>
+<h4>HgTagBranchListDialog.__closeBranchHeads</h4>
+<b>__closeBranchHeads</b>(<i></i>)
+<p>
+        Private slot to close the selected branches.
 </p><a NAME="HgTagBranchListDialog.__finish" ID="HgTagBranchListDialog.__finish"></a>
 <h4>HgTagBranchListDialog.__finish</h4>
 <b>__finish</b>(<i></i>)
--- a/eric6/Documentation/Source/eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.HgShelveDataDialog.html	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Documentation/Source/eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.HgShelveDataDialog.html	Sun Jun 02 11:42:48 2019 +0200
@@ -70,13 +70,16 @@
 </table>
 <a NAME="HgShelveDataDialog.__init__" ID="HgShelveDataDialog.__init__"></a>
 <h4>HgShelveDataDialog (Constructor)</h4>
-<b>HgShelveDataDialog</b>(<i>parent=None</i>)
+<b>HgShelveDataDialog</b>(<i>version, parent=None</i>)
 <p>
         Constructor
 </p><dl>
-<dt><i>parent</i></dt>
+<dt><i>version</i> (tuple of three int)</dt>
 <dd>
-reference to the parent widget (QWidget)
+Mercurial version
+</dd><dt><i>parent</i> (QWidget)</dt>
+<dd>
+reference to the parent widget
 </dd>
 </dl><a NAME="HgShelveDataDialog.getData" ID="HgShelveDataDialog.getData"></a>
 <h4>HgShelveDataDialog.getData</h4>
@@ -86,9 +89,14 @@
 </p><dl>
 <dt>Returns:</dt>
 <dd>
-tuple containing the name (string), date (QDateTime),
-            message (string) and a flag indicating to add/remove
-            new/missing files (boolean)
+tuple containing the name, date, message, a flag indicating
+            to add/remove new/missing files and a flag indicating to keep the
+            shelved changes in the working directory
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (str, QDateTime, str, bool, bool)
 </dd>
 </dl>
 <div align="right"><a href="#top">Up</a></div>
--- a/eric6/Documentation/Source/eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Documentation/Source/eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html	Sun Jun 02 11:42:48 2019 +0200
@@ -51,7 +51,7 @@
 QDialog, Ui_SetupWizardDialog
 <h3>Class Attributes</h3>
 <table>
-<tr><td>None</td></tr>
+<tr><td>ClassifiersUrl</td></tr>
 </table>
 <h3>Class Methods</h3>
 <table>
@@ -69,6 +69,9 @@
 <td><a href="#SetupWizardDialog.__addPackage">__addPackage</a></td>
 <td>Private method to add a package to the list.</td>
 </tr><tr>
+<td><a href="#SetupWizardDialog.__classifiersDownloadDone">__classifiersDownloadDone</a></td>
+<td>Private slot called, after the classifiers file has been downloaded from the internet.</td>
+</tr><tr>
 <td><a href="#SetupWizardDialog.__enableOkButton">__enableOkButton</a></td>
 <td>Private slot to set the state of the OK button.</td>
 </tr><tr>
@@ -78,8 +81,11 @@
 <td><a href="#SetupWizardDialog.__getStartDir">__getStartDir</a></td>
 <td>Private method to get the start directory for selection dialogs.</td>
 </tr><tr>
-<td><a href="#SetupWizardDialog.__populateFromTroveLists">__populateFromTroveLists</a></td>
-<td>Private method to populate lists from the Trove list file.</td>
+<td><a href="#SetupWizardDialog.__loadClassifiersFromPyPI">__loadClassifiersFromPyPI</a></td>
+<td>Private method to populate the classifiers list with data retrieved from PyPI.</td>
+</tr><tr>
+<td><a href="#SetupWizardDialog.__populateClassifiers">__populateClassifiers</a></td>
+<td>Private method to populate the classifiers.</td>
 </tr><tr>
 <td><a href="#SetupWizardDialog.getCode">getCode</a></td>
 <td>Public method to get the source code.</td>
@@ -120,6 +126,9 @@
 <td><a href="#SetupWizardDialog.on_excludePatternList_itemSelectionChanged">on_excludePatternList_itemSelectionChanged</a></td>
 <td>Private slot to handle a change of selected items of the exclude pattern list.</td>
 </tr><tr>
+<td><a href="#SetupWizardDialog.on_localClassifiersButton_clicked">on_localClassifiersButton_clicked</a></td>
+<td>Private method to populate lists from the Trove list file.</td>
+</tr><tr>
 <td><a href="#SetupWizardDialog.on_modulesList_itemSelectionChanged">on_modulesList_itemSelectionChanged</a></td>
 <td>Private slot to handle a change of selected items of the modules list.</td>
 </tr><tr>
@@ -188,6 +197,17 @@
 <dd>
 name of the package directory (string)
 </dd>
+</dl><a NAME="SetupWizardDialog.__classifiersDownloadDone" ID="SetupWizardDialog.__classifiersDownloadDone"></a>
+<h4>SetupWizardDialog.__classifiersDownloadDone</h4>
+<b>__classifiersDownloadDone</b>(<i>reply</i>)
+<p>
+        Private slot called, after the classifiers file has been downloaded
+        from the internet.
+</p><dl>
+<dt><i>reply</i> (QNetworkReply)</dt>
+<dd>
+reference to the network reply
+</dd>
 </dl><a NAME="SetupWizardDialog.__enableOkButton" ID="SetupWizardDialog.__enableOkButton"></a>
 <h4>SetupWizardDialog.__enableOkButton</h4>
 <b>__enableOkButton</b>(<i></i>)
@@ -213,12 +233,24 @@
 <dd>
 start directory (string)
 </dd>
-</dl><a NAME="SetupWizardDialog.__populateFromTroveLists" ID="SetupWizardDialog.__populateFromTroveLists"></a>
-<h4>SetupWizardDialog.__populateFromTroveLists</h4>
-<b>__populateFromTroveLists</b>(<i></i>)
+</dl><a NAME="SetupWizardDialog.__loadClassifiersFromPyPI" ID="SetupWizardDialog.__loadClassifiersFromPyPI"></a>
+<h4>SetupWizardDialog.__loadClassifiersFromPyPI</h4>
+<b>__loadClassifiersFromPyPI</b>(<i></i>)
 <p>
-        Private method to populate lists from the Trove list file.
-</p><a NAME="SetupWizardDialog.getCode" ID="SetupWizardDialog.getCode"></a>
+        Private method to populate the classifiers list with data retrieved
+        from PyPI.
+</p><a NAME="SetupWizardDialog.__populateClassifiers" ID="SetupWizardDialog.__populateClassifiers"></a>
+<h4>SetupWizardDialog.__populateClassifiers</h4>
+<b>__populateClassifiers</b>(<i>classifiers</i>)
+<p>
+        Private method to populate the classifiers.
+</p><dl>
+<dt><i>classifiers</i> (list of str)</dt>
+<dd>
+list of classifiers read from a local file or
+            retrieved from PyPI
+</dd>
+</dl><a NAME="SetupWizardDialog.getCode" ID="SetupWizardDialog.getCode"></a>
 <h4>SetupWizardDialog.getCode</h4>
 <b>getCode</b>(<i>indLevel, indString</i>)
 <p>
@@ -303,6 +335,14 @@
 <p>
         Private slot to handle a change of selected items of the
         exclude pattern list.
+</p><a NAME="SetupWizardDialog.on_localClassifiersButton_clicked" ID="SetupWizardDialog.on_localClassifiersButton_clicked"></a>
+<h4>SetupWizardDialog.on_localClassifiersButton_clicked</h4>
+<b>on_localClassifiersButton_clicked</b>(<i></i>)
+<p>
+        Private method to populate lists from the Trove list file.
+</p><p>
+        Note: The trove list file was created from querying
+        "https://pypi.org/pypi?%3Aaction=list_classifiers".
 </p><a NAME="SetupWizardDialog.on_modulesList_itemSelectionChanged" ID="SetupWizardDialog.on_modulesList_itemSelectionChanged"></a>
 <h4>SetupWizardDialog.on_modulesList_itemSelectionChanged</h4>
 <b>on_modulesList_itemSelectionChanged</b>(<i></i>)
--- a/eric6/Documentation/Source/eric6.Preferences.ConfigurationPages.ConfigurationPageBase.html	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Documentation/Source/eric6.Preferences.ConfigurationPages.ConfigurationPageBase.html	Sun Jun 02 11:42:48 2019 +0200
@@ -43,7 +43,13 @@
 <h2>ConfigurationPageBase</h2>
 <p>
     Class implementing the base class for all configuration pages.
-</p>
+</p><h3>Signals</h3>
+<dl>
+<dt>colourChanged(str, QColor)</dt>
+<dd>
+To inform about a new colour selection
+</dd>
+</dl>
 <h3>Derived from</h3>
 QWidget
 <h3>Class Attributes</h3>
--- a/eric6/Documentation/Source/eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.html	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Documentation/Source/eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.html	Sun Jun 02 11:42:48 2019 +0200
@@ -32,6 +32,9 @@
 <tr>
 <td><a href="#DebuggerGeneralPage">DebuggerGeneralPage</a></td>
 <td>Class implementing the Debugger General configuration page.</td>
+</tr><tr>
+<td><a href="#PreviewModel">PreviewModel</a></td>
+<td>Class to show an example of the selected background colours for the debug viewer.</td>
 </tr>
 </table>
 <h3>Functions</h3>
@@ -124,6 +127,204 @@
 </p>
 <div align="right"><a href="#top">Up</a></div>
 <hr /><hr />
+<a NAME="PreviewModel" ID="PreviewModel"></a>
+<h2>PreviewModel</h2>
+<p>
+    Class to show an example of the selected background colours for the debug
+    viewer.
+</p>
+<h3>Derived from</h3>
+QAbstractItemModel
+<h3>Class Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Class Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#PreviewModel.__init__">PreviewModel</a></td>
+<td>Constructor</td>
+</tr><tr>
+<td><a href="#PreviewModel.columnCount">columnCount</a></td>
+<td>Public Qt slot to get the column count.</td>
+</tr><tr>
+<td><a href="#PreviewModel.data">data</a></td>
+<td>Public Qt slot get the role data of item.</td>
+</tr><tr>
+<td><a href="#PreviewModel.flags">flags</a></td>
+<td>Public Qt slot to get the item flags.</td>
+</tr><tr>
+<td><a href="#PreviewModel.index">index</a></td>
+<td>Public Qt slot to get the index of item at row:column of parent.</td>
+</tr><tr>
+<td><a href="#PreviewModel.parent">parent</a></td>
+<td>Public Qt slot to get the parent of the given child.</td>
+</tr><tr>
+<td><a href="#PreviewModel.rowCount">rowCount</a></td>
+<td>Public Qt slot to get the row count.</td>
+</tr><tr>
+<td><a href="#PreviewModel.setColor">setColor</a></td>
+<td>Public slot to update the background colour indexed by key.</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<a NAME="PreviewModel.__init__" ID="PreviewModel.__init__"></a>
+<h4>PreviewModel (Constructor)</h4>
+<b>PreviewModel</b>(<i></i>)
+<p>
+        Constructor
+</p><a NAME="PreviewModel.columnCount" ID="PreviewModel.columnCount"></a>
+<h4>PreviewModel.columnCount</h4>
+<b>columnCount</b>(<i>parent=QModelIndex()</i>)
+<p>
+        Public Qt slot to get the column count.
+</p><dl>
+<dt><i>parent</i> (QModelIndex)</dt>
+<dd>
+the model parent
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+number of columns
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+int
+</dd>
+</dl><a NAME="PreviewModel.data" ID="PreviewModel.data"></a>
+<h4>PreviewModel.data</h4>
+<b>data</b>(<i>index, role=Qt.DisplayRole</i>)
+<p>
+        Public Qt slot get the role data of item.
+</p><dl>
+<dt><i>index</i> (QModelIndex)</dt>
+<dd>
+the model index
+</dd><dt><i>role</i> (QtCore.Qt.ItemDataRole)</dt>
+<dd>
+the requested data role
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+role data of item
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+str, QBrush or None
+</dd>
+</dl><a NAME="PreviewModel.flags" ID="PreviewModel.flags"></a>
+<h4>PreviewModel.flags</h4>
+<b>flags</b>(<i>index</i>)
+<p>
+        Public Qt slot to get the item flags.
+</p><dl>
+<dt><i>index</i> (QModelIndex)</dt>
+<dd>
+of item
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+item flags
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+QtCore.Qt.ItemFlag
+</dd>
+</dl><a NAME="PreviewModel.index" ID="PreviewModel.index"></a>
+<h4>PreviewModel.index</h4>
+<b>index</b>(<i>row, column, parent=QModelIndex()</i>)
+<p>
+        Public Qt slot to get the index of item at row:column of parent.
+</p><dl>
+<dt><i>row</i> (int)</dt>
+<dd>
+number of rows
+</dd><dt><i>column</i> (int)</dt>
+<dd>
+number of columns
+</dd><dt><i>parent</i> (QModelIndex)</dt>
+<dd>
+the model parent
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+new model index for child
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+QModelIndex
+</dd>
+</dl><a NAME="PreviewModel.parent" ID="PreviewModel.parent"></a>
+<h4>PreviewModel.parent</h4>
+<b>parent</b>(<i>child</i>)
+<p>
+        Public Qt slot to get the parent of the given child.
+</p><dl>
+<dt><i>child</i> (QModelIndex)</dt>
+<dd>
+the model child node
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+new model index for parent
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+QModelIndex
+</dd>
+</dl><a NAME="PreviewModel.rowCount" ID="PreviewModel.rowCount"></a>
+<h4>PreviewModel.rowCount</h4>
+<b>rowCount</b>(<i>parent=QModelIndex()</i>)
+<p>
+        Public Qt slot to get the row count.
+</p><dl>
+<dt><i>parent</i> (QModelIndex)</dt>
+<dd>
+the model parent
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+number of rows
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+int
+</dd>
+</dl><a NAME="PreviewModel.setColor" ID="PreviewModel.setColor"></a>
+<h4>PreviewModel.setColor</h4>
+<b>setColor</b>(<i>key, bgcolour</i>)
+<p>
+        Public slot to update the background colour indexed by key.
+</p><dl>
+<dt><i>key</i> (str)</dt>
+<dd>
+the name of background
+</dd><dt><i>bgcolour</i> (QColor)</dt>
+<dd>
+the new background colour
+</dd>
+</dl>
+<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>)
--- a/eric6/Documentation/Source/eric6.Preferences.ConfigurationPages.InterfacePage.html	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Documentation/Source/eric6.Preferences.ConfigurationPages.InterfacePage.html	Sun Jun 02 11:42:48 2019 +0200
@@ -64,7 +64,10 @@
 <td>Constructor</td>
 </tr><tr>
 <td><a href="#InterfacePage.__populateLanguageCombo">__populateLanguageCombo</a></td>
-<td>Private method to initialize the language combobox of the Interface configuration page.</td>
+<td>Private method to initialize the language combo box.</td>
+</tr><tr>
+<td><a href="#InterfacePage.__populateShellPositionCombo">__populateShellPositionCombo</a></td>
+<td>Private method to initialize the shell position combo box.</td>
 </tr><tr>
 <td><a href="#InterfacePage.__populateStyleCombo">__populateStyleCombo</a></td>
 <td>Private method to populate the style combo box.</td>
@@ -89,8 +92,12 @@
 <h4>InterfacePage.__populateLanguageCombo</h4>
 <b>__populateLanguageCombo</b>(<i></i>)
 <p>
-        Private method to initialize the language combobox of the Interface
-        configuration page.
+        Private method to initialize the language combo box.
+</p><a NAME="InterfacePage.__populateShellPositionCombo" ID="InterfacePage.__populateShellPositionCombo"></a>
+<h4>InterfacePage.__populateShellPositionCombo</h4>
+<b>__populateShellPositionCombo</b>(<i></i>)
+<p>
+        Private method to initialize the shell position combo box.
 </p><a NAME="InterfacePage.__populateStyleCombo" ID="InterfacePage.__populateStyleCombo"></a>
 <h4>InterfacePage.__populateStyleCombo</h4>
 <b>__populateStyleCombo</b>(<i></i>)
--- a/eric6/Documentation/Source/eric6.Project.Project.html	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Documentation/Source/eric6.Project.Project.html	Sun Jun 02 11:42:48 2019 +0200
@@ -635,8 +635,8 @@
 <td><a href="#Project.initFileTypes">initFileTypes</a></td>
 <td>Public method to initialize the filetype associations with default values.</td>
 </tr><tr>
-<td><a href="#Project.initMenu">initMenu</a></td>
-<td>Public slot to initialize the project menu.</td>
+<td><a href="#Project.initMenus">initMenus</a></td>
+<td>Public slot to initialize the project menus.</td>
 </tr><tr>
 <td><a href="#Project.initToolbars">initToolbars</a></td>
 <td>Public slot to initialize the project toolbar and the basic VCS toolbar.</td>
@@ -2271,15 +2271,20 @@
 <p>
         Public method to initialize the filetype associations with default
         values.
-</p><a NAME="Project.initMenu" ID="Project.initMenu"></a>
-<h4>Project.initMenu</h4>
-<b>initMenu</b>(<i></i>)
+</p><a NAME="Project.initMenus" ID="Project.initMenus"></a>
+<h4>Project.initMenus</h4>
+<b>initMenus</b>(<i></i>)
 <p>
-        Public slot to initialize the project menu.
+        Public slot to initialize the project menus.
 </p><dl>
 <dt>Returns:</dt>
 <dd>
-the menu generated (QMenu)
+tuple of generated menus
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (QMenu, QMenu)
 </dd>
 </dl><a NAME="Project.initToolbars" ID="Project.initToolbars"></a>
 <h4>Project.initToolbars</h4>
--- a/eric6/Documentation/Source/eric6.QScintilla.Editor.html	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Documentation/Source/eric6.QScintilla.Editor.html	Sun Jun 02 11:42:48 2019 +0200
@@ -1808,8 +1808,8 @@
         Private method to get the requested option via EditorConfig.
 </p><p>
         If there is no EditorConfig defined, the equivalent built-in option
-        will be used (Preferences.getEditor(). The option must be given as the
-        Preferences option key. The mapping to the EditorConfig option name
+        will be used (Preferences.getEditor() ). The option must be given as
+        the Preferences option key. The mapping to the EditorConfig option name
         will be done within this method.
 </p><dl>
 <dt><i>option</i> (str)</dt>
--- a/eric6/Documentation/Source/eric6.UI.UserInterface.html	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Documentation/Source/eric6.UI.UserInterface.html	Sun Jun 02 11:42:48 2019 +0200
@@ -780,6 +780,9 @@
 <td><a href="#UserInterface.launchHelpViewer">launchHelpViewer</a></td>
 <td>Public slot to start the help viewer/web browser.</td>
 </tr><tr>
+<td><a href="#UserInterface.networkAccessManager">networkAccessManager</a></td>
+<td>Public method to get a reference to the network access manager object.</td>
+</tr><tr>
 <td><a href="#UserInterface.notificationsEnabled">notificationsEnabled</a></td>
 <td>Public method to check, if notifications are enabled.</td>
 </tr><tr>
@@ -2522,6 +2525,21 @@
 <dd>
 flag indicating to use a single browser window
 </dd>
+</dl><a NAME="UserInterface.networkAccessManager" ID="UserInterface.networkAccessManager"></a>
+<h4>UserInterface.networkAccessManager</h4>
+<b>networkAccessManager</b>(<i></i>)
+<p>
+        Public method to get a reference to the network access manager object.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+reference to the network access manager object
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+QNetworkAccessManager
+</dd>
 </dl><a NAME="UserInterface.notificationsEnabled" ID="UserInterface.notificationsEnabled"></a>
 <h4>UserInterface.notificationsEnabled</h4>
 <b>notificationsEnabled</b>(<i></i>)
--- a/eric6/Documentation/Source/eric6.ViewManager.ViewManager.html	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Documentation/Source/eric6.ViewManager.ViewManager.html	Sun Jun 02 11:42:48 2019 +0200
@@ -696,7 +696,7 @@
 <td>Public method used to split the current view.</td>
 </tr><tr>
 <td><a href="#ViewManager.addToExtrasMenu">addToExtrasMenu</a></td>
-<td>Public method to add some actions to the extras menu.</td>
+<td>Public method to add some actions to the Extras menu.</td>
 </tr><tr>
 <td><a href="#ViewManager.addToRecentList">addToRecentList</a></td>
 <td>Public slot to add a filename to the list of recently opened files.</td>
@@ -833,6 +833,9 @@
 <td><a href="#ViewManager.initMacroMenu">initMacroMenu</a></td>
 <td>Public method to create the Macro menu.</td>
 </tr><tr>
+<td><a href="#ViewManager.initSearchMenu">initSearchMenu</a></td>
+<td>Public method to create the Search menu.</td>
+</tr><tr>
 <td><a href="#ViewManager.initSearchToolbars">initSearchToolbars</a></td>
 <td>Public method to create the Search toolbars.</td>
 </tr><tr>
@@ -2181,7 +2184,7 @@
 <h4>ViewManager.addToExtrasMenu</h4>
 <b>addToExtrasMenu</b>(<i>menu</i>)
 <p>
-        Public method to add some actions to the extras menu.
+        Public method to add some actions to the Extras menu.
 </p><dl>
 <dt><i>menu</i></dt>
 <dd>
@@ -2778,6 +2781,21 @@
 <dd>
 the generated menu
 </dd>
+</dl><a NAME="ViewManager.initSearchMenu" ID="ViewManager.initSearchMenu"></a>
+<h4>ViewManager.initSearchMenu</h4>
+<b>initSearchMenu</b>(<i></i>)
+<p>
+        Public method to create the Search menu.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+the generated menu
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+QMenu
+</dd>
 </dl><a NAME="ViewManager.initSearchToolbars" ID="ViewManager.initSearchToolbars"></a>
 <h4>ViewManager.initSearchToolbars</h4>
 <b>initSearchToolbars</b>(<i>toolbarManager</i>)
--- a/eric6/Documentation/Source/index-eric6.Debugger.html	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Documentation/Source/index-eric6.Debugger.html	Sun Jun 02 11:42:48 2019 +0200
@@ -89,7 +89,7 @@
 <td>Module implementing the variables filter dialog.</td>
 </tr><tr>
 <td><a href="eric6.Debugger.VariablesViewer.html">VariablesViewer</a></td>
-<td>Module implementing the variables viewer widget.</td>
+<td>Module implementing the variables viewer view based on QTreeView.</td>
 </tr><tr>
 <td><a href="eric6.Debugger.WatchPointModel.html">WatchPointModel</a></td>
 <td>Module implementing the Watch expression model.</td>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/Documentation/Source/index-eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.html	Sun Jun 02 11:42:48 2019 +0200
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<html><head>
+<title>eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension</title>
+<meta charset="UTF-8">
+<style>
+body {
+    background: #EDECE6;
+    margin: 0em 1em 10em 1em;
+    color: black;
+}
+
+h1 { color: white; background: #85774A; }
+h2 { color: white; background: #85774A; }
+h3 { color: white; background: #9D936E; }
+h4 { color: white; background: #9D936E; }
+    
+a { color: #BA6D36; }
+
+</style>
+</head>
+<body>
+<h1>eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension</h1>
+<p>
+Package implementing the closehead extension support interface.
+</p>
+
+
+<h3>Modules</h3>
+<table>
+<tr>
+<td><a href="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.HgCloseHeadSelectionDialog.html">HgCloseHeadSelectionDialog</a></td>
+<td>Module implementing a dialog to select the heads to be closed.</td>
+</tr><tr>
+<td><a href="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper.html">ProjectHelper</a></td>
+<td>Module implementing the closehead extension project helper.</td>
+</tr><tr>
+<td><a href="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.closehead.html">closehead</a></td>
+<td>Module implementing the closehead extension interface.</td>
+</tr>
+</table>
+</body></html>
\ No newline at end of file
--- a/eric6/Documentation/Source/index-eric6.Plugins.VcsPlugins.vcsMercurial.html	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Documentation/Source/index-eric6.Plugins.VcsPlugins.vcsMercurial.html	Sun Jun 02 11:42:48 2019 +0200
@@ -30,6 +30,9 @@
 <h3>Packages</h3>
 <table>
 <tr>
+<td><a href="index-eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.html">CloseheadExtension</a></td>
+<td>Package implementing the closehead extension support interface.</td>
+</tr><tr>
 <td><a href="index-eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage.html">ConfigurationPage</a></td>
 <td>Package implementing the the Mercurial configuration page.</td>
 </tr><tr>
--- a/eric6/E5Gui/E5ModelMenu.py	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/E5Gui/E5ModelMenu.py	Sun Jun 02 11:42:48 2019 +0200
@@ -370,6 +370,10 @@
             super(E5ModelMenu, self).mouseMoveEvent(evt)
             return
         
+        if self.__dragStartPosition.isNull():
+            super(E5ModelMenu, self).mouseMoveEvent(evt)
+            return
+        
         manhattanLength = (evt.pos() -
                            self.__dragStartPosition).manhattanLength()
         if manhattanLength <= QApplication.startDragDistance():
@@ -413,6 +417,10 @@
         """
         self._mouseButton = evt.button()
         self._keyboardModifiers = evt.modifiers()
+        
+        if evt.button() == Qt.LeftButton:
+            self.__dragStartPosition = QPoint()
+        
         super(E5ModelMenu, self).mouseReleaseEvent(evt)
     
     def resetFlags(self):
--- a/eric6/Helpviewer/HelpTabWidget.py	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Helpviewer/HelpTabWidget.py	Sun Jun 02 11:42:48 2019 +0200
@@ -116,20 +116,8 @@
         self.__closedTabsButton.setEnabled(False)
         self.__rightCornerWidgetLayout.addWidget(self.__closedTabsButton)
         
-        self.__closeButton = QToolButton(self)
-        self.__closeButton.setIcon(UI.PixmapCache.getIcon("close.png"))
-        self.__closeButton.setToolTip(
-            self.tr("Close the current help window"))
-        self.__closeButton.setEnabled(False)
-        self.__closeButton.clicked.connect(self.closeBrowser)
-        self.__rightCornerWidgetLayout.addWidget(self.__closeButton)
-        if Preferences.getUI("SingleCloseButton") or \
-           not hasattr(self, 'setTabsClosable'):
-            self.__closeButton.show()
-        else:
-            self.setTabsClosable(True)
-            self.tabCloseRequested.connect(self.closeBrowserAt)
-            self.__closeButton.hide()
+        self.setTabsClosable(True)
+        self.tabCloseRequested.connect(self.closeBrowserAt)
         
         self.setCornerWidget(self.__rightCornerWidget, Qt.TopRightCorner)
         
@@ -367,7 +355,6 @@
         
         self.__mainWindow.closeAct.setEnabled(True)
         self.__mainWindow.closeAllAct.setEnabled(True)
-        self.__closeButton.setEnabled(True)
         self.__navigationButton.setEnabled(True)
         
         if not linkName and not requestData:
@@ -737,20 +724,6 @@
         
         for urlbar in self.__stackedUrlBar.urlBars():
             urlbar.preferencesChanged()
-        
-        if Preferences.getUI("SingleCloseButton") or \
-           not hasattr(self, 'setTabsClosable'):
-            if hasattr(self, 'setTabsClosable'):
-                self.setTabsClosable(False)
-                try:
-                    self.tabCloseRequested.disconnect(self.closeBrowserAt)
-                except TypeError:
-                    pass
-            self.__closeButton.show()
-        else:
-            self.setTabsClosable(True)
-            self.tabCloseRequested.connect(self.closeBrowserAt)
-            self.__closeButton.hide()
     
     def __loadStarted(self, browser):
         """
--- a/eric6/PluginManager/PluginManager.py	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/PluginManager/PluginManager.py	Sun Jun 02 11:42:48 2019 +0200
@@ -399,7 +399,7 @@
                         "Module is missing the Python2 compatibility flag."
                         " Please update.")
                     compatible = False
-                elif not getattr(module, "python2Compatible"):
+                elif not getattr(module, "python2Compatible", True):
                     module.error = self.tr(
                         "Module is not Python2 compatible.")
                     compatible = False
@@ -408,7 +408,7 @@
                 if not compatible:
                     self.__failedModules[name] = module
                     raise PluginPy2IncompatibleError(name)
-            if getattr(module, "autoactivate"):
+            if getattr(module, "autoactivate", False):
                 self.__inactiveModules[name] = module
             else:
                 if not hasattr(module, "pluginType") or \
@@ -538,8 +538,8 @@
             
             if not self.__canActivatePlugin(module):
                 raise PluginActivationError(module.eric6PluginModuleName)
-            version = getattr(module, "version")
-            className = getattr(module, "className")
+            version = getattr(module, "version", "0.0.0")
+            className = getattr(module, "className", "")
             pluginClass = getattr(module, className)
             pluginObject = None
             if name not in self.__onDemandInactivePlugins:
@@ -608,8 +608,8 @@
             
             if not self.__canActivatePlugin(module):
                 raise PluginActivationError(module.eric6PluginModuleName)
-            version = getattr(module, "version")
-            className = getattr(module, "className")
+            version = getattr(module, "version", "0.0.0")
+            className = getattr(module, "className", "")
             pluginClass = getattr(module, className)
             pluginObject = None
             if onDemand and name in self.__onDemandInactivePlugins:
@@ -677,8 +677,8 @@
             if not hasattr(module, "className"):
                 raise PluginModuleFormatError(
                     module.eric6PluginModuleName, "className")
-            className = getattr(module, "className")
-            if not hasattr(module, className):
+            className = getattr(module, "className", "")
+            if not className or not hasattr(module, className):
                 raise PluginModuleFormatError(
                     module.eric6PluginModuleName, className)
             pluginClass = getattr(module, className)
@@ -765,14 +765,14 @@
         @return reference to the initialized plugin object
         """
         for name, module in list(self.__onDemandInactiveModules.items()):
-            if getattr(module, "pluginType") == type_ and \
-               getattr(module, "pluginTypename") == typename:
+            if getattr(module, "pluginType", "") == type_ and \
+               getattr(module, "pluginTypename", "") == typename:
                 return self.activatePlugin(name, onDemand=True)
         
         if maybeActive:
             for name, module in list(self.__onDemandActiveModules.items()):
-                if getattr(module, "pluginType") == type_ and \
-                   getattr(module, "pluginTypename") == typename:
+                if getattr(module, "pluginType", "") == type_ and \
+                   getattr(module, "pluginTypename", "") == typename:
                     self.deactivatePlugin(name, onDemand=True)
                     return self.activatePlugin(name, onDemand=True)
         
@@ -930,18 +930,19 @@
         
         for module in list(self.__onDemandActiveModules.values()) + \
                 list(self.__onDemandInactiveModules.values()):
-            if getattr(module, "pluginType") == type_ and \
+            if getattr(module, "pluginType", "") == type_ and \
                getattr(module, "error", "") == "":
-                plugin_name = getattr(module, "pluginTypename")
-                if hasattr(module, "displayString"):
-                    try:
-                        disp = module.displayString()
-                    except TypeError:
-                        disp = getattr(module, "displayString")
-                    if disp != "":
-                        pluginDict[plugin_name] = disp
-                else:
-                    pluginDict[plugin_name] = plugin_name
+                plugin_name = getattr(module, "pluginTypename", "")
+                if plugin_name:
+                    if hasattr(module, "displayString"):
+                        try:
+                            disp = module.displayString()
+                        except TypeError:
+                            disp = getattr(module, "displayString", "")
+                        if disp != "":
+                            pluginDict[plugin_name] = disp
+                    else:
+                        pluginDict[plugin_name] = plugin_name
         
         return pluginDict
         
@@ -955,8 +956,8 @@
         """
         for module in list(self.__onDemandActiveModules.values()) + \
                 list(self.__onDemandInactiveModules.values()):
-            if getattr(module, "pluginType") == type_ and \
-               getattr(module, "pluginTypename") == name:
+            if getattr(module, "pluginType", "") == type_ and \
+               getattr(module, "pluginTypename", "") == name:
                 if hasattr(module, "previewPix"):
                     return module.previewPix()
                 else:
@@ -1134,7 +1135,7 @@
         
         for module in list(self.__onDemandActiveModules.values()) + \
                 list(self.__onDemandInactiveModules.values()):
-            if getattr(module, "pluginType") == "version_control":
+            if getattr(module, "pluginType", "") == "version_control":
                 if hasattr(module, "getVcsSystemIndicator"):
                     res = module.getVcsSystemIndicator()
                     for indicator, vcsData in list(res.items()):
@@ -1150,7 +1151,7 @@
         Public method to deactivated all activated VCS plugins.
         """
         for name, module in list(self.__onDemandActiveModules.items()):
-            if getattr(module, "pluginType") == "version_control":
+            if getattr(module, "pluginType", "") == "version_control":
                 self.deactivatePlugin(name, True)
     
     ########################################################################
--- a/eric6/PluginManager/PluginUninstallDialog.py	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/PluginManager/PluginUninstallDialog.py	Sun Jun 02 11:42:48 2019 +0200
@@ -127,7 +127,7 @@
                     """ attribute. Aborting...</p>""").format(pluginName))
             return False
         
-        package = getattr(module, "packageName")
+        package = getattr(module, "packageName", None)
         if package is None:
             package = "None"
             packageDir = ""
--- a/eric6/Plugins/CheckerPlugins/CodeStyleChecker/MiscellaneousChecker.py	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Plugins/CheckerPlugins/CodeStyleChecker/MiscellaneousChecker.py	Sun Jun 02 11:42:48 2019 +0200
@@ -46,8 +46,10 @@
         
         "M201",
         
-        "M501", "M502", "M503", "M504", "M505", "M506", "M507",
-        "M511", "M512", "M513", "M514",
+        "M501", "M502", "M503", "M504", "M505", "M506", "M507", "M508",
+        "M509",
+        "M511", "M512", "M513",
+        "M521", "M522", "M523", "M524",
         
         "M601",
         "M611", "M612", "M613",
@@ -133,8 +135,9 @@
                                         "M621", "M622", "M623", "M624", "M625",
                                         "M631", "M632")),
             (self.__checkBugBear, ("M501", "M502", "M503", "M504", "M505",
-                                   "M506", "M507",
-                                   "M511", "M512", "M513", "M514")),
+                                   "M506", "M507", "M508", "M509",
+                                   "M511", "M512", "M513",
+                                   "M521", "M522", "M523", "M524")),
             (self.__checkLogging, ("M651", "M652", "M653", "M654", "M655")),
             (self.__checkFuture, ("M701", "M702")),
             (self.__checkGettext, ("M711",)),
@@ -653,6 +656,10 @@
             "list",
             "set",
         )
+        immutableCalls = (
+            "tuple",
+            "frozenset",
+        )
         functionDefs = [ast.FunctionDef]
         try:
             functionDefs.append(ast.AsyncFunctionDef)
@@ -662,7 +669,7 @@
         for node in ast.walk(self.__tree):
             if any(isinstance(node, functionDef)
                    for functionDef in functionDefs):
-                for default in node.args.defaults:
+                for default in node.args.defaults + node.args.kw_defaults:
                     if any(isinstance(default, mutableType)
                            for mutableType in mutableTypes):
                         typeName = type(default).__name__
@@ -672,7 +679,7 @@
                                 self.__error(default.lineno - 1,
                                              default.col_offset,
                                              "M823", callPath + "()")
-                            else:
+                            elif callPath not in immutableCalls:
                                 self.__error(default.lineno - 1,
                                              default.col_offset,
                                              "M822", typeName)
@@ -731,7 +738,7 @@
     
     def __checkBugBear(self):
         """
-        Private method to bugbear checks.
+        Private method for bugbear checks.
         """
         visitor = BugBearVisitor()
         visitor.visit(self.__tree)
@@ -1079,7 +1086,7 @@
     Class implementing a node visitor to check for various topics.
     """
     #
-    # This class was implemented along the BugBear flake8 extension (v 18.2.0).
+    # This class was implemented along the BugBear flake8 extension (v 19.3.0).
     # Original: Copyright (c) 2016 Ɓukasz Langa
     #
     
@@ -1135,9 +1142,9 @@
         if sys.version_info >= (3, 0):
             validPaths = ("six", "future.utils", "builtins")
             methodsDict = {
-                "M511": ("iterkeys", "itervalues", "iteritems", "iterlists"),
-                "M512": ("viewkeys", "viewvalues", "viewitems", "viewlists"),
-                "M513": ("next",),
+                "M521": ("iterkeys", "itervalues", "iteritems", "iterlists"),
+                "M522": ("viewkeys", "viewvalues", "viewitems", "viewlists"),
+                "M523": ("next",),
             }
         else:
             validPaths = ()
@@ -1154,11 +1161,36 @@
                 self.__checkForM502(node)
         else:
             try:
+                # bad super() call
+                if isinstance(node.func, ast.Name) and node.func.id == "super":
+                    args = node.args
+                    if (
+                        len(args) == 2 and
+                        isinstance(args[0], ast.Attribute) and
+                        isinstance(args[0].value, ast.Name) and
+                        args[0].value.id == 'self' and
+                        args[0].attr == '__class__'
+                    ):
+                        self.violations.append((node, "M509"))
+                
+                # bad getattr and setattr
                 if (
                     node.func.id in ("getattr", "hasattr") and
                     node.args[1].s == "__call__"
                 ):
-                    self.violations.append((node, "M503"))
+                    self.violations.append((node, "M511"))
+                if (
+                    node.func.id == "getattr" and
+                    len(node.args) == 2 and
+                    isinstance(node.args[1], ast.Str)
+                ):
+                    self.violations.append((node, "M512"))
+                elif (
+                    node.func.id == "setattr" and
+                    len(node.args) == 3 and
+                    isinstance(node.args[1], ast.Str)
+                ):
+                    self.violations.append((node, "M513"))
             except (AttributeError, IndexError):
                 pass
 
@@ -1196,7 +1228,7 @@
             # and tuples for simplicity.
             assignTargets = {t.id for t in node.targets if hasattr(t, 'id')}
             if '__metaclass__' in assignTargets and sys.version_info >= (3, 0):
-                self.violations.append((node, "M514"))
+                self.violations.append((node, "M524"))
         
         elif len(node.targets) == 1:
             target = node.targets[0]
@@ -1218,6 +1250,33 @@
         
         self.generic_visit(node)
     
+    def visit_Assert(self, node):
+        """
+        Public method to handle 'assert' statements.
+        
+        @param node reference to the node to be processed
+        @type ast.Assert
+        """
+        if isinstance(node.test, ast.NameConstant) and \
+           node.test.value is False:
+            self.violations.append((node, "M503"))
+        
+        self.generic_visit(node)
+    
+    def visit_JoinedStr(self, node):
+        """
+        Public method to handle f-string arguments.
+        
+        @param node reference to the node to be processed
+        @type ast.JoinedStr
+        """
+        if sys.version_info >= (3, 6):
+            for value in node.values:
+                if isinstance(value, ast.FormattedValue):
+                    return
+            
+            self.violations.append((node, "M508"))
+    
     def __checkForM502(self, node):
         """
         Private method to check the use of *strip().
--- a/eric6/Plugins/CheckerPlugins/CodeStyleChecker/translations.py	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Plugins/CheckerPlugins/CodeStyleChecker/translations.py	Sun Jun 02 11:42:48 2019 +0200
@@ -534,8 +534,7 @@
         "using .strip() with multi-character strings is misleading"),
     "M503": QCoreApplication.translate(
         "MiscellaneousChecker",
-        """using 'hasattr(x, "__call__")' to test if 'x' is callable is"""
-        """ unreliable"""),
+        "do not call assert False since python -O removes these calls"),
     "M504": QCoreApplication.translate(
         "MiscellaneousChecker",
         "'sys.maxint' is not defined in Python 3 - use 'sys.maxsize'"),
@@ -551,16 +550,32 @@
         "MiscellaneousChecker",
         "loop control variable {0} not used within the loop body -"
         " start the name with an underscore"),
+    "M508": QCoreApplication.translate(
+        "MiscellaneousChecker",
+        "unncessary f-string"),
+    "M509": QCoreApplication.translate(
+        "MiscellaneousChecker",
+        "cannot use 'self.__class__' as first argument of 'super()' call"),
     "M511": QCoreApplication.translate(
         "MiscellaneousChecker",
-        "Python 3 does not include '.iter*' methods on dictionaries"),
+        """using 'hasattr(x, "__call__")' to test if 'x' is callable is"""
+        """ unreliable"""),
     "M512": QCoreApplication.translate(
         "MiscellaneousChecker",
-        "Python 3 does not include '.view*' methods on dictionaries"),
+        "do not call getattr with a constant attribute value"),
     "M513": QCoreApplication.translate(
         "MiscellaneousChecker",
+        "do not call setattr with a constant attribute value"),
+    "M521": QCoreApplication.translate(
+        "MiscellaneousChecker",
+        "Python 3 does not include '.iter*' methods on dictionaries"),
+    "M522": QCoreApplication.translate(
+        "MiscellaneousChecker",
+        "Python 3 does not include '.view*' methods on dictionaries"),
+    "M523": QCoreApplication.translate(
+        "MiscellaneousChecker",
         "'.next()' does not exist in Python 3"),
-    "M514": QCoreApplication.translate(
+    "M524": QCoreApplication.translate(
         "MiscellaneousChecker",
         "'__metaclass__' does nothing on Python 3 -"
         " use 'class MyClass(BaseClass, metaclass=...)'"),
--- a/eric6/Plugins/PluginVcsMercurial.py	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Plugins/PluginVcsMercurial.py	Sun Jun 02 11:42:48 2019 +0200
@@ -175,6 +175,7 @@
         "EncodingMode": "strict",
         "ConsiderHidden": False,
         "LogMessageColumnWidth": 30,
+        "LogBrowserShowFullLog": True,
         "LogBrowserGeometry": QByteArray(),
         "LogBrowserSplitterStates": [QByteArray(), QByteArray(),
                                      QByteArray()],
@@ -266,7 +267,8 @@
         @return the requested setting
         """
         if key in ["StopLogOnCopy", "PullUpdate", "PreferUnbundle",
-                   "CreateBackup", "InternalMerge", "ConsiderHidden"]:
+                   "CreateBackup", "InternalMerge", "ConsiderHidden",
+                   "LogBrowserShowFullLog"]:
             return Preferences.toBool(Preferences.Prefs.settings.value(
                 "Mercurial/" + key, cls.MercurialDefaults[key]))
         elif key in ["LogLimit", "CommitMessages", "CommitAuthorsLimit",
--- a/eric6/Plugins/VcsPlugins/vcsGit/git.py	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Plugins/VcsPlugins/vcsGit/git.py	Sun Jun 02 11:42:48 2019 +0200
@@ -109,6 +109,8 @@
         self.__commitDialog = None
         
         self.__patchCheckData = None
+        
+        self.__projectHelper = None
     
     def getPlugin(self):
         """
@@ -158,7 +160,8 @@
             self.submoduleStatusDialog.close()
         
         # shut down the project helpers
-        self.__projectHelper.shutdown()
+        if self.__projectHelper is not None:
+            self.__projectHelper.shutdown()
     
     def initCommand(self, command):
         """
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/Plugins/VcsPlugins/vcsMercurial/CloseheadExtension/HgCloseHeadSelectionDialog.py	Sun Jun 02 11:42:48 2019 +0200
@@ -0,0 +1,113 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2019 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a dialog to select the heads to be closed.
+"""
+
+from __future__ import unicode_literals
+
+import os
+
+from PyQt5.QtCore import pyqtSlot, QProcess
+from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QTreeWidgetItem
+
+from .Ui_HgCloseHeadSelectionDialog import Ui_HgCloseHeadSelectionDialog
+
+
+class HgCloseHeadSelectionDialog(QDialog, Ui_HgCloseHeadSelectionDialog):
+    """
+    Class implementing a dialog to select the heads to be closed.
+    """
+    def __init__(self, vcs, ppath, parent=None):
+        """
+        Constructor
+        
+        @param vcs reference to the VCS object
+        @type Hg
+        @param ppath directory containing the repository
+        @type str
+        @param parent reference to the parent widget
+        @type QWidget
+        """
+        super(HgCloseHeadSelectionDialog, self).__init__(parent)
+        self.setupUi(self)
+        
+        self.buttonBox.button(QDialogButtonBox.Cancel).setDefault(True)
+        self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(False)
+        
+        heads = self.__getHeads(vcs, ppath)
+        for revision, branch in heads:
+            QTreeWidgetItem(self.headsList, [revision, branch])
+    
+    def __getHeads(self, vcs, ppath):
+        """
+        Private method to get the open heads.
+        
+        @param vcs reference to the VCS object
+        @type Hg
+        @param ppath directory containing the repository
+        @type str
+        @return list of tuples containing the revision and the corresponding
+            branch name
+        @rtype list of tuples of (str, str)
+        """
+        args = vcs.initCommand("heads")
+        args.append('--template')
+        args.append('{node|short}@@@{branches}\n')
+        
+        output = ""
+        client = vcs.getClient()
+        if client is None:
+            # find the root of the repo
+            repodir = self.splitPath(ppath)[0]
+            while not os.path.isdir(os.path.join(repodir, self.adminDir)):
+                repodir = os.path.dirname(repodir)
+                if os.path.splitdrive(repodir)[1] == os.sep:
+                    return []
+            
+            process = QProcess()
+            process.setWorkingDirectory(repodir)
+            process.start('hg', args)
+            procStarted = process.waitForStarted(5000)
+            if procStarted:
+                finished = process.waitForFinished(30000)
+                if finished and process.exitCode() == 0:
+                    output = str(process.readAllStandardOutput(),
+                                 self.getEncoding(), 'replace')
+        else:
+            output, error = client.runcommand(args)
+        
+        heads = []
+        if output:
+            for line in output.splitlines():
+                line = line.strip()
+                if line:
+                    revision, branch = line.split("@@@")
+                    heads.append((revision, branch))
+            
+        return heads
+    
+    @pyqtSlot()
+    def on_headsList_itemSelectionChanged(self):
+        """
+        Private slot handling changes of the selection.
+        """
+        self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(
+            len(self.headsList.selectedItems()) > 0
+        )
+    
+    def getData(self):
+        """
+        Public method to retrieve the entered data.
+        
+        @return tuple containing a list of selected revisions and the commit
+            message
+        @rtype tuple of (list of str, str)
+        """
+        revisions = [itm.text(0) for itm in self.headsList.selectedItems()]
+        message = self.logEdit.toPlainText().strip()
+        
+        return revisions, message
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/Plugins/VcsPlugins/vcsMercurial/CloseheadExtension/HgCloseHeadSelectionDialog.ui	Sun Jun 02 11:42:48 2019 +0200
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>HgCloseHeadSelectionDialog</class>
+ <widget class="QDialog" name="HgCloseHeadSelectionDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>532</width>
+    <height>402</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Close Heads</string>
+  </property>
+  <property name="sizeGripEnabled">
+   <bool>true</bool>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <widget class="QLabel" name="label">
+     <property name="text">
+      <string>Select heads to be closed:</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QTreeWidget" name="headsList">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+       <horstretch>0</horstretch>
+       <verstretch>2</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="alternatingRowColors">
+      <bool>true</bool>
+     </property>
+     <property name="selectionMode">
+      <enum>QAbstractItemView::ExtendedSelection</enum>
+     </property>
+     <property name="rootIsDecorated">
+      <bool>false</bool>
+     </property>
+     <column>
+      <property name="text">
+       <string>Revision</string>
+      </property>
+     </column>
+     <column>
+      <property name="text">
+       <string>Branch</string>
+      </property>
+     </column>
+    </widget>
+   </item>
+   <item>
+    <widget class="QLabel" name="label_2">
+     <property name="text">
+      <string>Commit Message:</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QTextEdit" name="logEdit">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+       <horstretch>0</horstretch>
+       <verstretch>1</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="tabChangesFocus">
+      <bool>true</bool>
+     </property>
+     <property name="acceptRichText">
+      <bool>false</bool>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <tabstops>
+  <tabstop>headsList</tabstop>
+  <tabstop>logEdit</tabstop>
+ </tabstops>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>HgCloseHeadSelectionDialog</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>HgCloseHeadSelectionDialog</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/Plugins/VcsPlugins/vcsMercurial/CloseheadExtension/ProjectHelper.py	Sun Jun 02 11:42:48 2019 +0200
@@ -0,0 +1,81 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2019 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing the closehead extension project helper.
+"""
+
+from __future__ import unicode_literals
+
+from PyQt5.QtWidgets import QMenu
+
+from E5Gui.E5Action import E5Action
+
+from ..HgExtensionProjectHelper import HgExtensionProjectHelper
+
+import UI.PixmapCache
+
+
+class CloseheadProjectHelper(HgExtensionProjectHelper):
+    """
+    Class implementing the closehead extension project helper.
+    """
+    def __init__(self):
+        """
+        Constructor
+        """
+        super(CloseheadProjectHelper, self).__init__()
+    
+    def initActions(self):
+        """
+        Public method to generate the action objects.
+        """
+        self.hgCloseheadAct = E5Action(
+            self.tr('Close Heads'),
+            UI.PixmapCache.getIcon("closehead"),
+            self.tr('Close Heads'),
+            0, 0, self, 'mercurial_closehead')
+        self.hgCloseheadAct.setStatusTip(self.tr(
+            'Close arbitrary heads without checking them out first'
+        ))
+        self.hgCloseheadAct.setWhatsThis(self.tr(
+            """<b>Close Heads</b>"""
+            """<p>This closes arbitrary heads without the need to check them"""
+            """ out first.</p>"""
+        ))
+        self.hgCloseheadAct.triggered.connect(self.__hgClosehead)
+        self.actions.append(self.hgCloseheadAct)
+    
+    def initMenu(self, mainMenu):
+        """
+        Public method to generate the extension menu.
+        
+        @param mainMenu reference to the main menu
+        @type QMenu
+        @return populated menu (QMenu)
+        """
+        menu = QMenu(self.menuTitle(), mainMenu)
+        menu.setIcon(UI.PixmapCache.getIcon("closehead"))
+        menu.setTearOffEnabled(True)
+        
+        menu.addAction(self.hgCloseheadAct)
+        
+        return menu
+    
+    def menuTitle(self):
+        """
+        Public method to get the menu title.
+        
+        @return title of the menu
+        @rtype str
+        """
+        return self.tr("Close Heads")
+    
+    def __hgClosehead(self):
+        """
+        Private slot used to close arbitrary heads.
+        """
+        self.vcs.getExtensionObject("closehead")\
+            .hgCloseheads(self.project.getProjectPath())
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/Plugins/VcsPlugins/vcsMercurial/CloseheadExtension/__init__.py	Sun Jun 02 11:42:48 2019 +0200
@@ -0,0 +1,8 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2019 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Package implementing the closehead extension support interface.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/Plugins/VcsPlugins/vcsMercurial/CloseheadExtension/closehead.py	Sun Jun 02 11:42:48 2019 +0200
@@ -0,0 +1,75 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2019 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing the closehead extension interface.
+"""
+
+from __future__ import unicode_literals
+
+import os
+
+from PyQt5.QtWidgets import QDialog
+
+from ..HgExtension import HgExtension
+from ..HgDialog import HgDialog
+
+
+class Closehead(HgExtension):
+    """
+    Class implementing the strip extension interface.
+    """
+    def __init__(self, vcs):
+        """
+        Constructor
+        
+        @param vcs reference to the Mercurial vcs object
+        @type Hg
+        """
+        super(Closehead, self).__init__(vcs)
+    
+    def hgCloseheads(self, name, revisions=None):
+        """
+        Public method to close arbitrary heads.
+        
+        @param name file/directory name
+        @type str
+        @param revisions revisions of branch heads to be closed
+        @type str
+        """
+        # find the root of the repo
+        repodir = self.vcs.splitPath(name)[0]
+        while not os.path.isdir(os.path.join(repodir, self.vcs.adminDir)):
+            repodir = os.path.dirname(repodir)
+            if os.path.splitdrive(repodir)[1] == os.sep:
+                return
+        
+        message = ""
+        if not revisions:
+            from .HgCloseHeadSelectionDialog import HgCloseHeadSelectionDialog
+            dlg = HgCloseHeadSelectionDialog(self.vcs, name)
+            if dlg.exec_() == QDialog.Accepted:
+                revisions, message = dlg.getData()
+        
+        if not revisions:
+            # still no revisions given; abort...
+            return
+        
+        args = self.vcs.initCommand("close-head")
+        if not message:
+            if len(revisions) == 1:
+                message = self.tr("Revision <{0}> closed.").format(
+                    revisions[0])
+            else:
+                message = self.tr("Revisions <{0}> closed.").format(
+                    ", ".join(revisions))
+        args += ["--message", message]
+        for revision in revisions:
+            args += ["--rev", revision]
+        
+        dia = HgDialog(self.tr("Closing Heads"), self.vcs)
+        res = dia.startProcess(args, repodir)
+        if res:
+            dia.exec_()
--- a/eric6/Plugins/VcsPlugins/vcsMercurial/ConfigurationPage/MercurialPage.py	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Plugins/VcsPlugins/vcsMercurial/ConfigurationPage/MercurialPage.py	Sun Jun 02 11:42:48 2019 +0200
@@ -52,6 +52,8 @@
             self.__plugin.getPreferences("LogLimit"))
         self.logWidthSpinBox.setValue(
             self.__plugin.getPreferences("LogMessageColumnWidth"))
+        self.startFullLogCheckBox.setChecked(
+            self.__plugin.getPreferences("LogBrowserShowFullLog"))
         # commit
         self.commitSpinBox.setValue(
             self.__plugin.getPreferences("CommitMessages"))
@@ -88,6 +90,8 @@
             "LogLimit", self.logSpinBox.value())
         self.__plugin.setPreferences(
             "LogMessageColumnWidth", self.logWidthSpinBox.value())
+        self.__plugin.setPreferences(
+            "LogBrowserShowFullLog", self.startFullLogCheckBox.isChecked())
         # commit
         self.__plugin.setPreferences(
             "CommitMessages", self.commitSpinBox.value())
--- a/eric6/Plugins/VcsPlugins/vcsMercurial/ConfigurationPage/MercurialPage.ui	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Plugins/VcsPlugins/vcsMercurial/ConfigurationPage/MercurialPage.ui	Sun Jun 02 11:42:48 2019 +0200
@@ -93,6 +93,19 @@
       <string>Log</string>
      </property>
      <layout class="QGridLayout" name="gridLayout_3">
+      <item row="1" column="1">
+       <widget class="QSpinBox" name="logWidthSpinBox">
+        <property name="toolTip">
+         <string>Enter the number of characters of the commit message to be shown in the list</string>
+        </property>
+        <property name="alignment">
+         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+        </property>
+        <property name="minimum">
+         <number>10</number>
+        </property>
+       </widget>
+      </item>
       <item row="0" column="0">
        <widget class="QLabel" name="label">
         <property name="text">
@@ -113,6 +126,13 @@
         </property>
        </widget>
       </item>
+      <item row="1" column="0">
+       <widget class="QLabel" name="label_7">
+        <property name="text">
+         <string>No. of message characters shown in list:</string>
+        </property>
+       </widget>
+      </item>
       <item row="0" column="2">
        <spacer>
         <property name="orientation">
@@ -126,23 +146,13 @@
         </property>
        </spacer>
       </item>
-      <item row="1" column="0">
-       <widget class="QLabel" name="label_7">
-        <property name="text">
-         <string>No. of message characters shown in list:</string>
+      <item row="2" column="0" colspan="3">
+       <widget class="QCheckBox" name="startFullLogCheckBox">
+        <property name="toolTip">
+         <string>Select to show all incoming and the first batch of local changesets</string>
         </property>
-       </widget>
-      </item>
-      <item row="1" column="1">
-       <widget class="QSpinBox" name="logWidthSpinBox">
-        <property name="toolTip">
-         <string>Enter the number of characters of the commit message to be shown in the list</string>
-        </property>
-        <property name="alignment">
-         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-        </property>
-        <property name="minimum">
-         <number>10</number>
+        <property name="text">
+         <string>Start showing incoming and local changesets</string>
         </property>
        </widget>
       </item>
@@ -359,6 +369,7 @@
   <tabstop>hiddenChangesetsCheckBox</tabstop>
   <tabstop>logSpinBox</tabstop>
   <tabstop>logWidthSpinBox</tabstop>
+  <tabstop>startFullLogCheckBox</tabstop>
   <tabstop>commitSpinBox</tabstop>
   <tabstop>commitAuthorsSpinBox</tabstop>
   <tabstop>pullUpdateCheckBox</tabstop>
--- a/eric6/Plugins/VcsPlugins/vcsMercurial/HgLogBrowserDialog.py	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Plugins/VcsPlugins/vcsMercurial/HgLogBrowserDialog.py	Sun Jun 02 11:42:48 2019 +0200
@@ -63,13 +63,16 @@
     
     ClosedIndicator = " \u2612"
     
-    def __init__(self, vcs, mode="log", parent=None):
+    def __init__(self, vcs, mode="", parent=None):
         """
         Constructor
         
         @param vcs reference to the vcs object
-        @param mode mode of the dialog (string; one of log, incoming, outgoing)
-        @param parent parent widget (QWidget)
+        @type Hg
+        @param mode mode of the dialog
+        @type str (one of log, full_log, incoming, outgoing)
+        @param parent parent widget
+        @type QWidget
         """
         super(HgLogBrowserDialog, self).__init__(parent)
         self.setupUi(self)
@@ -84,12 +87,20 @@
         self.diffSplitter.setStretchFactor(0, 1)
         self.diffSplitter.setStretchFactor(1, 2)
         
+        if not mode:
+            if vcs.getPlugin().getPreferences("LogBrowserShowFullLog"):
+                mode = "full_log"
+            else:
+                mode = "log"
+        
         if mode == "log":
             self.setWindowTitle(self.tr("Mercurial Log"))
         elif mode == "incoming":
             self.setWindowTitle(self.tr("Mercurial Log (Incoming)"))
         elif mode == "outgoing":
             self.setWindowTitle(self.tr("Mercurial Log (Outgoing)"))
+        elif mode == "full_log":
+            self.setWindowTitle(self.tr("Mercurial Full Log"))
         
         self.buttonBox.button(QDialogButtonBox.Close).setEnabled(False)
         self.buttonBox.button(QDialogButtonBox.Cancel).setDefault(True)
@@ -117,6 +128,7 @@
         self.fieldCombo.addItem(self.tr("Author"), "author")
         self.fieldCombo.addItem(self.tr("Message"), "message")
         self.fieldCombo.addItem(self.tr("File"), "file")
+        self.fieldCombo.addItem(self.tr("Phase"), "phase")
         
         font = Preferences.getEditorOtherFonts("MonospacedFont")
         self.diffEdit.setFontFamily(font.family())
@@ -127,8 +139,11 @@
         self.__diffGenerator.finished.connect(self.__generatorFinished)
         
         self.vcs = vcs
-        if mode in ("log", "incoming", "outgoing"):
-            self.commandMode = mode
+        if mode in ("log", "incoming", "outgoing", "full_log"):
+            if mode == "full_log":
+                self.commandMode = "incoming"
+            else:
+                self.commandMode = mode
             self.initialCommandMode = mode
         else:
             self.commandMode = "log"
@@ -181,6 +196,7 @@
         self.__edgesRole = Qt.UserRole + 2
         self.__parentsRole = Qt.UserRole + 3
         self.__latestTagRole = Qt.UserRole + 4
+        self.__incomingRole = Qt.UserRole + 5
         
         # roles used in the file tree
         self.__diffFileLineRole = Qt.UserRole
@@ -224,6 +240,8 @@
         self.__initActionsMenu()
         
         self.__finishCallbacks = []
+        if self.initialCommandMode == "full_log":
+            self.__addFinishCallback(self.on_nextButton_clicked)
     
     def __addFinishCallback(self, callback):
         """
@@ -275,6 +293,11 @@
             self.__tagActTriggered)
         self.__tagAct.setToolTip(self.tr("Tag the selected revision"))
         
+        self.__closeHeadsAct = self.__actionsMenu.addAction(
+            UI.PixmapCache.getIcon("closehead"), self.tr("Close Heads"),
+            self.__closeHeadsActTriggered)
+        self.__closeHeadsAct.setToolTip(self.tr("Close the selected heads"))
+        
         self.__switchAct = self.__actionsMenu.addAction(
             UI.PixmapCache.getIcon("vcsSwitch.png"), self.tr("Switch"),
             self.__switchActTriggered)
@@ -499,7 +522,10 @@
         
         self.logTree.clear()
         
-        self.commandMode = self.initialCommandMode
+        if self.initialCommandMode == "full_log":
+            self.commandMode = "incoming"
+        else:
+            self.commandMode = self.initialCommandMode
     
     def __resizeColumnsLog(self):
         """
@@ -595,23 +621,31 @@
         return col, color, edges
     
     def __generateIcon(self, column, color, bottomedges, topedges, dotColor,
-                       currentRev, closed):
+                       currentRev, closed, isDraft):
         """
         Private method to generate an icon containing the revision tree for the
         given data.
         
-        @param column column index of the revision (integer)
-        @param color color of the node (integer)
+        @param column column index of the revision
+        @type int
+        @param color color of the node
+        @type int
         @param bottomedges list of edges for the bottom of the node
-            (list of tuples of three integers)
+        @type list of tuples of (int, int, int)
         @param topedges list of edges for the top of the node
-            (list of tuples of three integers)
-        @param dotColor color to be used for the dot (QColor)
+        @type list of tuples of (int, int, int)
+        @param dotColor color to be used for the dot
+        @type QColor
         @param currentRev flag indicating to draw the icon for the
-            current revision (boolean)
+            current revision
+        @type bool
         @param closed flag indicating to draw an icon for a closed
-            branch (boolean)
-        @return icon for the node (QIcon)
+            branch
+        @type bool
+        @param isDraft flag indicating an entry of phase 'draft'
+        @type bool
+        @return icon for the node
+        @rtype QIcon
         """
         def col2x(col, radius):
             """
@@ -678,21 +712,30 @@
         elif self.commandMode in ("incoming", "outgoing"):
             offset = radius // 2
             if self.commandMode == "incoming":
-                # incoming, draw a down arrow
+                # incoming: draw a down arrow
                 painter.drawConvexPolygon(
                     QPoint(dot_x, dot_y),
                     QPoint(dot_x + 2 * offset, dot_y),
                     QPoint(dot_x + offset, dot_y + 2 * offset)
                 )
             else:
-                # outgoing, draw an up arrow
+                # outgoing: draw an up arrow
                 painter.drawConvexPolygon(
                     QPoint(dot_x + offset, dot_y),
                     QPoint(dot_x, dot_y + 2 * offset),
                     QPoint(dot_x + 2 * offset, dot_y + 2 * offset)
                 )
         else:
-            painter.drawEllipse(dot_x, dot_y, radius, radius)
+            if isDraft:
+                # 'draft' phase: draw an up arrow like outgoing
+                offset = radius // 2
+                painter.drawConvexPolygon(
+                    QPoint(dot_x + offset, dot_y),
+                    QPoint(dot_x, dot_y + 2 * offset),
+                    QPoint(dot_x + 2 * offset, dot_y + 2 * offset)
+                )
+            else:
+                painter.drawEllipse(dot_x, dot_y, radius, radius)
         painter.end()
         return QIcon(pix)
     
@@ -841,6 +884,50 @@
                     self.__closedBranchesRevs.append(
                         parts[-2].split(":", 1)[0])
     
+    def __getHeads(self):
+        """
+        Private method to get the list of all heads.
+        """
+        self.__headRevisions = []
+        errMsg = ""
+        
+        args = self.vcs.initCommand("heads")
+        args.append("--closed")
+        args.append("--template")
+        args.append("{rev}\n")
+        
+        output = ""
+        if self.__hgClient:
+            output, errMsg = self.__hgClient.runcommand(args)
+        else:
+            process = QProcess()
+            process.setWorkingDirectory(self.repodir)
+            process.start('hg', args)
+            procStarted = process.waitForStarted(5000)
+            if procStarted:
+                finished = process.waitForFinished(30000)
+                if finished and process.exitCode() == 0:
+                    output = str(process.readAllStandardOutput(),
+                                 self.vcs.getEncoding(), 'replace')
+                else:
+                    if not finished:
+                        errMsg = self.tr(
+                            "The hg process did not finish within 30s.")
+            else:
+                errMsg = self.tr("Could not start the hg executable.")
+        
+        if errMsg:
+            E5MessageBox.critical(
+                self,
+                self.tr("Mercurial Error"),
+                errMsg)
+        
+        if output:
+            for line in output.splitlines():
+                line = line.strip()
+                if line:
+                    self.__headRevisions.append(line)
+    
     def __getRevisionOfTag(self, tag):
         """
         Private method to get the revision of a tag.
@@ -970,6 +1057,7 @@
             itm.setData(0, self.__parentsRole, parents)
             for parent in parents:
                 self.__childrenInfo[parent].append(int(rev))
+        itm.setData(0, self.__incomingRole, self.commandMode == "incoming")
         
         if self.logTree.topLevelItemCount() > 1:
             topedges = \
@@ -982,7 +1070,8 @@
         icon = self.__generateIcon(column, color, edges, topedges,
                                    QColor(self.__branchColor(branches[0])),
                                    rev == self.__projectRevision,
-                                   rev in self.__closedBranchesRevs)
+                                   rev in self.__closedBranchesRevs,
+                                   phase == "draft")
         itm.setIcon(0, icon)
         
         try:
@@ -1064,7 +1153,12 @@
             else:
                 err = ""
             if err:
-                self.__showError(err)
+                if self.commandMode == "incoming" and \
+                        self.initialCommandMode == "full_log":
+                    # ignore the error
+                    self.commandMode = "log"
+                else:
+                    self.__showError(err)
             elif self.commandMode != "incoming" or \
                 (self.vcs.bundleFile and
                  os.path.exists(self.vcs.bundleFile)) or \
@@ -1074,6 +1168,10 @@
                 if err:
                     self.__showError(err)
                 self.__processBuffer()
+            elif self.commandMode == "incoming" and \
+                    self.initialCommandMode == "full_log":
+                # no incoming changesets, just switch to log mode
+                self.commandMode = "log"
             self.__finish()
         else:
             self.process.kill()
@@ -1120,9 +1218,18 @@
         self.__bundle = bundle
         self.__isFile = isFile
         
+        if self.initialCommandMode == "full_log":
+            if isFile:
+                self.commandMode = "log"
+                self.__finishCallbacks = []
+            else:
+                self.commandMode = "incoming"
+                self.__addFinishCallback(self.on_nextButton_clicked)
+        
         self.sbsSelectLabel.clear()
         
         self.errorGroup.hide()
+        self.errors.clear()
         QApplication.processEvents()
         
         self.__initData()
@@ -1146,6 +1253,7 @@
         self.__started = True
         self.__identifyProject()
         self.__getClosedBranches()
+        self.__getHeads()
         self.__getLogEntries(noEntries=noEntries)
     
     def __procFinished(self, exitCode, exitStatus):
@@ -1311,17 +1419,20 @@
         self.__resizeColumnsLog()
         
         if self.__started:
-            if self.__selectedRevisions:
-                foundItems = self.logTree.findItems(
-                    self.__selectedRevisions[0], Qt.MatchExactly,
-                    self.RevisionColumn)
-                if foundItems:
-                    self.logTree.setCurrentItem(foundItems[0])
+            if not self.__finishCallbacks:
+                # we are really done
+                if self.__selectedRevisions:
+                    foundItems = self.logTree.findItems(
+                        self.__selectedRevisions[0], Qt.MatchExactly,
+                        self.RevisionColumn)
+                    if foundItems:
+                        self.logTree.setCurrentItem(foundItems[0])
+                    else:
+                        self.logTree.setCurrentItem(
+                            self.logTree.topLevelItem(0))
                 else:
                     self.logTree.setCurrentItem(self.logTree.topLevelItem(0))
-            else:
-                self.logTree.setCurrentItem(self.logTree.topLevelItem(0))
-            self.__started = False
+                self.__started = False
         
         if self.commandMode in ("incoming", "outgoing"):
             self.commandMode = "log"    # switch to log mode
@@ -1356,8 +1467,9 @@
             self.__filterLogs()
         self.__updateToolMenuActions()
         
-        # restore current item
-        if self.__selectedRevisions:
+        # restore selected item
+        if self.__selectedRevisions and not self.__finishCallbacks:
+            # we are really done
             for revision in self.__selectedRevisions:
                 items = self.logTree.findItems(
                     revision, Qt.MatchExactly, self.RevisionColumn)
@@ -1460,13 +1572,15 @@
         Private slot to update the status of the tool menu actions and
         the tool menu button.
         """
-        if self.initialCommandMode == "log" and self.projectMode:
+        if self.initialCommandMode in ("log", "full_log") and self.projectMode:
             # do the phase action
             # step 1: count entries with changeable phases
             secret = 0
             draft = 0
             public = 0
-            for itm in self.logTree.selectedItems():
+            for itm in [item for item in self.logTree.selectedItems()
+                        if not item.data(0, self.__incomingRole)]:
+                # count phase for local items only
                 phase = itm.text(self.PhaseColumn)
                 if phase == self.phases["draft"]:
                     draft += 1
@@ -1487,7 +1601,9 @@
             # step 1: count selected entries not belonging to the
             #         current branch
             otherBranches = 0
-            for itm in self.logTree.selectedItems():
+            for itm in [item for item in self.logTree.selectedItems()
+                        if not item.data(0, self.__incomingRole)]:
+                # for local items only
                 branch = itm.text(self.BranchColumn)
                 if branch != self.__projectBranch:
                     otherBranches += 1
@@ -1495,15 +1611,27 @@
             # step 2: set the status of the graft action
             self.__graftAct.setEnabled(otherBranches > 0)
             
-            selectedItemsCount = len(self.logTree.selectedItems())
+            selectedItemsCount = len([
+                itm for itm in self.logTree.selectedItems()
+                if not itm.data(0, self.__incomingRole)
+            ])
+            selectedIncomingItemsCount = len([
+                itm for itm in self.logTree.selectedItems()
+                if itm.data(0, self.__incomingRole)
+            ])
+            
             self.__mergeAct.setEnabled(selectedItemsCount == 1)
             self.__tagAct.setEnabled(selectedItemsCount == 1)
             self.__switchAct.setEnabled(selectedItemsCount == 1)
             self.__bookmarkAct.setEnabled(selectedItemsCount == 1)
             self.__bookmarkMoveAct.setEnabled(selectedItemsCount == 1)
             
-            self.__pullAct.setText(self.tr("Pull Changes"))
-            self.__fetchAct.setText(self.tr("Fetch Changes"))
+            if selectedIncomingItemsCount > 0:
+                self.__pullAct.setText(self.tr("Pull Selected Changes"))
+                self.__fetchAct.setText(self.tr("Fetch Selected Changes"))
+            else:
+                self.__pullAct.setText(self.tr("Pull Changes"))
+                self.__fetchAct.setText(self.tr("Fetch Changes"))
             if self.vcs.canPull():
                 self.__pullAct.setEnabled(True)
                 self.__lfPullAct.setEnabled(
@@ -1519,6 +1647,8 @@
             if self.vcs.canPush():
                 self.__pushAct.setEnabled(
                     selectedItemsCount == 1 and
+                    not self.logTree.selectedItems()[0].data(
+                        0, self.__incomingRole) and
                     self.logTree.selectedItems()[0].text(self.PhaseColumn) ==
                     self.phases["draft"])
                 self.__pushAllAct.setEnabled(True)
@@ -1530,7 +1660,20 @@
                 self.vcs.isExtensionActive("strip") and
                 selectedItemsCount == 1)
             
-            self.__bundleAct.setEnabled(self.logTree.topLevelItemCount() > 0)
+            # count incoming items for 'full_log'
+            if self.initialCommandMode == "full_log":
+                # incoming items are at the top
+                incomingCount = 0
+                for row in range(self.logTree.topLevelItemCount()):
+                    if self.logTree.topLevelItem(row).data(
+                            0, self.__incomingRole):
+                        incomingCount += 1
+                    else:
+                        break
+                localCount = self.logTree.topLevelItemCount() - incomingCount
+            else:
+                localCount = self.logTree.topLevelItemCount()
+            self.__bundleAct.setEnabled(localCount > 0)
             self.__unbundleAct.setEnabled(False)
             
             self.__gpgSignAct.setEnabled(
@@ -1540,33 +1683,39 @@
                 self.vcs.isExtensionActive("gpg") and
                 selectedItemsCount == 1)
             
+            if self.vcs.isExtensionActive("closehead"):
+                revs = [itm.text(self.RevisionColumn).strip().split(":", 1)[0]
+                        for itm in self.logTree.selectedItems()
+                        if not itm.data(0, self.__incomingRole)]
+                revs = [rev for rev in revs if rev in self.__headRevisions]
+                self.__closeHeadsAct.setEnabled(len(revs) > 0)
+            else:
+                self.__closeHeadsAct.setEnabled(False)
             self.actionsButton.setEnabled(True)
         
         elif self.initialCommandMode == "incoming" and self.projectMode:
             for act in [self.__phaseAct, self.__graftAct, self.__mergeAct,
-                        self.__tagAct, self.__switchAct, self.__bookmarkAct,
-                        self.__bookmarkMoveAct, self.__pushAct,
-                        self.__pushAllAct, self.__stripAct, self.__bundleAct,
-                        self.__gpgSignAct, self.__gpgVerifyAct]:
+                        self.__tagAct, self.__closeHeadsAct, self.__switchAct,
+                        self.__bookmarkAct, self.__bookmarkMoveAct,
+                        self.__pushAct, self.__pushAllAct, self.__stripAct,
+                        self.__bundleAct, self.__gpgSignAct,
+                        self.__gpgVerifyAct]:
                 act.setEnabled(False)
             
             self.__pullAct.setText(self.tr("Pull Selected Changes"))
             self.__fetchAct.setText(self.tr("Fetch Selected Changes"))
             if self.vcs.canPull() and not bool(self.__bundle):
-                # step 1: determine number of selected draft changesets
-                #         i.e. those that can be pulled
-                selectedDraftItemsCount = 0
-                for itm in self.logTree.selectedItems():
-                    phase = itm.text(self.PhaseColumn)
-                    if phase == self.phases["draft"]:
-                        selectedDraftItemsCount += 1
-                self.__pullAct.setEnabled(selectedDraftItemsCount > 0)
+                selectedIncomingItemsCount = len([
+                    itm for itm in self.logTree.selectedItems()
+                    if itm.data(0, self.__incomingRole)
+                ])
+                self.__pullAct.setEnabled(selectedIncomingItemsCount > 0)
                 self.__lfPullAct.setEnabled(
                     self.vcs.isExtensionActive("largefiles") and
                     selectedItemsCount > 0)
                 self.__fetchAct.setEnabled(
                     self.vcs.isExtensionActive("fetch") and
-                    selectedDraftItemsCount > 0)
+                    selectedIncomingItemsCount > 0)
             else:
                 self.__pullAct.setEnabled(False)
                 self.__lfPullAct.setEnabled(False)
@@ -1578,11 +1727,11 @@
         
         elif self.initialCommandMode == "outgoing" and self.projectMode:
             for act in [self.__phaseAct, self.__graftAct, self.__mergeAct,
-                        self.__tagAct, self.__switchAct, self.__bookmarkAct,
-                        self.__bookmarkMoveAct, self.__pullAct,
-                        self.__lfPullAct, self.__fetchAct, self.__stripAct,
-                        self.__gpgSignAct, self.__gpgVerifyAct,
-                        self.__unbundleAct]:
+                        self.__tagAct, self.__closeHeadsAct, self.__switchAct,
+                        self.__bookmarkAct, self.__bookmarkMoveAct,
+                        self.__pullAct, self.__lfPullAct, self.__fetchAct,
+                        self.__stripAct, self.__gpgSignAct,
+                        self.__gpgVerifyAct, self.__unbundleAct]:
                 act.setEnabled(False)
             
             selectedItemsCount = len(self.logTree.selectedItems())
@@ -1789,8 +1938,11 @@
         """
         Private slot to handle the Next button.
         """
-        if self.__lastRev > 0 and self.nextButton.isEnabled():
-            self.__getLogEntries(startRev=self.__lastRev - 1)
+        if self.nextButton.isEnabled():
+            if self.__lastRev > 0:
+                self.__getLogEntries(startRev=self.__lastRev - 1)
+            else:
+                self.__getLogEntries()
     
     @pyqtSlot(QDate)
     def on_fromDate_dateChanged(self, date):
@@ -1921,6 +2073,9 @@
             fieldIndex = self.__changesRole
             searchRx = QRegExp(self.rxEdit.text(), Qt.CaseInsensitive)
             indexIsRole = True
+        elif txt == "phase":
+            fieldIndex = self.PhaseColumn
+            searchRx = QRegExp(self.rxEdit.text(), Qt.CaseInsensitive)
         else:
             fieldIndex = self.__messageRole
             searchRx = QRegExp(self.rxEdit.text(), Qt.CaseInsensitive)
@@ -1941,9 +2096,13 @@
         self.limitSpinBox.setEnabled(True)
     
     @pyqtSlot()
-    def on_refreshButton_clicked(self):
+    def on_refreshButton_clicked(self, addNext=False):
         """
         Private slot to refresh the log.
+        
+        @param addNext flag indicating to get a second batch of log entries as
+            well
+        @type bool
         """
         self.buttonBox.button(QDialogButtonBox.Close).setEnabled(False)
         self.buttonBox.button(QDialogButtonBox.Cancel).setEnabled(True)
@@ -1959,12 +2118,18 @@
         if self.initialCommandMode in ("incoming", "outgoing"):
             self.nextButton.setEnabled(False)
             self.limitSpinBox.setEnabled(False)
+            if addNext:
+                self.__addFinishCallback(self.on_nextButton_clicked)
         else:
             self.nextButton.setEnabled(True)
             self.limitSpinBox.setEnabled(True)
         
-        self.commandMode = self.initialCommandMode
-        self.start(self.__filename, isFile=self.__isFile,
+        if self.initialCommandMode == "full_log":
+            self.commandMode = "incoming"
+            self.__addFinishCallback(self.on_nextButton_clicked)
+        else:
+            self.commandMode = self.initialCommandMode
+        self.start(self.__filename, bundle=self.__bundle, isFile=self.__isFile,
                    noEntries=self.logTree.topLevelItemCount())
     
     def on_passwordCheckBox_toggled(self, isOn):
@@ -2022,27 +2187,29 @@
         """
         Private slot to handle the Change Phase action.
         """
-        currentPhase = self.logTree.selectedItems()[0].text(self.PhaseColumn)
-        revs = []
-        for itm in self.logTree.selectedItems():
-            if itm.text(self.PhaseColumn) == currentPhase:
-                revs.append(
-                    itm.text(self.RevisionColumn).split(":")[0].strip())
-        
-        if not revs:
-            self.__phaseAct.setEnabled(False)
-            return
-        
-        if currentPhase == self.phases["draft"]:
-            newPhase = self.phases["secret"]
-            data = (revs, "s", True)
-        else:
-            newPhase = self.phases["draft"]
-            data = (revs, "d", False)
-        res = self.vcs.hgPhase(self.repodir, data)
-        if res:
+        itm = self.logTree.selectedItems()[0]
+        if not itm.data(0, self.__incomingRole):
+            currentPhase = itm.text(self.PhaseColumn)
+            revs = []
             for itm in self.logTree.selectedItems():
-                itm.setText(self.PhaseColumn, newPhase)
+                if itm.text(self.PhaseColumn) == currentPhase:
+                    revs.append(
+                        itm.text(self.RevisionColumn).split(":")[0].strip())
+            
+            if not revs:
+                self.__phaseAct.setEnabled(False)
+                return
+            
+            if currentPhase == self.phases["draft"]:
+                newPhase = self.phases["secret"]
+                data = (revs, "s", True)
+            else:
+                newPhase = self.phases["draft"]
+                data = (revs, "d", False)
+            res = self.vcs.hgPhase(self.repodir, data)
+            if res:
+                for itm in self.logTree.selectedItems():
+                    itm.setText(self.PhaseColumn, newPhase)
     
     @pyqtSlot()
     def __graftActTriggered(self):
@@ -2051,7 +2218,8 @@
         """
         revs = []
         
-        for itm in self.logTree.selectedItems():
+        for itm in [item for item in self.logTree.selectedItems()
+                    if not item.data(0, self.__incomingRole)]:
             branch = itm.text(self.BranchColumn)
             if branch != self.__projectBranch:
                 revs.append(
@@ -2077,7 +2245,8 @@
         """
         Private slot to tag the selected revision.
         """
-        if len(self.logTree.selectedItems()) == 1:
+        if len([itm for itm in self.logTree.selectedItems()
+                if not itm.data(0, self.__incomingRole)]) == 1:
             itm = self.logTree.selectedItems()[0]
             rev = itm.text(self.RevisionColumn).strip().split(":", 1)[0]
             tag = itm.text(self.TagsColumn).strip().split(", ", 1)[0]
@@ -2086,12 +2255,31 @@
                 self.on_refreshButton_clicked()
     
     @pyqtSlot()
+    def __closeHeadsActTriggered(self):
+        """
+        Private slot to close the selected head revisions.
+        """
+        if self.vcs.isExtensionActive("closehead"):
+            revs = [itm.text(self.RevisionColumn).strip().split(":", 1)[0]
+                    for itm in self.logTree.selectedItems()
+                    if not itm.data(0, self.__incomingRole)]
+            revs = [rev for rev in revs if rev in self.__headRevisions]
+            if revs:
+                closeheadExtension = self.vcs.getExtensionObject("closehead")
+                if closeheadExtension is not None:
+                    closeheadExtension.hgCloseheads(
+                        self.repodir, revisions=revs)
+                    
+                    self.on_refreshButton_clicked()
+    
+    @pyqtSlot()
     def __switchActTriggered(self):
         """
         Private slot to switch the working directory to the
         selected revision.
         """
-        if len(self.logTree.selectedItems()) == 1:
+        if len([itm for itm in self.logTree.selectedItems()
+                if not itm.data(0, self.__incomingRole)]) == 1:
             itm = self.logTree.selectedItems()[0]
             rev = itm.text(self.RevisionColumn).strip().split(":", 1)[0]
             bookmarks = [bm.strip() for bm in
@@ -2129,7 +2317,8 @@
         """
         Private slot to bookmark the selected revision.
         """
-        if len(self.logTree.selectedItems()) == 1:
+        if len([itm for itm in self.logTree.selectedItems()
+                if not itm.data(0, self.__incomingRole)]) == 1:
             itm = self.logTree.selectedItems()[0]
             rev, changeset = \
                 itm.text(self.RevisionColumn).strip().split(":", 1)
@@ -2150,7 +2339,8 @@
         """
         Private slot to move a bookmark to the selected revision.
         """
-        if len(self.logTree.selectedItems()) == 1:
+        if len([itm for itm in self.logTree.selectedItems()
+                if not itm.data(0, self.__incomingRole)]) == 1:
             itm = self.logTree.selectedItems()[0]
             rev, changeset = \
                 itm.text(self.RevisionColumn).strip().split(":", 1)
@@ -2174,7 +2364,8 @@
         Private slot to pull large files of selected revisions.
         """
         revs = []
-        for itm in self.logTree.selectedItems():
+        for itm in [item for item in self.logTree.selectedItems()
+                    if not item.data(0, self.__incomingRole)]:
             rev = itm.text(self.RevisionColumn).strip().split(":", 1)[0]
             if rev:
                 revs.append(rev)
@@ -2190,22 +2381,20 @@
         """
         shouldReopen = False
         refresh = False
+        addNext = False
         
-        if self.initialCommandMode == "log":
-            shouldReopen = self.vcs.getExtensionObject("fetch").hgFetch(
-                self.repodir)
-            refresh = True
-        elif self.initialCommandMode == "incoming":
+        if self.initialCommandMode in ("log", "full_log", "incoming"):
             revs = []
-            for itm in self.logTree.selectedItems():
+            for itm in [item for item in self.logTree.selectedItems()
+                        if item.data(0, self.__incomingRole)]:
                 rev = itm.text(self.RevisionColumn).split(":")[1].strip()
-                phase = itm.text(self.PhaseColumn).strip()
-                if rev and phase == self.phases["draft"]:
+                if rev:
                     revs.append(rev)
-            if revs:
-                shouldReopen = self.vcs.getExtensionObject("fetch").hgFetch(
-                    self.repodir, )
-                refresh = True
+            shouldReopen = self.vcs.getExtensionObject("fetch").hgFetch(
+                self.repodir, revisions=revs)
+            refresh = True
+            if self.initialCommandMode == "incoming":
+                addNext = True
         if shouldReopen:
             res = E5MessageBox.yesNo(
                 None,
@@ -2218,7 +2407,7 @@
                 return
         
         if refresh:
-            self.on_refreshButton_clicked()
+            self.on_refreshButton_clicked(addNext=addNext)
     
     @pyqtSlot()
     def __pullActTriggered(self):
@@ -2227,20 +2416,19 @@
         """
         shouldReopen = False
         refresh = False
+        addNext = False
         
-        if self.initialCommandMode == "log":
-            shouldReopen = self.vcs.hgPull(self.repodir)
-            refresh = True
-        elif self.initialCommandMode == "incoming":
+        if self.initialCommandMode in ("log", "full_log", "incoming"):
             revs = []
-            for itm in self.logTree.selectedItems():
+            for itm in [item for item in self.logTree.selectedItems()
+                        if item.data(0, self.__incomingRole)]:
                 rev = itm.text(self.RevisionColumn).split(":")[1].strip()
-                phase = itm.text(self.PhaseColumn).strip()
-                if rev and phase == self.phases["draft"]:
+                if rev:
                     revs.append(rev)
-            if revs:
-                shouldReopen = self.vcs.hgPull(self.repodir, revisions=revs)
-                refresh = True
+            shouldReopen = self.vcs.hgPull(self.repodir, revisions=revs)
+            refresh = True
+            if self.initialCommandMode == "incoming":
+                addNext = True
         
         if shouldReopen:
             res = E5MessageBox.yesNo(
@@ -2254,7 +2442,7 @@
                 return
         
         if refresh:
-            self.on_refreshButton_clicked()
+            self.on_refreshButton_clicked(addNext=addNext)
     
     @pyqtSlot()
     def __pushActTriggered(self):
@@ -2263,10 +2451,12 @@
         changeset.
         """
         itm = self.logTree.selectedItems()[0]
-        rev = itm.text(self.RevisionColumn).strip().split(":", 1)[0]
-        if rev:
-            self.vcs.hgPush(self.repodir, rev=rev)
-            self.on_refreshButton_clicked()
+        if not itm.data(0, self.__incomingRole):
+            rev = itm.text(self.RevisionColumn).strip().split(":", 1)[0]
+            if rev:
+                self.vcs.hgPush(self.repodir, rev=rev)
+                self.on_refreshButton_clicked(
+                    addNext=self.initialCommandMode == "outgoing")
     
     @pyqtSlot()
     def __pushAllActTriggered(self):
@@ -2282,20 +2472,21 @@
         Private slot to strip changesets from the repository.
         """
         itm = self.logTree.selectedItems()[0]
-        rev = itm.text(self.RevisionColumn).strip().split(":", 1)[1]
-        shouldReopen = self.vcs.getExtensionObject("strip").hgStrip(
-            self.repodir, rev=rev)
-        if shouldReopen:
-            res = E5MessageBox.yesNo(
-                None,
-                self.tr("Strip Changesets"),
-                self.tr(
-                    """The project should be reread. Do this now?"""),
-                yesDefault=True)
-            if res:
-                e5App().getObject("Project").reopenProject()
-                return
-        
+        if not itm.data(0, self.__incomingRole):
+            rev = itm.text(self.RevisionColumn).strip().split(":", 1)[1]
+            shouldReopen = self.vcs.getExtensionObject("strip").hgStrip(
+                self.repodir, rev=rev)
+            if shouldReopen:
+                res = E5MessageBox.yesNo(
+                    None,
+                    self.tr("Strip Changesets"),
+                    self.tr(
+                        """The project should be reread. Do this now?"""),
+                    yesDefault=True)
+                if res:
+                    e5App().getObject("Project").reopenProject()
+                    return
+            
         self.on_refreshButton_clicked()
     
     @pyqtSlot()
@@ -2305,17 +2496,19 @@
         changeset.
         """
         itm = self.logTree.selectedItems()[0]
-        rev = "rev({0})".format(
-            itm.text(self.RevisionColumn).strip().split(":", 1)[0])
-        self.vcs.vcsMerge(self.repodir, rev=rev)
+        if not itm.data(0, self.__incomingRole):
+            rev = "rev({0})".format(
+                itm.text(self.RevisionColumn).strip().split(":", 1)[0])
+            self.vcs.vcsMerge(self.repodir, rev=rev)
     
     @pyqtSlot()
     def __bundleActTriggered(self):
         """
         Private slot to create a changegroup file.
         """
-        if self.initialCommandMode == "log":
-            selectedItems = self.logTree.selectedItems()
+        if self.initialCommandMode in ("log", "full_log"):
+            selectedItems = [itm for itm in self.logTree.selectedItems()
+                             if not itm.data(0, self.__incomingRole)]
             if len(selectedItems) == 0:
                 # all revisions of the local repository will be bundled
                 bundleData = {
@@ -2394,7 +2587,8 @@
         Private slot to sign the selected revisions.
         """
         revs = []
-        for itm in self.logTree.selectedItems():
+        for itm in [item for item in self.logTree.selectedItems()
+                    if not item.data(0, self.__incomingRole)]:
             rev = itm.text(self.RevisionColumn).split(":", 1)[0].strip()
             if rev:
                 revs.append(rev)
@@ -2408,11 +2602,12 @@
         """
         Private slot to verify the signatures of a selected revisions.
         """
-        rev = self.logTree.selectedItems()[0].text(self.RevisionColumn)\
-            .split(":", 1)[0].strip()
-        if rev:
-            self.vcs.getExtensionObject("gpg").hgGpgVerifySignatures(
-                self.repodir, rev=rev)
+        itm = self.logTree.selectedItems()[0]
+        if not itm.data(0, self.__incomingRole):
+            rev = itm.text(self.RevisionColumn).split(":", 1)[0].strip()
+            if rev:
+                self.vcs.getExtensionObject("gpg").hgGpgVerifySignatures(
+                    self.repodir, rev=rev)
     
     def __selectAllActTriggered(self, select=True):
         """
--- a/eric6/Plugins/VcsPlugins/vcsMercurial/HgTagBranchListDialog.py	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Plugins/VcsPlugins/vcsMercurial/HgTagBranchListDialog.py	Sun Jun 02 11:42:48 2019 +0200
@@ -18,7 +18,7 @@
 from PyQt5.QtCore import pyqtSlot, QProcess, Qt, QTimer, QCoreApplication, \
     QPoint
 from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QHeaderView, \
-    QTreeWidgetItem, QLineEdit, QMenu
+    QTreeWidgetItem, QLineEdit, QMenu, QAbstractItemView
 
 from E5Gui.E5Application import e5App
 from E5Gui import E5MessageBox
@@ -58,6 +58,7 @@
         self.allTagsList = None
         self.__hgClient = vcs.getClient()
         self.__currentRevision = ""
+        self.__currentBranch = ""
         
         self.tagList.headerItem().setText(self.tagList.columnCount(), "")
         self.tagList.header().setSortIndicator(3, Qt.AscendingOrder)
@@ -110,6 +111,9 @@
         if not tags:
             self.setWindowTitle(self.tr("Mercurial Branches List"))
             self.tagList.headerItem().setText(2, self.tr("Status"))
+            if self.vcs.isExtensionActive("closehead"):
+                self.tagList.setSelectionMode(
+                    QAbstractItemView.ExtendedSelection)
         self.activateWindow()
         
         self.tagsList = tagsList
@@ -377,10 +381,10 @@
         """
         Private method to highlight the current branch with a bold font.
         """
-        currentBranch = self.vcs.hgGetCurrentBranch(self.__repoDir)
-        if currentBranch:
+        self.__currentBranch = self.vcs.hgGetCurrentBranch(self.__repoDir)
+        if self.__currentBranch:
             items = self.tagList.findItems(
-                currentBranch, Qt.MatchCaseSensitive, 3)
+                self.__currentBranch, Qt.MatchCaseSensitive, 3)
             if len(items) == 1:
                 font = items[0].font(3)
                 font.setBold(True)
@@ -427,13 +431,24 @@
                     UI.PixmapCache.getIcon("vcsSwitch.png"),
                     self.tr("Switch to"), self.__switchTo)
             else:
-                menu.addAction(
+                act = menu.addAction(
                     UI.PixmapCache.getIcon("vcsSwitch.png"),
                     self.tr("Switch to"), self.__switchTo)
+                act.setEnabled(itm.text(3) != self.__currentBranch)
                 menu.addSeparator()
-                act = menu.addAction(self.tr("Close Branch"),
-                                     self.__closeBranch)
-                act.setEnabled(itm.text(3) != "default")
+                if self.vcs.isExtensionActive("closehead"):
+                    act = menu.addAction(
+                        UI.PixmapCache.getIcon("closehead"),
+                        self.tr("Close Branches"), self.__closeBranchHeads)
+                    act.setEnabled(len([
+                        itm for itm in self.tagList.selectedItems()
+                        if itm.text(3) != "default"
+                    ]) > 0)
+                else:
+                    act = menu.addAction(
+                        UI.PixmapCache.getIcon("closehead"),
+                        self.tr("Close Branch"), self.__closeBranch)
+                    act.setEnabled(itm.text(3) != "default")
             menu.popup(self.tagList.mapToGlobal(pos))
     
     def __switchTo(self):
@@ -493,3 +508,23 @@
                                    revision=currentBranch)
             
             self.on_refreshButton_clicked()
+    
+    def __closeBranchHeads(self):
+        """
+        Private slot to close the selected branches.
+        """
+        branches = [itm.text(3) for itm in self.tagsList.selectedItems()
+                    if itm.text(3) != "default"]
+        
+        from UI.DeleteFilesConfirmationDialog import \
+            DeleteFilesConfirmationDialog
+        dlg = DeleteFilesConfirmationDialog(
+            self.parent(),
+            self.tr("Close Branches"),
+            self.tr(
+                "Do you really want to close all listed branches?"),
+            branches)
+        yes = dlg.exec_() == QDialog.Accepted
+        if yes:
+            self.vcs.getExtensionObject("closehead").hgCloseheads(
+                self.__repoDir, branches)
--- a/eric6/Plugins/VcsPlugins/vcsMercurial/HgUserConfigDialog.py	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Plugins/VcsPlugins/vcsMercurial/HgUserConfigDialog.py	Sun Jun 02 11:42:48 2019 +0200
@@ -199,6 +199,13 @@
             if "largefiles" in self.__config["extensions"]:
                 del self.__config["extensions"]["largefiles"]
             self.__config["extensions"]["#largefiles"] = ""
+        
+        if self.closeheadCheckBox.isChecked() and self.__version >= (4, 8, 0):
+            self.__config["extensions"]["closehead"] = ""
+        else:
+            if "closehead" in self.__config["extensions"]:
+                del self.__config["extensions"]["closehead"]
+            self.__config["extensions"]["#closehead"] = ""
         ###################################################################
         ## http_proxy section
         ###################################################################
@@ -335,6 +342,9 @@
                     "strip" in self.__config["extensions"])
                 self.histeditCheckBox.setChecked(
                     "histedit" in self.__config["extensions"])
+                self.closeheadCheckBox.setChecked(
+                    "closehead" in self.__config["extensions"])
+            self.closeheadCheckBox.setEnabled(self.__version >= (4, 8, 0))
             
             # step 3: extract large files information
             if "largefiles" in self.__config:
--- a/eric6/Plugins/VcsPlugins/vcsMercurial/HgUserConfigDialog.ui	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Plugins/VcsPlugins/vcsMercurial/HgUserConfigDialog.ui	Sun Jun 02 11:42:48 2019 +0200
@@ -20,7 +20,7 @@
    <item>
     <widget class="QTabWidget" name="tabWidget">
      <property name="currentIndex">
-      <number>3</number>
+      <number>1</number>
      </property>
      <widget class="QWidget" name="tab">
       <attribute name="title">
@@ -121,6 +121,16 @@
          </property>
          <layout class="QGridLayout" name="gridLayout_2">
           <item row="0" column="0">
+           <widget class="QCheckBox" name="closeheadCheckBox">
+            <property name="toolTip">
+             <string>Select to activate the closehead extension</string>
+            </property>
+            <property name="text">
+             <string>Close Head</string>
+            </property>
+           </widget>
+          </item>
+          <item row="0" column="1">
            <widget class="QCheckBox" name="fetchCheckBox">
             <property name="toolTip">
              <string>Select to activate the fetch extension</string>
@@ -130,7 +140,7 @@
             </property>
            </widget>
           </item>
-          <item row="0" column="1">
+          <item row="1" column="0">
            <widget class="QCheckBox" name="gpgCheckBox">
             <property name="toolTip">
              <string>Select to activate the GPG extension</string>
@@ -140,7 +150,7 @@
             </property>
            </widget>
           </item>
-          <item row="1" column="0">
+          <item row="1" column="1">
            <widget class="QCheckBox" name="histeditCheckBox">
             <property name="toolTip">
              <string>Select to activate the histedit extension</string>
@@ -150,7 +160,7 @@
             </property>
            </widget>
           </item>
-          <item row="1" column="1">
+          <item row="2" column="0">
            <widget class="QCheckBox" name="largefilesCheckBox">
             <property name="toolTip">
              <string>Select to activate the largefiles extension</string>
@@ -160,7 +170,7 @@
             </property>
            </widget>
           </item>
-          <item row="2" column="0">
+          <item row="2" column="1">
            <widget class="QCheckBox" name="purgeCheckBox">
             <property name="toolTip">
              <string>Select to activate the Purge extension</string>
@@ -170,7 +180,7 @@
             </property>
            </widget>
           </item>
-          <item row="2" column="1">
+          <item row="3" column="0">
            <widget class="QCheckBox" name="queuesCheckBox">
             <property name="toolTip">
              <string>Select to activate the queues extension</string>
@@ -180,7 +190,7 @@
             </property>
            </widget>
           </item>
-          <item row="3" column="0">
+          <item row="3" column="1">
            <widget class="QCheckBox" name="rebaseCheckBox">
             <property name="toolTip">
              <string>Select to activate the rebase extension</string>
@@ -190,7 +200,7 @@
             </property>
            </widget>
           </item>
-          <item row="3" column="1">
+          <item row="4" column="0">
            <widget class="QCheckBox" name="shelveCheckBox">
             <property name="toolTip">
              <string>Select to activate the shelve extension</string>
@@ -200,7 +210,7 @@
             </property>
            </widget>
           </item>
-          <item row="4" column="0">
+          <item row="4" column="1">
            <widget class="QCheckBox" name="stripCheckBox">
             <property name="toolTip">
              <string>Select to activate the strip extension</string>
@@ -672,6 +682,7 @@
   <tabstop>tabWidget</tabstop>
   <tabstop>userNameEdit</tabstop>
   <tabstop>emailEdit</tabstop>
+  <tabstop>closeheadCheckBox</tabstop>
   <tabstop>fetchCheckBox</tabstop>
   <tabstop>gpgCheckBox</tabstop>
   <tabstop>histeditCheckBox</tabstop>
--- a/eric6/Plugins/VcsPlugins/vcsMercurial/ProjectHelper.py	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Plugins/VcsPlugins/vcsMercurial/ProjectHelper.py	Sun Jun 02 11:42:48 2019 +0200
@@ -49,6 +49,7 @@
         from .LargefilesExtension.ProjectHelper import LargefilesProjectHelper
         from .StripExtension.ProjectHelper import StripProjectHelper
         from .HisteditExtension.ProjectHelper import HisteditProjectHelper
+        from .CloseheadExtension.ProjectHelper import CloseheadProjectHelper
         self.__extensions = {
             "mq": QueuesProjectHelper(),
             "fetch": FetchProjectHelper(),
@@ -59,6 +60,7 @@
             "largefiles": LargefilesProjectHelper(),
             "strip": StripProjectHelper(),
             "histedit": HisteditProjectHelper(),
+            "closehead": CloseheadProjectHelper(),
         }
         
         self.__extensionMenuTitles = {}
@@ -554,6 +556,7 @@
         
         self.hgPushBranchAct = E5Action(
             self.tr('Push new branch'),
+            UI.PixmapCache.getIcon("vcsCommit.png"),
             self.tr('Push new branch'),
             0, 0, self, 'mercurial_push_branch')
         self.hgPushBranchAct.setStatusTip(self.tr(
@@ -570,6 +573,7 @@
         
         self.hgCloseBranchAct = E5Action(
             self.tr('Close branch'),
+            UI.PixmapCache.getIcon("closehead"),
             self.tr('Close branch'),
             0, 0, self, 'mercurial_close_branch')
         self.hgCloseBranchAct.setStatusTip(self.tr(
@@ -1620,6 +1624,8 @@
                     self.extensionMenus[extensionName].menu()\
                         .isTearOffMenuVisible():
                 self.extensionMenus[extensionName].menu().hideTearOffMenu()
+        if self.vcs.version < (4, 8, 0):
+            self.extensionMenus["closehead"].setEnabled(False)
     
     def __hgExtendedDiff(self):
         """
--- a/eric6/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/HgShelveDataDialog.py	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/HgShelveDataDialog.py	Sun Jun 02 11:42:48 2019 +0200
@@ -19,11 +19,14 @@
     """
     Class implementing a dialog to enter the data for a shelve operation.
     """
-    def __init__(self, parent=None):
+    def __init__(self, version, parent=None):
         """
         Constructor
         
-        @param parent reference to the parent widget (QWidget)
+        @param version Mercurial version
+        @type tuple of three int
+        @param parent reference to the parent widget
+        @type QWidget
         """
         super(HgShelveDataDialog, self).__init__(parent)
         self.setupUi(self)
@@ -31,6 +34,10 @@
         self.__initialDateTime = QDateTime.currentDateTime()
         self.dateTimeEdit.setDateTime(self.__initialDateTime)
         
+        if version < (5, 0, 0):
+            self.keepCheckBox.setChecked(False)
+            self.keepCheckBox.hide()
+        
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
     
@@ -38,9 +45,10 @@
         """
         Public method to get the user data.
         
-        @return tuple containing the name (string), date (QDateTime),
-            message (string) and a flag indicating to add/remove
-            new/missing files (boolean)
+        @return tuple containing the name, date, message, a flag indicating
+            to add/remove new/missing files and a flag indicating to keep the
+            shelved changes in the working directory
+        @rtype tuple of (str, QDateTime, str, bool, bool)
         """
         if self.dateTimeEdit.dateTime() != self.__initialDateTime:
             dateTime = self.dateTimeEdit.dateTime()
@@ -51,4 +59,5 @@
             dateTime,
             self.messageEdit.text(),
             self.addRemoveCheckBox.isChecked(),
+            self.keepCheckBox.isChecked(),
         )
--- a/eric6/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/HgShelveDataDialog.ui	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/HgShelveDataDialog.ui	Sun Jun 02 11:42:48 2019 +0200
@@ -7,7 +7,7 @@
     <x>0</x>
     <y>0</y>
     <width>500</width>
-    <height>170</height>
+    <height>167</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -93,6 +93,16 @@
     </widget>
    </item>
    <item row="4" column="0" colspan="2">
+    <widget class="QCheckBox" name="keepCheckBox">
+     <property name="toolTip">
+      <string>Select to shelve, but keep the changes in the working directory</string>
+     </property>
+     <property name="text">
+      <string>Shelve, but keep changes</string>
+     </property>
+    </widget>
+   </item>
+   <item row="5" column="0" colspan="2">
     <widget class="QDialogButtonBox" name="buttonBox">
      <property name="orientation">
       <enum>Qt::Horizontal</enum>
--- a/eric6/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/shelve.py	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/shelve.py	Sun Jun 02 11:42:48 2019 +0200
@@ -101,9 +101,9 @@
         
         res = False
         from .HgShelveDataDialog import HgShelveDataDialog
-        dlg = HgShelveDataDialog()
+        dlg = HgShelveDataDialog(self.vcs.version)
         if dlg.exec_() == QDialog.Accepted:
-            shelveName, dateTime, message, addRemove = dlg.getData()
+            shelveName, dateTime, message, addRemove, keep = dlg.getData()
             
             args = self.vcs.initCommand("shelve")
             if shelveName:
@@ -117,6 +117,8 @@
             if dateTime.isValid():
                 args.append("--date")
                 args.append(dateTime.toString("yyyy-MM-dd hh:mm:ss"))
+            if self.vcs.version >= (5, 0, 0) and keep:
+                args.append("--keep")
             args.append("-v")
             
             if isinstance(name, list):
--- a/eric6/Plugins/VcsPlugins/vcsMercurial/hg.py	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Plugins/VcsPlugins/vcsMercurial/hg.py	Sun Jun 02 11:42:48 2019 +0200
@@ -131,6 +131,7 @@
             self.__iniWatcher.addPath(cfgFile)
         
         self.__client = None
+        self.__projectHelper = None
         
         self.__repoDir = ""
         self.__repoIniFile = ""
@@ -147,6 +148,7 @@
         from .LargefilesExtension.largefiles import Largefiles
         from .StripExtension.strip import Strip
         from .HisteditExtension.histedit import Histedit
+        from .CloseheadExtension.closehead import Closehead
         self.__extensions = {
             "mq": Queues(self),
             "fetch": Fetch(self),
@@ -157,6 +159,7 @@
             "largefiles": Largefiles(self),
             "strip": Strip(self),
             "histedit": Histedit(self),
+            "closehead": Closehead(self),
         }
     
     def getPlugin(self):
@@ -212,7 +215,8 @@
             os.remove(self.bundleFile)
         
         # shut down the project helpers
-        self.__projectHelper.shutdown()
+        if self.__projectHelper is not None:
+            self.__projectHelper.shutdown()
         
         # shut down the extensions
         for extension in self.__extensions.values():
@@ -3441,6 +3445,8 @@
                 extensionName = \
                     line.split("=", 1)[0].strip().split(".")[-1].strip()
                 self.__activeExtensions.append(extensionName)
+        if self.version < (4, 8, 0) and "closehead" in self.__activeExtensions:
+            self.__activeExtensions.remove["closehead"]
         
         if activeExtensions != sorted(self.__activeExtensions):
             self.activeExtensionsChanged.emit()
--- a/eric6/Plugins/ViewManagerPlugins/Tabview/Tabview.py	Sat May 04 12:04:12 2019 +0200
+++ b/eric6/Plugins/ViewManagerPlugins/Tabview/Tabview.py	Sun Jun 02 11:42:48 2019 +0200
@@ -209,18 +209,7 @@
         self.navigationButton.setEnabled(False)
         self.rightCornerWidgetLayout.addWidget(self.navigationButton)
         
-        if Preferences.getUI("SingleCloseButton") or \
-           not hasattr(self, 'setTabsClosable'):
-            self.closeButton = QToolButton(self)
-            self.closeButton.setIcon(UI.PixmapCache.getIcon("close.png"))
-            self.closeButton.setToolTip(
-                self.tr("Close the current editor"))
-            self.closeButton.setEnabled(False)
-            self.closeButton.clicked[bool].connect(self.__closeButtonClicked)
-            self.rightCornerWidgetLayout.addWidget(self.closeButton)
-        else:
-            self.tabCloseRequested.connect(self.__closeRequested)
-            self.closeButton = None
+        self.tabCloseRequested.connect(self.__closeRequested)
         
         self.setCornerWidget(self.rightCornerWidget, Qt.TopRightCorner)
         
@@ -370,10 +359,7 @@
         editor = assembly.getEditor()
         super(TabWidget, self).addTab(
             assembly, UI.PixmapCache.getIcon("empty.png"), title)
-        if self.closeButton:
-            self.closeButton.setEnabled(True)
-        else:
-            self.setTabsClosable(True)
+        self.setTabsClosable(True)
         self.navigationButton.setEnabled(True)
         
         if editor not in self.editors:
@@ -404,10 +390,7 @@
             index, assembly,
             UI.PixmapCache.ge