Added the pip interface plug-in to the core plug-ins.

Sat, 09 Dec 2017 18:32:08 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sat, 09 Dec 2017 18:32:08 +0100
changeset 6011
e6af0dcfbb35
parent 6010
7ef7d47a0ad5
child 6012
ff8ac2f1a6ac

Added the pip interface plug-in to the core plug-ins.

APIs/Python3/eric6.api file | annotate | diff | comparison | revisions
APIs/Python3/eric6.bas file | annotate | diff | comparison | revisions
Documentation/Help/source.qch file | annotate | diff | comparison | revisions
Documentation/Help/source.qhp file | annotate | diff | comparison | revisions
Documentation/Source/eric6.E5XML.Config.html file | annotate | diff | comparison | revisions
Documentation/Source/eric6.Plugins.PluginPipInterface.html file | annotate | diff | comparison | revisions
Documentation/Source/eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.PipPage.html file | annotate | diff | comparison | revisions
Documentation/Source/eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html file | annotate | diff | comparison | revisions
Documentation/Source/eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.html file | annotate | diff | comparison | revisions
Documentation/Source/eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html file | annotate | diff | comparison | revisions
Documentation/Source/eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html file | annotate | diff | comparison | revisions
Documentation/Source/eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackageDetailsDialog.html file | annotate | diff | comparison | revisions
Documentation/Source/eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackagesInputDialog.html file | annotate | diff | comparison | revisions
Documentation/Source/eric6.Plugins.UiExtensionPlugins.PipInterface.PipRequirementsSelectionDialog.html file | annotate | diff | comparison | revisions
Documentation/Source/eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html file | annotate | diff | comparison | revisions
Documentation/Source/index-eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.html file | annotate | diff | comparison | revisions
Documentation/Source/index-eric6.Plugins.UiExtensionPlugins.PipInterface.html file | annotate | diff | comparison | revisions
Documentation/Source/index-eric6.Plugins.UiExtensionPlugins.html file | annotate | diff | comparison | revisions
Documentation/Source/index-eric6.Plugins.html file | annotate | diff | comparison | revisions
Plugins/PluginPipInterface.py file | annotate | diff | comparison | revisions
Plugins/UiExtensionPlugins/PipInterface/ConfigurationPage/PipPage.py file | annotate | diff | comparison | revisions
Plugins/UiExtensionPlugins/PipInterface/ConfigurationPage/PipPage.ui file | annotate | diff | comparison | revisions
Plugins/UiExtensionPlugins/PipInterface/ConfigurationPage/__init__.py file | annotate | diff | comparison | revisions
Plugins/UiExtensionPlugins/PipInterface/Pip.py file | annotate | diff | comparison | revisions
Plugins/UiExtensionPlugins/PipInterface/PipDialog.py file | annotate | diff | comparison | revisions
Plugins/UiExtensionPlugins/PipInterface/PipDialog.ui file | annotate | diff | comparison | revisions
Plugins/UiExtensionPlugins/PipInterface/PipFreezeDialog.py file | annotate | diff | comparison | revisions
Plugins/UiExtensionPlugins/PipInterface/PipFreezeDialog.ui file | annotate | diff | comparison | revisions
Plugins/UiExtensionPlugins/PipInterface/PipListDialog.py file | annotate | diff | comparison | revisions
Plugins/UiExtensionPlugins/PipInterface/PipListDialog.ui file | annotate | diff | comparison | revisions
Plugins/UiExtensionPlugins/PipInterface/PipPackageDetailsDialog.py file | annotate | diff | comparison | revisions
Plugins/UiExtensionPlugins/PipInterface/PipPackageDetailsDialog.ui file | annotate | diff | comparison | revisions
Plugins/UiExtensionPlugins/PipInterface/PipPackagesInputDialog.py file | annotate | diff | comparison | revisions
Plugins/UiExtensionPlugins/PipInterface/PipPackagesInputDialog.ui file | annotate | diff | comparison | revisions
Plugins/UiExtensionPlugins/PipInterface/PipRequirementsSelectionDialog.py file | annotate | diff | comparison | revisions
Plugins/UiExtensionPlugins/PipInterface/PipRequirementsSelectionDialog.ui file | annotate | diff | comparison | revisions
Plugins/UiExtensionPlugins/PipInterface/PipSearchDialog.py file | annotate | diff | comparison | revisions
Plugins/UiExtensionPlugins/PipInterface/PipSearchDialog.ui file | annotate | diff | comparison | revisions
Plugins/UiExtensionPlugins/PipInterface/__init__.py file | annotate | diff | comparison | revisions
Plugins/UiExtensionPlugins/__init__.py file | annotate | diff | comparison | revisions
changelog file | annotate | diff | comparison | revisions
eric6.e4p file | annotate | diff | comparison | revisions
i18n/eric6_cs.qm file | annotate | diff | comparison | revisions
i18n/eric6_cs.ts file | annotate | diff | comparison | revisions
i18n/eric6_de.qm file | annotate | diff | comparison | revisions
i18n/eric6_de.ts file | annotate | diff | comparison | revisions
i18n/eric6_empty.ts file | annotate | diff | comparison | revisions
i18n/eric6_en.qm file | annotate | diff | comparison | revisions
i18n/eric6_en.ts file | annotate | diff | comparison | revisions
i18n/eric6_es.qm file | annotate | diff | comparison | revisions
i18n/eric6_es.ts file | annotate | diff | comparison | revisions
i18n/eric6_fr.qm file | annotate | diff | comparison | revisions
i18n/eric6_fr.ts file | annotate | diff | comparison | revisions
i18n/eric6_it.qm file | annotate | diff | comparison | revisions
i18n/eric6_it.ts file | annotate | diff | comparison | revisions
i18n/eric6_pt.qm file | annotate | diff | comparison | revisions
i18n/eric6_pt.ts file | annotate | diff | comparison | revisions
i18n/eric6_ru.qm file | annotate | diff | comparison | revisions
i18n/eric6_ru.ts file | annotate | diff | comparison | revisions
i18n/eric6_tr.qm file | annotate | diff | comparison | revisions
i18n/eric6_tr.ts file | annotate | diff | comparison | revisions
i18n/eric6_zh_CN.qm file | annotate | diff | comparison | revisions
i18n/eric6_zh_CN.ts file | annotate | diff | comparison | revisions
--- a/APIs/Python3/eric6.api	Sat Dec 09 17:43:24 2017 +0100
+++ b/APIs/Python3/eric6.api	Sat Dec 09 18:32:08 2017 +0100
@@ -1556,6 +1556,7 @@
 eric6.E5XML.Config.multiProjectFileFormatVersion?7
 eric6.E5XML.Config.pluginRepositoryFileFormatVersion?7
 eric6.E5XML.Config.projectFileFormatVersion?7
+eric6.E5XML.Config.projectFileFormatVersionAlt?7
 eric6.E5XML.Config.sessionFileFormatVersion?7
 eric6.E5XML.Config.shortcutsFileFormatVersion?7
 eric6.E5XML.Config.tasksFileFormatVersion?7
@@ -4378,6 +4379,36 @@
 eric6.Plugins.PluginEricdoc.python2Compatible?7
 eric6.Plugins.PluginEricdoc.shortDescription?7
 eric6.Plugins.PluginEricdoc.version?7
+eric6.Plugins.PluginPipInterface.PipInterfacePlugin.PreferencesKey?7
+eric6.Plugins.PluginPipInterface.PipInterfacePlugin.activate?4()
+eric6.Plugins.PluginPipInterface.PipInterfacePlugin.currentPipChanged?7
+eric6.Plugins.PluginPipInterface.PipInterfacePlugin.deactivate?4()
+eric6.Plugins.PluginPipInterface.PipInterfacePlugin.getDefaultPipExecutables?4()
+eric6.Plugins.PluginPipInterface.PipInterfacePlugin.getMenu?4(name)
+eric6.Plugins.PluginPipInterface.PipInterfacePlugin.getMenuNames?4()
+eric6.Plugins.PluginPipInterface.PipInterfacePlugin.getPreferences?4(key)
+eric6.Plugins.PluginPipInterface.PipInterfacePlugin.setPreferences?4(key, value)
+eric6.Plugins.PluginPipInterface.PipInterfacePlugin?1(ui)
+eric6.Plugins.PluginPipInterface._findDefaultExecutables?5(majorVersion)
+eric6.Plugins.PluginPipInterface.author?7
+eric6.Plugins.PluginPipInterface.autoactivate?7
+eric6.Plugins.PluginPipInterface.className?7
+eric6.Plugins.PluginPipInterface.createPipPage?4(configDlg)
+eric6.Plugins.PluginPipInterface.deactivateable?7
+eric6.Plugins.PluginPipInterface.error?7
+eric6.Plugins.PluginPipInterface.exeDisplayDataList?4()
+eric6.Plugins.PluginPipInterface.getConfigData?4()
+eric6.Plugins.PluginPipInterface.getExePath?4(branch, access, versionStr)
+eric6.Plugins.PluginPipInterface.longDescription?7
+eric6.Plugins.PluginPipInterface.name?7
+eric6.Plugins.PluginPipInterface.needsRestart?7
+eric6.Plugins.PluginPipInterface.packageName?7
+eric6.Plugins.PluginPipInterface.pipPluginObject?7
+eric6.Plugins.PluginPipInterface.prepareUninstall?4()
+eric6.Plugins.PluginPipInterface.pyqtApi?7
+eric6.Plugins.PluginPipInterface.python2Compatible?7
+eric6.Plugins.PluginPipInterface.shortDescription?7
+eric6.Plugins.PluginPipInterface.version?7
 eric6.Plugins.PluginSyntaxChecker.SyntaxCheckerPlugin.activate?4()
 eric6.Plugins.PluginSyntaxChecker.SyntaxCheckerPlugin.deactivate?4()
 eric6.Plugins.PluginSyntaxChecker.SyntaxCheckerPlugin?1(ui)
@@ -4688,6 +4719,73 @@
 eric6.Plugins.PluginWizardQRegularExpression.python2Compatible?7
 eric6.Plugins.PluginWizardQRegularExpression.shortDescription?7
 eric6.Plugins.PluginWizardQRegularExpression.version?7
+eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.PipPage.PipPage.on_addButton_clicked?4()
+eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.PipPage.PipPage.on_defaultListButton_clicked?4()
+eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.PipPage.PipPage.save?4()
+eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.PipPage.PipPage?1(plugin)
+eric6.Plugins.UiExtensionPlugins.PipInterface.DefaultIndexUrl?7
+eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.Pip.getMenu?4(name)
+eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.Pip.getMenuNames?4()
+eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.Pip.initActions?4()
+eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.Pip.initMenu?4()
+eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.Pip.installPackages?4(packages, cmd="")
+eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.Pip.runProcess?4(args, cmd="")
+eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.Pip.uninstallPackages?4(packages, cmd="")
+eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.Pip.upgradePackages?4(packages, cmd="")
+eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.Pip.upgradePip?4(pip="")
+eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.Pip?1(plugin, parent=None)
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.PipDialog.closeEvent?4(e)
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.PipDialog.on_buttonBox_clicked?4(button)
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.PipDialog.startProcess?4(cmd, args, showArgs=True)
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.PipDialog.startProcesses?4(processParams)
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.PipDialog?1(text, parent=None)
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.PipFreezeDialog.closeEvent?4(e)
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.PipFreezeDialog.on_buttonBox_clicked?4(button)
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.PipFreezeDialog.on_copyButton_clicked?4()
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.PipFreezeDialog.on_fileButton_clicked?4()
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.PipFreezeDialog.on_insertButton_clicked?4()
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.PipFreezeDialog.on_localCheckBox_clicked?4(checked)
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.PipFreezeDialog.on_pipComboBox_activated?4(txt)
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.PipFreezeDialog.on_replaceAllButton_clicked?4()
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.PipFreezeDialog.on_replaceSelectionButton_clicked?4()
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.PipFreezeDialog.on_requirementsEdit_textChanged?4()
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.PipFreezeDialog.on_requirementsFileEdit_textChanged?4(txt)
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.PipFreezeDialog.on_saveButton_clicked?4()
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.PipFreezeDialog.on_saveToButton_clicked?4()
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.PipFreezeDialog.start?4()
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.PipFreezeDialog?1(pip, plugin, parent=None)
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.PipListDialog.CommandArguments?7
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.PipListDialog.ShowProcessClassifiersMode?7
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.PipListDialog.ShowProcessEntryPointsMode?7
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.PipListDialog.ShowProcessFilesListMode?7
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.PipListDialog.ShowProcessGeneralMode?7
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.PipListDialog.closeEvent?4(e)
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.PipListDialog.on_buttonBox_clicked?4(button)
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.PipListDialog.on_installedFilesCheckBox_clicked?4(checked)
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.PipListDialog.on_localCheckBox_clicked?4(checked)
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.PipListDialog.on_notRequiredCheckBox_clicked?4(checked)
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.PipListDialog.on_packageList_itemSelectionChanged?4()
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.PipListDialog.on_pipComboBox_activated?4(txt)
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.PipListDialog.on_verboseCheckBox_clicked?4(checked)
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.PipListDialog.start?4()
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.PipListDialog?1(pip, mode, plugin, title, parent=None)
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackageDetailsDialog.PipPackageDetailsDialog?1(detailsData, downloadsData, parent=None)
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackagesInputDialog.PipPackagesInputDialog.getData?4()
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackagesInputDialog.PipPackagesInputDialog.on_packagesEdit_textChanged?4(txt)
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackagesInputDialog.PipPackagesInputDialog?1(plugin, title, parent=None)
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipRequirementsSelectionDialog.PipRequirementsSelectionDialog.getData?4()
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipRequirementsSelectionDialog.PipRequirementsSelectionDialog.on_fileButton_clicked?4()
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipRequirementsSelectionDialog.PipRequirementsSelectionDialog.on_requirementsEdit_textChanged?4(txt)
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipRequirementsSelectionDialog.PipRequirementsSelectionDialog?1(plugin, parent=None)
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.PipSearchDialog.Stopwords?7
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.PipSearchDialog.VersionRole?7
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.PipSearchDialog.closeEvent?4(e)
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.PipSearchDialog.on_buttonBox_clicked?4(button)
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.PipSearchDialog.on_resultList_itemActivated?4(item, column)
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.PipSearchDialog.on_resultList_itemSelectionChanged?4()
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.PipSearchDialog.on_searchButton_clicked?4()
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.PipSearchDialog.on_searchEdit_textChanged?4(txt)
+eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.PipSearchDialog?1(pip, plugin, parent=None)
 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()
--- a/APIs/Python3/eric6.bas	Sat Dec 09 17:43:24 2017 +0100
+++ b/APIs/Python3/eric6.bas	Sat Dec 09 18:32:08 2017 +0100
@@ -582,6 +582,16 @@
 PathGraphingAstVisitor ASTVisitor
 PersonalDataDialog QDialog Ui_PersonalDataDialog
 PersonalInformationManager QObject
+Pip QObject
+PipDialog QDialog Ui_PipDialog
+PipFreezeDialog QDialog Ui_PipFreezeDialog
+PipInterfacePlugin QObject
+PipListDialog QDialog Ui_PipListDialog
+PipPackageDetailsDialog QDialog Ui_PipPackageDetailsDialog
+PipPackagesInputDialog QDialog Ui_PipPackagesInputDialog
+PipPage ConfigurationPageBase Ui_PipPage
+PipRequirementsSelectionDialog QDialog Ui_PipRequirementsSelectionDialog
+PipSearchDialog QDialog Ui_PipSearchDialog
 PixmapDiagram E5MainWindow
 PlainStrList list
 PlainTextDocumentationViewer QWidget
Binary file Documentation/Help/source.qch has changed
--- a/Documentation/Help/source.qhp	Sat Dec 09 17:43:24 2017 +0100
+++ b/Documentation/Help/source.qhp	Sat Dec 09 18:32:08 2017 +0100
@@ -513,6 +513,21 @@
                 <section title="eric6.Plugins.DocumentationPlugins.Ericdoc.EricdocExecDialog" ref="eric6.Plugins.DocumentationPlugins.Ericdoc.EricdocExecDialog.html" />
               </section>
             </section>
+            <section title="eric6.Plugins.UiExtensionPlugins" ref="index-eric6.Plugins.UiExtensionPlugins.html">
+              <section title="eric6.Plugins.UiExtensionPlugins.PipInterface" ref="index-eric6.Plugins.UiExtensionPlugins.PipInterface.html">
+                <section title="eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage" ref="index-eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.html">
+                  <section title="eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.PipPage" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.PipPage.html" />
+                </section>
+                <section title="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html" />
+                <section title="eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.html" />
+                <section title="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html" />
+                <section title="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html" />
+                <section title="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackageDetailsDialog" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackageDetailsDialog.html" />
+                <section title="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackagesInputDialog" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackagesInputDialog.html" />
+                <section title="eric6.Plugins.UiExtensionPlugins.PipInterface.PipRequirementsSelectionDialog" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipRequirementsSelectionDialog.html" />
+                <section title="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html" />
+              </section>
+            </section>
             <section title="eric6.Plugins.VcsPlugins" ref="index-eric6.Plugins.VcsPlugins.html">
               <section title="eric6.Plugins.VcsPlugins.vcsMercurial" ref="index-eric6.Plugins.VcsPlugins.vcsMercurial.html">
                 <section title="eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage" ref="index-eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage.html">
@@ -753,6 +768,7 @@
             <section title="eric6.Plugins.PluginCodeStyleChecker" ref="eric6.Plugins.PluginCodeStyleChecker.html" />
             <section title="eric6.Plugins.PluginEricapi" ref="eric6.Plugins.PluginEricapi.html" />
             <section title="eric6.Plugins.PluginEricdoc" ref="eric6.Plugins.PluginEricdoc.html" />
+            <section title="eric6.Plugins.PluginPipInterface" ref="eric6.Plugins.PluginPipInterface.html" />
             <section title="eric6.Plugins.PluginSyntaxChecker" ref="eric6.Plugins.PluginSyntaxChecker.html" />
             <section title="eric6.Plugins.PluginTabnanny" ref="eric6.Plugins.PluginTabnanny.html" />
             <section title="eric6.Plugins.PluginVcsMercurial" ref="eric6.Plugins.PluginVcsMercurial.html" />
@@ -3081,6 +3097,7 @@
       <keyword name="ConfigurationDialog.getExpandedEntries" id="ConfigurationDialog.getExpandedEntries" ref="eric6.Preferences.ConfigurationDialog.html#ConfigurationDialog.getExpandedEntries" />
       <keyword name="ConfigurationDialog.setPreferences" id="ConfigurationDialog.setPreferences" ref="eric6.Preferences.ConfigurationDialog.html#ConfigurationDialog.setPreferences" />
       <keyword name="ConfigurationDialog.showConfigurationPageByName" id="ConfigurationDialog.showConfigurationPageByName" ref="eric6.Preferences.ConfigurationDialog.html#ConfigurationDialog.showConfigurationPageByName" />
+      <keyword name="ConfigurationPage (Package)" id="ConfigurationPage (Package)" ref="index-eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.html" />
       <keyword name="ConfigurationPage (Package)" id="ConfigurationPage (Package)" ref="index-eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage.html" />
       <keyword name="ConfigurationPage (Package)" id="ConfigurationPage (Package)" ref="index-eric6.Plugins.VcsPlugins.vcsPySvn.ConfigurationPage.html" />
       <keyword name="ConfigurationPage (Package)" id="ConfigurationPage (Package)" ref="index-eric6.Plugins.VcsPlugins.vcsSubversion.ConfigurationPage.html" />
@@ -10783,6 +10800,154 @@
       <keyword name="PersonalInformationManager.showConfigurationDialog" id="PersonalInformationManager.showConfigurationDialog" ref="eric6.WebBrowser.PersonalInformationManager.PersonalInformationManager.html#PersonalInformationManager.showConfigurationDialog" />
       <keyword name="PersonalInformationManager.viewKeyPressEvent" id="PersonalInformationManager.viewKeyPressEvent" ref="eric6.Helpviewer.PersonalInformationManager.PersonalInformationManager.html#PersonalInformationManager.viewKeyPressEvent" />
       <keyword name="PersonalInformationManager.viewKeyPressEvent" id="PersonalInformationManager.viewKeyPressEvent" ref="eric6.WebBrowser.PersonalInformationManager.PersonalInformationManager.html#PersonalInformationManager.viewKeyPressEvent" />
+      <keyword name="Pip" id="Pip" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip" />
+      <keyword name="Pip (Constructor)" id="Pip (Constructor)" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__init__" />
+      <keyword name="Pip (Module)" id="Pip (Module)" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html" />
+      <keyword name="Pip.__aboutToShowMenu" id="Pip.__aboutToShowMenu" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__aboutToShowMenu" />
+      <keyword name="Pip.__checkUpgradePyQt" id="Pip.__checkUpgradePyQt" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__checkUpgradePyQt" />
+      <keyword name="Pip.__editConfiguration" id="Pip.__editConfiguration" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__editConfiguration" />
+      <keyword name="Pip.__editUserConfiguration" id="Pip.__editUserConfiguration" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__editUserConfiguration" />
+      <keyword name="Pip.__editVirtualenvConfiguration" id="Pip.__editVirtualenvConfiguration" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__editVirtualenvConfiguration" />
+      <keyword name="Pip.__generateRequirements" id="Pip.__generateRequirements" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__generateRequirements" />
+      <keyword name="Pip.__getPython" id="Pip.__getPython" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__getPython" />
+      <keyword name="Pip.__getUserConfig" id="Pip.__getUserConfig" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__getUserConfig" />
+      <keyword name="Pip.__getVirtualenvConfig" id="Pip.__getVirtualenvConfig" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__getVirtualenvConfig" />
+      <keyword name="Pip.__handleTearOffMenu" id="Pip.__handleTearOffMenu" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__handleTearOffMenu" />
+      <keyword name="Pip.__installPackages" id="Pip.__installPackages" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__installPackages" />
+      <keyword name="Pip.__installPip" id="Pip.__installPip" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__installPip" />
+      <keyword name="Pip.__installRequirements" id="Pip.__installRequirements" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__installRequirements" />
+      <keyword name="Pip.__listOutdatedPackages" id="Pip.__listOutdatedPackages" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__listOutdatedPackages" />
+      <keyword name="Pip.__listPackages" id="Pip.__listPackages" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__listPackages" />
+      <keyword name="Pip.__listUptodatePackages" id="Pip.__listUptodatePackages" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__listUptodatePackages" />
+      <keyword name="Pip.__pipConfigure" id="Pip.__pipConfigure" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__pipConfigure" />
+      <keyword name="Pip.__repairPip" id="Pip.__repairPip" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__repairPip" />
+      <keyword name="Pip.__searchPyPI" id="Pip.__searchPyPI" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__searchPyPI" />
+      <keyword name="Pip.__selectPipExecutable" id="Pip.__selectPipExecutable" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__selectPipExecutable" />
+      <keyword name="Pip.__uninstallPackages" id="Pip.__uninstallPackages" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__uninstallPackages" />
+      <keyword name="Pip.__uninstallRequirements" id="Pip.__uninstallRequirements" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__uninstallRequirements" />
+      <keyword name="Pip.__upgradePackages" id="Pip.__upgradePackages" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__upgradePackages" />
+      <keyword name="Pip.getMenu" id="Pip.getMenu" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.getMenu" />
+      <keyword name="Pip.getMenuNames" id="Pip.getMenuNames" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.getMenuNames" />
+      <keyword name="Pip.initActions" id="Pip.initActions" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.initActions" />
+      <keyword name="Pip.initMenu" id="Pip.initMenu" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.initMenu" />
+      <keyword name="Pip.installPackages" id="Pip.installPackages" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.installPackages" />
+      <keyword name="Pip.runProcess" id="Pip.runProcess" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.runProcess" />
+      <keyword name="Pip.uninstallPackages" id="Pip.uninstallPackages" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.uninstallPackages" />
+      <keyword name="Pip.upgradePackages" id="Pip.upgradePackages" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.upgradePackages" />
+      <keyword name="Pip.upgradePip" id="Pip.upgradePip" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.upgradePip" />
+      <keyword name="PipDialog" id="PipDialog" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.html#PipDialog" />
+      <keyword name="PipDialog (Constructor)" id="PipDialog (Constructor)" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.html#PipDialog.__init__" />
+      <keyword name="PipDialog (Module)" id="PipDialog (Module)" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.html" />
+      <keyword name="PipDialog.__addOutput" id="PipDialog.__addOutput" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.html#PipDialog.__addOutput" />
+      <keyword name="PipDialog.__finish" id="PipDialog.__finish" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.html#PipDialog.__finish" />
+      <keyword name="PipDialog.__procFinished" id="PipDialog.__procFinished" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.html#PipDialog.__procFinished" />
+      <keyword name="PipDialog.__readStderr" id="PipDialog.__readStderr" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.html#PipDialog.__readStderr" />
+      <keyword name="PipDialog.__readStdout" id="PipDialog.__readStdout" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.html#PipDialog.__readStdout" />
+      <keyword name="PipDialog.closeEvent" id="PipDialog.closeEvent" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.html#PipDialog.closeEvent" />
+      <keyword name="PipDialog.on_buttonBox_clicked" id="PipDialog.on_buttonBox_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.html#PipDialog.on_buttonBox_clicked" />
+      <keyword name="PipDialog.startProcess" id="PipDialog.startProcess" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.html#PipDialog.startProcess" />
+      <keyword name="PipDialog.startProcesses" id="PipDialog.startProcesses" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.html#PipDialog.startProcesses" />
+      <keyword name="PipFreezeDialog" id="PipFreezeDialog" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html#PipFreezeDialog" />
+      <keyword name="PipFreezeDialog (Constructor)" id="PipFreezeDialog (Constructor)" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html#PipFreezeDialog.__init__" />
+      <keyword name="PipFreezeDialog (Module)" id="PipFreezeDialog (Module)" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html" />
+      <keyword name="PipFreezeDialog.__refresh" id="PipFreezeDialog.__refresh" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html#PipFreezeDialog.__refresh" />
+      <keyword name="PipFreezeDialog.__updateButtons" id="PipFreezeDialog.__updateButtons" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html#PipFreezeDialog.__updateButtons" />
+      <keyword name="PipFreezeDialog.__writeToFile" id="PipFreezeDialog.__writeToFile" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html#PipFreezeDialog.__writeToFile" />
+      <keyword name="PipFreezeDialog.closeEvent" id="PipFreezeDialog.closeEvent" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html#PipFreezeDialog.closeEvent" />
+      <keyword name="PipFreezeDialog.on_buttonBox_clicked" id="PipFreezeDialog.on_buttonBox_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html#PipFreezeDialog.on_buttonBox_clicked" />
+      <keyword name="PipFreezeDialog.on_copyButton_clicked" id="PipFreezeDialog.on_copyButton_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html#PipFreezeDialog.on_copyButton_clicked" />
+      <keyword name="PipFreezeDialog.on_fileButton_clicked" id="PipFreezeDialog.on_fileButton_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html#PipFreezeDialog.on_fileButton_clicked" />
+      <keyword name="PipFreezeDialog.on_insertButton_clicked" id="PipFreezeDialog.on_insertButton_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html#PipFreezeDialog.on_insertButton_clicked" />
+      <keyword name="PipFreezeDialog.on_localCheckBox_clicked" id="PipFreezeDialog.on_localCheckBox_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html#PipFreezeDialog.on_localCheckBox_clicked" />
+      <keyword name="PipFreezeDialog.on_pipComboBox_activated" id="PipFreezeDialog.on_pipComboBox_activated" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html#PipFreezeDialog.on_pipComboBox_activated" />
+      <keyword name="PipFreezeDialog.on_replaceAllButton_clicked" id="PipFreezeDialog.on_replaceAllButton_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html#PipFreezeDialog.on_replaceAllButton_clicked" />
+      <keyword name="PipFreezeDialog.on_replaceSelectionButton_clicked" id="PipFreezeDialog.on_replaceSelectionButton_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html#PipFreezeDialog.on_replaceSelectionButton_clicked" />
+      <keyword name="PipFreezeDialog.on_requirementsEdit_textChanged" id="PipFreezeDialog.on_requirementsEdit_textChanged" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html#PipFreezeDialog.on_requirementsEdit_textChanged" />
+      <keyword name="PipFreezeDialog.on_requirementsFileEdit_textChanged" id="PipFreezeDialog.on_requirementsFileEdit_textChanged" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html#PipFreezeDialog.on_requirementsFileEdit_textChanged" />
+      <keyword name="PipFreezeDialog.on_saveButton_clicked" id="PipFreezeDialog.on_saveButton_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html#PipFreezeDialog.on_saveButton_clicked" />
+      <keyword name="PipFreezeDialog.on_saveToButton_clicked" id="PipFreezeDialog.on_saveToButton_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html#PipFreezeDialog.on_saveToButton_clicked" />
+      <keyword name="PipFreezeDialog.start" id="PipFreezeDialog.start" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html#PipFreezeDialog.start" />
+      <keyword name="PipInterface (Package)" id="PipInterface (Package)" ref="index-eric6.Plugins.UiExtensionPlugins.PipInterface.html" />
+      <keyword name="PipInterfacePlugin" id="PipInterfacePlugin" ref="eric6.Plugins.PluginPipInterface.html#PipInterfacePlugin" />
+      <keyword name="PipInterfacePlugin (Constructor)" id="PipInterfacePlugin (Constructor)" ref="eric6.Plugins.PluginPipInterface.html#PipInterfacePlugin.__init__" />
+      <keyword name="PipInterfacePlugin.__initialize" id="PipInterfacePlugin.__initialize" ref="eric6.Plugins.PluginPipInterface.html#PipInterfacePlugin.__initialize" />
+      <keyword name="PipInterfacePlugin.activate" id="PipInterfacePlugin.activate" ref="eric6.Plugins.PluginPipInterface.html#PipInterfacePlugin.activate" />
+      <keyword name="PipInterfacePlugin.deactivate" id="PipInterfacePlugin.deactivate" ref="eric6.Plugins.PluginPipInterface.html#PipInterfacePlugin.deactivate" />
+      <keyword name="PipInterfacePlugin.getDefaultPipExecutables" id="PipInterfacePlugin.getDefaultPipExecutables" ref="eric6.Plugins.PluginPipInterface.html#PipInterfacePlugin.getDefaultPipExecutables" />
+      <keyword name="PipInterfacePlugin.getMenu" id="PipInterfacePlugin.getMenu" ref="eric6.Plugins.PluginPipInterface.html#PipInterfacePlugin.getMenu" />
+      <keyword name="PipInterfacePlugin.getMenuNames" id="PipInterfacePlugin.getMenuNames" ref="eric6.Plugins.PluginPipInterface.html#PipInterfacePlugin.getMenuNames" />
+      <keyword name="PipInterfacePlugin.getPreferences" id="PipInterfacePlugin.getPreferences" ref="eric6.Plugins.PluginPipInterface.html#PipInterfacePlugin.getPreferences" />
+      <keyword name="PipInterfacePlugin.setPreferences" id="PipInterfacePlugin.setPreferences" ref="eric6.Plugins.PluginPipInterface.html#PipInterfacePlugin.setPreferences" />
+      <keyword name="PipListDialog" id="PipListDialog" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog" />
+      <keyword name="PipListDialog (Constructor)" id="PipListDialog (Constructor)" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.__init__" />
+      <keyword name="PipListDialog (Module)" id="PipListDialog (Module)" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html" />
+      <keyword name="PipListDialog.__executeUpgradePackages" id="PipListDialog.__executeUpgradePackages" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.__executeUpgradePackages" />
+      <keyword name="PipListDialog.__finish" id="PipListDialog.__finish" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.__finish" />
+      <keyword name="PipListDialog.__procFinished" id="PipListDialog.__procFinished" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.__procFinished" />
+      <keyword name="PipListDialog.__processOutput" id="PipListDialog.__processOutput" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.__processOutput" />
+      <keyword name="PipListDialog.__readStderr" id="PipListDialog.__readStderr" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.__readStderr" />
+      <keyword name="PipListDialog.__readStdout" id="PipListDialog.__readStdout" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.__readStdout" />
+      <keyword name="PipListDialog.__refresh" id="PipListDialog.__refresh" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.__refresh" />
+      <keyword name="PipListDialog.__stopProcess" id="PipListDialog.__stopProcess" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.__stopProcess" />
+      <keyword name="PipListDialog.__uninstallPackages" id="PipListDialog.__uninstallPackages" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.__uninstallPackages" />
+      <keyword name="PipListDialog.__upgradeAllPackages" id="PipListDialog.__upgradeAllPackages" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.__upgradeAllPackages" />
+      <keyword name="PipListDialog.__upgradePackages" id="PipListDialog.__upgradePackages" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.__upgradePackages" />
+      <keyword name="PipListDialog.__upgradePip" id="PipListDialog.__upgradePip" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.__upgradePip" />
+      <keyword name="PipListDialog.closeEvent" id="PipListDialog.closeEvent" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.closeEvent" />
+      <keyword name="PipListDialog.on_buttonBox_clicked" id="PipListDialog.on_buttonBox_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.on_buttonBox_clicked" />
+      <keyword name="PipListDialog.on_installedFilesCheckBox_clicked" id="PipListDialog.on_installedFilesCheckBox_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.on_installedFilesCheckBox_clicked" />
+      <keyword name="PipListDialog.on_localCheckBox_clicked" id="PipListDialog.on_localCheckBox_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.on_localCheckBox_clicked" />
+      <keyword name="PipListDialog.on_notRequiredCheckBox_clicked" id="PipListDialog.on_notRequiredCheckBox_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.on_notRequiredCheckBox_clicked" />
+      <keyword name="PipListDialog.on_packageList_itemSelectionChanged" id="PipListDialog.on_packageList_itemSelectionChanged" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.on_packageList_itemSelectionChanged" />
+      <keyword name="PipListDialog.on_pipComboBox_activated" id="PipListDialog.on_pipComboBox_activated" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.on_pipComboBox_activated" />
+      <keyword name="PipListDialog.on_verboseCheckBox_clicked" id="PipListDialog.on_verboseCheckBox_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.on_verboseCheckBox_clicked" />
+      <keyword name="PipListDialog.start" id="PipListDialog.start" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.start" />
+      <keyword name="PipPackageDetailsDialog" id="PipPackageDetailsDialog" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackageDetailsDialog.html#PipPackageDetailsDialog" />
+      <keyword name="PipPackageDetailsDialog (Constructor)" id="PipPackageDetailsDialog (Constructor)" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackageDetailsDialog.html#PipPackageDetailsDialog.__init__" />
+      <keyword name="PipPackageDetailsDialog (Module)" id="PipPackageDetailsDialog (Module)" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackageDetailsDialog.html" />
+      <keyword name="PipPackageDetailsDialog.__formatSize" id="PipPackageDetailsDialog.__formatSize" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackageDetailsDialog.html#PipPackageDetailsDialog.__formatSize" />
+      <keyword name="PipPackageDetailsDialog.__formatUploadDate" id="PipPackageDetailsDialog.__formatUploadDate" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackageDetailsDialog.html#PipPackageDetailsDialog.__formatUploadDate" />
+      <keyword name="PipPackageDetailsDialog.__populateDetails" id="PipPackageDetailsDialog.__populateDetails" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackageDetailsDialog.html#PipPackageDetailsDialog.__populateDetails" />
+      <keyword name="PipPackageDetailsDialog.__populateDownloadUrls" id="PipPackageDetailsDialog.__populateDownloadUrls" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackageDetailsDialog.html#PipPackageDetailsDialog.__populateDownloadUrls" />
+      <keyword name="PipPackageDetailsDialog.__populateRequiresProvides" id="PipPackageDetailsDialog.__populateRequiresProvides" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackageDetailsDialog.html#PipPackageDetailsDialog.__populateRequiresProvides" />
+      <keyword name="PipPackageDetailsDialog.__sanitize" id="PipPackageDetailsDialog.__sanitize" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackageDetailsDialog.html#PipPackageDetailsDialog.__sanitize" />
+      <keyword name="PipPackagesInputDialog" id="PipPackagesInputDialog" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackagesInputDialog.html#PipPackagesInputDialog" />
+      <keyword name="PipPackagesInputDialog (Constructor)" id="PipPackagesInputDialog (Constructor)" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackagesInputDialog.html#PipPackagesInputDialog.__init__" />
+      <keyword name="PipPackagesInputDialog (Module)" id="PipPackagesInputDialog (Module)" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackagesInputDialog.html" />
+      <keyword name="PipPackagesInputDialog.getData" id="PipPackagesInputDialog.getData" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackagesInputDialog.html#PipPackagesInputDialog.getData" />
+      <keyword name="PipPackagesInputDialog.on_packagesEdit_textChanged" id="PipPackagesInputDialog.on_packagesEdit_textChanged" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackagesInputDialog.html#PipPackagesInputDialog.on_packagesEdit_textChanged" />
+      <keyword name="PipPage" id="PipPage" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.PipPage.html#PipPage" />
+      <keyword name="PipPage (Constructor)" id="PipPage (Constructor)" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.PipPage.html#PipPage.__init__" />
+      <keyword name="PipPage (Module)" id="PipPage (Module)" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.PipPage.html" />
+      <keyword name="PipPage.on_addButton_clicked" id="PipPage.on_addButton_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.PipPage.html#PipPage.on_addButton_clicked" />
+      <keyword name="PipPage.on_defaultListButton_clicked" id="PipPage.on_defaultListButton_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.PipPage.html#PipPage.on_defaultListButton_clicked" />
+      <keyword name="PipPage.save" id="PipPage.save" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.PipPage.html#PipPage.save" />
+      <keyword name="PipRequirementsSelectionDialog" id="PipRequirementsSelectionDialog" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipRequirementsSelectionDialog.html#PipRequirementsSelectionDialog" />
+      <keyword name="PipRequirementsSelectionDialog (Constructor)" id="PipRequirementsSelectionDialog (Constructor)" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipRequirementsSelectionDialog.html#PipRequirementsSelectionDialog.__init__" />
+      <keyword name="PipRequirementsSelectionDialog (Module)" id="PipRequirementsSelectionDialog (Module)" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipRequirementsSelectionDialog.html" />
+      <keyword name="PipRequirementsSelectionDialog.getData" id="PipRequirementsSelectionDialog.getData" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipRequirementsSelectionDialog.html#PipRequirementsSelectionDialog.getData" />
+      <keyword name="PipRequirementsSelectionDialog.on_fileButton_clicked" id="PipRequirementsSelectionDialog.on_fileButton_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipRequirementsSelectionDialog.html#PipRequirementsSelectionDialog.on_fileButton_clicked" />
+      <keyword name="PipRequirementsSelectionDialog.on_requirementsEdit_textChanged" id="PipRequirementsSelectionDialog.on_requirementsEdit_textChanged" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipRequirementsSelectionDialog.html#PipRequirementsSelectionDialog.on_requirementsEdit_textChanged" />
+      <keyword name="PipSearchDialog" id="PipSearchDialog" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html#PipSearchDialog" />
+      <keyword name="PipSearchDialog (Constructor)" id="PipSearchDialog (Constructor)" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html#PipSearchDialog.__init__" />
+      <keyword name="PipSearchDialog (Module)" id="PipSearchDialog (Module)" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html" />
+      <keyword name="PipSearchDialog.__detailsError" id="PipSearchDialog.__detailsError" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html#PipSearchDialog.__detailsError" />
+      <keyword name="PipSearchDialog.__displayPackageDetails" id="PipSearchDialog.__displayPackageDetails" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html#PipSearchDialog.__displayPackageDetails" />
+      <keyword name="PipSearchDialog.__finish" id="PipSearchDialog.__finish" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html#PipSearchDialog.__finish" />
+      <keyword name="PipSearchDialog.__getPackageDownloadsData" id="PipSearchDialog.__getPackageDownloadsData" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html#PipSearchDialog.__getPackageDownloadsData" />
+      <keyword name="PipSearchDialog.__install" id="PipSearchDialog.__install" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html#PipSearchDialog.__install" />
+      <keyword name="PipSearchDialog.__processSearchResult" id="PipSearchDialog.__processSearchResult" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html#PipSearchDialog.__processSearchResult" />
+      <keyword name="PipSearchDialog.__score" id="PipSearchDialog.__score" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html#PipSearchDialog.__score" />
+      <keyword name="PipSearchDialog.__search" id="PipSearchDialog.__search" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html#PipSearchDialog.__search" />
+      <keyword name="PipSearchDialog.__searchError" id="PipSearchDialog.__searchError" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html#PipSearchDialog.__searchError" />
+      <keyword name="PipSearchDialog.__showDetails" id="PipSearchDialog.__showDetails" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html#PipSearchDialog.__showDetails" />
+      <keyword name="PipSearchDialog.__transformHits" id="PipSearchDialog.__transformHits" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html#PipSearchDialog.__transformHits" />
+      <keyword name="PipSearchDialog.closeEvent" id="PipSearchDialog.closeEvent" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html#PipSearchDialog.closeEvent" />
+      <keyword name="PipSearchDialog.on_buttonBox_clicked" id="PipSearchDialog.on_buttonBox_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html#PipSearchDialog.on_buttonBox_clicked" />
+      <keyword name="PipSearchDialog.on_resultList_itemActivated" id="PipSearchDialog.on_resultList_itemActivated" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html#PipSearchDialog.on_resultList_itemActivated" />
+      <keyword name="PipSearchDialog.on_resultList_itemSelectionChanged" id="PipSearchDialog.on_resultList_itemSelectionChanged" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html#PipSearchDialog.on_resultList_itemSelectionChanged" />
+      <keyword name="PipSearchDialog.on_searchButton_clicked" id="PipSearchDialog.on_searchButton_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html#PipSearchDialog.on_searchButton_clicked" />
+      <keyword name="PipSearchDialog.on_searchEdit_textChanged" id="PipSearchDialog.on_searchEdit_textChanged" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html#PipSearchDialog.on_searchEdit_textChanged" />
       <keyword name="PixmapCache" id="PixmapCache" ref="eric6.UI.PixmapCache.html#PixmapCache" />
       <keyword name="PixmapCache (Constructor)" id="PixmapCache (Constructor)" ref="eric6.UI.PixmapCache.html#PixmapCache.__init__" />
       <keyword name="PixmapCache (Module)" id="PixmapCache (Module)" ref="eric6.UI.PixmapCache.html" />
@@ -10965,6 +11130,7 @@
       <keyword name="PluginModulesError (Constructor)" id="PluginModulesError (Constructor)" ref="eric6.PluginManager.PluginExceptions.html#PluginModulesError.__init__" />
       <keyword name="PluginPathError" id="PluginPathError" ref="eric6.PluginManager.PluginExceptions.html#PluginPathError" />
       <keyword name="PluginPathError (Constructor)" id="PluginPathError (Constructor)" ref="eric6.PluginManager.PluginExceptions.html#PluginPathError.__init__" />
+      <keyword name="PluginPipInterface (Module)" id="PluginPipInterface (Module)" ref="eric6.Plugins.PluginPipInterface.html" />
       <keyword name="PluginPy2IncompatibleError" id="PluginPy2IncompatibleError" ref="eric6.PluginManager.PluginExceptions.html#PluginPy2IncompatibleError" />
       <keyword name="PluginPy2IncompatibleError (Constructor)" id="PluginPy2IncompatibleError (Constructor)" ref="eric6.PluginManager.PluginExceptions.html#PluginPy2IncompatibleError.__init__" />
       <keyword name="PluginRepositoryDialog" id="PluginRepositoryDialog" ref="eric6.PluginManager.PluginRepositoryDialog.html#PluginRepositoryDialog" />
@@ -15001,6 +15167,7 @@
       <keyword name="UMLSceneSizeDialog (Constructor)" id="UMLSceneSizeDialog (Constructor)" ref="eric6.Graphics.UMLSceneSizeDialog.html#UMLSceneSizeDialog.__init__" />
       <keyword name="UMLSceneSizeDialog (Module)" id="UMLSceneSizeDialog (Module)" ref="eric6.Graphics.UMLSceneSizeDialog.html" />
       <keyword name="UMLSceneSizeDialog.getData" id="UMLSceneSizeDialog.getData" ref="eric6.Graphics.UMLSceneSizeDialog.html#UMLSceneSizeDialog.getData" />
+      <keyword name="UiExtensionPlugins (Package)" id="UiExtensionPlugins (Package)" ref="index-eric6.Plugins.UiExtensionPlugins.html" />
       <keyword name="Uid" id="Uid" ref="eric6.Utilities.binplistlib.html#Uid" />
       <keyword name="Uid.__repr__" id="Uid.__repr__" ref="eric6.Utilities.binplistlib.html#Uid.__repr__" />
       <keyword name="UniqueNamespace" id="UniqueNamespace" ref="eric6.E5Network.E5RFC6266.html#UniqueNamespace" />
@@ -16810,6 +16977,7 @@
       <keyword name="_add_check" id="_add_check" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.pycodestyle.html#_add_check" />
       <keyword name="_buildChildrenLists" id="_buildChildrenLists" ref="eric6.Graphics.GraphicsUtilities.html#_buildChildrenLists" />
       <keyword name="_encode_base64" id="_encode_base64" ref="eric6.UI.EmailDialog.html#_encode_base64" />
+      <keyword name="_findDefaultExecutables" id="_findDefaultExecutables" ref="eric6.Plugins.PluginPipInterface.html#_findDefaultExecutables" />
       <keyword name="_get_parameters" id="_get_parameters" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.pycodestyle.html#_get_parameters" />
       <keyword name="_getfullargs" id="_getfullargs" ref="eric6.DebugClients.Python.DebugUtilities.html#_getfullargs" />
       <keyword name="_indent" id="_indent" ref="eric6.Utilities.ClassBrowsers.pyclbr.html#_indent" />
@@ -16967,6 +17135,7 @@
       <keyword name="createMainWidget" id="createMainWidget" ref="eric6.eric6_uipreviewer.html#createMainWidget" />
       <keyword name="createMainWidget" id="createMainWidget" ref="eric6.eric6_unittest.html#createMainWidget" />
       <keyword name="createMainWidget" id="createMainWidget" ref="eric6.eric6_webbrowser.html#createMainWidget" />
+      <keyword name="createPipPage" id="createPipPage" ref="eric6.Plugins.PluginPipInterface.html#createPipPage" />
       <keyword name="createPyWrapper" id="createPyWrapper" ref="eric6.install.html#createPyWrapper" />
       <keyword name="critical" id="critical" ref="eric6.E5Gui.E5MessageBox.html#critical" />
       <keyword name="crypto (Package)" id="crypto (Package)" ref="index-eric6.Utilities.crypto.html" />
@@ -17033,6 +17202,7 @@
       <keyword name="exeDisplayData" id="exeDisplayData" ref="eric6.Plugins.PluginVcsPySvn.html#exeDisplayData" />
       <keyword name="exeDisplayData" id="exeDisplayData" ref="eric6.Plugins.PluginVcsSubversion.html#exeDisplayData" />
       <keyword name="exeDisplayDataList" id="exeDisplayDataList" ref="eric6.Plugins.PluginEricdoc.html#exeDisplayDataList" />
+      <keyword name="exeDisplayDataList" id="exeDisplayDataList" ref="eric6.Plugins.PluginPipInterface.html#exeDisplayDataList" />
       <keyword name="exit" id="exit" ref="eric6.install-debugclients.html#exit" />
       <keyword name="exit" id="exit" ref="eric6.install.html#exit" />
       <keyword name="exit" id="exit" ref="eric6.uninstall-debugclients.html#exit" />
@@ -17077,6 +17247,7 @@
       <keyword name="getCombinedIcon" id="getCombinedIcon" ref="eric6.UI.PixmapCache.html#getCombinedIcon" />
       <keyword name="getCompleter" id="getCompleter" ref="eric6.QScintilla.TypingCompleters.__init__.html#getCompleter" />
       <keyword name="getConfig" id="getConfig" ref="eric6.eric6config.html#getConfig" />
+      <keyword name="getConfigData" id="getConfigData" ref="eric6.Plugins.PluginPipInterface.html#getConfigData" />
       <keyword name="getConfigData" id="getConfigData" ref="eric6.Plugins.PluginVcsMercurial.html#getConfigData" />
       <keyword name="getConfigData" id="getConfigData" ref="eric6.Plugins.PluginVcsPySvn.html#getConfigData" />
       <keyword name="getConfigData" id="getConfigData" ref="eric6.Plugins.PluginVcsSubversion.html#getConfigData" />
@@ -17105,6 +17276,7 @@
       <keyword name="getEditorOtherFonts" id="getEditorOtherFonts" ref="eric6.Preferences.__init__.html#getEditorOtherFonts" />
       <keyword name="getEditorTyping" id="getEditorTyping" ref="eric6.Preferences.__init__.html#getEditorTyping" />
       <keyword name="getEnvironmentEntry" id="getEnvironmentEntry" ref="eric6.Utilities.__init__.html#getEnvironmentEntry" />
+      <keyword name="getExePath" id="getExePath" ref="eric6.Plugins.PluginPipInterface.html#getExePath" />
       <keyword name="getExecutablePath" id="getExecutablePath" ref="eric6.Utilities.__init__.html#getExecutablePath" />
       <keyword name="getExecutablePaths" id="getExecutablePaths" ref="eric6.Utilities.__init__.html#getExecutablePaths" />
       <keyword name="getExistingDirectory" id="getExistingDirectory" ref="eric6.E5Gui.E5FileDialog.html#getExistingDirectory" />
@@ -17368,6 +17540,7 @@
       <keyword name="prepareJsonCommand" id="prepareJsonCommand" ref="eric6.DebugClients.Python.DebugUtilities.html#prepareJsonCommand" />
       <keyword name="prepareProcess" id="prepareProcess" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgUtilities.html#prepareProcess" />
       <keyword name="prepareQtMacBundle" id="prepareQtMacBundle" ref="eric6.Utilities.__init__.html#prepareQtMacBundle" />
+      <keyword name="prepareUninstall" id="prepareUninstall" ref="eric6.Plugins.PluginPipInterface.html#prepareUninstall" />
       <keyword name="prepareUninstall" id="prepareUninstall" ref="eric6.Plugins.PluginVcsMercurial.html#prepareUninstall" />
       <keyword name="prepareUninstall" id="prepareUninstall" ref="eric6.Plugins.PluginVcsPySvn.html#prepareUninstall" />
       <keyword name="prepareUninstall" id="prepareUninstall" ref="eric6.Plugins.PluginVcsSubversion.html#prepareUninstall" />
@@ -17989,6 +18162,7 @@
       <file>eric6.Plugins.PluginCodeStyleChecker.html</file>
       <file>eric6.Plugins.PluginEricapi.html</file>
       <file>eric6.Plugins.PluginEricdoc.html</file>
+      <file>eric6.Plugins.PluginPipInterface.html</file>
       <file>eric6.Plugins.PluginSyntaxChecker.html</file>
       <file>eric6.Plugins.PluginTabnanny.html</file>
       <file>eric6.Plugins.PluginVcsMercurial.html</file>
@@ -18005,6 +18179,15 @@
       <file>eric6.Plugins.PluginWizardQMessageBox.html</file>
       <file>eric6.Plugins.PluginWizardQRegExp.html</file>
       <file>eric6.Plugins.PluginWizardQRegularExpression.html</file>
+      <file>eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.PipPage.html</file>
+      <file>eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html</file>
+      <file>eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.html</file>
+      <file>eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html</file>
+      <file>eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html</file>
+      <file>eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackageDetailsDialog.html</file>
+      <file>eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackagesInputDialog.html</file>
+      <file>eric6.Plugins.UiExtensionPlugins.PipInterface.PipRequirementsSelectionDialog.html</file>
+      <file>eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.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>
@@ -18725,6 +18908,9 @@
       <file>index-eric6.Plugins.DocumentationPlugins.Ericapi.html</file>
       <file>index-eric6.Plugins.DocumentationPlugins.Ericdoc.html</file>
       <file>index-eric6.Plugins.DocumentationPlugins.html</file>
+      <file>index-eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.html</file>
+      <file>index-eric6.Plugins.UiExtensionPlugins.PipInterface.html</file>
+      <file>index-eric6.Plugins.UiExtensionPlugins.html</file>
       <file>index-eric6.Plugins.VcsPlugins.html</file>
       <file>index-eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage.html</file>
       <file>index-eric6.Plugins.VcsPlugins.vcsMercurial.FetchExtension.html</file>
--- a/Documentation/Source/eric6.E5XML.Config.html	Sat Dec 09 17:43:24 2017 +0100
+++ b/Documentation/Source/eric6.E5XML.Config.html	Sat Dec 09 18:32:08 2017 +0100
@@ -25,7 +25,7 @@
 </p>
 <h3>Global Attributes</h3>
 <table>
-<tr><td>debuggerPropertiesFileFormatVersion</td></tr><tr><td>dictionariesListFileFormatVersion</td></tr><tr><td>highlightingStylesFileFormatVersion</td></tr><tr><td>multiProjectFileFormatVersion</td></tr><tr><td>pluginRepositoryFileFormatVersion</td></tr><tr><td>projectFileFormatVersion</td></tr><tr><td>sessionFileFormatVersion</td></tr><tr><td>shortcutsFileFormatVersion</td></tr><tr><td>tasksFileFormatVersion</td></tr><tr><td>templatesFileFormatVersion</td></tr><tr><td>userProjectFileFormatVersion</td></tr>
+<tr><td>debuggerPropertiesFileFormatVersion</td></tr><tr><td>dictionariesListFileFormatVersion</td></tr><tr><td>highlightingStylesFileFormatVersion</td></tr><tr><td>multiProjectFileFormatVersion</td></tr><tr><td>pluginRepositoryFileFormatVersion</td></tr><tr><td>projectFileFormatVersion</td></tr><tr><td>projectFileFormatVersionAlt</td></tr><tr><td>sessionFileFormatVersion</td></tr><tr><td>shortcutsFileFormatVersion</td></tr><tr><td>tasksFileFormatVersion</td></tr><tr><td>templatesFileFormatVersion</td></tr><tr><td>userProjectFileFormatVersion</td></tr>
 </table>
 <h3>Classes</h3>
 <table>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Documentation/Source/eric6.Plugins.PluginPipInterface.html	Sat Dec 09 18:32:08 2017 +0100
@@ -0,0 +1,291 @@
+<!DOCTYPE html>
+<html><head>
+<title>eric6.Plugins.PluginPipInterface</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.PluginPipInterface</h1>
+<p>
+Module implementing the pip interface plug-in.
+</p>
+<h3>Global Attributes</h3>
+<table>
+<tr><td>author</td></tr><tr><td>autoactivate</td></tr><tr><td>className</td></tr><tr><td>deactivateable</td></tr><tr><td>error</td></tr><tr><td>longDescription</td></tr><tr><td>name</td></tr><tr><td>needsRestart</td></tr><tr><td>packageName</td></tr><tr><td>pipPluginObject</td></tr><tr><td>pyqtApi</td></tr><tr><td>python2Compatible</td></tr><tr><td>shortDescription</td></tr><tr><td>version</td></tr>
+</table>
+<h3>Classes</h3>
+<table>
+<tr>
+<td><a href="#PipInterfacePlugin">PipInterfacePlugin</a></td>
+<td>Class implementing the pip interface plug-in.</td>
+</tr>
+</table>
+<h3>Functions</h3>
+<table>
+<tr>
+<td><a href="#_findDefaultExecutables">_findDefaultExecutables</a></td>
+<td>Restricted function to determine the name and path of the executables.</td>
+</tr><tr>
+<td><a href="#createPipPage">createPipPage</a></td>
+<td>Module function to create the pip configuration page.</td>
+</tr><tr>
+<td><a href="#exeDisplayDataList">exeDisplayDataList</a></td>
+<td>Module function to support the display of some executable info.</td>
+</tr><tr>
+<td><a href="#getConfigData">getConfigData</a></td>
+<td>Module function returning data as required by the configuration dialog.</td>
+</tr><tr>
+<td><a href="#getExePath">getExePath</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#prepareUninstall">prepareUninstall</a></td>
+<td>Module function to prepare for an un-installation.</td>
+</tr>
+</table>
+<hr /><hr />
+<a NAME="PipInterfacePlugin" ID="PipInterfacePlugin"></a>
+<h2>PipInterfacePlugin</h2>
+<p>
+    Class implementing the pip interface plug-in.
+</p><h3>Signals</h3>
+<dl>
+<dt>currentPipChanged(exe)</dt>
+<dd>
+emitted to signal a change of the current
+        pip executable
+</dd>
+</dl>
+<h3>Derived from</h3>
+QObject
+<h3>Class Attributes</h3>
+<table>
+<tr><td>PreferencesKey</td></tr>
+</table>
+<h3>Class Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#PipInterfacePlugin.__init__">PipInterfacePlugin</a></td>
+<td>Constructor</td>
+</tr><tr>
+<td><a href="#PipInterfacePlugin.__initialize">__initialize</a></td>
+<td>Private slot to (re)initialize the plugin.</td>
+</tr><tr>
+<td><a href="#PipInterfacePlugin.activate">activate</a></td>
+<td>Public method to activate this plugin.</td>
+</tr><tr>
+<td><a href="#PipInterfacePlugin.deactivate">deactivate</a></td>
+<td>Public method to deactivate this plugin.</td>
+</tr><tr>
+<td><a href="#PipInterfacePlugin.getDefaultPipExecutables">getDefaultPipExecutables</a></td>
+<td>Public method to get the default list of pip executables.</td>
+</tr><tr>
+<td><a href="#PipInterfacePlugin.getMenu">getMenu</a></td>
+<td>Public method to get a reference to the requested menu.</td>
+</tr><tr>
+<td><a href="#PipInterfacePlugin.getMenuNames">getMenuNames</a></td>
+<td>Public method to get the names of all menus.</td>
+</tr><tr>
+<td><a href="#PipInterfacePlugin.getPreferences">getPreferences</a></td>
+<td>Public method to retrieve the various refactoring settings.</td>
+</tr><tr>
+<td><a href="#PipInterfacePlugin.setPreferences">setPreferences</a></td>
+<td>Public method to store the various refactoring settings.</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<a NAME="PipInterfacePlugin.__init__" ID="PipInterfacePlugin.__init__"></a>
+<h4>PipInterfacePlugin (Constructor)</h4>
+<b>PipInterfacePlugin</b>(<i>ui</i>)
+<p>
+        Constructor
+</p><dl>
+<dt><i>ui</i></dt>
+<dd>
+reference to the user interface object (UI.UserInterface)
+</dd>
+</dl><a NAME="PipInterfacePlugin.__initialize" ID="PipInterfacePlugin.__initialize"></a>
+<h4>PipInterfacePlugin.__initialize</h4>
+<b>__initialize</b>(<i></i>)
+<p>
+        Private slot to (re)initialize the plugin.
+</p><a NAME="PipInterfacePlugin.activate" ID="PipInterfacePlugin.activate"></a>
+<h4>PipInterfacePlugin.activate</h4>
+<b>activate</b>(<i></i>)
+<p>
+        Public method to activate this plugin.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+tuple of None and activation status (boolean)
+</dd>
+</dl><a NAME="PipInterfacePlugin.deactivate" ID="PipInterfacePlugin.deactivate"></a>
+<h4>PipInterfacePlugin.deactivate</h4>
+<b>deactivate</b>(<i></i>)
+<p>
+        Public method to deactivate this plugin.
+</p><a NAME="PipInterfacePlugin.getDefaultPipExecutables" ID="PipInterfacePlugin.getDefaultPipExecutables"></a>
+<h4>PipInterfacePlugin.getDefaultPipExecutables</h4>
+<b>getDefaultPipExecutables</b>(<i></i>)
+<p>
+        Public method to get the default list of pip executables.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+list of pip executables (list of string)
+</dd>
+</dl><a NAME="PipInterfacePlugin.getMenu" ID="PipInterfacePlugin.getMenu"></a>
+<h4>PipInterfacePlugin.getMenu</h4>
+<b>getMenu</b>(<i>name</i>)
+<p>
+        Public method to get a reference to the requested menu.
+</p><dl>
+<dt><i>name</i></dt>
+<dd>
+name of the menu (string)
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+reference to the menu (QMenu) or None, if no
+            menu with the given name exists
+</dd>
+</dl><a NAME="PipInterfacePlugin.getMenuNames" ID="PipInterfacePlugin.getMenuNames"></a>
+<h4>PipInterfacePlugin.getMenuNames</h4>
+<b>getMenuNames</b>(<i></i>)
+<p>
+        Public method to get the names of all menus.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+menu names (list of string)
+</dd>
+</dl><a NAME="PipInterfacePlugin.getPreferences" ID="PipInterfacePlugin.getPreferences"></a>
+<h4>PipInterfacePlugin.getPreferences</h4>
+<b>getPreferences</b>(<i>key</i>)
+<p>
+        Public method to retrieve the various refactoring settings.
+</p><dl>
+<dt><i>key</i></dt>
+<dd>
+the key of the value to get
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+the requested refactoring setting
+</dd>
+</dl><a NAME="PipInterfacePlugin.setPreferences" ID="PipInterfacePlugin.setPreferences"></a>
+<h4>PipInterfacePlugin.setPreferences</h4>
+<b>setPreferences</b>(<i>key, value</i>)
+<p>
+        Public method to store the various refactoring settings.
+</p><dl>
+<dt><i>key</i></dt>
+<dd>
+the key of the setting to be set (string)
+</dd><dt><i>value</i></dt>
+<dd>
+the value to be set
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
+<a NAME="_findDefaultExecutables" ID="_findDefaultExecutables"></a>
+<h2>_findDefaultExecutables</h2>
+<b>_findDefaultExecutables</b>(<i>majorVersion</i>)
+<p>
+    Restricted function to determine the name and path of the executables.
+</p><dl>
+<dt><i>majorVersion</i></dt>
+<dd>
+major python version of the executables (int)
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+path names of the executables (list of string)
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
+<a NAME="createPipPage" ID="createPipPage"></a>
+<h2>createPipPage</h2>
+<b>createPipPage</b>(<i>configDlg</i>)
+<p>
+    Module function to create the pip configuration page.
+</p><dl>
+<dt><i>configDlg</i></dt>
+<dd>
+reference to the configuration dialog
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+reference to the configuration page
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
+<a NAME="exeDisplayDataList" ID="exeDisplayDataList"></a>
+<h2>exeDisplayDataList</h2>
+<b>exeDisplayDataList</b>(<i></i>)
+<p>
+    Module function to support the display of some executable info.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+list of dictionaries containing the data to query the presence of
+        the executable
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
+<a NAME="getConfigData" ID="getConfigData"></a>
+<h2>getConfigData</h2>
+<b>getConfigData</b>(<i></i>)
+<p>
+    Module function returning data as required by the configuration dialog.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+dictionary containing the relevant data
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
+<a NAME="getExePath" ID="getExePath"></a>
+<h2>getExePath</h2>
+<b>getExePath</b>(<i>branch, access, versionStr</i>)
+
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
+<a NAME="prepareUninstall" ID="prepareUninstall"></a>
+<h2>prepareUninstall</h2>
+<b>prepareUninstall</b>(<i></i>)
+<p>
+    Module function to prepare for an un-installation.
+</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/Documentation/Source/eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.PipPage.html	Sat Dec 09 18:32:08 2017 +0100
@@ -0,0 +1,105 @@
+<!DOCTYPE html>
+<html><head>
+<title>eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.PipPage</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.UiExtensionPlugins.PipInterface.ConfigurationPage.PipPage</h1>
+<p>
+Package implementing the configuration page.
+</p>
+<h3>Global Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Classes</h3>
+<table>
+<tr>
+<td><a href="#PipPage">PipPage</a></td>
+<td>Class implementing the configuration page.</td>
+</tr>
+</table>
+<h3>Functions</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<hr /><hr />
+<a NAME="PipPage" ID="PipPage"></a>
+<h2>PipPage</h2>
+<p>
+    Class implementing the configuration page.
+</p>
+<h3>Derived from</h3>
+ConfigurationPageBase, Ui_PipPage
+<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="#PipPage.__init__">PipPage</a></td>
+<td>Constructor</td>
+</tr><tr>
+<td><a href="#PipPage.on_addButton_clicked">on_addButton_clicked</a></td>
+<td>Private slot used to add an executable to the list.</td>
+</tr><tr>
+<td><a href="#PipPage.on_defaultListButton_clicked">on_defaultListButton_clicked</a></td>
+<td>Private slot to load the default list of pip executables.</td>
+</tr><tr>
+<td><a href="#PipPage.save">save</a></td>
+<td>Public slot to save the pip configuration.</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<a NAME="PipPage.__init__" ID="PipPage.__init__"></a>
+<h4>PipPage (Constructor)</h4>
+<b>PipPage</b>(<i>plugin</i>)
+<p>
+        Constructor
+</p><dl>
+<dt><i>plugin</i></dt>
+<dd>
+reference to the plugin object
+</dd>
+</dl><a NAME="PipPage.on_addButton_clicked" ID="PipPage.on_addButton_clicked"></a>
+<h4>PipPage.on_addButton_clicked</h4>
+<b>on_addButton_clicked</b>(<i></i>)
+<p>
+        Private slot used to add an executable to the list.
+</p><a NAME="PipPage.on_defaultListButton_clicked" ID="PipPage.on_defaultListButton_clicked"></a>
+<h4>PipPage.on_defaultListButton_clicked</h4>
+<b>on_defaultListButton_clicked</b>(<i></i>)
+<p>
+        Private slot to load the default list of pip executables.
+</p><a NAME="PipPage.save" ID="PipPage.save"></a>
+<h4>PipPage.save</h4>
+<b>save</b>(<i></i>)
+<p>
+        Public slot to save the pip configuration.
+</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/Documentation/Source/eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html	Sat Dec 09 18:32:08 2017 +0100
@@ -0,0 +1,477 @@
+<!DOCTYPE html>
+<html><head>
+<title>eric6.Plugins.UiExtensionPlugins.PipInterface.Pip</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.UiExtensionPlugins.PipInterface.Pip</h1>
+<p>
+Package implementing the pip GUI logic.
+</p>
+<h3>Global Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Classes</h3>
+<table>
+<tr>
+<td><a href="#Pip">Pip</a></td>
+<td>Class implementing the pip GUI logic.</td>
+</tr>
+</table>
+<h3>Functions</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<hr /><hr />
+<a NAME="Pip" ID="Pip"></a>
+<h2>Pip</h2>
+<p>
+    Class implementing the pip GUI logic.
+</p>
+<h3>Derived from</h3>
+QObject
+<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="#Pip.__init__">Pip</a></td>
+<td>Constructor</td>
+</tr><tr>
+<td><a href="#Pip.__aboutToShowMenu">__aboutToShowMenu</a></td>
+<td>Private slot to set the action enabled status.</td>
+</tr><tr>
+<td><a href="#Pip.__checkUpgradePyQt">__checkUpgradePyQt</a></td>
+<td>Private method to check, if an upgrade of PyQt packages is attempted.</td>
+</tr><tr>
+<td><a href="#Pip.__editConfiguration">__editConfiguration</a></td>
+<td>Private method to edit a configuration.</td>
+</tr><tr>
+<td><a href="#Pip.__editUserConfiguration">__editUserConfiguration</a></td>
+<td>Private slot to edit the user configuration.</td>
+</tr><tr>
+<td><a href="#Pip.__editVirtualenvConfiguration">__editVirtualenvConfiguration</a></td>
+<td>Private slot to edit the current virtualenv configuration.</td>
+</tr><tr>
+<td><a href="#Pip.__generateRequirements">__generateRequirements</a></td>
+<td>Private slot to generate the contents for a requirements file.</td>
+</tr><tr>
+<td><a href="#Pip.__getPython">__getPython</a></td>
+<td>Private method to derive the path to the python executable given the path to the pip executable.</td>
+</tr><tr>
+<td><a href="#Pip.__getUserConfig">__getUserConfig</a></td>
+<td>Private method to get the name of the user configuration file.</td>
+</tr><tr>
+<td><a href="#Pip.__getVirtualenvConfig">__getVirtualenvConfig</a></td>
+<td>Private method to get the name of the virtualenv configuration file.</td>
+</tr><tr>
+<td><a href="#Pip.__handleTearOffMenu">__handleTearOffMenu</a></td>
+<td>Private slot to handle a change of the pip executable.</td>
+</tr><tr>
+<td><a href="#Pip.__installPackages">__installPackages</a></td>
+<td>Private slot to install packages to be given by the user.</td>
+</tr><tr>
+<td><a href="#Pip.__installPip">__installPip</a></td>
+<td>Private slot to install pip.</td>
+</tr><tr>
+<td><a href="#Pip.__installRequirements">__installRequirements</a></td>
+<td>Private slot to install packages as given in a requirements file.</td>
+</tr><tr>
+<td><a href="#Pip.__listOutdatedPackages">__listOutdatedPackages</a></td>
+<td>Private slot to list all installed, up-to-date packages.</td>
+</tr><tr>
+<td><a href="#Pip.__listPackages">__listPackages</a></td>
+<td>Private slot to list all installed packages.</td>
+</tr><tr>
+<td><a href="#Pip.__listUptodatePackages">__listUptodatePackages</a></td>
+<td>Private slot to list all installed, up-to-date packages.</td>
+</tr><tr>
+<td><a href="#Pip.__pipConfigure">__pipConfigure</a></td>
+<td>Private slot to open the configuration page.</td>
+</tr><tr>
+<td><a href="#Pip.__repairPip">__repairPip</a></td>
+<td></td>
+</tr><tr>
+<td><a href="#Pip.__searchPyPI">__searchPyPI</a></td>
+<td>Private slot to search the Python Package Index.</td>
+</tr><tr>
+<td><a href="#Pip.__selectPipExecutable">__selectPipExecutable</a></td>
+<td>Private method to select the pip executable to be used.</td>
+</tr><tr>
+<td><a href="#Pip.__uninstallPackages">__uninstallPackages</a></td>
+<td>Private slot to uninstall packages to be given by the user.</td>
+</tr><tr>
+<td><a href="#Pip.__uninstallRequirements">__uninstallRequirements</a></td>
+<td>Private slot to uninstall packages as given in a requirements file.</td>
+</tr><tr>
+<td><a href="#Pip.__upgradePackages">__upgradePackages</a></td>
+<td>Private slot to upgrade packages to be given by the user.</td>
+</tr><tr>
+<td><a href="#Pip.getMenu">getMenu</a></td>
+<td>Public method to get a reference to the requested menu.</td>
+</tr><tr>
+<td><a href="#Pip.getMenuNames">getMenuNames</a></td>
+<td>Public method to get the names of all menus.</td>
+</tr><tr>
+<td><a href="#Pip.initActions">initActions</a></td>
+<td>Public method to define the Django actions.</td>
+</tr><tr>
+<td><a href="#Pip.initMenu">initMenu</a></td>
+<td>Public slot to initialize the Django menu.</td>
+</tr><tr>
+<td><a href="#Pip.installPackages">installPackages</a></td>
+<td>Public method to install the given list of packages.</td>
+</tr><tr>
+<td><a href="#Pip.runProcess">runProcess</a></td>
+<td>Public method to execute the current pip with the given arguments.</td>
+</tr><tr>
+<td><a href="#Pip.uninstallPackages">uninstallPackages</a></td>
+<td>Public method to uninstall the given list of packages.</td>
+</tr><tr>
+<td><a href="#Pip.upgradePackages">upgradePackages</a></td>
+<td>Public method to upgrade the given list of packages.</td>
+</tr><tr>
+<td><a href="#Pip.upgradePip">upgradePip</a></td>
+<td>Public method to upgrade pip itself.</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<a NAME="Pip.__init__" ID="Pip.__init__"></a>
+<h4>Pip (Constructor)</h4>
+<b>Pip</b>(<i>plugin, parent=None</i>)
+<p>
+        Constructor
+</p><dl>
+<dt><i>plugin</i></dt>
+<dd>
+reference to the plugin object
+</dd><dt><i>parent</i></dt>
+<dd>
+parent (QObject)
+</dd>
+</dl><a NAME="Pip.__aboutToShowMenu" ID="Pip.__aboutToShowMenu"></a>
+<h4>Pip.__aboutToShowMenu</h4>
+<b>__aboutToShowMenu</b>(<i></i>)
+<p>
+        Private slot to set the action enabled status.
+</p><a NAME="Pip.__checkUpgradePyQt" ID="Pip.__checkUpgradePyQt"></a>
+<h4>Pip.__checkUpgradePyQt</h4>
+<b>__checkUpgradePyQt</b>(<i>packages</i>)
+<p>
+        Private method to check, if an upgrade of PyQt packages is attempted.
+</p><dl>
+<dt><i>packages</i> (list of str)</dt>
+<dd>
+list of packages to upgrade
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+flag indicating to abort the upgrade attempt
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+bool
+</dd>
+</dl><a NAME="Pip.__editConfiguration" ID="Pip.__editConfiguration"></a>
+<h4>Pip.__editConfiguration</h4>
+<b>__editConfiguration</b>(<i>virtualenv=False</i>)
+<p>
+        Private method to edit a configuration.
+</p><dl>
+<dt><i>virtualenv</i></dt>
+<dd>
+flag indicating to edit the current virtualenv
+            configuration file (boolean)
+</dd>
+</dl><a NAME="Pip.__editUserConfiguration" ID="Pip.__editUserConfiguration"></a>
+<h4>Pip.__editUserConfiguration</h4>
+<b>__editUserConfiguration</b>(<i></i>)
+<p>
+        Private slot to edit the user configuration.
+</p><a NAME="Pip.__editVirtualenvConfiguration" ID="Pip.__editVirtualenvConfiguration"></a>
+<h4>Pip.__editVirtualenvConfiguration</h4>
+<b>__editVirtualenvConfiguration</b>(<i></i>)
+<p>
+        Private slot to edit the current virtualenv configuration.
+</p><a NAME="Pip.__generateRequirements" ID="Pip.__generateRequirements"></a>
+<h4>Pip.__generateRequirements</h4>
+<b>__generateRequirements</b>(<i></i>)
+<p>
+        Private slot to generate the contents for a requirements file.
+</p><a NAME="Pip.__getPython" ID="Pip.__getPython"></a>
+<h4>Pip.__getPython</h4>
+<b>__getPython</b>(<i>cmd</i>)
+<p>
+        Private method to derive the path to the python executable given the
+        path to the pip executable.
+</p><dl>
+<dt><i>cmd</i> (str)</dt>
+<dd>
+path of the pip executable
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+path of the python executable
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+str
+</dd>
+</dl><a NAME="Pip.__getUserConfig" ID="Pip.__getUserConfig"></a>
+<h4>Pip.__getUserConfig</h4>
+<b>__getUserConfig</b>(<i></i>)
+<p>
+        Private method to get the name of the user configuration file.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+path of the user configuration file (string)
+</dd>
+</dl><a NAME="Pip.__getVirtualenvConfig" ID="Pip.__getVirtualenvConfig"></a>
+<h4>Pip.__getVirtualenvConfig</h4>
+<b>__getVirtualenvConfig</b>(<i></i>)
+<p>
+        Private method to get the name of the virtualenv configuration file.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+path of the virtualenv configuration file (string)
+</dd>
+</dl><a NAME="Pip.__handleTearOffMenu" ID="Pip.__handleTearOffMenu"></a>
+<h4>Pip.__handleTearOffMenu</h4>
+<b>__handleTearOffMenu</b>(<i>pip</i>)
+<p>
+        Private slot to handle a change of the pip executable.
+</p><dl>
+<dt><i>pip</i> (str)</dt>
+<dd>
+path of the pip executable
+</dd>
+</dl><a NAME="Pip.__installPackages" ID="Pip.__installPackages"></a>
+<h4>Pip.__installPackages</h4>
+<b>__installPackages</b>(<i></i>)
+<p>
+        Private slot to install packages to be given by the user.
+</p><a NAME="Pip.__installPip" ID="Pip.__installPip"></a>
+<h4>Pip.__installPip</h4>
+<b>__installPip</b>(<i></i>)
+<p>
+        Private slot to install pip.
+</p><a NAME="Pip.__installRequirements" ID="Pip.__installRequirements"></a>
+<h4>Pip.__installRequirements</h4>
+<b>__installRequirements</b>(<i></i>)
+<p>
+        Private slot to install packages as given in a requirements file.
+</p><a NAME="Pip.__listOutdatedPackages" ID="Pip.__listOutdatedPackages"></a>
+<h4>Pip.__listOutdatedPackages</h4>
+<b>__listOutdatedPackages</b>(<i></i>)
+<p>
+        Private slot to list all installed, up-to-date packages.
+</p><a NAME="Pip.__listPackages" ID="Pip.__listPackages"></a>
+<h4>Pip.__listPackages</h4>
+<b>__listPackages</b>(<i></i>)
+<p>
+        Private slot to list all installed packages.
+</p><a NAME="Pip.__listUptodatePackages" ID="Pip.__listUptodatePackages"></a>
+<h4>Pip.__listUptodatePackages</h4>
+<b>__listUptodatePackages</b>(<i></i>)
+<p>
+        Private slot to list all installed, up-to-date packages.
+</p><a NAME="Pip.__pipConfigure" ID="Pip.__pipConfigure"></a>
+<h4>Pip.__pipConfigure</h4>
+<b>__pipConfigure</b>(<i></i>)
+<p>
+        Private slot to open the configuration page.
+</p><a NAME="Pip.__repairPip" ID="Pip.__repairPip"></a>
+<h4>Pip.__repairPip</h4>
+<b>__repairPip</b>(<i></i>)
+<a NAME="Pip.__searchPyPI" ID="Pip.__searchPyPI"></a>
+<h4>Pip.__searchPyPI</h4>
+<b>__searchPyPI</b>(<i></i>)
+<p>
+        Private slot to search the Python Package Index.
+</p><a NAME="Pip.__selectPipExecutable" ID="Pip.__selectPipExecutable"></a>
+<h4>Pip.__selectPipExecutable</h4>
+<b>__selectPipExecutable</b>(<i></i>)
+<p>
+        Private method to select the pip executable to be used.
+</p><a NAME="Pip.__uninstallPackages" ID="Pip.__uninstallPackages"></a>
+<h4>Pip.__uninstallPackages</h4>
+<b>__uninstallPackages</b>(<i></i>)
+<p>
+        Private slot to uninstall packages to be given by the user.
+</p><a NAME="Pip.__uninstallRequirements" ID="Pip.__uninstallRequirements"></a>
+<h4>Pip.__uninstallRequirements</h4>
+<b>__uninstallRequirements</b>(<i></i>)
+<p>
+        Private slot to uninstall packages as given in a requirements file.
+</p><a NAME="Pip.__upgradePackages" ID="Pip.__upgradePackages"></a>
+<h4>Pip.__upgradePackages</h4>
+<b>__upgradePackages</b>(<i></i>)
+<p>
+        Private slot to upgrade packages to be given by the user.
+</p><a NAME="Pip.getMenu" ID="Pip.getMenu"></a>
+<h4>Pip.getMenu</h4>
+<b>getMenu</b>(<i>name</i>)
+<p>
+        Public method to get a reference to the requested menu.
+</p><dl>
+<dt><i>name</i></dt>
+<dd>
+name of the menu (string)
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+reference to the menu (QMenu) or None, if no
+            menu with the given name exists
+</dd>
+</dl><a NAME="Pip.getMenuNames" ID="Pip.getMenuNames"></a>
+<h4>Pip.getMenuNames</h4>
+<b>getMenuNames</b>(<i></i>)
+<p>
+        Public method to get the names of all menus.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+menu names (list of string)
+</dd>
+</dl><a NAME="Pip.initActions" ID="Pip.initActions"></a>
+<h4>Pip.initActions</h4>
+<b>initActions</b>(<i></i>)
+<p>
+        Public method to define the Django actions.
+</p><a NAME="Pip.initMenu" ID="Pip.initMenu"></a>
+<h4>Pip.initMenu</h4>
+<b>initMenu</b>(<i></i>)
+<p>
+        Public slot to initialize the Django menu.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+the menu generated (QMenu)
+</dd>
+</dl><a NAME="Pip.installPackages" ID="Pip.installPackages"></a>
+<h4>Pip.installPackages</h4>
+<b>installPackages</b>(<i>packages, cmd=""</i>)
+<p>
+        Public method to install the given list of packages.
+</p><dl>
+<dt><i>packages</i></dt>
+<dd>
+list of packages to install (list of string)
+</dd><dt><i>cmd</i></dt>
+<dd>
+pip command to be used (string)
+</dd>
+</dl><a NAME="Pip.runProcess" ID="Pip.runProcess"></a>
+<h4>Pip.runProcess</h4>
+<b>runProcess</b>(<i>args, cmd=""</i>)
+<p>
+        Public method to execute the current pip with the given arguments.
+</p><p>
+        The selected pip executable is called with the given arguments and
+        waited for its end.
+</p><dl>
+<dt><i>args</i></dt>
+<dd>
+list of command line arguments (list of string)
+</dd><dt><i>cmd</i></dt>
+<dd>
+pip command to be used (string)
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+tuple containing a flag indicating success and the output
+            of the process (string)
+</dd>
+</dl><a NAME="Pip.uninstallPackages" ID="Pip.uninstallPackages"></a>
+<h4>Pip.uninstallPackages</h4>
+<b>uninstallPackages</b>(<i>packages, cmd=""</i>)
+<p>
+        Public method to uninstall the given list of packages.
+</p><dl>
+<dt><i>packages</i></dt>
+<dd>
+list of packages to uninstall (list of string)
+</dd><dt><i>cmd</i></dt>
+<dd>
+pip command to be used (string)
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+flag indicating a successful execution (boolean)
+</dd>
+</dl><a NAME="Pip.upgradePackages" ID="Pip.upgradePackages"></a>
+<h4>Pip.upgradePackages</h4>
+<b>upgradePackages</b>(<i>packages, cmd=""</i>)
+<p>
+        Public method to upgrade the given list of packages.
+</p><dl>
+<dt><i>packages</i></dt>
+<dd>
+list of packages to upgrade (list of string)
+</dd><dt><i>cmd</i></dt>
+<dd>
+pip command to be used (string)
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+flag indicating a successful execution (boolean)
+</dd>
+</dl><a NAME="Pip.upgradePip" ID="Pip.upgradePip"></a>
+<h4>Pip.upgradePip</h4>
+<b>upgradePip</b>(<i>pip=""</i>)
+<p>
+        Public method to upgrade pip itself.
+</p><dl>
+<dt><i>pip</i> (str)</dt>
+<dd>
+pip command to be used
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+flag indicating a successful execution
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+bool
+</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/Documentation/Source/eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.html	Sat Dec 09 18:32:08 2017 +0100
@@ -0,0 +1,218 @@
+<!DOCTYPE html>
+<html><head>
+<title>eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog</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.UiExtensionPlugins.PipInterface.PipDialog</h1>
+<p>
+Module implementing a dialog showing the output of a pip command.
+</p>
+<h3>Global Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Classes</h3>
+<table>
+<tr>
+<td><a href="#PipDialog">PipDialog</a></td>
+<td>Class implementing a dialog showing the output of a pip command.</td>
+</tr>
+</table>
+<h3>Functions</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<hr /><hr />
+<a NAME="PipDialog" ID="PipDialog"></a>
+<h2>PipDialog</h2>
+<p>
+    Class implementing a dialog showing the output of a pip command.
+</p>
+<h3>Derived from</h3>
+QDialog, Ui_PipDialog
+<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="#PipDialog.__init__">PipDialog</a></td>
+<td>Constructor</td>
+</tr><tr>
+<td><a href="#PipDialog.__addOutput">__addOutput</a></td>
+<td>Private method to add some text to the output pane.</td>
+</tr><tr>
+<td><a href="#PipDialog.__finish">__finish</a></td>
+<td>Private slot called when the process finished or the user pressed the button.</td>
+</tr><tr>
+<td><a href="#PipDialog.__procFinished">__procFinished</a></td>
+<td>Private slot connected to the finished signal.</td>
+</tr><tr>
+<td><a href="#PipDialog.__readStderr">__readStderr</a></td>
+<td>Private slot to handle the readyReadStandardError signal.</td>
+</tr><tr>
+<td><a href="#PipDialog.__readStdout">__readStdout</a></td>
+<td>Private slot to handle the readyReadStandardOutput signal.</td>
+</tr><tr>
+<td><a href="#PipDialog.closeEvent">closeEvent</a></td>
+<td>Protected slot implementing a close event handler.</td>
+</tr><tr>
+<td><a href="#PipDialog.on_buttonBox_clicked">on_buttonBox_clicked</a></td>
+<td>Private slot called by a button of the button box clicked.</td>
+</tr><tr>
+<td><a href="#PipDialog.startProcess">startProcess</a></td>
+<td>Public slot used to start the process.</td>
+</tr><tr>
+<td><a href="#PipDialog.startProcesses">startProcesses</a></td>
+<td>Public method to issue a list of commands to be executed.</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<a NAME="PipDialog.__init__" ID="PipDialog.__init__"></a>
+<h4>PipDialog (Constructor)</h4>
+<b>PipDialog</b>(<i>text, parent=None</i>)
+<p>
+        Constructor
+</p><dl>
+<dt><i>text</i></dt>
+<dd>
+text to be shown by the label (string)
+</dd><dt><i>parent</i></dt>
+<dd>
+reference to the parent widget (QWidget)
+</dd>
+</dl><a NAME="PipDialog.__addOutput" ID="PipDialog.__addOutput"></a>
+<h4>PipDialog.__addOutput</h4>
+<b>__addOutput</b>(<i>txt</i>)
+<p>
+        Private method to add some text to the output pane.
+</p><dl>
+<dt><i>txt</i> (str)</dt>
+<dd>
+text to be added
+</dd>
+</dl><a NAME="PipDialog.__finish" ID="PipDialog.__finish"></a>
+<h4>PipDialog.__finish</h4>
+<b>__finish</b>(<i></i>)
+<p>
+        Private slot called when the process finished or the user pressed
+        the button.
+</p><a NAME="PipDialog.__procFinished" ID="PipDialog.__procFinished"></a>
+<h4>PipDialog.__procFinished</h4>
+<b>__procFinished</b>(<i>exitCode, exitStatus</i>)
+<p>
+        Private slot connected to the finished signal.
+</p><dl>
+<dt><i>exitCode</i></dt>
+<dd>
+exit code of the process (integer)
+</dd><dt><i>exitStatus</i></dt>
+<dd>
+exit status of the process (QProcess.ExitStatus)
+</dd>
+</dl><a NAME="PipDialog.__readStderr" ID="PipDialog.__readStderr"></a>
+<h4>PipDialog.__readStderr</h4>
+<b>__readStderr</b>(<i></i>)
+<p>
+        Private slot to handle the readyReadStandardError signal.
+</p><p>
+        It reads the error output of the process and inserts it into the
+        error pane.
+</p><a NAME="PipDialog.__readStdout" ID="PipDialog.__readStdout"></a>
+<h4>PipDialog.__readStdout</h4>
+<b>__readStdout</b>(<i></i>)
+<p>
+        Private slot to handle the readyReadStandardOutput signal.
+</p><p>
+        It reads the output of the process, formats it and inserts it into
+        the contents pane.
+</p><a NAME="PipDialog.closeEvent" ID="PipDialog.closeEvent"></a>
+<h4>PipDialog.closeEvent</h4>
+<b>closeEvent</b>(<i>e</i>)
+<p>
+        Protected slot implementing a close event handler.
+</p><dl>
+<dt><i>e</i></dt>
+<dd>
+close event (QCloseEvent)
+</dd>
+</dl><a NAME="PipDialog.on_buttonBox_clicked" ID="PipDialog.on_buttonBox_clicked"></a>
+<h4>PipDialog.on_buttonBox_clicked</h4>
+<b>on_buttonBox_clicked</b>(<i>button</i>)
+<p>
+        Private slot called by a button of the button box clicked.
+</p><dl>
+<dt><i>button</i></dt>
+<dd>
+button that was clicked (QAbstractButton)
+</dd>
+</dl><a NAME="PipDialog.startProcess" ID="PipDialog.startProcess"></a>
+<h4>PipDialog.startProcess</h4>
+<b>startProcess</b>(<i>cmd, args, showArgs=True</i>)
+<p>
+        Public slot used to start the process.
+</p><dl>
+<dt><i>cmd</i></dt>
+<dd>
+name of the pip executable to be used (string)
+</dd><dt><i>args</i></dt>
+<dd>
+list of arguments for the process (list of strings)
+</dd><dt><i>showArgs=</i></dt>
+<dd>
+flag indicating to show the arguments (boolean)
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+flag indicating a successful start of the process
+</dd>
+</dl><a NAME="PipDialog.startProcesses" ID="PipDialog.startProcesses"></a>
+<h4>PipDialog.startProcesses</h4>
+<b>startProcesses</b>(<i>processParams</i>)
+<p>
+        Public method to issue a list of commands to be executed.
+</p><dl>
+<dt><i>processParams</i> (list of tuples of str and list of str)</dt>
+<dd>
+list of tuples containing the command
+            and arguments
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+flag indicating a successful start of the first process
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+bool
+</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/Documentation/Source/eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html	Sat Dec 09 18:32:08 2017 +0100
@@ -0,0 +1,257 @@
+<!DOCTYPE html>
+<html><head>
+<title>eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog</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.UiExtensionPlugins.PipInterface.PipFreezeDialog</h1>
+<p>
+Module implementing a dialog to generate a requirements file.
+</p>
+<h3>Global Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Classes</h3>
+<table>
+<tr>
+<td><a href="#PipFreezeDialog">PipFreezeDialog</a></td>
+<td>Class implementing a dialog to generate a requirements file.</td>
+</tr>
+</table>
+<h3>Functions</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<hr /><hr />
+<a NAME="PipFreezeDialog" ID="PipFreezeDialog"></a>
+<h2>PipFreezeDialog</h2>
+<p>
+    Class implementing a dialog to generate a requirements file.
+</p>
+<h3>Derived from</h3>
+QDialog, Ui_PipFreezeDialog
+<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="#PipFreezeDialog.__init__">PipFreezeDialog</a></td>
+<td>Constructor</td>
+</tr><tr>
+<td><a href="#PipFreezeDialog.__refresh">__refresh</a></td>
+<td>Private slot to refresh the displayed list.</td>
+</tr><tr>
+<td><a href="#PipFreezeDialog.__updateButtons">__updateButtons</a></td>
+<td>Private method to set the state of the various buttons.</td>
+</tr><tr>
+<td><a href="#PipFreezeDialog.__writeToFile">__writeToFile</a></td>
+<td>Private method to write the requirements text to a file.</td>
+</tr><tr>
+<td><a href="#PipFreezeDialog.closeEvent">closeEvent</a></td>
+<td>Protected slot implementing a close event handler.</td>
+</tr><tr>
+<td><a href="#PipFreezeDialog.on_buttonBox_clicked">on_buttonBox_clicked</a></td>
+<td>Private slot called by a button of the button box clicked.</td>
+</tr><tr>
+<td><a href="#PipFreezeDialog.on_copyButton_clicked">on_copyButton_clicked</a></td>
+<td>Private slot to copy the requirements text to the clipboard.</td>
+</tr><tr>
+<td><a href="#PipFreezeDialog.on_fileButton_clicked">on_fileButton_clicked</a></td>
+<td>Private slot to enter the requirements file via a file selection dialog.</td>
+</tr><tr>
+<td><a href="#PipFreezeDialog.on_insertButton_clicked">on_insertButton_clicked</a></td>
+<td>Private slot to insert the requirements text at the cursor position of the current editor.</td>
+</tr><tr>
+<td><a href="#PipFreezeDialog.on_localCheckBox_clicked">on_localCheckBox_clicked</a></td>
+<td>Private slot handling the switching of the local mode.</td>
+</tr><tr>
+<td><a href="#PipFreezeDialog.on_pipComboBox_activated">on_pipComboBox_activated</a></td>
+<td>Private slot handling the selection of a pip executable.</td>
+</tr><tr>
+<td><a href="#PipFreezeDialog.on_replaceAllButton_clicked">on_replaceAllButton_clicked</a></td>
+<td>Private slot to replace the text of the current editor with the requirements text.</td>
+</tr><tr>
+<td><a href="#PipFreezeDialog.on_replaceSelectionButton_clicked">on_replaceSelectionButton_clicked</a></td>
+<td>Private slot to replace the selected text of the current editor with the requirements text.</td>
+</tr><tr>
+<td><a href="#PipFreezeDialog.on_requirementsEdit_textChanged">on_requirementsEdit_textChanged</a></td>
+<td>Private slot handling changes of the requirements text.</td>
+</tr><tr>
+<td><a href="#PipFreezeDialog.on_requirementsFileEdit_textChanged">on_requirementsFileEdit_textChanged</a></td>
+<td>Private slot handling a change of the requirements file name.</td>
+</tr><tr>
+<td><a href="#PipFreezeDialog.on_saveButton_clicked">on_saveButton_clicked</a></td>
+<td>Private slot to save the requirements text to the requirements file.</td>
+</tr><tr>
+<td><a href="#PipFreezeDialog.on_saveToButton_clicked">on_saveToButton_clicked</a></td>
+<td>Private slot to write the requirements text to a new file.</td>
+</tr><tr>
+<td><a href="#PipFreezeDialog.start">start</a></td>
+<td>Public method to start the command.</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<a NAME="PipFreezeDialog.__init__" ID="PipFreezeDialog.__init__"></a>
+<h4>PipFreezeDialog (Constructor)</h4>
+<b>PipFreezeDialog</b>(<i>pip, plugin, parent=None</i>)
+<p>
+        Constructor
+</p><dl>
+<dt><i>pip</i></dt>
+<dd>
+reference to the master object (Pip)
+</dd><dt><i>plugin</i></dt>
+<dd>
+reference to the plugin object (ToolPipPlugin)
+</dd><dt><i>parent</i></dt>
+<dd>
+reference to the parent widget (QWidget)
+</dd>
+</dl><a NAME="PipFreezeDialog.__refresh" ID="PipFreezeDialog.__refresh"></a>
+<h4>PipFreezeDialog.__refresh</h4>
+<b>__refresh</b>(<i></i>)
+<p>
+        Private slot to refresh the displayed list.
+</p><a NAME="PipFreezeDialog.__updateButtons" ID="PipFreezeDialog.__updateButtons"></a>
+<h4>PipFreezeDialog.__updateButtons</h4>
+<b>__updateButtons</b>(<i></i>)
+<p>
+        Private method to set the state of the various buttons.
+</p><a NAME="PipFreezeDialog.__writeToFile" ID="PipFreezeDialog.__writeToFile"></a>
+<h4>PipFreezeDialog.__writeToFile</h4>
+<b>__writeToFile</b>(<i>fileName</i>)
+<p>
+        Private method to write the requirements text to a file.
+</p><dl>
+<dt><i>fileName</i></dt>
+<dd>
+name of the file to write to (string)
+</dd>
+</dl><a NAME="PipFreezeDialog.closeEvent" ID="PipFreezeDialog.closeEvent"></a>
+<h4>PipFreezeDialog.closeEvent</h4>
+<b>closeEvent</b>(<i>e</i>)
+<p>
+        Protected slot implementing a close event handler.
+</p><dl>
+<dt><i>e</i></dt>
+<dd>
+close event (QCloseEvent)
+</dd>
+</dl><a NAME="PipFreezeDialog.on_buttonBox_clicked" ID="PipFreezeDialog.on_buttonBox_clicked"></a>
+<h4>PipFreezeDialog.on_buttonBox_clicked</h4>
+<b>on_buttonBox_clicked</b>(<i>button</i>)
+<p>
+        Private slot called by a button of the button box clicked.
+</p><dl>
+<dt><i>button</i></dt>
+<dd>
+button that was clicked (QAbstractButton)
+</dd>
+</dl><a NAME="PipFreezeDialog.on_copyButton_clicked" ID="PipFreezeDialog.on_copyButton_clicked"></a>
+<h4>PipFreezeDialog.on_copyButton_clicked</h4>
+<b>on_copyButton_clicked</b>(<i></i>)
+<p>
+        Private slot to copy the requirements text to the clipboard.
+</p><a NAME="PipFreezeDialog.on_fileButton_clicked" ID="PipFreezeDialog.on_fileButton_clicked"></a>
+<h4>PipFreezeDialog.on_fileButton_clicked</h4>
+<b>on_fileButton_clicked</b>(<i></i>)
+<p>
+        Private slot to enter the requirements file via a file selection
+        dialog.
+</p><a NAME="PipFreezeDialog.on_insertButton_clicked" ID="PipFreezeDialog.on_insertButton_clicked"></a>
+<h4>PipFreezeDialog.on_insertButton_clicked</h4>
+<b>on_insertButton_clicked</b>(<i></i>)
+<p>
+        Private slot to insert the requirements text at the cursor position
+        of the current editor.
+</p><a NAME="PipFreezeDialog.on_localCheckBox_clicked" ID="PipFreezeDialog.on_localCheckBox_clicked"></a>
+<h4>PipFreezeDialog.on_localCheckBox_clicked</h4>
+<b>on_localCheckBox_clicked</b>(<i>checked</i>)
+<p>
+        Private slot handling the switching of the local mode.
+</p><dl>
+<dt><i>checked</i></dt>
+<dd>
+state of the local check box (boolean)
+</dd>
+</dl><a NAME="PipFreezeDialog.on_pipComboBox_activated" ID="PipFreezeDialog.on_pipComboBox_activated"></a>
+<h4>PipFreezeDialog.on_pipComboBox_activated</h4>
+<b>on_pipComboBox_activated</b>(<i>txt</i>)
+<p>
+        Private slot handling the selection of a pip executable.
+</p><dl>
+<dt><i>txt</i></dt>
+<dd>
+path of the pip executable (string)
+</dd>
+</dl><a NAME="PipFreezeDialog.on_replaceAllButton_clicked" ID="PipFreezeDialog.on_replaceAllButton_clicked"></a>
+<h4>PipFreezeDialog.on_replaceAllButton_clicked</h4>
+<b>on_replaceAllButton_clicked</b>(<i></i>)
+<p>
+        Private slot to replace the text of the current editor with the
+        requirements text.
+</p><a NAME="PipFreezeDialog.on_replaceSelectionButton_clicked" ID="PipFreezeDialog.on_replaceSelectionButton_clicked"></a>
+<h4>PipFreezeDialog.on_replaceSelectionButton_clicked</h4>
+<b>on_replaceSelectionButton_clicked</b>(<i></i>)
+<p>
+        Private slot to replace the selected text of the current editor
+        with the requirements text.
+</p><a NAME="PipFreezeDialog.on_requirementsEdit_textChanged" ID="PipFreezeDialog.on_requirementsEdit_textChanged"></a>
+<h4>PipFreezeDialog.on_requirementsEdit_textChanged</h4>
+<b>on_requirementsEdit_textChanged</b>(<i></i>)
+<p>
+        Private slot handling changes of the requirements text.
+</p><a NAME="PipFreezeDialog.on_requirementsFileEdit_textChanged" ID="PipFreezeDialog.on_requirementsFileEdit_textChanged"></a>
+<h4>PipFreezeDialog.on_requirementsFileEdit_textChanged</h4>
+<b>on_requirementsFileEdit_textChanged</b>(<i>txt</i>)
+<p>
+        Private slot handling a change of the requirements file name.
+</p><dl>
+<dt><i>txt</i></dt>
+<dd>
+name of the requirements file (string)
+</dd>
+</dl><a NAME="PipFreezeDialog.on_saveButton_clicked" ID="PipFreezeDialog.on_saveButton_clicked"></a>
+<h4>PipFreezeDialog.on_saveButton_clicked</h4>
+<b>on_saveButton_clicked</b>(<i></i>)
+<p>
+        Private slot to save the requirements text to the requirements file.
+</p><a NAME="PipFreezeDialog.on_saveToButton_clicked" ID="PipFreezeDialog.on_saveToButton_clicked"></a>
+<h4>PipFreezeDialog.on_saveToButton_clicked</h4>
+<b>on_saveToButton_clicked</b>(<i></i>)
+<p>
+        Private slot to write the requirements text to a new file.
+</p><a NAME="PipFreezeDialog.start" ID="PipFreezeDialog.start"></a>
+<h4>PipFreezeDialog.start</h4>
+<b>start</b>(<i></i>)
+<p>
+        Public method to start the command.
+</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/Documentation/Source/eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html	Sat Dec 09 18:32:08 2017 +0100
@@ -0,0 +1,319 @@
+<!DOCTYPE html>
+<html><head>
+<title>eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog</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.UiExtensionPlugins.PipInterface.PipListDialog</h1>
+<p>
+Module implementing a dialog to list installed packages.
+</p>
+<h3>Global Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Classes</h3>
+<table>
+<tr>
+<td><a href="#PipListDialog">PipListDialog</a></td>
+<td>Class implementing a dialog to list installed packages.</td>
+</tr>
+</table>
+<h3>Functions</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<hr /><hr />
+<a NAME="PipListDialog" ID="PipListDialog"></a>
+<h2>PipListDialog</h2>
+<p>
+    Class implementing a dialog to list installed packages.
+</p>
+<h3>Derived from</h3>
+QDialog, Ui_PipListDialog
+<h3>Class Attributes</h3>
+<table>
+<tr><td>CommandArguments</td></tr><tr><td>ShowProcessClassifiersMode</td></tr><tr><td>ShowProcessEntryPointsMode</td></tr><tr><td>ShowProcessFilesListMode</td></tr><tr><td>ShowProcessGeneralMode</td></tr>
+</table>
+<h3>Class Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#PipListDialog.__init__">PipListDialog</a></td>
+<td>Constructor</td>
+</tr><tr>
+<td><a href="#PipListDialog.__executeUpgradePackages">__executeUpgradePackages</a></td>
+<td>Private method to execute the pip upgrade command.</td>
+</tr><tr>
+<td><a href="#PipListDialog.__finish">__finish</a></td>
+<td>Private slot called when the process finished or the user pressed the cancel button.</td>
+</tr><tr>
+<td><a href="#PipListDialog.__procFinished">__procFinished</a></td>
+<td>Private slot connected to the finished signal.</td>
+</tr><tr>
+<td><a href="#PipListDialog.__processOutput">__processOutput</a></td>
+<td>Private method to process the captured output.</td>
+</tr><tr>
+<td><a href="#PipListDialog.__readStderr">__readStderr</a></td>
+<td>Private slot to handle the readyReadStandardError signal.</td>
+</tr><tr>
+<td><a href="#PipListDialog.__readStdout">__readStdout</a></td>
+<td>Private slot to handle the readyReadStandardOutput signal.</td>
+</tr><tr>
+<td><a href="#PipListDialog.__refresh">__refresh</a></td>
+<td>Private slot to refresh the displayed list.</td>
+</tr><tr>
+<td><a href="#PipListDialog.__stopProcess">__stopProcess</a></td>
+<td>Private slot to stop the running process.</td>
+</tr><tr>
+<td><a href="#PipListDialog.__uninstallPackages">__uninstallPackages</a></td>
+<td>Private slot to uninstall the selected packages.</td>
+</tr><tr>
+<td><a href="#PipListDialog.__upgradeAllPackages">__upgradeAllPackages</a></td>
+<td>Private slot to upgrade all listed packages.</td>
+</tr><tr>
+<td><a href="#PipListDialog.__upgradePackages">__upgradePackages</a></td>
+<td>Private slot to upgrade the selected packages.</td>
+</tr><tr>
+<td><a href="#PipListDialog.__upgradePip">__upgradePip</a></td>
+<td>Private slot to upgrade pip itself.</td>
+</tr><tr>
+<td><a href="#PipListDialog.closeEvent">closeEvent</a></td>
+<td>Protected slot implementing a close event handler.</td>
+</tr><tr>
+<td><a href="#PipListDialog.on_buttonBox_clicked">on_buttonBox_clicked</a></td>
+<td>Private slot called by a button of the button box clicked.</td>
+</tr><tr>
+<td><a href="#PipListDialog.on_installedFilesCheckBox_clicked">on_installedFilesCheckBox_clicked</a></td>
+<td>Private slot to handle a change of the installed files information checkbox.</td>
+</tr><tr>
+<td><a href="#PipListDialog.on_localCheckBox_clicked">on_localCheckBox_clicked</a></td>
+<td>Private slot handling the switching of the local mode.</td>
+</tr><tr>
+<td><a href="#PipListDialog.on_notRequiredCheckBox_clicked">on_notRequiredCheckBox_clicked</a></td>
+<td>Private slot handling the switching of the 'not required' mode.</td>
+</tr><tr>
+<td><a href="#PipListDialog.on_packageList_itemSelectionChanged">on_packageList_itemSelectionChanged</a></td>
+<td>Private slot handling the selection of a package.</td>
+</tr><tr>
+<td><a href="#PipListDialog.on_pipComboBox_activated">on_pipComboBox_activated</a></td>
+<td>Private slot handling the selection of a pip executable.</td>
+</tr><tr>
+<td><a href="#PipListDialog.on_verboseCheckBox_clicked">on_verboseCheckBox_clicked</a></td>
+<td>Private slot to handle a change of the verbose package information checkbox.</td>
+</tr><tr>
+<td><a href="#PipListDialog.start">start</a></td>
+<td>Public method to start the command.</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<a NAME="PipListDialog.__init__" ID="PipListDialog.__init__"></a>
+<h4>PipListDialog (Constructor)</h4>
+<b>PipListDialog</b>(<i>pip, mode, plugin, title, parent=None</i>)
+<p>
+        Constructor
+</p><dl>
+<dt><i>pip</i></dt>
+<dd>
+reference to the master object (Pip)
+</dd><dt><i>mode</i></dt>
+<dd>
+list command mode (string; one of 'list',
+            'uptodate', 'outdated')
+</dd><dt><i>plugin</i></dt>
+<dd>
+reference to the plugin object (ToolPipPlugin)
+</dd><dt><i>title</i></dt>
+<dd>
+title of the dialog (string)
+</dd><dt><i>parent</i></dt>
+<dd>
+reference to the parent widget (QWidget)
+</dd>
+</dl><a NAME="PipListDialog.__executeUpgradePackages" ID="PipListDialog.__executeUpgradePackages"></a>
+<h4>PipListDialog.__executeUpgradePackages</h4>
+<b>__executeUpgradePackages</b>(<i>packages</i>)
+<p>
+        Private method to execute the pip upgrade command.
+</p><dl>
+<dt><i>packages</i> (list of str)</dt>
+<dd>
+list of package names to be upgraded
+</dd>
+</dl><a NAME="PipListDialog.__finish" ID="PipListDialog.__finish"></a>
+<h4>PipListDialog.__finish</h4>
+<b>__finish</b>(<i></i>)
+<p>
+        Private slot called when the process finished or the user pressed
+        the cancel button.
+</p><a NAME="PipListDialog.__procFinished" ID="PipListDialog.__procFinished"></a>
+<h4>PipListDialog.__procFinished</h4>
+<b>__procFinished</b>(<i>exitCode, exitStatus</i>)
+<p>
+        Private slot connected to the finished signal.
+</p><dl>
+<dt><i>exitCode</i></dt>
+<dd>
+exit code of the process (integer)
+</dd><dt><i>exitStatus</i></dt>
+<dd>
+exit status of the process (QProcess.ExitStatus)
+</dd>
+</dl><a NAME="PipListDialog.__processOutput" ID="PipListDialog.__processOutput"></a>
+<h4>PipListDialog.__processOutput</h4>
+<b>__processOutput</b>(<i></i>)
+<p>
+        Private method to process the captured output.
+</p><a NAME="PipListDialog.__readStderr" ID="PipListDialog.__readStderr"></a>
+<h4>PipListDialog.__readStderr</h4>
+<b>__readStderr</b>(<i></i>)
+<p>
+        Private slot to handle the readyReadStandardError signal.
+</p><p>
+        It reads the error output of the process and inserts it into the
+        error pane.
+</p><a NAME="PipListDialog.__readStdout" ID="PipListDialog.__readStdout"></a>
+<h4>PipListDialog.__readStdout</h4>
+<b>__readStdout</b>(<i></i>)
+<p>
+        Private slot to handle the readyReadStandardOutput signal.
+</p><p>
+        It reads the output of the process, formats it and inserts it into
+        the contents pane.
+</p><a NAME="PipListDialog.__refresh" ID="PipListDialog.__refresh"></a>
+<h4>PipListDialog.__refresh</h4>
+<b>__refresh</b>(<i></i>)
+<p>
+        Private slot to refresh the displayed list.
+</p><a NAME="PipListDialog.__stopProcess" ID="PipListDialog.__stopProcess"></a>
+<h4>PipListDialog.__stopProcess</h4>
+<b>__stopProcess</b>(<i></i>)
+<p>
+        Private slot to stop the running process.
+</p><a NAME="PipListDialog.__uninstallPackages" ID="PipListDialog.__uninstallPackages"></a>
+<h4>PipListDialog.__uninstallPackages</h4>
+<b>__uninstallPackages</b>(<i></i>)
+<p>
+        Private slot to uninstall the selected packages.
+</p><a NAME="PipListDialog.__upgradeAllPackages" ID="PipListDialog.__upgradeAllPackages"></a>
+<h4>PipListDialog.__upgradeAllPackages</h4>
+<b>__upgradeAllPackages</b>(<i></i>)
+<p>
+        Private slot to upgrade all listed packages.
+</p><a NAME="PipListDialog.__upgradePackages" ID="PipListDialog.__upgradePackages"></a>
+<h4>PipListDialog.__upgradePackages</h4>
+<b>__upgradePackages</b>(<i></i>)
+<p>
+        Private slot to upgrade the selected packages.
+</p><a NAME="PipListDialog.__upgradePip" ID="PipListDialog.__upgradePip"></a>
+<h4>PipListDialog.__upgradePip</h4>
+<b>__upgradePip</b>(<i></i>)
+<p>
+        Private slot to upgrade pip itself.
+</p><a NAME="PipListDialog.closeEvent" ID="PipListDialog.closeEvent"></a>
+<h4>PipListDialog.closeEvent</h4>
+<b>closeEvent</b>(<i>e</i>)
+<p>
+        Protected slot implementing a close event handler.
+</p><dl>
+<dt><i>e</i></dt>
+<dd>
+close event (QCloseEvent)
+</dd>
+</dl><a NAME="PipListDialog.on_buttonBox_clicked" ID="PipListDialog.on_buttonBox_clicked"></a>
+<h4>PipListDialog.on_buttonBox_clicked</h4>
+<b>on_buttonBox_clicked</b>(<i>button</i>)
+<p>
+        Private slot called by a button of the button box clicked.
+</p><dl>
+<dt><i>button</i></dt>
+<dd>
+button that was clicked (QAbstractButton)
+</dd>
+</dl><a NAME="PipListDialog.on_installedFilesCheckBox_clicked" ID="PipListDialog.on_installedFilesCheckBox_clicked"></a>
+<h4>PipListDialog.on_installedFilesCheckBox_clicked</h4>
+<b>on_installedFilesCheckBox_clicked</b>(<i>checked</i>)
+<p>
+        Private slot to handle a change of the installed files information
+        checkbox.
+</p><dl>
+<dt><i>checked</i> (bool)</dt>
+<dd>
+state of the checkbox
+</dd>
+</dl><a NAME="PipListDialog.on_localCheckBox_clicked" ID="PipListDialog.on_localCheckBox_clicked"></a>
+<h4>PipListDialog.on_localCheckBox_clicked</h4>
+<b>on_localCheckBox_clicked</b>(<i>checked</i>)
+<p>
+        Private slot handling the switching of the local mode.
+</p><dl>
+<dt><i>checked</i></dt>
+<dd>
+state of the local check box (boolean)
+</dd>
+</dl><a NAME="PipListDialog.on_notRequiredCheckBox_clicked" ID="PipListDialog.on_notRequiredCheckBox_clicked"></a>
+<h4>PipListDialog.on_notRequiredCheckBox_clicked</h4>
+<b>on_notRequiredCheckBox_clicked</b>(<i>checked</i>)
+<p>
+        Private slot handling the switching of the 'not required' mode.
+</p><dl>
+<dt><i>checked</i></dt>
+<dd>
+state of the 'not required' check box (boolean)
+</dd>
+</dl><a NAME="PipListDialog.on_packageList_itemSelectionChanged" ID="PipListDialog.on_packageList_itemSelectionChanged"></a>
+<h4>PipListDialog.on_packageList_itemSelectionChanged</h4>
+<b>on_packageList_itemSelectionChanged</b>(<i></i>)
+<p>
+        Private slot handling the selection of a package.
+</p><a NAME="PipListDialog.on_pipComboBox_activated" ID="PipListDialog.on_pipComboBox_activated"></a>
+<h4>PipListDialog.on_pipComboBox_activated</h4>
+<b>on_pipComboBox_activated</b>(<i>txt</i>)
+<p>
+        Private slot handling the selection of a pip executable.
+</p><dl>
+<dt><i>txt</i></dt>
+<dd>
+path of the pip executable (string)
+</dd>
+</dl><a NAME="PipListDialog.on_verboseCheckBox_clicked" ID="PipListDialog.on_verboseCheckBox_clicked"></a>
+<h4>PipListDialog.on_verboseCheckBox_clicked</h4>
+<b>on_verboseCheckBox_clicked</b>(<i>checked</i>)
+<p>
+        Private slot to handle a change of the verbose package information
+        checkbox.
+</p><dl>
+<dt><i>checked</i> (bool)</dt>
+<dd>
+state of the checkbox
+</dd>
+</dl><a NAME="PipListDialog.start" ID="PipListDialog.start"></a>
+<h4>PipListDialog.start</h4>
+<b>start</b>(<i></i>)
+<p>
+        Public method to start the command.
+</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/Documentation/Source/eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackageDetailsDialog.html	Sat Dec 09 18:32:08 2017 +0100
@@ -0,0 +1,183 @@
+<!DOCTYPE html>
+<html><head>
+<title>eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackageDetailsDialog</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.UiExtensionPlugins.PipInterface.PipPackageDetailsDialog</h1>
+<p>
+Module implementing a dialog to show details about a package.
+</p>
+<h3>Global Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Classes</h3>
+<table>
+<tr>
+<td><a href="#PipPackageDetailsDialog">PipPackageDetailsDialog</a></td>
+<td>Class documentation goes here.</td>
+</tr>
+</table>
+<h3>Functions</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<hr /><hr />
+<a NAME="PipPackageDetailsDialog" ID="PipPackageDetailsDialog"></a>
+<h2>PipPackageDetailsDialog</h2>
+<p>
+    Class documentation goes here.
+</p>
+<h3>Derived from</h3>
+QDialog, Ui_PipPackageDetailsDialog
+<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="#PipPackageDetailsDialog.__init__">PipPackageDetailsDialog</a></td>
+<td>Constructor</td>
+</tr><tr>
+<td><a href="#PipPackageDetailsDialog.__formatSize">__formatSize</a></td>
+<td>Private slot to format the size.</td>
+</tr><tr>
+<td><a href="#PipPackageDetailsDialog.__formatUploadDate">__formatUploadDate</a></td>
+<td>Private method to format the upload date.</td>
+</tr><tr>
+<td><a href="#PipPackageDetailsDialog.__populateDetails">__populateDetails</a></td>
+<td>Private method to populate the details tab.</td>
+</tr><tr>
+<td><a href="#PipPackageDetailsDialog.__populateDownloadUrls">__populateDownloadUrls</a></td>
+<td>Private method to populate the download URLs tab.</td>
+</tr><tr>
+<td><a href="#PipPackageDetailsDialog.__populateRequiresProvides">__populateRequiresProvides</a></td>
+<td>Private method to populate the requires/provides tab.</td>
+</tr><tr>
+<td><a href="#PipPackageDetailsDialog.__sanitize">__sanitize</a></td>
+<td>Private method to clean-up the given text.</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<a NAME="PipPackageDetailsDialog.__init__" ID="PipPackageDetailsDialog.__init__"></a>
+<h4>PipPackageDetailsDialog (Constructor)</h4>
+<b>PipPackageDetailsDialog</b>(<i>detailsData, downloadsData, parent=None</i>)
+<p>
+        Constructor
+</p><dl>
+<dt><i>detailsData</i></dt>
+<dd>
+package details (dict)
+</dd><dt><i>downloadsData</i></dt>
+<dd>
+downloads information (dict)
+</dd><dt><i>parent</i></dt>
+<dd>
+reference to the parent widget (QWidget)
+</dd>
+</dl><a NAME="PipPackageDetailsDialog.__formatSize" ID="PipPackageDetailsDialog.__formatSize"></a>
+<h4>PipPackageDetailsDialog.__formatSize</h4>
+<b>__formatSize</b>(<i>size</i>)
+<p>
+        Private slot to format the size.
+</p><dl>
+<dt><i>size</i></dt>
+<dd>
+size to be formatted (integer)
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+formatted size (string)
+</dd>
+</dl><a NAME="PipPackageDetailsDialog.__formatUploadDate" ID="PipPackageDetailsDialog.__formatUploadDate"></a>
+<h4>PipPackageDetailsDialog.__formatUploadDate</h4>
+<b>__formatUploadDate</b>(<i>datetime</i>)
+<p>
+        Private method to format the upload date.
+</p><dl>
+<dt><i>datetime</i></dt>
+<dd>
+upload date and time (xmlrpc.DateTime)
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+formatted date string (string)
+</dd>
+</dl><a NAME="PipPackageDetailsDialog.__populateDetails" ID="PipPackageDetailsDialog.__populateDetails"></a>
+<h4>PipPackageDetailsDialog.__populateDetails</h4>
+<b>__populateDetails</b>(<i>detailsData</i>)
+<p>
+        Private method to populate the details tab.
+</p><dl>
+<dt><i>detailsData</i></dt>
+<dd>
+package details (dict)
+</dd>
+</dl><a NAME="PipPackageDetailsDialog.__populateDownloadUrls" ID="PipPackageDetailsDialog.__populateDownloadUrls"></a>
+<h4>PipPackageDetailsDialog.__populateDownloadUrls</h4>
+<b>__populateDownloadUrls</b>(<i>downloadsData</i>)
+<p>
+        Private method to populate the download URLs tab.
+</p><dl>
+<dt><i>downloadsData</i></dt>
+<dd>
+downloads information (dict)
+</dd>
+</dl><a NAME="PipPackageDetailsDialog.__populateRequiresProvides" ID="PipPackageDetailsDialog.__populateRequiresProvides"></a>
+<h4>PipPackageDetailsDialog.__populateRequiresProvides</h4>
+<b>__populateRequiresProvides</b>(<i>detailsData</i>)
+<p>
+        Private method to populate the requires/provides tab.
+</p><dl>
+<dt><i>detailsData</i></dt>
+<dd>
+package details (dict)
+</dd>
+</dl><a NAME="PipPackageDetailsDialog.__sanitize" ID="PipPackageDetailsDialog.__sanitize"></a>
+<h4>PipPackageDetailsDialog.__sanitize</h4>
+<b>__sanitize</b>(<i>text, forUrl=False</i>)
+<p>
+        Private method to clean-up the given text.
+</p><dl>
+<dt><i>text</i></dt>
+<dd>
+raw text (string)
+</dd><dt><i>forUrl</i></dt>
+<dd>
+flag indicating to sanitize an URL text (boolean)
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+processed text (string)
+</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/Documentation/Source/eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackagesInputDialog.html	Sat Dec 09 18:32:08 2017 +0100
@@ -0,0 +1,114 @@
+<!DOCTYPE html>
+<html><head>
+<title>eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackagesInputDialog</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.UiExtensionPlugins.PipInterface.PipPackagesInputDialog</h1>
+<p>
+Module implementing a dialog to enter package specifications.
+</p>
+<h3>Global Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Classes</h3>
+<table>
+<tr>
+<td><a href="#PipPackagesInputDialog">PipPackagesInputDialog</a></td>
+<td>Class documentation goes here.</td>
+</tr>
+</table>
+<h3>Functions</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<hr /><hr />
+<a NAME="PipPackagesInputDialog" ID="PipPackagesInputDialog"></a>
+<h2>PipPackagesInputDialog</h2>
+<p>
+    Class documentation goes here.
+</p>
+<h3>Derived from</h3>
+QDialog, Ui_PipPackagesInputDialog
+<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="#PipPackagesInputDialog.__init__">PipPackagesInputDialog</a></td>
+<td>Constructor</td>
+</tr><tr>
+<td><a href="#PipPackagesInputDialog.getData">getData</a></td>
+<td>Public method to get the entered data.</td>
+</tr><tr>
+<td><a href="#PipPackagesInputDialog.on_packagesEdit_textChanged">on_packagesEdit_textChanged</a></td>
+<td>Private slot handling entering package names.</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<a NAME="PipPackagesInputDialog.__init__" ID="PipPackagesInputDialog.__init__"></a>
+<h4>PipPackagesInputDialog (Constructor)</h4>
+<b>PipPackagesInputDialog</b>(<i>plugin, title, parent=None</i>)
+<p>
+        Constructor
+</p><dl>
+<dt><i>plugin</i></dt>
+<dd>
+reference to the plugin object (ToolPipPlugin)
+</dd><dt><i>title</i></dt>
+<dd>
+dialog title (string)
+</dd><dt><i>parent</i></dt>
+<dd>
+reference to the parent widget (QWidget)
+</dd>
+</dl><a NAME="PipPackagesInputDialog.getData" ID="PipPackagesInputDialog.getData"></a>
+<h4>PipPackagesInputDialog.getData</h4>
+<b>getData</b>(<i></i>)
+<p>
+        Public method to get the entered data.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+tuple with the pip command (string) and the list of
+            package specifications (list of string)
+</dd>
+</dl><a NAME="PipPackagesInputDialog.on_packagesEdit_textChanged" ID="PipPackagesInputDialog.on_packagesEdit_textChanged"></a>
+<h4>PipPackagesInputDialog.on_packagesEdit_textChanged</h4>
+<b>on_packagesEdit_textChanged</b>(<i>txt</i>)
+<p>
+        Private slot handling entering package names.
+</p><dl>
+<dt><i>txt</i></dt>
+<dd>
+name of the requirements file (string)
+</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/Documentation/Source/eric6.Plugins.UiExtensionPlugins.PipInterface.PipRequirementsSelectionDialog.html	Sat Dec 09 18:32:08 2017 +0100
@@ -0,0 +1,120 @@
+<!DOCTYPE html>
+<html><head>
+<title>eric6.Plugins.UiExtensionPlugins.PipInterface.PipRequirementsSelectionDialog</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.UiExtensionPlugins.PipInterface.PipRequirementsSelectionDialog</h1>
+<p>
+Module implementing a dialog to enter a requirements file.
+</p>
+<h3>Global Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Classes</h3>
+<table>
+<tr>
+<td><a href="#PipRequirementsSelectionDialog">PipRequirementsSelectionDialog</a></td>
+<td>Class implementing a dialog to enter a requirements file.</td>
+</tr>
+</table>
+<h3>Functions</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<hr /><hr />
+<a NAME="PipRequirementsSelectionDialog" ID="PipRequirementsSelectionDialog"></a>
+<h2>PipRequirementsSelectionDialog</h2>
+<p>
+    Class implementing a dialog to enter a requirements file.
+</p>
+<h3>Derived from</h3>
+QDialog, Ui_PipRequirementsSelectionDialog
+<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="#PipRequirementsSelectionDialog.__init__">PipRequirementsSelectionDialog</a></td>
+<td>Constructor</td>
+</tr><tr>
+<td><a href="#PipRequirementsSelectionDialog.getData">getData</a></td>
+<td>Public method to get the entered data.</td>
+</tr><tr>
+<td><a href="#PipRequirementsSelectionDialog.on_fileButton_clicked">on_fileButton_clicked</a></td>
+<td>Private slot to enter the requirements file via a file selection dialog.</td>
+</tr><tr>
+<td><a href="#PipRequirementsSelectionDialog.on_requirementsEdit_textChanged">on_requirementsEdit_textChanged</a></td>
+<td>Private slot handling entering the name of a requirements file.</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<a NAME="PipRequirementsSelectionDialog.__init__" ID="PipRequirementsSelectionDialog.__init__"></a>
+<h4>PipRequirementsSelectionDialog (Constructor)</h4>
+<b>PipRequirementsSelectionDialog</b>(<i>plugin, parent=None</i>)
+<p>
+        Constructor
+</p><dl>
+<dt><i>plugin</i></dt>
+<dd>
+reference to the plugin object (ToolPipPlugin)
+</dd><dt><i>parent</i></dt>
+<dd>
+reference to the parent widget (QWidget)
+</dd>
+</dl><a NAME="PipRequirementsSelectionDialog.getData" ID="PipRequirementsSelectionDialog.getData"></a>
+<h4>PipRequirementsSelectionDialog.getData</h4>
+<b>getData</b>(<i></i>)
+<p>
+        Public method to get the entered data.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+tuple with the pip command (string) and the name of the
+            requirements file (string)
+</dd>
+</dl><a NAME="PipRequirementsSelectionDialog.on_fileButton_clicked" ID="PipRequirementsSelectionDialog.on_fileButton_clicked"></a>
+<h4>PipRequirementsSelectionDialog.on_fileButton_clicked</h4>
+<b>on_fileButton_clicked</b>(<i></i>)
+<p>
+        Private slot to enter the requirements file via a file selection
+        dialog.
+</p><a NAME="PipRequirementsSelectionDialog.on_requirementsEdit_textChanged" ID="PipRequirementsSelectionDialog.on_requirementsEdit_textChanged"></a>
+<h4>PipRequirementsSelectionDialog.on_requirementsEdit_textChanged</h4>
+<b>on_requirementsEdit_textChanged</b>(<i>txt</i>)
+<p>
+        Private slot handling entering the name of a requirements file.
+</p><dl>
+<dt><i>txt</i></dt>
+<dd>
+name of the requirements file (string)
+</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/Documentation/Source/eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html	Sat Dec 09 18:32:08 2017 +0100
@@ -0,0 +1,312 @@
+<!DOCTYPE html>
+<html><head>
+<title>eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog</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.UiExtensionPlugins.PipInterface.PipSearchDialog</h1>
+<p>
+Module implementing a dialog to search PyPI.
+</p>
+<h3>Global Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Classes</h3>
+<table>
+<tr>
+<td><a href="#PipSearchDialog">PipSearchDialog</a></td>
+<td>Class implementing a dialog to search PyPI.</td>
+</tr>
+</table>
+<h3>Functions</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<hr /><hr />
+<a NAME="PipSearchDialog" ID="PipSearchDialog"></a>
+<h2>PipSearchDialog</h2>
+<p>
+    Class implementing a dialog to search PyPI.
+</p>
+<h3>Derived from</h3>
+QDialog, Ui_PipSearchDialog
+<h3>Class Attributes</h3>
+<table>
+<tr><td>Stopwords</td></tr><tr><td>VersionRole</td></tr>
+</table>
+<h3>Class Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#PipSearchDialog.__init__">PipSearchDialog</a></td>
+<td>Constructor</td>
+</tr><tr>
+<td><a href="#PipSearchDialog.__detailsError">__detailsError</a></td>
+<td>Private method handling a details error.</td>
+</tr><tr>
+<td><a href="#PipSearchDialog.__displayPackageDetails">__displayPackageDetails</a></td>
+<td>Private method to display the returned package details.</td>
+</tr><tr>
+<td><a href="#PipSearchDialog.__finish">__finish</a></td>
+<td>Private slot performing the finishing actions.</td>
+</tr><tr>
+<td><a href="#PipSearchDialog.__getPackageDownloadsData">__getPackageDownloadsData</a></td>
+<td>Private method to store the details data and get downloads information.</td>
+</tr><tr>
+<td><a href="#PipSearchDialog.__install">__install</a></td>
+<td>Private slot to install the selected packages.</td>
+</tr><tr>
+<td><a href="#PipSearchDialog.__processSearchResult">__processSearchResult</a></td>
+<td>Private method to process the search result data from PyPI.</td>
+</tr><tr>
+<td><a href="#PipSearchDialog.__score">__score</a></td>
+<td>Private method to calculate some score for a search result.</td>
+</tr><tr>
+<td><a href="#PipSearchDialog.__search">__search</a></td>
+<td>Private method to perform the search.</td>
+</tr><tr>
+<td><a href="#PipSearchDialog.__searchError">__searchError</a></td>
+<td>Private method handling a search error.</td>
+</tr><tr>
+<td><a href="#PipSearchDialog.__showDetails">__showDetails</a></td>
+<td>Private slot to show details about the selected package.</td>
+</tr><tr>
+<td><a href="#PipSearchDialog.__transformHits">__transformHits</a></td>
+<td>Private method to convert the list returned from pypi into a packages list.</td>
+</tr><tr>
+<td><a href="#PipSearchDialog.closeEvent">closeEvent</a></td>
+<td>Protected slot implementing a close event handler.</td>
+</tr><tr>
+<td><a href="#PipSearchDialog.on_buttonBox_clicked">on_buttonBox_clicked</a></td>
+<td>Private slot called by a button of the button box clicked.</td>
+</tr><tr>
+<td><a href="#PipSearchDialog.on_resultList_itemActivated">on_resultList_itemActivated</a></td>
+<td>Private slot reacting on an item activation.</td>
+</tr><tr>
+<td><a href="#PipSearchDialog.on_resultList_itemSelectionChanged">on_resultList_itemSelectionChanged</a></td>
+<td>Private slot handling changes of the selection.</td>
+</tr><tr>
+<td><a href="#PipSearchDialog.on_searchButton_clicked">on_searchButton_clicked</a></td>
+<td>Private slot handling a press of the search button.</td>
+</tr><tr>
+<td><a href="#PipSearchDialog.on_searchEdit_textChanged">on_searchEdit_textChanged</a></td>
+<td>Private slot handling a change of the search term.</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<a NAME="PipSearchDialog.__init__" ID="PipSearchDialog.__init__"></a>
+<h4>PipSearchDialog (Constructor)</h4>
+<b>PipSearchDialog</b>(<i>pip, plugin, parent=None</i>)
+<p>
+        Constructor
+</p><dl>
+<dt><i>pip</i></dt>
+<dd>
+reference to the master object (Pip)
+</dd><dt><i>plugin</i></dt>
+<dd>
+reference to the plugin object (ToolPipPlugin)
+</dd><dt><i>parent</i></dt>
+<dd>
+reference to the parent widget (QWidget)
+</dd>
+</dl><a NAME="PipSearchDialog.__detailsError" ID="PipSearchDialog.__detailsError"></a>
+<h4>PipSearchDialog.__detailsError</h4>
+<b>__detailsError</b>(<i>errorCode, errorString</i>)
+<p>
+        Private method handling a details error.
+</p><dl>
+<dt><i>errorCode</i></dt>
+<dd>
+code of the error (integer)
+</dd><dt><i>errorString</i></dt>
+<dd>
+error message (string)
+</dd>
+</dl><a NAME="PipSearchDialog.__displayPackageDetails" ID="PipSearchDialog.__displayPackageDetails"></a>
+<h4>PipSearchDialog.__displayPackageDetails</h4>
+<b>__displayPackageDetails</b>(<i>data</i>)
+<p>
+        Private method to display the returned package details.
+</p><dl>
+<dt><i>data</i></dt>
+<dd>
+result data (tuple) with downloads information in the first
+            element
+</dd>
+</dl><a NAME="PipSearchDialog.__finish" ID="PipSearchDialog.__finish"></a>
+<h4>PipSearchDialog.__finish</h4>
+<b>__finish</b>(<i></i>)
+<p>
+        Private slot performing the finishing actions.
+</p><a NAME="PipSearchDialog.__getPackageDownloadsData" ID="PipSearchDialog.__getPackageDownloadsData"></a>
+<h4>PipSearchDialog.__getPackageDownloadsData</h4>
+<b>__getPackageDownloadsData</b>(<i>packageVersion, data</i>)
+<p>
+        Private method to store the details data and get downloads
+        information.
+</p><dl>
+<dt><i>packageVersion</i> (str)</dt>
+<dd>
+version info
+</dd><dt><i>data</i> (tuple)</dt>
+<dd>
+result data with package details in the first
+            element
+</dd>
+</dl><a NAME="PipSearchDialog.__install" ID="PipSearchDialog.__install"></a>
+<h4>PipSearchDialog.__install</h4>
+<b>__install</b>(<i></i>)
+<p>
+        Private slot to install the selected packages.
+</p><a NAME="PipSearchDialog.__processSearchResult" ID="PipSearchDialog.__processSearchResult"></a>
+<h4>PipSearchDialog.__processSearchResult</h4>
+<b>__processSearchResult</b>(<i>data</i>)
+<p>
+        Private method to process the search result data from PyPI.
+</p><dl>
+<dt><i>data</i></dt>
+<dd>
+result data (tuple) with hits in the first element
+</dd>
+</dl><a NAME="PipSearchDialog.__score" ID="PipSearchDialog.__score"></a>
+<h4>PipSearchDialog.__score</h4>
+<b>__score</b>(<i>name, summary</i>)
+<p>
+        Private method to calculate some score for a search result.
+</p><dl>
+<dt><i>name</i> (str)</dt>
+<dd>
+name of the returned package
+</dd><dt><i>summary</i> (str)</dt>
+<dd>
+summary text for the package
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+score value
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+int
+</dd>
+</dl><a NAME="PipSearchDialog.__search" ID="PipSearchDialog.__search"></a>
+<h4>PipSearchDialog.__search</h4>
+<b>__search</b>(<i></i>)
+<p>
+        Private method to perform the search.
+</p><a NAME="PipSearchDialog.__searchError" ID="PipSearchDialog.__searchError"></a>
+<h4>PipSearchDialog.__searchError</h4>
+<b>__searchError</b>(<i>errorCode, errorString</i>)
+<p>
+        Private method handling a search error.
+</p><dl>
+<dt><i>errorCode</i></dt>
+<dd>
+code of the error (integer)
+</dd><dt><i>errorString</i></dt>
+<dd>
+error message (string)
+</dd>
+</dl><a NAME="PipSearchDialog.__showDetails" ID="PipSearchDialog.__showDetails"></a>
+<h4>PipSearchDialog.__showDetails</h4>
+<b>__showDetails</b>(<i></i>)
+<p>
+        Private slot to show details about the selected package.
+</p><a NAME="PipSearchDialog.__transformHits" ID="PipSearchDialog.__transformHits"></a>
+<h4>PipSearchDialog.__transformHits</h4>
+<b>__transformHits</b>(<i>hits</i>)
+<p>
+        Private method to convert the list returned from pypi into a
+        packages list.
+</p><dl>
+<dt><i>hits</i></dt>
+<dd>
+list returned from pypi (list of dict)
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+list of packages (list of dict)
+</dd>
+</dl><a NAME="PipSearchDialog.closeEvent" ID="PipSearchDialog.closeEvent"></a>
+<h4>PipSearchDialog.closeEvent</h4>
+<b>closeEvent</b>(<i>e</i>)
+<p>
+        Protected slot implementing a close event handler.
+</p><dl>
+<dt><i>e</i></dt>
+<dd>
+close event (QCloseEvent)
+</dd>
+</dl><a NAME="PipSearchDialog.on_buttonBox_clicked" ID="PipSearchDialog.on_buttonBox_clicked"></a>
+<h4>PipSearchDialog.on_buttonBox_clicked</h4>
+<b>on_buttonBox_clicked</b>(<i>button</i>)
+<p>
+        Private slot called by a button of the button box clicked.
+</p><dl>
+<dt><i>button</i></dt>
+<dd>
+button that was clicked (QAbstractButton)
+</dd>
+</dl><a NAME="PipSearchDialog.on_resultList_itemActivated" ID="PipSearchDialog.on_resultList_itemActivated"></a>
+<h4>PipSearchDialog.on_resultList_itemActivated</h4>
+<b>on_resultList_itemActivated</b>(<i>item, column</i>)
+<p>
+        Private slot reacting on an item activation.
+</p><dl>
+<dt><i>item</i></dt>
+<dd>
+reference to the activated item (QTreeWidgetItem)
+</dd><dt><i>column</i></dt>
+<dd>
+activated column (integer)
+</dd>
+</dl><a NAME="PipSearchDialog.on_resultList_itemSelectionChanged" ID="PipSearchDialog.on_resultList_itemSelectionChanged"></a>
+<h4>PipSearchDialog.on_resultList_itemSelectionChanged</h4>
+<b>on_resultList_itemSelectionChanged</b>(<i></i>)
+<p>
+        Private slot handling changes of the selection.
+</p><a NAME="PipSearchDialog.on_searchButton_clicked" ID="PipSearchDialog.on_searchButton_clicked"></a>
+<h4>PipSearchDialog.on_searchButton_clicked</h4>
+<b>on_searchButton_clicked</b>(<i></i>)
+<p>
+        Private slot handling a press of the search button.
+</p><a NAME="PipSearchDialog.on_searchEdit_textChanged" ID="PipSearchDialog.on_searchEdit_textChanged"></a>
+<h4>PipSearchDialog.on_searchEdit_textChanged</h4>
+<b>on_searchEdit_textChanged</b>(<i>txt</i>)
+<p>
+        Private slot handling a change of the search term.
+</p><dl>
+<dt><i>txt</i></dt>
+<dd>
+search term (string)
+</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/Documentation/Source/index-eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.html	Sat Dec 09 18:32:08 2017 +0100
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html><head>
+<title>eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage</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.UiExtensionPlugins.PipInterface.ConfigurationPage</h1>
+<p>
+Package implementing the configuration page.
+</p>
+
+
+<h3>Modules</h3>
+<table>
+<tr>
+<td><a href="eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.PipPage.html">PipPage</a></td>
+<td>Package implementing the configuration page.</td>
+</tr>
+</table>
+</body></html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Documentation/Source/index-eric6.Plugins.UiExtensionPlugins.PipInterface.html	Sat Dec 09 18:32:08 2017 +0100
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<html><head>
+<title>eric6.Plugins.UiExtensionPlugins.PipInterface</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.UiExtensionPlugins.PipInterface</h1>
+<p>
+Package implementing the various pip dialogs and data.
+</p>
+
+<h3>Packages</h3>
+<table>
+<tr>
+<td><a href="index-eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.html">ConfigurationPage</a></td>
+<td>Package implementing the configuration page.</td>
+</tr>
+</table>
+
+<h3>Modules</h3>
+<table>
+<tr>
+<td><a href="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html">Pip</a></td>
+<td>Package implementing the pip GUI logic.</td>
+</tr><tr>
+<td><a href="eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.html">PipDialog</a></td>
+<td>Module implementing a dialog showing the output of a pip command.</td>
+</tr><tr>
+<td><a href="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html">PipFreezeDialog</a></td>
+<td>Module implementing a dialog to generate a requirements file.</td>
+</tr><tr>
+<td><a href="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html">PipListDialog</a></td>
+<td>Module implementing a dialog to list installed packages.</td>
+</tr><tr>
+<td><a href="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackageDetailsDialog.html">PipPackageDetailsDialog</a></td>
+<td>Module implementing a dialog to show details about a package.</td>
+</tr><tr>
+<td><a href="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackagesInputDialog.html">PipPackagesInputDialog</a></td>
+<td>Module implementing a dialog to enter package specifications.</td>
+</tr><tr>
+<td><a href="eric6.Plugins.UiExtensionPlugins.PipInterface.PipRequirementsSelectionDialog.html">PipRequirementsSelectionDialog</a></td>
+<td>Module implementing a dialog to enter a requirements file.</td>
+</tr><tr>
+<td><a href="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html">PipSearchDialog</a></td>
+<td>Module implementing a dialog to search PyPI.</td>
+</tr>
+</table>
+</body></html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Documentation/Source/index-eric6.Plugins.UiExtensionPlugins.html	Sat Dec 09 18:32:08 2017 +0100
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html><head>
+<title>eric6.Plugins.UiExtensionPlugins</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.UiExtensionPlugins</h1>
+<p>
+Package containing the various interface extension plug-ins.
+</p>
+
+<h3>Packages</h3>
+<table>
+<tr>
+<td><a href="index-eric6.Plugins.UiExtensionPlugins.PipInterface.html">PipInterface</a></td>
+<td>Package implementing the various pip dialogs and data.</td>
+</tr>
+</table>
+
+</body></html>
\ No newline at end of file
--- a/Documentation/Source/index-eric6.Plugins.html	Sat Dec 09 17:43:24 2017 +0100
+++ b/Documentation/Source/index-eric6.Plugins.html	Sat Dec 09 18:32:08 2017 +0100
@@ -36,6 +36,9 @@
 <td><a href="index-eric6.Plugins.DocumentationPlugins.html">DocumentationPlugins</a></td>
 <td>Package containing the various core documentation tool plugins.</td>
 </tr><tr>
+<td><a href="index-eric6.Plugins.UiExtensionPlugins.html">UiExtensionPlugins</a></td>
+<td>Package containing the various interface extension plug-ins.</td>
+</tr><tr>
 <td><a href="index-eric6.Plugins.VcsPlugins.html">VcsPlugins</a></td>
 <td>Package containing the various version control system plugins.</td>
 </tr><tr>
@@ -62,6 +65,9 @@
 <td><a href="eric6.Plugins.PluginEricdoc.html">PluginEricdoc</a></td>
 <td>Module implementing the Ericdoc plugin.</td>
 </tr><tr>
+<td><a href="eric6.Plugins.PluginPipInterface.html">PluginPipInterface</a></td>
+<td>Module implementing the pip interface plug-in.</td>
+</tr><tr>
 <td><a href="eric6.Plugins.PluginSyntaxChecker.html">PluginSyntaxChecker</a></td>
 <td>Module implementing the Syntax Checker plugin.</td>
 </tr><tr>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Plugins/PluginPipInterface.py	Sat Dec 09 18:32:08 2017 +0100
@@ -0,0 +1,389 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2015 - 2017 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing the pip interface plug-in.
+"""
+
+from __future__ import unicode_literals
+
+import os
+import platform
+
+from PyQt5.QtCore import pyqtSignal, QObject, QCoreApplication
+
+from E5Gui.E5Application import e5App
+
+import Preferences
+import Utilities
+import UI.Info
+
+# Start-Of-Header
+name = "pip Interface Plug-in"
+author = "Detlev Offenbach <detlev@die-offenbachs.de>"
+autoactivate = True
+deactivateable = True
+version = UI.Info.VersionOnly
+className = "PipInterfacePlugin"
+packageName = "__core__"
+shortDescription = "Plug-in implementing a simple GUI for the pip command."
+longDescription = (
+    """Plug-in implementing a simple GUI for the pip command."""
+)
+needsRestart = False
+pyqtApi = 2
+python2Compatible = True
+# End-Of-Header
+
+error = ""
+
+pipPluginObject = None
+
+
+def exeDisplayDataList():
+    """
+    Module function to support the display of some executable info.
+    
+    @return list of dictionaries containing the data to query the presence of
+        the executable
+    """
+    global pipPluginObject
+    
+    dataList = []
+    data = {
+        "programEntry": True,
+        "header": QCoreApplication.translate(
+            "PipInterfacePlugin", "Package Management - pip"),
+        "exe": "dummyExe",
+        "versionCommand": "--version",
+        "versionStartsWith": "dummyExe",
+        "versionPosition": 1,
+        "version": "",
+        "versionCleanup": None,
+    }
+    if pipPluginObject is not None:
+        executables = pipPluginObject.getPreferences("PipExecutables")
+        if not executables:
+            executables = ["pip3", "pip2", "pip"]
+        for exePath in executables:
+            data["exe"] = exePath
+            data["versionStartsWith"] = "pip"
+            dataList.append(data.copy())
+    return dataList
+
+
+def createPipPage(configDlg):
+    """
+    Module function to create the pip configuration page.
+    
+    @param configDlg reference to the configuration dialog
+    @return reference to the configuration page
+    """
+    global pipPluginObject
+    from UiExtensionPlugins.PipInterface.ConfigurationPage.PipPage import \
+        PipPage
+    page = PipPage(pipPluginObject)
+    return page
+    
+
+def getConfigData():
+    """
+    Module function returning data as required by the configuration dialog.
+    
+    @return dictionary containing the relevant data
+    """
+    return {
+        "pipPage": [
+            QCoreApplication.translate(
+                "PipInterfacePlugin", "Python Package Management"),
+            "preferences-python.png",
+            createPipPage, None, None
+        ],
+    }
+
+
+def prepareUninstall():
+    """
+    Module function to prepare for an un-installation.
+    """
+    Preferences.Prefs.settings.remove(PipInterfacePlugin.PreferencesKey)
+
+
+def _findDefaultExecutables(majorVersion):
+    """
+    Restricted function to determine the name and path of the executables.
+    
+    @param majorVersion major python version of the executables (int)
+    @return path names of the executables (list of string)
+    """
+    # Determine Python Version
+    if majorVersion == 3:
+        minorVersions = range(10)
+    elif majorVersion == 2:
+        minorVersions = range(6, 8)
+    else:
+        return []
+    
+    executables = set()
+    if Utilities.isWindowsPlatform():
+        #
+        # Windows
+        #
+        try:
+            import winreg
+        except ImportError:
+            import _winreg as winreg    # __IGNORE_WARNING__
+        
+        def getExePath(branch, access, versionStr):
+            exes = []
+            try:
+                software = winreg.OpenKey(branch, 'Software', 0, access)
+                python = winreg.OpenKey(software, 'Python', 0, access)
+                pcore = winreg.OpenKey(python, 'PythonCore', 0, access)
+                version = winreg.OpenKey(pcore, versionStr, 0, access)
+                installpath = winreg.QueryValue(version, 'InstallPath')
+                exe = os.path.join(installpath, 'Scripts', 'pip.exe')
+                if os.access(exe, os.X_OK):
+                    exes.append(exe)
+            except (WindowsError, OSError):   # __IGNORE_WARNING__
+                pass
+            return exes
+        
+        for minorVersion in minorVersions:
+            versionStr = '{0}.{1}'.format(majorVersion, minorVersion)
+            exePaths = getExePath(
+                winreg.HKEY_CURRENT_USER,
+                winreg.KEY_WOW64_32KEY | winreg.KEY_READ, versionStr)
+            if exePaths:
+                for exePath in exePaths:
+                    executables.add(exePath)
+            
+            exePaths = getExePath(
+                winreg.HKEY_LOCAL_MACHINE,
+                winreg.KEY_WOW64_32KEY | winreg.KEY_READ, versionStr)
+            if exePaths:
+                for exePath in exePaths:
+                    executables.add(exePath)
+            
+            # Even on Intel 64-bit machines it's 'AMD64'
+            if platform.machine() == 'AMD64':
+                exePaths = getExePath(
+                    winreg.HKEY_CURRENT_USER,
+                    winreg.KEY_WOW64_64KEY | winreg.KEY_READ, versionStr)
+                if exePaths:
+                    for exePath in exePaths:
+                        executables.add(exePath)
+                
+                exePath = getExePath(
+                    winreg.HKEY_LOCAL_MACHINE,
+                    winreg.KEY_WOW64_64KEY | winreg.KEY_READ, versionStr)
+                if exePaths:
+                    for exePath in exePaths:
+                        executables.add(exePath)
+    else:
+        #
+        # Linux, Unix ...
+        pipScript = 'pip'
+        scriptSuffixes = ["",
+                          "{0}".format(majorVersion),
+                          "-{0}".format(majorVersion),
+                          ]
+        for minorVersion in minorVersions:
+            scriptSuffixes.append(
+                "{0}.{1}".format(majorVersion, minorVersion))
+            scriptSuffixes.append(
+                "-{0}.{1}".format(majorVersion, minorVersion))
+        # There could be multiple pip executables in the path
+        # e.g. for different python variants
+        path = Utilities.getEnvironmentEntry('PATH')
+        # environment variable not defined
+        if path is None:
+            return []
+        
+        # step 1: determine possible candidates
+        exes = []
+        dirs = path.split(os.pathsep)
+        for directory in dirs:
+            for suffix in scriptSuffixes:
+                exe = os.path.join(directory, pipScript + suffix)
+                if os.access(exe, os.X_OK):
+                    exes.append(exe)
+        
+        # step 2: determine the Python variant
+        if Utilities.isMacPlatform():
+            checkStrings = ["Python.framework/Versions/3".lower(),
+                            "python3"]
+        else:
+            checkStrings = ["python3"]
+        
+        _exePy2 = set()
+        _exePy3 = set()
+        for exe in exes:
+            try:
+                f = open(exe, "r")
+                line0 = f.readline()
+                for checkStr in checkStrings:
+                    if checkStr in line0.lower():
+                        _exePy3.add(exe)
+                        break
+                else:
+                    _exePy2.add(exe)
+            finally:
+                f.close()
+        
+        executables = _exePy3 if majorVersion == 3 else _exePy2
+    
+    return list(executables)
+
+
+class PipInterfacePlugin(QObject):
+    """
+    Class implementing the pip interface plug-in.
+    
+    @signal currentPipChanged(exe) emitted to signal a change of the current
+        pip executable
+    """
+    PreferencesKey = "PipPlugin"
+    
+    currentPipChanged = pyqtSignal(str)
+    
+    def __init__(self, ui):
+        """
+        Constructor
+        
+        @param ui reference to the user interface object (UI.UserInterface)
+        """
+        super(PipInterfacePlugin, self).__init__(ui)
+        self.__ui = ui
+        self.__initialize()
+        
+        self.__defaults = {
+            "PipExecutables": [],
+            "CurrentPipExecutable": "",
+            "PipSearchIndex": "",           # used by the search command
+        }
+    
+    def __initialize(self):
+        """
+        Private slot to (re)initialize the plugin.
+        """
+        self.__object = None
+        
+        self.__mainAct = None
+        self.__mainMenu = None
+    
+    def activate(self):
+        """
+        Public method to activate this plugin.
+        
+        @return tuple of None and activation status (boolean)
+        """
+        global error
+        error = ""     # clear previous error
+        
+        global pipPluginObject
+        pipPluginObject = self
+        
+        from UiExtensionPlugins.PipInterface.Pip import Pip
+        self.__object = Pip(self, self.__ui)
+        self.__object.initActions()
+        e5App().registerPluginObject("PipGui", self.__object)
+        
+        menu = self.__ui.getMenu("extras")
+        self.__mainMenu = self.__object.initMenu()
+        self.__mainAct = menu.addMenu(self.__mainMenu)
+        
+        if self.getPreferences("PipExecutables"):
+            # remove all executables, that don't exist anymore
+            executables = []
+            for executable in self.getPreferences("PipExecutables"):
+                if os.access(executable, os.X_OK):
+                    executables.append(executable)
+            self.setPreferences("PipExecutables", executables)
+            
+            current = self.getPreferences("CurrentPipExecutable")
+            if current not in executables:
+                current = ""
+                self.setPreferences("CurrentPipExecutable", current)
+        else:
+            # load the list with default executables
+            self.setPreferences("PipExecutables",
+                                self.getDefaultPipExecutables())
+        
+        return None, True
+    
+    def deactivate(self):
+        """
+        Public method to deactivate this plugin.
+        """
+        e5App().unregisterPluginObject("PipGui")
+        
+        menu = self.__ui.getMenu("extras")
+        menu.removeAction(self.__mainAct)
+        self.__mainAct = None
+        
+        self.__initialize()
+    
+    def getPreferences(self, key):
+        """
+        Public method to retrieve the various refactoring settings.
+        
+        @param key the key of the value to get
+        @return the requested refactoring setting
+        """
+        if key in ["PipExecutables"]:
+            return Preferences.toList(Preferences.Prefs.settings.value(
+                self.PreferencesKey + "/" + key, self.__defaults[key]))
+        else:
+            return Preferences.Prefs.settings.value(
+                self.PreferencesKey + "/" + key, self.__defaults[key])
+    
+    def setPreferences(self, key, value):
+        """
+        Public method to store the various refactoring settings.
+        
+        @param key the key of the setting to be set (string)
+        @param value the value to be set
+        """
+        Preferences.Prefs.settings.setValue(
+            self.PreferencesKey + "/" + key, value)
+        
+        if key == "CurrentPipExecutable":
+                self.currentPipChanged.emit(value)
+    
+    def getMenu(self, name):
+        """
+        Public method to get a reference to the requested menu.
+        
+        @param name name of the menu (string)
+        @return reference to the menu (QMenu) or None, if no
+            menu with the given name exists
+        """
+        if self.__object is not None:
+            return self.__object.getMenu(name)
+        else:
+            return None
+    
+    def getMenuNames(self):
+        """
+        Public method to get the names of all menus.
+        
+        @return menu names (list of string)
+        """
+        if self.__object is not None:
+            return list(self.__menus.keys())
+        else:
+            return []
+    
+    def getDefaultPipExecutables(self):
+        """
+        Public method to get the default list of pip executables.
+        
+        @return list of pip executables (list of string)
+        """
+        return _findDefaultExecutables(2) + _findDefaultExecutables(3)
+
+#
+# eflag: noqa = M801
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Plugins/UiExtensionPlugins/PipInterface/ConfigurationPage/PipPage.py	Sat Dec 09 18:32:08 2017 +0100
@@ -0,0 +1,110 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2015 - 2017 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Package implementing the configuration page.
+"""
+
+from __future__ import unicode_literals
+
+import os
+
+from PyQt5.QtCore import pyqtSlot, Qt, QSortFilterProxyModel, QStringListModel
+
+from E5Gui import E5FileDialog
+
+from Preferences.ConfigurationPages.ConfigurationPageBase import \
+    ConfigurationPageBase
+from .Ui_PipPage import Ui_PipPage
+
+from .. import DefaultIndexUrl
+
+import Utilities
+
+
+class PipPage(ConfigurationPageBase, Ui_PipPage):
+    """
+    Class implementing the configuration page.
+    """
+    def __init__(self, plugin):
+        """
+        Constructor
+        
+        @param plugin reference to the plugin object
+        """
+        super(PipPage, self).__init__()
+        self.setupUi(self)
+        self.setObjectName("PipPage")
+        
+        self.__plugin = plugin
+        
+        self.__model = QStringListModel(self)
+        self.__proxyModel = QSortFilterProxyModel(self)
+        self.__proxyModel.setFilterCaseSensitivity(Qt.CaseInsensitive)
+        self.__proxyModel.setSourceModel(self.__model)
+        self.stringList.setModel(self.__proxyModel)
+        
+        self.removeButton.clicked.connect(self.stringList.removeSelected)
+        self.removeAllButton.clicked.connect(self.stringList.removeAll)
+        
+        self.indexLabel.setText(self.tr(
+            '<b>Note:</b> Leave empty to use the default index URL ('
+            '<a href="{0}">{0}</a>).')
+            .format(DefaultIndexUrl))
+        
+        # set initial values
+        self.__model.setStringList(
+            self.__plugin.getPreferences("PipExecutables"))
+        self.__model.sort(0)
+        self.indexEdit.setText(self.__plugin.getPreferences("PipSearchIndex"))
+    
+    @pyqtSlot()
+    def on_addButton_clicked(self):
+        """
+        Private slot used to add an executable to the list.
+        """
+        executable = E5FileDialog.getOpenFileName(
+            self,
+            self.tr("Add pip executable"),
+            os.path.expanduser("~"),
+            "")
+        executable = Utilities.toNativeSeparators(executable)
+        if executable != "" and executable not in self.__model.stringList():
+            self.__model.insertRow(self.__model.rowCount())
+            self.__model.setData(
+                self.__model.index(self.__model.rowCount() - 1), executable)
+            self.__model.sort(0)
+    
+    @pyqtSlot()
+    def on_defaultListButton_clicked(self):
+        """
+        Private slot to load the default list of pip executables.
+        """
+        self.stringList.removeAll()
+        defaults = self.__plugin.getDefaultPipExecutables()
+        for executable in defaults:
+            self.__model.insertRow(self.__model.rowCount())
+            self.__model.setData(
+                self.__model.index(self.__model.rowCount() - 1), executable)
+        self.__model.sort(0)
+    
+    def save(self):
+        """
+        Public slot to save the pip configuration.
+        """
+        executables = self.__model.stringList()[:]
+        self.__plugin.setPreferences(
+            "PipExecutables", executables)
+        self.__plugin.setPreferences(
+            "PipSearchIndex", self.indexEdit.text().strip())
+        if executables:
+            if self.__plugin.getPreferences("CurrentPipExecutable") \
+                    not in executables:
+                self.__plugin.setPreferences(
+                    "CurrentPipExecutable", "")
+        else:
+            # reset the current executable if none have been configured
+            self.__plugin.setPreferences(
+                "CurrentPipExecutable", "")
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Plugins/UiExtensionPlugins/PipInterface/ConfigurationPage/PipPage.ui	Sat Dec 09 18:32:08 2017 +0100
@@ -0,0 +1,173 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>PipPage</class>
+ <widget class="QWidget" name="PipPage">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>602</width>
+    <height>389</height>
+   </rect>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout_2">
+   <item>
+    <widget class="QLabel" name="headerLabel">
+     <property name="text">
+      <string>&lt;b&gt;Configure pip&lt;/b&gt;</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="Line" name="line9_3">
+     <property name="frameShape">
+      <enum>QFrame::HLine</enum>
+     </property>
+     <property name="frameShadow">
+      <enum>QFrame::Sunken</enum>
+     </property>
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QGroupBox" name="groupBox_2">
+     <property name="title">
+      <string>Index URL</string>
+     </property>
+     <layout class="QVBoxLayout" name="verticalLayout">
+      <item>
+       <widget class="QLineEdit" name="indexEdit">
+        <property name="toolTip">
+         <string>Enter the URL of the package index or leave empty to use the default</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QLabel" name="indexLabel">
+        <property name="text">
+         <string/>
+        </property>
+        <property name="openExternalLinks">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item>
+    <widget class="QGroupBox" name="groupBox">
+     <property name="title">
+      <string>pip Executables</string>
+     </property>
+     <layout class="QGridLayout" name="gridLayout">
+      <item row="0" column="0" rowspan="7">
+       <widget class="E5ListView" name="stringList">
+        <property name="alternatingRowColors">
+         <bool>true</bool>
+        </property>
+        <property name="selectionMode">
+         <enum>QAbstractItemView::ExtendedSelection</enum>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="1">
+       <widget class="QPushButton" name="addButton">
+        <property name="toolTip">
+         <string>Press to add an entry</string>
+        </property>
+        <property name="text">
+         <string>&amp;Add...</string>
+        </property>
+        <property name="autoDefault">
+         <bool>false</bool>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="1">
+       <widget class="Line" name="line_3">
+        <property name="orientation">
+         <enum>Qt::Horizontal</enum>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="1">
+       <widget class="QPushButton" name="removeButton">
+        <property name="toolTip">
+         <string>Press to remove the selected entries</string>
+        </property>
+        <property name="text">
+         <string>&amp;Remove</string>
+        </property>
+        <property name="autoDefault">
+         <bool>false</bool>
+        </property>
+       </widget>
+      </item>
+      <item row="3" column="1">
+       <widget class="QPushButton" name="removeAllButton">
+        <property name="toolTip">
+         <string>Press to remove all entries</string>
+        </property>
+        <property name="text">
+         <string>R&amp;emove All</string>
+        </property>
+        <property name="autoDefault">
+         <bool>false</bool>
+        </property>
+       </widget>
+      </item>
+      <item row="4" column="1">
+       <widget class="Line" name="line_4">
+        <property name="orientation">
+         <enum>Qt::Horizontal</enum>
+        </property>
+       </widget>
+      </item>
+      <item row="5" column="1">
+       <widget class="QPushButton" name="defaultListButton">
+        <property name="toolTip">
+         <string>Press to load the default list</string>
+        </property>
+        <property name="text">
+         <string>&amp;Default</string>
+        </property>
+       </widget>
+      </item>
+      <item row="6" column="1">
+       <spacer name="verticalSpacer_3">
+        <property name="orientation">
+         <enum>Qt::Vertical</enum>
+        </property>
+        <property name="sizeHint" stdset="0">
+         <size>
+          <width>20</width>
+          <height>196</height>
+         </size>
+        </property>
+       </spacer>
+      </item>
+     </layout>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <customwidgets>
+  <customwidget>
+   <class>E5ListView</class>
+   <extends>QListView</extends>
+   <header>E5Gui/E5ListView.h</header>
+  </customwidget>
+ </customwidgets>
+ <tabstops>
+  <tabstop>indexEdit</tabstop>
+  <tabstop>stringList</tabstop>
+  <tabstop>addButton</tabstop>
+  <tabstop>removeButton</tabstop>
+  <tabstop>removeAllButton</tabstop>
+ </tabstops>
+ <resources/>
+ <connections/>
+</ui>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Plugins/UiExtensionPlugins/PipInterface/ConfigurationPage/__init__.py	Sat Dec 09 18:32:08 2017 +0100
@@ -0,0 +1,8 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2015 - 2017 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Package implementing the configuration page.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Plugins/UiExtensionPlugins/PipInterface/Pip.py	Sat Dec 09 18:32:08 2017 +0100
@@ -0,0 +1,1008 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2015 - 2017 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Package implementing the pip GUI logic.
+"""
+
+from __future__ import unicode_literals
+try:
+    str = unicode       # __IGNORE_EXCEPTION__
+except NameError:
+    pass
+
+import os
+import re
+import sys
+
+from PyQt5.QtCore import pyqtSlot, QObject, QProcess, QDir
+from PyQt5.QtWidgets import QMenu, QInputDialog, QDialog
+
+from E5Gui import E5MessageBox, E5FileDialog
+from E5Gui.E5Action import E5Action
+from E5Gui.E5Application import e5App
+
+from .PipDialog import PipDialog
+
+import Preferences
+import Globals
+
+
+class Pip(QObject):
+    """
+    Class implementing the pip GUI logic.
+    """
+    def __init__(self, plugin, parent=None):
+        """
+        Constructor
+        
+        @param plugin reference to the plugin object
+        @param parent parent (QObject)
+        """
+        super(Pip, self).__init__(parent)
+        
+        self.__plugin = plugin
+        self.__ui = parent
+        
+        self.__menus = {}   # dictionary with references to menus
+        
+        self.__plugin.currentPipChanged.connect(self.__handleTearOffMenu)
+    
+    def initActions(self):
+        """
+        Public method to define the Django actions.
+        """
+        self.actions = []
+    
+        self.selectExecutableAct = E5Action(
+            self.tr('pip Executable'),
+            self.tr('pip &Executable'),
+            0, 0,
+            self, 'pip_select_executable')
+        self.selectExecutableAct.setStatusTip(self.tr(
+            'Selects the pip executable to be used'))
+        self.selectExecutableAct.setWhatsThis(self.tr(
+            """<b>pip Executable</b>"""
+            """<p>This selects the pip executable to be used. Multiple"""
+            """ executables can be pre-configured via the configuration"""
+            """ dialog.</p>"""
+        ))
+        self.selectExecutableAct.triggered.connect(self.__selectPipExecutable)
+        self.actions.append(self.selectExecutableAct)
+        
+        ##############################################
+        ## Actions for listing packages
+        ##############################################
+        
+        self.listPackagesAct = E5Action(
+            self.tr('List Installed Packages'),
+            self.tr('&List Installed Packages...'),
+            0, 0,
+            self, 'pip_list_packages')
+        self.listPackagesAct.setStatusTip(self.tr(
+            'List all installed packages with versions'))
+        self.listPackagesAct.setWhatsThis(self.tr(
+            """<b>List Installed Packages</b>"""
+            """<p>This lists all the installed packages together"""
+            """ with their versions.</p>"""
+        ))
+        self.listPackagesAct.triggered.connect(self.__listPackages)
+        self.actions.append(self.listPackagesAct)
+        
+        self.listUptodatePackagesAct = E5Action(
+            self.tr('List Up-to-date Packages'),
+            self.tr('List Up-to-&date Packages...'),
+            0, 0,
+            self, 'pip_list_uptodate_packages')
+        self.listUptodatePackagesAct.setStatusTip(self.tr(
+            'List all installed, up-to-date packages with versions'))
+        self.listUptodatePackagesAct.setWhatsThis(self.tr(
+            """<b>List Up-to-date Packages</b>"""
+            """<p>This lists all the installed, up-to-date packages together"""
+            """ with their versions.</p>"""
+        ))
+        self.listUptodatePackagesAct.triggered.connect(
+            self.__listUptodatePackages)
+        self.actions.append(self.listUptodatePackagesAct)
+        
+        self.listOutdatedPackagesAct = E5Action(
+            self.tr('List Outdated Packages'),
+            self.tr('List &Outdated Packages...'),
+            0, 0,
+            self, 'pip_list_outdated_packages')
+        self.listOutdatedPackagesAct.setStatusTip(self.tr(
+            'List all installed, outdated packages with versions'))
+        self.listOutdatedPackagesAct.setWhatsThis(self.tr(
+            """<b>List Up-to-date Packages</b>"""
+            """<p>This lists all the installed, outdated packages together"""
+            """ with their current and latest versions.</p>"""
+        ))
+        self.listOutdatedPackagesAct.triggered.connect(
+            self.__listOutdatedPackages)
+        self.actions.append(self.listOutdatedPackagesAct)
+        
+        ##############################################
+        ## Actions for installing packages
+        ##############################################
+        
+        self.installPackagesAct = E5Action(
+            self.tr('Install Packages'),
+            self.tr('&Install Packages'),
+            0, 0,
+            self, 'pip_install_packages')
+        self.installPackagesAct.setStatusTip(self.tr(
+            'Install packages according to user input'))
+        self.installPackagesAct.setWhatsThis(self.tr(
+            """<b>Install Packages</b>"""
+            """<p>This installs packages according to user input.</p>"""
+        ))
+        self.installPackagesAct.triggered.connect(self.__installPackages)
+        self.actions.append(self.installPackagesAct)
+        
+        self.installRequirementsAct = E5Action(
+            self.tr('Install Requirements'),
+            self.tr('Install Requirements'),
+            0, 0,
+            self, 'pip_install_requirements')
+        self.installRequirementsAct.setStatusTip(self.tr(
+            'Install packages according to a requirements file'))
+        self.installRequirementsAct.setWhatsThis(self.tr(
+            """<b>Install Requirements</b>"""
+            """<p>This installs packages according to a requirements"""
+            """ file.</p>"""
+        ))
+        self.installRequirementsAct.triggered.connect(
+            self.__installRequirements)
+        self.actions.append(self.installRequirementsAct)
+        
+        self.installPipAct = E5Action(
+            self.tr('Install Pip'),
+            self.tr('Install Pip'),
+            0, 0,
+            self, 'pip_install_pip')
+        self.installPipAct.setStatusTip(self.tr(
+            'Install the pip package itself'))
+        self.installPipAct.setWhatsThis(self.tr(
+            """<b>Install Pip</b>"""
+            """<p>This install the pip package itself.</p>"""
+        ))
+        self.installPipAct.triggered.connect(self.__installPip)
+        self.actions.append(self.installPipAct)
+        
+        self.repairPipAct = E5Action(
+            self.tr('Repair Pip'),
+            self.tr('Repair Pip'),
+            0, 0,
+            self, 'pip_repair_pip')
+        self.repairPipAct.setStatusTip(self.tr(
+            'Repair the pip package'))
+        self.repairPipAct.setWhatsThis(self.tr(
+            """<b>Repair Pip</b>"""
+            """<p>This repairs the pip package by re-installing it.</p>"""
+        ))
+        self.repairPipAct.triggered.connect(self.__repairPip)
+        self.actions.append(self.repairPipAct)
+        
+        self.upgradePipAct = E5Action(
+            self.tr('Upgrade Pip'),
+            self.tr('Upgrade &Pip'),
+            0, 0,
+            self, 'pip_upgrade_pip')
+        self.upgradePipAct.setStatusTip(self.tr(
+            'Upgrade the pip package itself'))
+        self.upgradePipAct.setWhatsThis(self.tr(
+            """<b>Upgrade Pip</b>"""
+            """<p>This upgrades the pip package itself.</p>"""
+        ))
+        self.upgradePipAct.triggered.connect(self.upgradePip)
+        self.actions.append(self.upgradePipAct)
+        
+        self.upgradePackagesAct = E5Action(
+            self.tr('Upgrade Packages'),
+            self.tr('&Upgrade Packages'),
+            0, 0,
+            self, 'pip_upgrade_packages')
+        self.upgradePackagesAct.setStatusTip(self.tr(
+            'Upgrade packages according to user input'))
+        self.upgradePackagesAct.setWhatsThis(self.tr(
+            """<b>Upgrade Packages</b>"""
+            """<p>This upgrades packages according to user input.</p>"""
+        ))
+        self.upgradePackagesAct.triggered.connect(self.__upgradePackages)
+        self.actions.append(self.upgradePackagesAct)
+        
+        ##############################################
+        ## Actions for uninstalling packages
+        ##############################################
+        
+        self.uninstallPackagesAct = E5Action(
+            self.tr('Uninstall Packages'),
+            self.tr('Uninstall Packages'),
+            0, 0,
+            self, 'pip_uninstall_packages')
+        self.uninstallPackagesAct.setStatusTip(self.tr(
+            'Uninstall packages according to user input'))
+        self.uninstallPackagesAct.setWhatsThis(self.tr(
+            """<b>Uninstall Packages</b>"""
+            """<p>This uninstalls packages according to user input.</p>"""
+        ))
+        self.uninstallPackagesAct.triggered.connect(self.__uninstallPackages)
+        self.actions.append(self.uninstallPackagesAct)
+        
+        self.uninstallRequirementsAct = E5Action(
+            self.tr('Uninstall Requirements'),
+            self.tr('Uninstall Requirements'),
+            0, 0,
+            self, 'pip_uninstall_requirements')
+        self.uninstallRequirementsAct.setStatusTip(self.tr(
+            'Uninstall packages according to a requirements file'))
+        self.uninstallRequirementsAct.setWhatsThis(self.tr(
+            """<b>Uninstall Requirements</b>"""
+            """<p>This uninstalls packages according to a requirements"""
+            """ file.</p>"""
+        ))
+        self.uninstallRequirementsAct.triggered.connect(
+            self.__uninstallRequirements)
+        self.actions.append(self.uninstallRequirementsAct)
+        
+        ##############################################
+        ## Actions for generating requirements files
+        ##############################################
+        
+        self.generateRequirementsAct = E5Action(
+            self.tr('Generate Requirements'),
+            self.tr('&Generate Requirements...'),
+            0, 0,
+            self, 'pip_generate_requirements')
+        self.generateRequirementsAct.setStatusTip(self.tr(
+            'Generate the contents of a requirements file'))
+        self.generateRequirementsAct.setWhatsThis(self.tr(
+            """<b>Generate Requirements</b>"""
+            """<p>This generates the contents of a requirements file.</p>"""
+        ))
+        self.generateRequirementsAct.triggered.connect(
+            self.__generateRequirements)
+        self.actions.append(self.generateRequirementsAct)
+        
+        ##############################################
+        ## Actions for generating requirements files
+        ##############################################
+        
+        self.searchPyPIAct = E5Action(
+            self.tr('Search PyPI'),
+            self.tr('&Search PyPI...'),
+            0, 0,
+            self, 'pip_search_pypi')
+        self.searchPyPIAct.setStatusTip(self.tr(
+            'Open a dialog to search the Python Package Index'))
+        self.searchPyPIAct.setWhatsThis(self.tr(
+            """<b>Search PyPI</b>"""
+            """<p>This opens a dialog to search the Python Package"""
+            """ Index.</p>"""
+        ))
+        self.searchPyPIAct.triggered.connect(self.__searchPyPI)
+        self.actions.append(self.searchPyPIAct)
+        
+        ##############################################
+        ## Actions for editing configuration files
+        ##############################################
+        
+        self.editUserConfigAct = E5Action(
+            self.tr('Edit User Configuration'),
+            self.tr('Edit User Configuration...'),
+            0, 0,
+            self, 'pip_edit_user_config')
+        self.editUserConfigAct.setStatusTip(self.tr(
+            'Open the per user configuration file in an editor'))
+        self.editUserConfigAct.setWhatsThis(self.tr(
+            """<b>Edit User Configuration</b>"""
+            """<p>This opens the per user configuration file in an editor."""
+            """</p>"""
+        ))
+        self.editUserConfigAct.triggered.connect(self.__editUserConfiguration)
+        self.actions.append(self.editUserConfigAct)
+        
+        self.editVirtualenvConfigAct = E5Action(
+            self.tr('Edit Current Virtualenv Configuration'),
+            self.tr('Edit Current Virtualenv Configuration...'),
+            0, 0,
+            self, 'pip_edit_virtualenv_config')
+        self.editVirtualenvConfigAct.setStatusTip(self.tr(
+            'Open the current virtualenv configuration file in an editor'))
+        self.editVirtualenvConfigAct.setWhatsThis(self.tr(
+            """<b>Edit Current Virtualenv Configuration</b>"""
+            """<p>This opens the current virtualenv configuration file in"""
+            """ an editor. </p>"""
+        ))
+        self.editVirtualenvConfigAct.triggered.connect(
+            self.__editVirtualenvConfiguration)
+        self.actions.append(self.editVirtualenvConfigAct)
+        
+        self.pipConfigAct = E5Action(
+            self.tr('Configure'),
+            self.tr('Configure...'),
+            0, 0, self, 'pip_configure')
+        self.pipConfigAct.setStatusTip(self.tr(
+            'Show the configuration dialog with the Python Package Management'
+            ' page selected'
+        ))
+        self.pipConfigAct.setWhatsThis(self.tr(
+            """<b>Configure</b>"""
+            """<p>Show the configuration dialog with the Python Package"""
+            """ Management page selected.</p>"""
+        ))
+        self.pipConfigAct.triggered.connect(self.__pipConfigure)
+        self.actions.append(self.pipConfigAct)
+    
+    def initMenu(self):
+        """
+        Public slot to initialize the Django menu.
+        
+        @return the menu generated (QMenu)
+        """
+        self.__menus = {}   # clear menus references
+        
+        menu = QMenu(self.tr('P&ython Package Management'), self.__ui)
+        menu.setTearOffEnabled(True)
+        
+        menu.addAction(self.selectExecutableAct)
+        menu.addSeparator()
+        menu.addAction(self.listPackagesAct)
+        menu.addAction(self.listUptodatePackagesAct)
+        menu.addAction(self.listOutdatedPackagesAct)
+        menu.addSeparator()
+        menu.addAction(self.installPipAct)
+        menu.addAction(self.installPackagesAct)
+        menu.addAction(self.installRequirementsAct)
+        menu.addSeparator()
+        menu.addAction(self.upgradePipAct)
+        menu.addAction(self.upgradePackagesAct)
+        menu.addSeparator()
+        menu.addAction(self.uninstallPackagesAct)
+        menu.addAction(self.uninstallRequirementsAct)
+        menu.addSeparator()
+        menu.addAction(self.generateRequirementsAct)
+        menu.addSeparator()
+        menu.addAction(self.searchPyPIAct)
+        menu.addSeparator()
+        menu.addAction(self.repairPipAct)
+        menu.addSeparator()
+        menu.addAction(self.editUserConfigAct)
+        menu.addAction(self.editVirtualenvConfigAct)
+        menu.addSeparator()
+        menu.addAction(self.pipConfigAct)
+        
+        self.__menus["main"] = menu
+        
+        menu.aboutToShow.connect(self.__aboutToShowMenu)
+        
+        return menu
+    
+    def __aboutToShowMenu(self):
+        """
+        Private slot to set the action enabled status.
+        """
+        enable = bool(self.__plugin.getPreferences("CurrentPipExecutable"))
+        for act in self.actions:
+            if act not in [self.selectExecutableAct,
+                           self.installPipAct,
+                           self.editUserConfigAct,
+                           self.editVirtualenvConfigAct,
+                           self.pipConfigAct]:
+                act.setEnabled(enable)
+    
+    def getMenu(self, name):
+        """
+        Public method to get a reference to the requested menu.
+        
+        @param name name of the menu (string)
+        @return reference to the menu (QMenu) or None, if no
+            menu with the given name exists
+        """
+        if name in self.__menus:
+            return self.__menus[name]
+        else:
+            return None
+    
+    def getMenuNames(self):
+        """
+        Public method to get the names of all menus.
+        
+        @return menu names (list of string)
+        """
+        return list(self.__menus.keys())
+    
+    def __handleTearOffMenu(self, pip):
+        """
+        Private slot to handle a change of the pip executable.
+        
+        @param pip path of the pip executable
+        @type str
+        """
+        if self.__menus["main"].isTearOffMenuVisible():
+            # determine, if torn off menu needs to be refreshed
+            enabled = self.listPackagesAct.isEnabled()
+            if ((bool(pip) and not enabled) or
+                    (not bool(pip) and enabled)):
+                self.__menus["main"].hideTearOffMenu()
+    
+    ##########################################################################
+    ## Methods below implement some utility functions
+    ##########################################################################
+    
+    def runProcess(self, args, cmd=""):
+        """
+        Public method to execute the current pip with the given arguments.
+        
+        The selected pip executable is called with the given arguments and
+        waited for its end.
+        
+        @param args list of command line arguments (list of string)
+        @param cmd pip command to be used (string)
+        @return tuple containing a flag indicating success and the output
+            of the process (string)
+        """
+        if not cmd:
+            cmd = self.__plugin.getPreferences("CurrentPipExecutable")
+        ioEncoding = Preferences.getSystem("IOEncoding")
+        
+        process = QProcess()
+        process.start(cmd, args)
+        procStarted = process.waitForStarted()
+        if procStarted:
+            finished = process.waitForFinished(30000)
+            if finished:
+                if process.exitCode() == 0:
+                    output = str(process.readAllStandardOutput(), ioEncoding,
+                                 'replace')
+                    return True, output
+                else:
+                    return False, self.tr("pip exited with an error ({0}).")\
+                        .format(process.exitCode())
+            else:
+                process.terminate()
+                process.waitForFinished(2000)
+                process.kill()
+                process.waitForFinished(3000)
+                return False, self.tr("pip did not finish within 30 seconds.")
+        
+        return False, self.tr("pip could not be started.")
+    
+    def __getUserConfig(self):
+        """
+        Private method to get the name of the user configuration file.
+        
+        @return path of the user configuration file (string)
+        """
+        # Unix:     ~/.config/pip/pip.conf
+        # OS X:     ~/Library/Application Support/pip/pip.conf
+        # Windows:  %APPDATA%\pip\pip.ini
+        # Environment: $PIP_CONFIG_FILE
+        
+        try:
+            return os.environ["PIP_CONFIG_FILE"]
+        except KeyError:
+            pass
+        
+        if Globals.isWindowsPlatform():
+            config = os.path.join(os.environ["APPDATA"], "pip", "pip.ini")
+        elif Globals.isMacPlatform():
+            config = os.path.expanduser(
+                "~/Library/Application Support/pip/pip.conf")
+        else:
+            config = os.path.expanduser("~/.config/pip/pip.conf")
+        
+        return config
+    
+    def __getVirtualenvConfig(self):
+        """
+        Private method to get the name of the virtualenv configuration file.
+        
+        @return path of the virtualenv configuration file (string)
+        """
+        # Unix, OS X:   $VIRTUAL_ENV/pip.conf
+        # Windows:      %VIRTUAL_ENV%\pip.ini
+        
+        if Globals.isWindowsPlatform():
+            pip = "pip.ini"
+        else:
+            pip = "pip.conf"
+        try:
+            virtualenv = os.environ["VIRTUAL_ENV"]
+        except KeyError:
+            # determine from pip executable file
+            virtualenv = os.path.dirname(os.path.dirname(
+                self.__plugin.getPreferences("CurrentPipExecutable")))
+        
+        return os.path.join(virtualenv, pip)
+    
+    ##########################################################################
+    ## Methods below implement the individual menu entries
+    ##########################################################################
+    
+    def __selectPipExecutable(self):
+        """
+        Private method to select the pip executable to be used.
+        """
+        pipExecutables = sorted(self.__plugin.getPreferences("PipExecutables"))
+        if pipExecutables:
+            currentExecutable = self.__plugin.getPreferences(
+                "CurrentPipExecutable")
+            try:
+                index = pipExecutables.index(currentExecutable)
+            except ValueError:
+                index = 0
+            executable, ok = QInputDialog.getItem(
+                None,
+                self.tr("pip Executable"),
+                self.tr("Select pip Executable to be used:"),
+                pipExecutables, index, False)
+            
+            if ok and executable:
+                self.__plugin.setPreferences("CurrentPipExecutable",
+                                             executable)
+        else:
+            res = E5MessageBox.yesNo(
+                None,
+                self.tr("pip Executable"),
+                self.tr("""No pip executables have been configured yet."""
+                        """ Shall this be done now?"""),
+                yesDefault=True)
+            if res:
+                e5App().getObject("UserInterface").showPreferences("pipPage")
+    
+    def __listPackages(self):
+        """
+        Private slot to list all installed packages.
+        """
+        from .PipListDialog import PipListDialog
+        self.__listDialog = PipListDialog(
+            self, "list", self.__plugin, self.tr("Installed Packages"))
+        self.__listDialog.show()
+        self.__listDialog.start()
+    
+    def __listUptodatePackages(self):
+        """
+        Private slot to list all installed, up-to-date packages.
+        """
+        from .PipListDialog import PipListDialog
+        self.__listUptodateDialog = PipListDialog(
+            self, "uptodate", self.__plugin, self.tr("Up-to-date Packages"))
+        self.__listUptodateDialog.show()
+        self.__listUptodateDialog.start()
+    
+    def __listOutdatedPackages(self):
+        """
+        Private slot to list all installed, up-to-date packages.
+        """
+        from .PipListDialog import PipListDialog
+        self.__listOutdatedDialog = PipListDialog(
+            self, "outdated", self.__plugin, self.tr("Outdated Packages"))
+        self.__listOutdatedDialog.show()
+        self.__listOutdatedDialog.start()
+    
+    def __editUserConfiguration(self):
+        """
+        Private slot to edit the user configuration.
+        """
+        self.__editConfiguration()
+    
+    def __editVirtualenvConfiguration(self):
+        """
+        Private slot to edit the current virtualenv configuration.
+        """
+        self.__editConfiguration(virtualenv=True)
+    
+    def __editConfiguration(self, virtualenv=False):
+        """
+        Private method to edit a configuration.
+        
+        @param virtualenv flag indicating to edit the current virtualenv
+            configuration file (boolean)
+        """
+        from QScintilla.MiniEditor import MiniEditor
+        if virtualenv:
+            cfgFile = self.__getVirtualenvConfig()
+        else:
+            cfgFile = self.__getUserConfig()
+        cfgDir = os.path.dirname(cfgFile)
+        if not cfgDir:
+            E5MessageBox.critical(
+                None,
+                self.tr("Edit Configuration"),
+                self.tr("""No valid configuartion path determined."""
+                        """ Is a virtual environment selected? Aborting"""))
+            return
+        
+        try:
+            if not os.path.isdir(cfgDir):
+                os.makedirs(cfgDir)
+        except OSError:
+            E5MessageBox.critical(
+                None,
+                self.tr("Edit Configuration"),
+                self.tr("""No valid configuartion path determined."""
+                        """ Is a virtual environment selected? Aborting"""))
+            return
+        
+        if not os.path.exists(cfgFile):
+            try:
+                f = open(cfgFile, "w")
+                f.write("[global]\n")
+                f.close()
+            except (IOError, OSError):
+                # ignore these
+                pass
+        
+        # check, if the destination is writeable
+        if not os.access(cfgFile, os.W_OK):
+            E5MessageBox.critical(
+                None,
+                self.tr("Edit Configuration"),
+                self.tr("""No valid configuartion path determined."""
+                        """ Is a virtual environment selected? Aborting"""))
+            return
+        
+        self.__editor = MiniEditor(cfgFile, "Properties")
+        self.__editor.show()
+    
+    def __installPip(self):
+        """
+        Private slot to install pip.
+        """
+        python = E5FileDialog.getOpenFileName(
+            None,
+            self.tr("Select Python Executable"))
+        if python:
+            python = QDir.toNativeSeparators(python)
+            dia = PipDialog(self.tr('Install PIP'))
+            res = dia.startProcesses([
+                (python, ["-m", "ensurepip"]),
+                (python, ["-m", "pip", "install", "--upgrade", "pip"]),
+            ])
+            if res:
+                dia.exec_()
+                pip = E5FileDialog.getOpenFileName(
+                    None,
+                    self.tr("Select PIP Executable"),
+                    os.path.dirname(python))
+                if pip:
+                    pip = QDir.toNativeSeparators(pip)
+                    pipExecutables = \
+                        self.__plugin.getPreferences("PipExecutables")
+                    if pip not in pipExecutables:
+                        pipExecutables.append(pip)
+                        self.__plugin.setPreferences(
+                            "PipExecutables", pipExecutables)
+    
+    @pyqtSlot()
+    def upgradePip(self, pip=""):
+        """
+        Public method to upgrade pip itself.
+        
+        @param pip pip command to be used
+        @type str
+        @return flag indicating a successful execution
+        @rtype bool
+        """
+        # Upgrading pip needs to be treated specially because
+        # it must be done using the python executable
+        
+        if not pip:
+            default = self.tr("<Default>")
+            pipExecutables = sorted(
+                self.__plugin.getPreferences("PipExecutables"))
+            pip, ok = QInputDialog.getItem(
+                None,
+                self.tr("Upgrade pip"),
+                self.tr("Select pip Executable:"),
+                [default] + pipExecutables,
+                0, False)
+            if not ok or not pip:
+                return False
+            
+            if pip == default:
+                pip = self.__plugin.getPreferences("CurrentPipExecutable")
+        
+        python = self.__getPython(pip)
+        if not python:
+            python = E5FileDialog.getOpenFileName(
+                None,
+                self.tr("Select Python Executable"),
+                os.path.dirname(pip))
+            if python:
+                python = QDir.toNativeSeparators(python)
+            else:
+                return False
+        
+        args = ["-m", "pip", "install", "--upgrade", "pip"]
+        dia = PipDialog(self.tr('Upgrade PIP'))
+        res = dia.startProcess(python, args)
+        if res:
+            dia.exec_()
+        return res
+    
+    @pyqtSlot()
+    def __repairPip(self):
+        default = self.tr("<Default>")
+        pipExecutables = sorted(
+            self.__plugin.getPreferences("PipExecutables"))
+        pip, ok = QInputDialog.getItem(
+            None,
+            self.tr("Upgrade pip"),
+            self.tr("Select pip Executable:"),
+            [default] + pipExecutables,
+            0, False)
+        if not ok or not pip:
+            return False
+        
+        if pip == default:
+            pip = self.__plugin.getPreferences("CurrentPipExecutable")
+        
+        python = self.__getPython(pip)
+        if not python:
+            python = E5FileDialog.getOpenFileName(
+                None,
+                self.tr("Select Python Executable"),
+                os.path.dirname(pip))
+            if python:
+                python = QDir.toNativeSeparators(python)
+            else:
+                return False
+        
+        # pip install --ignore-installed pip
+        args = ["-m", "pip", "install", "--ignore-installed", "pip"]
+        dia = PipDialog(self.tr('Repair PIP'))
+        res = dia.startProcess(python, args)
+        if res:
+            dia.exec_()
+    
+    def __getPython(self, cmd):
+        """
+        Private method to derive the path to the python executable given the
+        path to the pip executable.
+        
+        @param cmd path of the pip executable
+        @type str
+        @return path of the python executable
+        @rtype str
+        """
+        path, prog = os.path.split(cmd)
+        paths = (path, os.path.split(path)[0])  # to try the parent directory
+        if Globals.isWindowsPlatform():
+            subPatterns = ((r"\d\.\d", ""),
+                           (r"\d\.", "."))
+            for pyname in ("python", "pypy"):
+                python = prog.replace("pip", pyname)
+                for pattern, repl in subPatterns:
+                    if re.search(pattern, python):
+                        python = re.sub(pattern, repl, python)
+                        break
+                for path in paths:
+                    pypath = os.path.join(path, python)
+                    if os.path.exists(pypath):
+                        return pypath
+        else:
+            subPatterns = ((r"\.\d$", ""),
+                           (r"\d\.\d$", ""),
+                           (r"\d$", ""))
+            for pyname in ("python", "pypy"):
+                python = prog.replace("pip", pyname)
+                for path in paths:
+                    pypath = os.path.join(path, python)
+                    if os.path.exists(pypath):
+                        return pypath
+                    
+                    for pattern, repl in subPatterns:
+                        if re.search(pattern, cmd):
+                            newpy = re.sub(pattern, repl, python)
+                            pypath = os.path.join(path, newpy)
+                            if os.path.exists(pypath):
+                                return pypath
+        
+        return ""
+    
+    def __checkUpgradePyQt(self, packages):
+        """
+        Private method to check, if an upgrade of PyQt packages is attempted.
+        
+        @param packages list of packages to upgrade
+        @type list of str
+        @return flag indicating to abort the upgrade attempt
+        @rtype bool
+        """
+        pyqtPackages = [p for p in packages
+                        if p.lower() in ["pyqt5", "qscintilla", "sip"]]
+        
+        if bool(pyqtPackages):
+            abort = not E5MessageBox.yesNo(
+                None,
+                self.tr("Upgrade Packages"),
+                self.tr(
+                    """You are trying to upgrade PyQt packages. This will"""
+                    """ not work for the current instance of Python ({0})."""
+                    """ Do you want to continue?""").format(sys.executable),
+                icon=E5MessageBox.Critical)
+        else:
+            abort = False
+        
+        return abort
+    
+    def upgradePackages(self, packages, cmd=""):
+        """
+        Public method to upgrade the given list of packages.
+        
+        @param packages list of packages to upgrade (list of string)
+        @param cmd pip command to be used (string)
+        @return flag indicating a successful execution (boolean)
+        """
+        if self.__checkUpgradePyQt(packages):
+            return False
+        
+        if not cmd:
+            cmd = self.__plugin.getPreferences("CurrentPipExecutable")
+        args = ["install", "--upgrade"] + packages
+        dia = PipDialog(self.tr('Upgrade Packages'))
+        res = dia.startProcess(cmd, args)
+        if res:
+            dia.exec_()
+        return res
+    
+    def __upgradePackages(self):
+        """
+        Private slot to upgrade packages to be given by the user.
+        """
+        from .PipPackagesInputDialog import PipPackagesInputDialog
+        dlg = PipPackagesInputDialog(
+            self.__plugin, self.tr("Upgrade Packages"))
+        if dlg.exec_() == QDialog.Accepted:
+            command, packages = dlg.getData()
+            if packages:
+                self.upgradePackages(packages, cmd=command)
+    
+    def installPackages(self, packages, cmd=""):
+        """
+        Public method to install the given list of packages.
+        
+        @param packages list of packages to install (list of string)
+        @param cmd pip command to be used (string)
+        """
+        if not cmd:
+            cmd = self.__plugin.getPreferences("CurrentPipExecutable")
+        args = ["install"] + packages
+        dia = PipDialog(self.tr('Install Packages'))
+        res = dia.startProcess(cmd, args)
+        if res:
+            dia.exec_()
+    
+    def __installPackages(self):
+        """
+        Private slot to install packages to be given by the user.
+        """
+        from .PipPackagesInputDialog import PipPackagesInputDialog
+        dlg = PipPackagesInputDialog(
+            self.__plugin, self.tr("Install Packages"))
+        if dlg.exec_() == QDialog.Accepted:
+            command, packages = dlg.getData()
+            if packages:
+                self.installPackages(packages, cmd=command)
+    
+    def __installRequirements(self):
+        """
+        Private slot to install packages as given in a requirements file.
+        """
+        from .PipRequirementsSelectionDialog import \
+            PipRequirementsSelectionDialog
+        dlg = PipRequirementsSelectionDialog(self.__plugin)
+        if dlg.exec_() == QDialog.Accepted:
+            command, requirements = dlg.getData()
+            if requirements and os.path.exists(requirements):
+                if not command:
+                    command = self.__plugin.getPreferences(
+                        "CurrentPipExecutable")
+                args = ["install", "--requirement", requirements]
+                dia = PipDialog(self.tr('Install Packages from Requirements'))
+                res = dia.startProcess(command, args)
+                if res:
+                    dia.exec_()
+    
+    def uninstallPackages(self, packages, cmd=""):
+        """
+        Public method to uninstall the given list of packages.
+        
+        @param packages list of packages to uninstall (list of string)
+        @param cmd pip command to be used (string)
+        @return flag indicating a successful execution (boolean)
+        """
+        res = False
+        if packages:
+            from UI.DeleteFilesConfirmationDialog import \
+                DeleteFilesConfirmationDialog
+            dlg = DeleteFilesConfirmationDialog(
+                self.parent(),
+                self.tr("Uninstall Packages"),
+                self.tr(
+                    "Do you really want to uninstall these packages?"),
+                packages)
+            if dlg.exec_() == QDialog.Accepted:
+                if not cmd:
+                    cmd = self.__plugin.getPreferences("CurrentPipExecutable")
+                args = ["uninstall", "--yes"] + packages
+                dia = PipDialog(self.tr('Uninstall Packages'))
+                res = dia.startProcess(cmd, args)
+                if res:
+                    dia.exec_()
+        return res
+    
+    def __uninstallPackages(self):
+        """
+        Private slot to uninstall packages to be given by the user.
+        """
+        from .PipPackagesInputDialog import PipPackagesInputDialog
+        dlg = PipPackagesInputDialog(
+            self.__plugin, self.tr("Uninstall Packages"))
+        if dlg.exec_() == QDialog.Accepted:
+            command, packages = dlg.getData()
+            if packages:
+                self.uninstallPackages(packages, cmd=command)
+    
+    def __uninstallRequirements(self):
+        """
+        Private slot to uninstall packages as given in a requirements file.
+        """
+        from .PipRequirementsSelectionDialog import \
+            PipRequirementsSelectionDialog
+        dlg = PipRequirementsSelectionDialog(self.__plugin)
+        if dlg.exec_() == QDialog.Accepted:
+            command, requirements = dlg.getData()
+            if requirements and os.path.exists(requirements):
+                try:
+                    f = open(requirements, "r")
+                    reqs = f.read().splitlines()
+                    f.close()
+                except (OSError, IOError):
+                    return
+                
+                from UI.DeleteFilesConfirmationDialog import \
+                    DeleteFilesConfirmationDialog
+                dlg = DeleteFilesConfirmationDialog(
+                    self.parent(),
+                    self.tr("Uninstall Packages"),
+                    self.tr(
+                        "Do you really want to uninstall these packages?"),
+                    reqs)
+                if dlg.exec_() == QDialog.Accepted:
+                    if not command:
+                        command = self.__plugin.getPreferences(
+                            "CurrentPipExecutable")
+                    args = ["uninstall", "--requirement", requirements]
+                    dia = PipDialog(
+                        self.tr('Uninstall Packages from Requirements'))
+                    res = dia.startProcess(command, args)
+                    if res:
+                        dia.exec_()
+    
+    def __generateRequirements(self):
+        """
+        Private slot to generate the contents for a requirements file.
+        """
+        from .PipFreezeDialog import PipFreezeDialog
+        self.__freezeDialog = PipFreezeDialog(self, self.__plugin)
+        self.__freezeDialog.show()
+        self.__freezeDialog.start()
+    
+    def __searchPyPI(self):
+        """
+        Private slot to search the Python Package Index.
+        """
+        from .PipSearchDialog import PipSearchDialog
+        self.__searchDialog = PipSearchDialog(self, self.__plugin)
+        self.__searchDialog.show()
+    
+    def __pipConfigure(self):
+        """
+        Private slot to open the configuration page.
+        """
+        e5App().getObject("UserInterface").showPreferences("pipPage")
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Plugins/UiExtensionPlugins/PipInterface/PipDialog.py	Sat Dec 09 18:32:08 2017 +0100
@@ -0,0 +1,194 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2015 - 2017 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a dialog showing the output of a pip command.
+"""
+
+from __future__ import unicode_literals
+try:
+    str = unicode       # __IGNORE_EXCEPTION__
+except NameError:
+    pass
+
+from PyQt5.QtCore import pyqtSlot, Qt, QCoreApplication, QTimer, \
+    QProcess
+from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QAbstractButton
+
+from E5Gui import E5MessageBox
+
+from .Ui_PipDialog import Ui_PipDialog
+
+import Preferences
+
+
+class PipDialog(QDialog, Ui_PipDialog):
+    """
+    Class implementing a dialog showing the output of a pip command.
+    """
+    def __init__(self, text, parent=None):
+        """
+        Constructor
+        
+        @param text text to be shown by the label (string)
+        @param parent reference to the parent widget (QWidget)
+        """
+        super(PipDialog, self).__init__(parent)
+        self.setupUi(self)
+        
+        self.proc = None
+        self.__processQueue = []
+        self.__ioEncoding = Preferences.getSystem("IOEncoding")
+        
+        self.outputGroup.setTitle(text)
+        
+        self.show()
+        QCoreApplication.processEvents()
+    
+    def closeEvent(self, e):
+        """
+        Protected slot implementing a close event handler.
+        
+        @param e close event (QCloseEvent)
+        """
+        self.__processQueue = []
+        
+        if self.proc is not None and \
+           self.proc.state() != QProcess.NotRunning:
+            self.proc.terminate()
+            QTimer.singleShot(2000, self.proc.kill)
+            self.proc.waitForFinished(3000)
+        
+        self.proc = None
+        
+        e.accept()
+    
+    def __finish(self):
+        """
+        Private slot called when the process finished or the user pressed
+        the button.
+        """
+        if self.proc is not None and \
+           self.proc.state() != QProcess.NotRunning:
+            self.proc.terminate()
+            QTimer.singleShot(2000, self.proc.kill)
+            self.proc.waitForFinished(3000)
+        
+        self.proc = None
+        
+        self.buttonBox.button(QDialogButtonBox.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.Close).setFocus(
+            Qt.OtherFocusReason)
+        
+        if self.__processQueue:
+            cmd, args = self.__processQueue.pop(0)
+            self.__addOutput("\n\n")
+            self.startProcess(cmd, args)
+    
+    @pyqtSlot(QAbstractButton)
+    def on_buttonBox_clicked(self, button):
+        """
+        Private slot called by a button of the button box clicked.
+        
+        @param button button that was clicked (QAbstractButton)
+        """
+        if button == self.buttonBox.button(QDialogButtonBox.Close):
+            self.close()
+    
+    def __procFinished(self, exitCode, exitStatus):
+        """
+        Private slot connected to the finished signal.
+        
+        @param exitCode exit code of the process (integer)
+        @param exitStatus exit status of the process (QProcess.ExitStatus)
+        """
+        self.__finish()
+    
+    def startProcess(self, cmd, args, showArgs=True):
+        """
+        Public slot used to start the process.
+        
+        @param cmd name of the pip executable to be used (string)
+        @param args list of arguments for the process (list of strings)
+        @keyparam showArgs flag indicating to show the arguments (boolean)
+        @return flag indicating a successful start of the process
+        """
+        if len(self.errors.toPlainText()) == 0:
+            self.errorGroup.hide()
+        
+        if showArgs:
+            self.resultbox.append(cmd + ' ' + ' '.join(args))
+            self.resultbox.append('')
+        
+        self.proc = QProcess()
+        self.proc.finished.connect(self.__procFinished)
+        self.proc.readyReadStandardOutput.connect(self.__readStdout)
+        self.proc.readyReadStandardError.connect(self.__readStderr)
+        self.proc.start(cmd, args)
+        procStarted = self.proc.waitForStarted(5000)
+        if not procStarted:
+            self.buttonBox.setFocus()
+            E5MessageBox.critical(
+                self,
+                self.tr('Process Generation Error'),
+                self.tr(
+                    'The process {0} could not be started.'
+                ).format(cmd))
+        return procStarted
+    
+    def startProcesses(self, processParams):
+        """
+        Public method to issue a list of commands to be executed.
+        
+        @param processParams list of tuples containing the command
+            and arguments
+        @type list of tuples of str and list of str
+        @return flag indicating a successful start of the first process
+        @rtype bool
+        """
+        if len(processParams) > 1:
+            for cmd, args in processParams[1:]:
+                self.__processQueue.append((cmd, args[:]))
+        cmd, args = processParams[0]
+        return self.startProcess(cmd, args)
+    
+    def __readStdout(self):
+        """
+        Private slot to handle the readyReadStandardOutput signal.
+        
+        It reads the output of the process, formats it and inserts it into
+        the contents pane.
+        """
+        if self.proc is not None:
+            txt = str(self.proc.readAllStandardOutput(),
+                      self.__ioEncoding, 'replace')
+            self.__addOutput(txt)
+
+    def __addOutput(self, txt):
+        """
+        Private method to add some text to the output pane.
+        
+        @param txt text to be added
+        @type str
+        """
+        self.resultbox.insertPlainText(txt)
+        self.resultbox.ensureCursorVisible()
+        QCoreApplication.processEvents()
+    
+    def __readStderr(self):
+        """
+        Private slot to handle the readyReadStandardError signal.
+        
+        It reads the error output of the process and inserts it into the
+        error pane.
+        """
+        if self.proc is not None:
+            s = str(self.proc.readAllStandardError(),
+                    self.__ioEncoding, 'replace')
+            self.errorGroup.show()
+            self.errors.insertPlainText(s)
+            self.errors.ensureCursorVisible()
+            
+            QCoreApplication.processEvents()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Plugins/UiExtensionPlugins/PipInterface/PipDialog.ui	Sat Dec 09 18:32:08 2017 +0100
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>PipDialog</class>
+ <widget class="QDialog" name="PipDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>600</width>
+    <height>500</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>pip</string>
+  </property>
+  <property name="sizeGripEnabled">
+   <bool>true</bool>
+  </property>
+  <layout class="QVBoxLayout">
+   <item>
+    <widget class="QGroupBox" name="outputGroup">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
+       <horstretch>0</horstretch>
+       <verstretch>2</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="title">
+      <string>Output</string>
+     </property>
+     <layout class="QVBoxLayout">
+      <item>
+       <widget class="QTextEdit" name="resultbox">
+        <property name="readOnly">
+         <bool>true</bool>
+        </property>
+        <property name="acceptRichText">
+         <bool>false</bool>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item>
+    <widget class="QGroupBox" name="errorGroup">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
+       <horstretch>0</horstretch>
+       <verstretch>1</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="title">
+      <string>Errors</string>
+     </property>
+     <layout class="QVBoxLayout">
+      <item>
+       <widget class="QTextEdit" name="errors">
+        <property name="readOnly">
+         <bool>true</bool>
+        </property>
+        <property name="acceptRichText">
+         <bool>false</bool>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item>
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Close</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11"/>
+ <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
+ <tabstops>
+  <tabstop>resultbox</tabstop>
+  <tabstop>errors</tabstop>
+  <tabstop>buttonBox</tabstop>
+ </tabstops>
+ <resources/>
+ <connections/>
+</ui>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Plugins/UiExtensionPlugins/PipInterface/PipFreezeDialog.py	Sat Dec 09 18:32:08 2017 +0100
@@ -0,0 +1,306 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2015 - 2017 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a dialog to generate a requirements file.
+"""
+
+from __future__ import unicode_literals
+try:
+    str = unicode       # __IGNORE_EXCEPTION__
+except NameError:
+    pass
+
+import os
+
+from PyQt5.QtCore import pyqtSlot, Qt
+from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QAbstractButton, \
+    QApplication
+
+from E5Gui import E5MessageBox, E5FileDialog
+from E5Gui.E5Application import e5App
+
+from .Ui_PipFreezeDialog import Ui_PipFreezeDialog
+
+import Utilities
+import UI.PixmapCache
+
+
+class PipFreezeDialog(QDialog, Ui_PipFreezeDialog):
+    """
+    Class implementing a dialog to generate a requirements file.
+    """
+    def __init__(self, pip, plugin, parent=None):
+        """
+        Constructor
+        
+        @param pip reference to the master object (Pip)
+        @param plugin reference to the plugin object (ToolPipPlugin)
+        @param parent reference to the parent widget (QWidget)
+        """
+        super(PipFreezeDialog, self).__init__(parent)
+        self.setupUi(self)
+        self.setWindowFlags(Qt.Window)
+        
+        self.__refreshButton = self.buttonBox.addButton(
+            self.tr("&Refresh"), QDialogButtonBox.ActionRole)
+        
+        self.fileButton.setIcon(UI.PixmapCache.getIcon("open.png"))
+        
+        self.__pip = pip
+        
+        self.__default = self.tr("<Default>")
+        pipExecutables = sorted(plugin.getPreferences("PipExecutables"))
+        self.pipComboBox.addItem(self.__default)
+        self.pipComboBox.addItems(pipExecutables)
+        
+        self.__requirementsEdited = False
+        self.__requirementsAvailable = False
+        
+        self.__updateButtons()
+    
+    def closeEvent(self, e):
+        """
+        Protected slot implementing a close event handler.
+        
+        @param e close event (QCloseEvent)
+        """
+        QApplication.restoreOverrideCursor()
+        e.accept()
+    
+    @pyqtSlot(str)
+    def on_pipComboBox_activated(self, txt):
+        """
+        Private slot handling the selection of a pip executable.
+        
+        @param txt path of the pip executable (string)
+        """
+        self.__refresh()
+    
+    @pyqtSlot(bool)
+    def on_localCheckBox_clicked(self, checked):
+        """
+        Private slot handling the switching of the local mode.
+        
+        @param checked state of the local check box (boolean)
+        """
+        self.__refresh()
+    
+    @pyqtSlot(str)
+    def on_requirementsFileEdit_textChanged(self, txt):
+        """
+        Private slot handling a change of the requirements file name.
+        
+        @param txt name of the requirements file (string)
+        """
+        self.__updateButtons()
+    
+    @pyqtSlot()
+    def on_fileButton_clicked(self):
+        """
+        Private slot to enter the requirements file via a file selection
+        dialog.
+        """
+        fileName = E5FileDialog.getOpenFileName(
+            self,
+            self.tr("Select the requirements file"),
+            self.requirementsFileEdit.text() or os.path.expanduser("~"),
+            self.tr("Text Files (*.txt);;All Files (*)")
+        )
+        if fileName:
+            self.requirementsFileEdit.setText(
+                Utilities.toNativeSeparators(fileName))
+    
+    @pyqtSlot()
+    def on_requirementsEdit_textChanged(self):
+        """
+        Private slot handling changes of the requirements text.
+        """
+        self.__requirementsEdited = True
+    
+    @pyqtSlot(QAbstractButton)
+    def on_buttonBox_clicked(self, button):
+        """
+        Private slot called by a button of the button box clicked.
+        
+        @param button button that was clicked (QAbstractButton)
+        """
+        if button == self.buttonBox.button(QDialogButtonBox.Close):
+            self.close()
+        elif button == self.__refreshButton:
+            self.__refresh()
+    
+    def __refresh(self):
+        """
+        Private slot to refresh the displayed list.
+        """
+        if self.__requirementsEdited:
+            ok = E5MessageBox.yesNo(
+                self,
+                self.tr("Generate Requirements"),
+                self.tr("""The requirements were changed. Do you want"""
+                        """ to overwrite these changes?"""))
+        else:
+            ok = True
+        if ok:
+            self.start()
+    
+    def start(self):
+        """
+        Public method to start the command.
+        """
+        self.requirementsEdit.clear()
+        self.__requirementsAvailable = False
+        
+        command = self.pipComboBox.currentText()
+        if command == self.__default:
+            command = ""
+        
+        args = ["freeze"]
+        if self.localCheckBox.isChecked():
+            args.append("--local")
+        if self.requirementsFileEdit.text():
+            fileName = Utilities.toNativeSeparators(
+                self.requirementsFileEdit.text())
+            if os.path.exists(fileName):
+                args.append("--requirement")
+                args.append(fileName)
+        
+        QApplication.setOverrideCursor(Qt.WaitCursor)
+        success, output = self.__pip.runProcess(
+            args, cmd=command)
+        
+        if success:
+            self.requirementsEdit.setPlainText(output)
+            self.__requirementsAvailable = True
+        else:
+            self.requirementsEdit.setPlainText(
+                self.tr("No output generated by 'pip freeze'."))
+        
+        QApplication.restoreOverrideCursor()
+        self.__updateButtons()
+        
+        self.__requirementsEdited = False
+    
+    def __updateButtons(self):
+        """
+        Private method to set the state of the various buttons.
+        """
+        self.saveButton.setEnabled(
+            self.__requirementsAvailable and
+            bool(self.requirementsFileEdit.text())
+        )
+        self.saveToButton.setEnabled(self.__requirementsAvailable)
+        self.copyButton.setEnabled(self.__requirementsAvailable)
+        
+        aw = e5App().getObject("ViewManager").activeWindow()
+        if aw and self.__requirementsAvailable:
+            self.insertButton.setEnabled(True)
+            self.replaceAllButton.setEnabled(True)
+            self.replaceSelectionButton.setEnabled(
+                aw.hasSelectedText())
+        else:
+            self.insertButton.setEnabled(False)
+            self.replaceAllButton.setEnabled(False)
+            self.replaceSelectionButton.setEnabled(False)
+    
+    def __writeToFile(self, fileName):
+        """
+        Private method to write the requirements text to a file.
+        
+        @param fileName name of the file to write to (string)
+        """
+        if os.path.exists(fileName):
+            ok = E5MessageBox.warning(
+                self,
+                self.tr("Generate Requirements"),
+                self.tr("""The file <b>{0}</b> already exists. Do you want"""
+                        """ to overwrite it?""").format(fileName))
+            if not ok:
+                return
+        
+        try:
+            f = open(fileName, "w")
+            f.write(self.requirementsEdit.toPlainText())
+            f.close()
+        except (OSError, IOError) as err:
+            E5MessageBox.critical(
+                self,
+                self.tr("Generate Requirements"),
+                self.tr("""<p>The requirements could not be written"""
+                        """ to <b>{0}</b>.</p><p>Reason: {1}</p>""")
+                .format(fileName, str(err)))
+    
+    @pyqtSlot()
+    def on_saveButton_clicked(self):
+        """
+        Private slot to save the requirements text to the requirements file.
+        """
+        fileName = self.requirementsFileEdit.text()
+        self.__writeToFile(fileName)
+    
+    @pyqtSlot()
+    def on_saveToButton_clicked(self):
+        """
+        Private slot to write the requirements text to a new file.
+        """
+        fileName, selectedFilter = E5FileDialog.getSaveFileNameAndFilter(
+            self,
+            self.tr("Generate Requirements"),
+            os.path.expanduser("~"),
+            self.tr("Text Files (*.txt);;All Files (*)"),
+            None,
+            E5FileDialog.Options(E5FileDialog.DontConfirmOverwrite)
+        )
+        if fileName:
+            ext = os.path.splitext(fileName)[1]
+            if not ext:
+                ex = selectedFilter.split("(*")[1].split(")")[0]
+                if ex:
+                    fileName += ex
+            self.__writeToFile(fileName)
+    
+    @pyqtSlot()
+    def on_copyButton_clicked(self):
+        """
+        Private slot to copy the requirements text to the clipboard.
+        """
+        txt = self.requirementsEdit.toPlainText()
+        cb = QApplication.clipboard()
+        cb.setText(txt)
+    
+    @pyqtSlot()
+    def on_insertButton_clicked(self):
+        """
+        Private slot to insert the requirements text at the cursor position
+        of the current editor.
+        """
+        aw = e5App().getObject("ViewManager").activeWindow()
+        if aw:
+            aw.beginUndoAction()
+            aw.insert(self.requirementsEdit.toPlainText())
+            aw.endUndoAction()
+    
+    @pyqtSlot()
+    def on_replaceSelectionButton_clicked(self):
+        """
+        Private slot to replace the selected text of the current editor
+        with the requirements text.
+        """
+        aw = e5App().getObject("ViewManager").activeWindow()
+        if aw:
+            aw.beginUndoAction()
+            aw.replaceSelectedText(self.requirementsEdit.toPlainText())
+            aw.endUndoAction()
+    
+    @pyqtSlot()
+    def on_replaceAllButton_clicked(self):
+        """
+        Private slot to replace the text of the current editor with the
+        requirements text.
+        """
+        aw = e5App().getObject("ViewManager").activeWindow()
+        if aw:
+            aw.setText(self.requirementsEdit.toPlainText())
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Plugins/UiExtensionPlugins/PipInterface/PipFreezeDialog.ui	Sat Dec 09 18:32:08 2017 +0100
@@ -0,0 +1,212 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>PipFreezeDialog</class>
+ <widget class="QDialog" name="PipFreezeDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>600</width>
+    <height>550</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Generate Requirements</string>
+  </property>
+  <property name="toolTip">
+   <string>Replace the current selection with the requirements text</string>
+  </property>
+  <property name="sizeGripEnabled">
+   <bool>true</bool>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <widget class="QComboBox" name="pipComboBox">
+     <property name="toolTip">
+      <string>Select the pip command to use</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QCheckBox" name="localCheckBox">
+     <property name="toolTip">
+      <string>Select to show requirements for locally-installed packages only</string>
+     </property>
+     <property name="text">
+      <string>Local packages only</string>
+     </property>
+     <property name="checked">
+      <bool>true</bool>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <item>
+      <widget class="QLabel" name="label">
+       <property name="text">
+        <string>Requirements File:</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QLineEdit" name="requirementsFileEdit">
+       <property name="toolTip">
+        <string>Enter the path of a requirements file</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QToolButton" name="fileButton">
+       <property name="toolTip">
+        <string>Select the requirements file through a file selection dialog</string>
+       </property>
+       <property name="text">
+        <string notr="true"/>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <layout class="QGridLayout" name="gridLayout">
+     <item row="0" column="0" rowspan="7">
+      <widget class="QPlainTextEdit" name="requirementsEdit">
+       <property name="tabChangesFocus">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+     <item row="0" column="1">
+      <widget class="QPushButton" name="saveButton">
+       <property name="toolTip">
+        <string>Press to save to the requirements file</string>
+       </property>
+       <property name="text">
+        <string>Save</string>
+       </property>
+      </widget>
+     </item>
+     <item row="1" column="1">
+      <widget class="QPushButton" name="saveToButton">
+       <property name="toolTip">
+        <string>Save to a new file</string>
+       </property>
+       <property name="text">
+        <string>Save To</string>
+       </property>
+      </widget>
+     </item>
+     <item row="2" column="1">
+      <widget class="QPushButton" name="copyButton">
+       <property name="toolTip">
+        <string>Copy the requirements text to the clipboard</string>
+       </property>
+       <property name="text">
+        <string>Copy</string>
+       </property>
+      </widget>
+     </item>
+     <item row="3" column="1">
+      <widget class="QPushButton" name="insertButton">
+       <property name="toolTip">
+        <string>Insert the requirements text at the cursor position</string>
+       </property>
+       <property name="text">
+        <string>Insert</string>
+       </property>
+      </widget>
+     </item>
+     <item row="4" column="1">
+      <widget class="QPushButton" name="replaceSelectionButton">
+       <property name="text">
+        <string>Replace Selection</string>
+       </property>
+      </widget>
+     </item>
+     <item row="5" column="1">
+      <widget class="QPushButton" name="replaceAllButton">
+       <property name="toolTip">
+        <string>Replace all text with the requirements text</string>
+       </property>
+       <property name="text">
+        <string>Replace All</string>
+       </property>
+      </widget>
+     </item>
+     <item row="6" column="1">
+      <spacer name="verticalSpacer">
+       <property name="orientation">
+        <enum>Qt::Vertical</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>20</width>
+         <height>40</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Close</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <tabstops>
+  <tabstop>pipComboBox</tabstop>
+  <tabstop>localCheckBox</tabstop>
+  <tabstop>requirementsFileEdit</tabstop>
+  <tabstop>fileButton</tabstop>
+  <tabstop>requirementsEdit</tabstop>
+  <tabstop>saveButton</tabstop>
+  <tabstop>saveToButton</tabstop>
+  <tabstop>copyButton</tabstop>
+  <tabstop>insertButton</tabstop>
+  <tabstop>replaceSelectionButton</tabstop>
+  <tabstop>replaceAllButton</tabstop>
+ </tabstops>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>PipFreezeDialog</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>PipFreezeDialog</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/Plugins/UiExtensionPlugins/PipInterface/PipListDialog.py	Sat Dec 09 18:32:08 2017 +0100
@@ -0,0 +1,516 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2015 - 2017 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a dialog to list installed packages.
+"""
+
+from __future__ import unicode_literals
+try:
+    str = unicode       # __IGNORE_EXCEPTION__
+except NameError:
+    pass
+
+import json
+
+from PyQt5.QtCore import pyqtSlot, Qt, QProcess, QTimer
+from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QAbstractButton, \
+    QApplication, QTreeWidgetItem, QHeaderView
+
+from E5Gui import E5MessageBox
+
+from .Ui_PipListDialog import Ui_PipListDialog
+
+import Preferences
+
+
+class PipListDialog(QDialog, Ui_PipListDialog):
+    """
+    Class implementing a dialog to list installed packages.
+    """
+    CommandArguments = {
+        "list": ["list", "--format=json"],
+        "uptodate": ["list", "--uptodate", "--format=json"],
+        "outdated": ["list", "--outdated", "--format=json"],
+    }
+    
+    ShowProcessGeneralMode = 0
+    ShowProcessClassifiersMode = 1
+    ShowProcessEntryPointsMode = 2
+    ShowProcessFilesListMode = 3
+    
+    def __init__(self, pip, mode, plugin, title, parent=None):
+        """
+        Constructor
+        
+        @param pip reference to the master object (Pip)
+        @param mode list command mode (string; one of 'list',
+            'uptodate', 'outdated')
+        @param plugin reference to the plugin object (ToolPipPlugin)
+        @param title title of the dialog (string)
+        @param parent reference to the parent widget (QWidget)
+        """
+        assert mode in PipListDialog.CommandArguments
+        
+        super(PipListDialog, self).__init__(parent)
+        self.setupUi(self)
+        self.setWindowFlags(Qt.Window)
+        
+        self.setWindowTitle(title)
+        
+        self.__refreshButton = self.buttonBox.addButton(
+            self.tr("&Refresh"), QDialogButtonBox.ActionRole)
+        self.__refreshButton.setEnabled(False)
+        if mode == "outdated":
+            self.__upgradeButton = self.buttonBox.addButton(
+                self.tr("Up&grade"), QDialogButtonBox.ActionRole)
+            self.__upgradeButton.setEnabled(False)
+            self.__upgradeAllButton = self.buttonBox.addButton(
+                self.tr("Upgrade &All"), QDialogButtonBox.ActionRole)
+            self.__upgradeAllButton.setEnabled(False)
+        else:
+            self.__upgradeButton = None
+            self.__upgradeAllButton = None
+        self.__uninstallButton = self.buttonBox.addButton(
+            self.tr("&Uninstall"), QDialogButtonBox.ActionRole)
+        self.__uninstallButton.setEnabled(False)
+        
+        self.__pip = pip
+        self.__mode = mode
+        self.__defaultCommand = plugin.getPreferences("CurrentPipExecutable")
+        self.__ioEncoding = Preferences.getSystem("IOEncoding")
+        self.__errors = ""
+        self.__output = []
+        
+        self.__nothingStrings = {
+            "list": self.tr("Nothing to show"),
+            "uptodate": self.tr("All packages outdated"),
+            "outdated": self.tr("All packages up-to-date"),
+        }
+        
+        self.__default = self.tr("<Default>")
+        pipExecutables = sorted(plugin.getPreferences("PipExecutables"))
+        self.pipComboBox.addItem(self.__default)
+        self.pipComboBox.addItems(pipExecutables)
+        
+        if mode == "list":
+            self.infoLabel.setText(self.tr("Installed Packages:"))
+            self.packageList.setHeaderLabels([
+                self.tr("Package"),
+                self.tr("Version"),
+            ])
+        elif mode == "uptodate":
+            self.infoLabel.setText(self.tr("Up-to-date Packages:"))
+            self.packageList.setHeaderLabels([
+                self.tr("Package"),
+                self.tr("Version"),
+            ])
+        elif mode == "outdated":
+            self.infoLabel.setText(self.tr("Outdated Packages:"))
+            self.packageList.setHeaderLabels([
+                self.tr("Package"),
+                self.tr("Current Version"),
+                self.tr("Latest Version"),
+                self.tr("Package Type"),
+            ])
+        
+        self.packageList.header().setSortIndicator(0, Qt.AscendingOrder)
+        
+        self.__infoLabels = {
+            "name": self.tr("Name:"),
+            "version": self.tr("Version:"),
+            "location": self.tr("Location:"),
+            "requires": self.tr("Requires:"),
+            "summary": self.tr("Summary:"),
+            "home-page": self.tr("Homepage:"),
+            "author": self.tr("Author:"),
+            "author-email": self.tr("Author Email:"),
+            "license": self.tr("License:"),
+            "metadata-version": self.tr("Metadata Version:"),
+            "installer": self.tr("Installer:"),
+            "classifiers": self.tr("Classifiers:"),
+            "entry-points": self.tr("Entry Points:"),
+            "files": self.tr("Files:"),
+        }
+        self.infoWidget.setHeaderLabels(["Key", "Value"])
+        
+        self.process = QProcess()
+        self.process.finished.connect(self.__procFinished)
+        self.process.readyReadStandardOutput.connect(self.__readStdout)
+        self.process.readyReadStandardError.connect(self.__readStderr)
+        
+        self.show()
+        QApplication.processEvents()
+    
+    def __stopProcess(self):
+        """
+        Private slot to stop the running process.
+        """
+        if self.process.state() != QProcess.NotRunning:
+            self.process.terminate()
+            QTimer.singleShot(2000, self.process.kill)
+            self.process.waitForFinished(3000)
+        
+        QApplication.restoreOverrideCursor()
+    
+    def closeEvent(self, e):
+        """
+        Protected slot implementing a close event handler.
+        
+        @param e close event (QCloseEvent)
+        """
+        self.__stopProcess()
+        e.accept()
+    
+    def __finish(self):
+        """
+        Private slot called when the process finished or the user pressed
+        the cancel button.
+        """
+        self.__stopProcess()
+        
+        self.__processOutput()
+        
+        self.buttonBox.button(QDialogButtonBox.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.Close).setDefault(True)
+        self.buttonBox.button(QDialogButtonBox.Close).setFocus(
+            Qt.OtherFocusReason)
+        self.__refreshButton.setEnabled(True)
+        
+        if self.packageList.topLevelItemCount() == 0:
+            QTreeWidgetItem(self.packageList,
+                            [self.__nothingStrings[self.__mode]])
+            if self.__errors and not self.__errors.startswith("DEPRECATION"):
+                E5MessageBox.critical(
+                    self,
+                    self.windowTitle(),
+                    self.tr("""<p>The pip command failed.</p>"""
+                            """<p>Reason: {0}</p>""").format(
+                        self.__errors.replace("\r\n", "<br/>")
+                            .replace("\n", "<br/>").replace("\r", "<br/>")
+                            .replace(" ", "&nbsp;")))
+            if self.__upgradeAllButton is not None:
+                self.__upgradeAllButton.setEnabled(False)
+        else:
+            if self.__upgradeAllButton is not None:
+                self.__upgradeAllButton.setEnabled(True)
+        
+        self.packageList.sortItems(
+            0,
+            self.packageList.header().sortIndicatorOrder())
+        self.packageList.header().resizeSections(
+            QHeaderView.ResizeToContents)
+        self.packageList.header().setStretchLastSection(True)
+    
+    @pyqtSlot(QAbstractButton)
+    def on_buttonBox_clicked(self, button):
+        """
+        Private slot called by a button of the button box clicked.
+        
+        @param button button that was clicked (QAbstractButton)
+        """
+        if button == self.buttonBox.button(QDialogButtonBox.Close):
+            self.close()
+        elif button == self.buttonBox.button(QDialogButtonBox.Cancel):
+            self.__finish()
+        elif button == self.__refreshButton:
+            self.__refresh()
+        elif button == self.__upgradeButton:
+            self.__upgradePackages()
+        elif button == self.__upgradeAllButton:
+            self.__upgradeAllPackages()
+        elif button == self.__uninstallButton:
+            self.__uninstallPackages()
+    
+    def __procFinished(self, exitCode, exitStatus):
+        """
+        Private slot connected to the finished signal.
+        
+        @param exitCode exit code of the process (integer)
+        @param exitStatus exit status of the process (QProcess.ExitStatus)
+        """
+        self.__finish()
+    
+    def __refresh(self):
+        """
+        Private slot to refresh the displayed list.
+        """
+        self.__stopProcess()
+        self.start()
+    
+    def start(self):
+        """
+        Public method to start the command.
+        """
+        self.packageList.clear()
+        self.__errors = ""
+        self.__output = []
+        
+        self.buttonBox.button(QDialogButtonBox.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.Cancel).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.Cancel).setDefault(True)
+        self.__refreshButton.setEnabled(False)
+        QApplication.processEvents()
+        
+        QApplication.setOverrideCursor(Qt.WaitCursor)
+        QApplication.processEvents()
+        
+        command = self.pipComboBox.currentText()
+        if command == self.__default:
+            command = self.__defaultCommand
+        
+        args = PipListDialog.CommandArguments[self.__mode][:]
+        if self.localCheckBox.isChecked():
+            args.append("--local")
+        if self.notRequiredCheckBox.isChecked():
+            args.append("--not-required")
+        
+        self.process.start(command, args)
+        procStarted = self.process.waitForStarted(5000)
+        if not procStarted:
+            self.buttonBox.setFocus()
+            self.__stopProcess()
+            E5MessageBox.critical(
+                self,
+                self.tr('Process Generation Error'),
+                self.tr(
+                    'The process {0} could not be started.'
+                ).format(command))
+            self.__finish()
+    
+    def __processOutput(self):
+        """
+        Private method to process the captured output.
+        """
+        if self.__output:
+            packageData = json.loads("\n".join(self.__output))
+            for package in packageData:
+                data = [
+                    package["name"],
+                    package["version"],
+                ]
+                if self.__mode == "outdated":
+                    data.extend([
+                        package["latest_version"],
+                        package["latest_filetype"],
+                    ])
+                QTreeWidgetItem(self.packageList, data)
+    
+    def __readStdout(self):
+        """
+        Private slot to handle the readyReadStandardOutput signal.
+        
+        It reads the output of the process, formats it and inserts it into
+        the contents pane.
+        """
+        self.process.setReadChannel(QProcess.StandardOutput)
+        
+        while self.process.canReadLine():
+            line = str(self.process.readLine(), self.__ioEncoding,
+                       'replace').strip()
+            self.__output.append(line)
+    
+    def __readStderr(self):
+        """
+        Private slot to handle the readyReadStandardError signal.
+        
+        It reads the error output of the process and inserts it into the
+        error pane.
+        """
+        self.__errors += str(self.process.readAllStandardError(),
+                             self.__ioEncoding, 'replace')
+    
+    @pyqtSlot(str)
+    def on_pipComboBox_activated(self, txt):
+        """
+        Private slot handling the selection of a pip executable.
+        
+        @param txt path of the pip executable (string)
+        """
+        self.__refresh()
+    
+    @pyqtSlot(bool)
+    def on_localCheckBox_clicked(self, checked):
+        """
+        Private slot handling the switching of the local mode.
+        
+        @param checked state of the local check box (boolean)
+        """
+        self.__refresh()
+    
+    @pyqtSlot(bool)
+    def on_notRequiredCheckBox_clicked(self, checked):
+        """
+        Private slot handling the switching of the 'not required' mode.
+        
+        @param checked state of the 'not required' check box (boolean)
+        """
+        self.__refresh()
+    
+    @pyqtSlot()
+    def on_packageList_itemSelectionChanged(self):
+        """
+        Private slot handling the selection of a package.
+        """
+        self.infoWidget.clear()
+        
+        if len(self.packageList.selectedItems()) == 1:
+            itm = self.packageList.selectedItems()[0]
+            
+            command = self.pipComboBox.currentText()
+            if command == self.__default:
+                command = ""
+            
+            QApplication.setOverrideCursor(Qt.WaitCursor)
+            
+            args = ["show"]
+            if self.verboseCheckBox.isChecked():
+                args.append("--verbose")
+            if self.installedFilesCheckBox.isChecked():
+                args.append("--files")
+            args.append(itm.text(0))
+            success, output = self.__pip.runProcess(args, cmd=command)
+            
+            if success and output:
+                mode = PipListDialog.ShowProcessGeneralMode
+                for line in output.splitlines():
+                    line = line.rstrip()
+                    if line != "---":
+                        if mode != PipListDialog.ShowProcessGeneralMode:
+                            if line[0] == " ":
+                                QTreeWidgetItem(
+                                    self.infoWidget,
+                                    [" ", line.strip()])
+                            else:
+                                mode = PipListDialog.ShowProcessGeneralMode
+                        if mode == PipListDialog.ShowProcessGeneralMode:
+                            try:
+                                label, info = line.split(": ", 1)
+                            except ValueError:
+                                label = line[:-1]
+                                info = ""
+                            label = label.lower()
+                            if label in self.__infoLabels:
+                                QTreeWidgetItem(
+                                    self.infoWidget,
+                                    [self.__infoLabels[label], info])
+                            if label == "files":
+                                mode = PipListDialog.ShowProcessFilesListMode
+                            elif label == "classifiers":
+                                mode = PipListDialog.ShowProcessClassifiersMode
+                            elif label == "entry-points":
+                                mode = PipListDialog.ShowProcessEntryPointsMode
+                self.infoWidget.scrollToTop()
+            
+            header = self.infoWidget.header()
+            header.setStretchLastSection(False)
+            header.resizeSections(QHeaderView.ResizeToContents)
+            if header.sectionSize(0) + header.sectionSize(1) < header.width():
+                header.setStretchLastSection(True)
+            
+            QApplication.restoreOverrideCursor()
+        
+        enable = (len(self.packageList.selectedItems()) > 1 or
+                  (len(self.packageList.selectedItems()) == 1 and
+                   self.packageList.selectedItems()[0].text(0) not in
+                   self.__nothingStrings.values()))
+        self.__upgradeButton and self.__upgradeButton.setEnabled(enable)
+        self.__uninstallButton.setEnabled(enable)
+    
+    @pyqtSlot(bool)
+    def on_verboseCheckBox_clicked(self, checked):
+        """
+        Private slot to handle a change of the verbose package information
+        checkbox.
+        
+        @param checked state of the checkbox
+        @type bool
+        """
+        self.on_packageList_itemSelectionChanged()
+    
+    @pyqtSlot(bool)
+    def on_installedFilesCheckBox_clicked(self, checked):
+        """
+        Private slot to handle a change of the installed files information
+        checkbox.
+        
+        @param checked state of the checkbox
+        @type bool
+        """
+        self.on_packageList_itemSelectionChanged()
+    
+    def __upgradePackages(self):
+        """
+        Private slot to upgrade the selected packages.
+        """
+        packages = []
+        for itm in self.packageList.selectedItems():
+            packages.append(itm.text(0))
+        
+        if packages:
+            if "pip" in packages:
+                self.__upgradePip()
+            else:
+                self.__executeUpgradePackages(packages)
+    
+    def __upgradeAllPackages(self):
+        """
+        Private slot to upgrade all listed packages.
+        """
+        packages = []
+        for index in range(self.packageList.topLevelItemCount()):
+            itm = self.packageList.topLevelItem(index)
+            packages.append(itm.text(0))
+        
+        if packages:
+            if "pip" in packages:
+                self.__upgradePip()
+            else:
+                self.__executeUpgradePackages(packages)
+    
+    def __upgradePip(self):
+        """
+        Private slot to upgrade pip itself.
+        """
+        pip = self.pipComboBox.currentText()
+        if pip == self.__default:
+            pip = ""
+
+        res = self.__pip.upgradePip(pip=pip)
+        if res:
+            self.__refresh()
+
+    def __executeUpgradePackages(self, packages):
+        """
+        Private method to execute the pip upgrade command.
+        
+        @param packages list of package names to be upgraded
+        @type list of str
+        """
+        command = self.pipComboBox.currentText()
+        if command == self.__default:
+            command = ""
+
+        res = self.__pip.upgradePackages(packages, cmd=command)
+        if res:
+            self.__refresh()
+    
+    def __uninstallPackages(self):
+        """
+        Private slot to uninstall the selected packages.
+        """
+        packages = []
+        for itm in self.packageList.selectedItems():
+            packages.append(itm.text(0))
+        
+        if packages:
+            command = self.pipComboBox.currentText()
+            if command == self.__default:
+                command = ""
+            
+            res = self.__pip.uninstallPackages(packages, cmd=command)
+            if res:
+                self.__refresh()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Plugins/UiExtensionPlugins/PipInterface/PipListDialog.ui	Sat Dec 09 18:32:08 2017 +0100
@@ -0,0 +1,225 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>PipListDialog</class>
+ <widget class="QDialog" name="PipListDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>600</width>
+    <height>550</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Package List</string>
+  </property>
+  <property name="sizeGripEnabled">
+   <bool>true</bool>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout_2">
+   <item>
+    <widget class="QComboBox" name="pipComboBox">
+     <property name="toolTip">
+      <string>Select the pip command to use</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <item>
+      <widget class="QLabel" name="infoLabel">
+       <property name="text">
+        <string notr="true">TextLabel</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <spacer name="horizontalSpacer">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <widget class="QCheckBox" name="localCheckBox">
+       <property name="toolTip">
+        <string>Select to show only locally-installed packages</string>
+       </property>
+       <property name="text">
+        <string>Local packages only</string>
+       </property>
+       <property name="checked">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QCheckBox" name="notRequiredCheckBox">
+       <property name="toolTip">
+        <string>Select to list packages that are not dependencies of installed packages</string>
+       </property>
+       <property name="text">
+        <string>Not required Packages</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <widget class="QSplitter" name="splitter">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="childrenCollapsible">
+      <bool>false</bool>
+     </property>
+     <widget class="QTreeWidget" name="packageList">
+      <property name="sizePolicy">
+       <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+        <horstretch>0</horstretch>
+        <verstretch>3</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>
+      <property name="itemsExpandable">
+       <bool>false</bool>
+      </property>
+      <property name="sortingEnabled">
+       <bool>true</bool>
+      </property>
+      <column>
+       <property name="text">
+        <string notr="true">1</string>
+       </property>
+      </column>
+     </widget>
+     <widget class="QWidget" name="widget" native="true">
+      <property name="sizePolicy">
+       <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+        <horstretch>0</horstretch>
+        <verstretch>1</verstretch>
+       </sizepolicy>
+      </property>
+      <layout class="QVBoxLayout" name="verticalLayout">
+       <property name="leftMargin">
+        <number>0</number>
+       </property>
+       <property name="topMargin">
+        <number>0</number>
+       </property>
+       <property name="rightMargin">
+        <number>0</number>
+       </property>
+       <property name="bottomMargin">
+        <number>0</number>
+       </property>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_2">
+         <item>
+          <widget class="QCheckBox" name="verboseCheckBox">
+           <property name="toolTip">
+            <string>Select to show verbose package information</string>
+           </property>
+           <property name="text">
+            <string>Verbose Package Information</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QCheckBox" name="installedFilesCheckBox">
+           <property name="toolTip">
+            <string>Select to show information about installed files</string>
+           </property>
+           <property name="text">
+            <string>Installed Files Information</string>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <widget class="QTreeWidget" name="infoWidget">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+           <horstretch>0</horstretch>
+           <verstretch>1</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="alternatingRowColors">
+          <bool>true</bool>
+         </property>
+         <property name="rootIsDecorated">
+          <bool>false</bool>
+         </property>
+         <property name="itemsExpandable">
+          <bool>false</bool>
+         </property>
+         <property name="allColumnsShowFocus">
+          <bool>true</bool>
+         </property>
+         <property name="wordWrap">
+          <bool>true</bool>
+         </property>
+         <property name="columnCount">
+          <number>2</number>
+         </property>
+         <attribute name="headerVisible">
+          <bool>false</bool>
+         </attribute>
+         <attribute name="headerStretchLastSection">
+          <bool>false</bool>
+         </attribute>
+         <column>
+          <property name="text">
+           <string notr="true">1</string>
+          </property>
+         </column>
+         <column>
+          <property name="text">
+           <string notr="true">2</string>
+          </property>
+         </column>
+        </widget>
+       </item>
+      </layout>
+     </widget>
+    </widget>
+   </item>
+   <item>
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Close</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <tabstops>
+  <tabstop>pipComboBox</tabstop>
+  <tabstop>localCheckBox</tabstop>
+  <tabstop>notRequiredCheckBox</tabstop>
+  <tabstop>packageList</tabstop>
+  <tabstop>verboseCheckBox</tabstop>
+  <tabstop>installedFilesCheckBox</tabstop>
+  <tabstop>infoWidget</tabstop>
+ </tabstops>
+ <resources/>
+ <connections/>
+</ui>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Plugins/UiExtensionPlugins/PipInterface/PipPackageDetailsDialog.py	Sat Dec 09 18:32:08 2017 +0100
@@ -0,0 +1,212 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2015 - 2017 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a dialog to show details about a package.
+"""
+
+from __future__ import unicode_literals
+try:
+    basestring    # __IGNORE_WARNING__
+except NameError:
+    basestring = str
+
+from PyQt5.QtCore import Qt, QLocale
+from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QTreeWidgetItem, \
+    QLabel, QHeaderView
+
+from .Ui_PipPackageDetailsDialog import Ui_PipPackageDetailsDialog
+
+
+class PipPackageDetailsDialog(QDialog, Ui_PipPackageDetailsDialog):
+    """
+    Class documentation goes here.
+    """
+    def __init__(self, detailsData, downloadsData, parent=None):
+        """
+        Constructor
+        
+        @param detailsData package details (dict)
+        @param downloadsData downloads information (dict)
+        @param parent reference to the parent widget (QWidget)
+        """
+        super(PipPackageDetailsDialog, self).__init__(parent)
+        self.setupUi(self)
+        
+        self.__locale = QLocale()
+        self.__packageTypeMap = {
+            "sdist": self.tr("Source"),
+            "bdist_wheel": self.tr("Python Wheel"),
+            "bdist_egg": self.tr("Python Egg"),
+            "bdist_wininst": self.tr("MS Windows Installer"),
+            "bdist_msi": self.tr("MS Windows Installer"),
+            "bdist_rpm": self.tr("Unix Installer"),
+            "bdist_deb": self.tr("Unix Installer"),
+            "bdist_dumb": self.tr("Archive"),
+        }
+        
+        self.__populateDetails(detailsData)
+        self.__populateDownloadUrls(downloadsData)
+        self.__populateRequiresProvides(detailsData)
+    
+    def __populateDetails(self, detailsData):
+        """
+        Private method to populate the details tab.
+        
+        @param detailsData package details (dict)
+        """
+        self.packageNameLabel.setText(
+            "<h1>{0} {1}</h1".format(self.__sanitize(detailsData["name"]),
+                                     self.__sanitize(detailsData["version"])))
+        self.summaryLabel.setText(
+            self.__sanitize(detailsData["summary"][:240]))
+        self.descriptionEdit.setPlainText(
+            self.__sanitize(detailsData["description"]))
+        self.authorLabel.setText(self.__sanitize(detailsData["author"]))
+        self.authorEmailLabel.setText(
+            '<a href="mailto:{0}">{0}</a>'.format(
+                self.__sanitize(detailsData["author_email"])))
+        self.licenseLabel.setText(self.__sanitize(detailsData["license"]))
+        self.platformLabel.setText(self.__sanitize(detailsData["platform"]))
+        self.homePageLabel.setText(
+            '<a href="{0}">{0}</a>'.format(
+                self.__sanitize(detailsData["home_page"], forUrl=True)))
+        self.packageUrlLabel.setText(
+            '<a href="{0}">{0}</a>'.format(
+                self.__sanitize(detailsData["package_url"], forUrl=True)))
+        self.releaseUrlLabel.setText(
+            '<a href="{0}">{0}</a>'.format(
+                self.__sanitize(detailsData["release_url"], forUrl=True)))
+        self.docsUrlLabel.setText(
+            '<a href="{0}">{0}</a>'.format(
+                self.__sanitize(detailsData["docs_url"], forUrl=True)))
+        self.downloadsDayLabel.setText(self.__locale.toString(
+            detailsData["downloads"]["last_day"]))
+        self.downloadsWeekLabel.setText(self.__locale.toString(
+            detailsData["downloads"]["last_week"]))
+        self.downloadsMonthLabel.setText(self.__locale.toString(
+            detailsData["downloads"]["last_month"]))
+        self.classifiersList.addItems(detailsData["classifiers"])
+        
+        self.buttonBox.button(QDialogButtonBox.Close).setDefault(True)
+        self.buttonBox.button(QDialogButtonBox.Close).setFocus(
+            Qt.OtherFocusReason)
+    
+    def __populateDownloadUrls(self, downloadsData):
+        """
+        Private method to populate the download URLs tab.
+        
+        @param downloadsData downloads information (dict)
+        """
+        index = self.infoWidget.indexOf(self.urls)
+        if downloadsData:
+            self.infoWidget.setTabEnabled(index, True)
+            for download in downloadsData:
+                itm = QTreeWidgetItem(self.downloadUrlsList, [
+                    "",
+                    self.__packageTypeMap[download["packagetype"]]
+                    if download["packagetype"] in self.__packageTypeMap
+                    else "",
+                    download["python_version"]
+                    if download["python_version"] != "source"
+                    else "",
+                    self.__locale.toString(download["downloads"]),
+                    self.__formatUploadDate(download["upload_time"]),
+                    self.__formatSize(download["size"]),
+                ])
+                if download["has_sig"]:
+                    pgpLink = ' (<a href="{0}">pgp</a>)'.format(
+                        download["url"] + ".asc")
+                else:
+                    pgpLink = ""
+                urlLabel = QLabel('<a href="{0}#md5={2}">{1}</a>{3}'.format(
+                    download["url"], download["filename"],
+                    download["md5_digest"], pgpLink))
+                urlLabel.setTextInteractionFlags(Qt.LinksAccessibleByMouse)
+                urlLabel.setOpenExternalLinks(True)
+                self.downloadUrlsList.setItemWidget(itm, 0, urlLabel)
+            header = self.downloadUrlsList.header()
+            header.resizeSections(QHeaderView.ResizeToContents)
+        else:
+            self.infoWidget.setTabEnabled(index, False)
+    
+    def __populateRequiresProvides(self, detailsData):
+        """
+        Private method to populate the requires/provides tab.
+        
+        @param detailsData package details (dict)
+        """
+        populated = False
+        
+        if "requires" in detailsData:
+            self.requiredPackagesList.addItems(detailsData["requires"])
+            populated = True
+        if "requires_dist" in detailsData:
+            self.requiredDistributionsList.addItems(
+                detailsData["requires_dist"])
+            populated = True
+        if "provides" in detailsData:
+            self.providedPackagesList.addItems(detailsData["provides"])
+            populated = True
+        if "provides_dist" in detailsData:
+            self.providedDistributionsList.addItems(
+                detailsData["provides_dist"])
+            populated = True
+        
+        index = self.infoWidget.indexOf(self.requires)
+        self.infoWidget.setTabEnabled(index, populated)
+    
+    def __sanitize(self, text, forUrl=False):
+        """
+        Private method to clean-up the given text.
+        
+        @param text raw text (string)
+        @param forUrl flag indicating to sanitize an URL text (boolean)
+        @return processed text (string)
+        """
+        if text == "UNKNOWN":
+            text = ""
+        elif text == "any":
+            text = self.tr("any")
+        elif text is None:
+            text = ""
+        if forUrl:
+            if not isinstance(text, basestring) or \
+                    not text.startswith(("http://", "https://", "ftp://")):
+                # ignore if the schema is not one of the listed ones
+                text = ""
+        
+        return text
+    
+    def __formatUploadDate(self, datetime):
+        """
+        Private method to format the upload date.
+        
+        @param datetime upload date and time (xmlrpc.DateTime)
+        @return formatted date string (string)
+        """
+        date = datetime.value.split("T")[0]
+        return "{0}-{1}-{2}".format(date[:4], date[4:6], date[6:])
+    
+    def __formatSize(self, size):
+        """
+        Private slot to format the size.
+        
+        @param size size to be formatted (integer)
+        @return formatted size (string)
+        """
+        unit = ""
+        if size < 1024:
+            unit = self.tr("B")
+        elif size < 1024 * 1024:
+            size /= 1024
+            unit = self.tr("KB")
+        elif size < 1024 * 1024 * 1024:
+            size /= 1024 * 1024
+            unit = self.tr("MB")
+        else:
+            size /= 1024 * 1024 * 1024
+            unit = self.tr("GB")
+        return self.tr("{0:.1f} {1}", "value, unit").format(size, unit)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Plugins/UiExtensionPlugins/PipInterface/PipPackageDetailsDialog.ui	Sat Dec 09 18:32:08 2017 +0100
@@ -0,0 +1,517 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>PipPackageDetailsDialog</class>
+ <widget class="QDialog" name="PipPackageDetailsDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>800</width>
+    <height>700</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Package Details</string>
+  </property>
+  <property name="sizeGripEnabled">
+   <bool>true</bool>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <widget class="QLabel" name="packageNameLabel"/>
+   </item>
+   <item>
+    <widget class="QTabWidget" name="infoWidget">
+     <property name="currentIndex">
+      <number>0</number>
+     </property>
+     <widget class="QWidget" name="details">
+      <attribute name="title">
+       <string>Details</string>
+      </attribute>
+      <attribute name="toolTip">
+       <string>Lists package informations</string>
+      </attribute>
+      <layout class="QGridLayout" name="gridLayout_2">
+       <item row="0" column="1">
+        <widget class="QLabel" name="summaryLabel">
+         <property name="wordWrap">
+          <bool>true</bool>
+         </property>
+        </widget>
+       </item>
+       <item row="1" column="0">
+        <widget class="QLabel" name="label_3">
+         <property name="text">
+          <string>Description:</string>
+         </property>
+         <property name="alignment">
+          <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+         </property>
+        </widget>
+       </item>
+       <item row="3" column="1">
+        <widget class="QLabel" name="authorEmailLabel">
+         <property name="openExternalLinks">
+          <bool>true</bool>
+         </property>
+        </widget>
+       </item>
+       <item row="1" column="1">
+        <widget class="QPlainTextEdit" name="descriptionEdit">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+           <horstretch>0</horstretch>
+           <verstretch>5</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="tabChangesFocus">
+          <bool>true</bool>
+         </property>
+         <property name="readOnly">
+          <bool>true</bool>
+         </property>
+        </widget>
+       </item>
+       <item row="2" column="0">
+        <widget class="QLabel" name="label_4">
+         <property name="text">
+          <string>Author:</string>
+         </property>
+        </widget>
+       </item>
+       <item row="2" column="1">
+        <widget class="QLabel" name="authorLabel"/>
+       </item>
+       <item row="3" column="0">
+        <widget class="QLabel" name="label_5">
+         <property name="text">
+          <string>Author Email:</string>
+         </property>
+        </widget>
+       </item>
+       <item row="7" column="1">
+        <widget class="QLabel" name="packageUrlLabel">
+         <property name="openExternalLinks">
+          <bool>true</bool>
+         </property>
+        </widget>
+       </item>
+       <item row="4" column="0">
+        <widget class="QLabel" name="label_6">
+         <property name="text">
+          <string>License:</string>
+         </property>
+        </widget>
+       </item>
+       <item row="4" column="1">
+        <widget class="QLabel" name="licenseLabel"/>
+       </item>
+       <item row="0" column="0">
+        <widget class="QLabel" name="label">
+         <property name="text">
+          <string>Summary:</string>
+         </property>
+         <property name="alignment">
+          <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+         </property>
+        </widget>
+       </item>
+       <item row="5" column="0">
+        <widget class="QLabel" name="label_7">
+         <property name="text">
+          <string>Platform:</string>
+         </property>
+        </widget>
+       </item>
+       <item row="5" column="1">
+        <widget class="QLabel" name="platformLabel"/>
+       </item>
+       <item row="6" column="0">
+        <widget class="QLabel" name="label_8">
+         <property name="text">
+          <string>Home Page:</string>
+         </property>
+        </widget>
+       </item>
+       <item row="6" column="1">
+        <widget class="QLabel" name="homePageLabel">
+         <property name="openExternalLinks">
+          <bool>true</bool>
+         </property>
+        </widget>
+       </item>
+       <item row="7" column="0">
+        <widget class="QLabel" name="label_9">
+         <property name="text">
+          <string>Package URL:</string>
+         </property>
+        </widget>
+       </item>
+       <item row="8" column="0">
+        <widget class="QLabel" name="label_10">
+         <property name="text">
+          <string>Release URL:</string>
+         </property>
+        </widget>
+       </item>
+       <item row="8" column="1">
+        <widget class="QLabel" name="releaseUrlLabel">
+         <property name="openExternalLinks">
+          <bool>true</bool>
+         </property>
+        </widget>
+       </item>
+       <item row="9" column="0">
+        <widget class="QLabel" name="label_11">
+         <property name="text">
+          <string>Documentation URL:</string>
+         </property>
+        </widget>
+       </item>
+       <item row="9" column="1">
+        <widget class="QLabel" name="docsUrlLabel">
+         <property name="openExternalLinks">
+          <bool>true</bool>
+         </property>
+        </widget>
+       </item>
+       <item row="10" column="0">
+        <widget class="QLabel" name="label_12">
+         <property name="text">
+          <string>Downloads:</string>
+         </property>
+         <property name="alignment">
+          <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+         </property>
+        </widget>
+       </item>
+       <item row="10" column="1">
+        <layout class="QGridLayout" name="gridLayout">
+         <item row="0" column="0">
+          <widget class="QLabel" name="label_13">
+           <property name="text">
+            <string>Last Day:</string>
+           </property>
+          </widget>
+         </item>
+         <item row="0" column="1">
+          <widget class="QLabel" name="downloadsDayLabel">
+           <property name="alignment">
+            <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+           </property>
+          </widget>
+         </item>
+         <item row="0" column="2">
+          <spacer name="horizontalSpacer">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item row="1" column="0">
+          <widget class="QLabel" name="label_14">
+           <property name="text">
+            <string>Last Week:</string>
+           </property>
+          </widget>
+         </item>
+         <item row="1" column="1">
+          <widget class="QLabel" name="downloadsWeekLabel">
+           <property name="alignment">
+            <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+           </property>
+          </widget>
+         </item>
+         <item row="2" column="0">
+          <widget class="QLabel" name="label_15">
+           <property name="text">
+            <string>Last Month:</string>
+           </property>
+          </widget>
+         </item>
+         <item row="2" column="1">
+          <widget class="QLabel" name="downloadsMonthLabel">
+           <property name="alignment">
+            <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </item>
+       <item row="11" column="0">
+        <widget class="QLabel" name="label_16">
+         <property name="text">
+          <string>Classifiers:</string>
+         </property>
+         <property name="alignment">
+          <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+         </property>
+        </widget>
+       </item>
+       <item row="11" column="1">
+        <widget class="QListWidget" name="classifiersList">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+           <horstretch>0</horstretch>
+           <verstretch>1</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="alternatingRowColors">
+          <bool>true</bool>
+         </property>
+         <property name="selectionMode">
+          <enum>QAbstractItemView::NoSelection</enum>
+         </property>
+         <property name="sortingEnabled">
+          <bool>true</bool>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </widget>
+     <widget class="QWidget" name="urls">
+      <attribute name="title">
+       <string>Download URLs</string>
+      </attribute>
+      <attribute name="toolTip">
+       <string>Lists the download URLs</string>
+      </attribute>
+      <layout class="QVBoxLayout" name="verticalLayout_2">
+       <item>
+        <widget class="QTreeWidget" name="downloadUrlsList">
+         <property name="alternatingRowColors">
+          <bool>true</bool>
+         </property>
+         <property name="selectionMode">
+          <enum>QAbstractItemView::NoSelection</enum>
+         </property>
+         <property name="rootIsDecorated">
+          <bool>false</bool>
+         </property>
+         <property name="itemsExpandable">
+          <bool>false</bool>
+         </property>
+         <attribute name="headerStretchLastSection">
+          <bool>false</bool>
+         </attribute>
+         <column>
+          <property name="text">
+           <string>File</string>
+          </property>
+         </column>
+         <column>
+          <property name="text">
+           <string>Type</string>
+          </property>
+         </column>
+         <column>
+          <property name="text">
+           <string>Py Version</string>
+          </property>
+         </column>
+         <column>
+          <property name="text">
+           <string>Downloads</string>
+          </property>
+         </column>
+         <column>
+          <property name="text">
+           <string>Uploaded on</string>
+          </property>
+         </column>
+         <column>
+          <property name="text">
+           <string>Size</string>
+          </property>
+         </column>
+        </widget>
+       </item>
+      </layout>
+     </widget>
+     <widget class="QWidget" name="requires">
+      <attribute name="title">
+       <string>Requires/Provides</string>
+      </attribute>
+      <attribute name="toolTip">
+       <string>Lists required and provided packages</string>
+      </attribute>
+      <layout class="QVBoxLayout" name="verticalLayout_3">
+       <item>
+        <widget class="QGroupBox" name="groupBox">
+         <property name="title">
+          <string>Requires</string>
+         </property>
+         <layout class="QGridLayout" name="gridLayout_4">
+          <item row="0" column="0">
+           <widget class="QLabel" name="label_17">
+            <property name="text">
+             <string>Required Packages:</string>
+            </property>
+            <property name="alignment">
+             <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+            </property>
+           </widget>
+          </item>
+          <item row="0" column="1">
+           <widget class="QListWidget" name="requiredPackagesList">
+            <property name="alternatingRowColors">
+             <bool>true</bool>
+            </property>
+            <property name="selectionMode">
+             <enum>QAbstractItemView::NoSelection</enum>
+            </property>
+            <property name="sortingEnabled">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+          <item row="1" column="0">
+           <widget class="QLabel" name="label_18">
+            <property name="text">
+             <string>Required Distributions:</string>
+            </property>
+            <property name="alignment">
+             <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+            </property>
+           </widget>
+          </item>
+          <item row="1" column="1">
+           <widget class="QListWidget" name="requiredDistributionsList">
+            <property name="alternatingRowColors">
+             <bool>true</bool>
+            </property>
+            <property name="selectionMode">
+             <enum>QAbstractItemView::NoSelection</enum>
+            </property>
+            <property name="sortingEnabled">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </widget>
+       </item>
+       <item>
+        <widget class="QGroupBox" name="groupBox_2">
+         <property name="title">
+          <string>Provides</string>
+         </property>
+         <layout class="QGridLayout" name="gridLayout_3">
+          <item row="0" column="0">
+           <widget class="QLabel" name="label_20">
+            <property name="text">
+             <string>Provided Packages:</string>
+            </property>
+            <property name="alignment">
+             <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+            </property>
+           </widget>
+          </item>
+          <item row="0" column="1">
+           <widget class="QListWidget" name="providedPackagesList">
+            <property name="alternatingRowColors">
+             <bool>true</bool>
+            </property>
+            <property name="selectionMode">
+             <enum>QAbstractItemView::NoSelection</enum>
+            </property>
+            <property name="sortingEnabled">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+          <item row="1" column="0">
+           <widget class="QLabel" name="label_19">
+            <property name="text">
+             <string>Provided Distributions:</string>
+            </property>
+            <property name="alignment">
+             <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+            </property>
+           </widget>
+          </item>
+          <item row="1" column="1">
+           <widget class="QListWidget" name="providedDistributionsList">
+            <property name="alternatingRowColors">
+             <bool>true</bool>
+            </property>
+            <property name="selectionMode">
+             <enum>QAbstractItemView::NoSelection</enum>
+            </property>
+            <property name="sortingEnabled">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </widget>
+       </item>
+      </layout>
+     </widget>
+    </widget>
+   </item>
+   <item>
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Close</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <tabstops>
+  <tabstop>infoWidget</tabstop>
+  <tabstop>descriptionEdit</tabstop>
+  <tabstop>classifiersList</tabstop>
+  <tabstop>downloadUrlsList</tabstop>
+  <tabstop>requiredPackagesList</tabstop>
+  <tabstop>requiredDistributionsList</tabstop>
+  <tabstop>providedPackagesList</tabstop>
+  <tabstop>providedDistributionsList</tabstop>
+ </tabstops>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>PipPackageDetailsDialog</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>PipPackageDetailsDialog</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/Plugins/UiExtensionPlugins/PipInterface/PipPackagesInputDialog.py	Sat Dec 09 18:32:08 2017 +0100
@@ -0,0 +1,66 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2015 - 2017 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a dialog to enter package specifications.
+"""
+
+from __future__ import unicode_literals
+
+from PyQt5.QtCore import pyqtSlot
+from PyQt5.QtWidgets import QDialog, QDialogButtonBox
+
+from .Ui_PipPackagesInputDialog import Ui_PipPackagesInputDialog
+
+
+class PipPackagesInputDialog(QDialog, Ui_PipPackagesInputDialog):
+    """
+    Class documentation goes here.
+    """
+    def __init__(self, plugin, title, parent=None):
+        """
+        Constructor
+        
+        @param plugin reference to the plugin object (ToolPipPlugin)
+        @param title dialog title (string)
+        @param parent reference to the parent widget (QWidget)
+        """
+        super(PipPackagesInputDialog, self).__init__(parent)
+        self.setupUi(self)
+        
+        self.setWindowTitle(title)
+        
+        self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(False)
+        
+        self.__default = self.tr("<Default>")
+        pipExecutables = sorted(plugin.getPreferences("PipExecutables"))
+        self.pipComboBox.addItem(self.__default)
+        self.pipComboBox.addItems(pipExecutables)
+        
+        msh = self.minimumSizeHint()
+        self.resize(max(self.width(), msh.width()), msh.height())
+    
+    @pyqtSlot(str)
+    def on_packagesEdit_textChanged(self, txt):
+        """
+        Private slot handling entering package names.
+        
+        @param txt name of the requirements file (string)
+        """
+        self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(bool(txt))
+    
+    def getData(self):
+        """
+        Public method to get the entered data.
+        
+        @return tuple with the pip command (string) and the list of
+            package specifications (list of string)
+        """
+        command = self.pipComboBox.currentText()
+        if command == self.__default:
+            command = ""
+        packages = [p.strip() for p in self.packagesEdit.text().split()]
+        
+        return command, packages
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Plugins/UiExtensionPlugins/PipInterface/PipPackagesInputDialog.ui	Sat Dec 09 18:32:08 2017 +0100
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>PipPackagesInputDialog</class>
+ <widget class="QDialog" name="PipPackagesInputDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>600</width>
+    <height>143</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Packages </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 the pip executable to be used:</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QComboBox" name="pipComboBox">
+     <property name="toolTip">
+      <string>Select the pip command to use</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QLabel" name="label_2">
+     <property name="text">
+      <string>Enter package specifications (separated by whitespace):</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QLineEdit" name="packagesEdit"/>
+   </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>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>PipPackagesInputDialog</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>PipPackagesInputDialog</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/Plugins/UiExtensionPlugins/PipInterface/PipRequirementsSelectionDialog.py	Sat Dec 09 18:32:08 2017 +0100
@@ -0,0 +1,93 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2015 - 2017 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+
+"""
+Module implementing a dialog to enter a requirements file.
+"""
+
+from __future__ import unicode_literals
+
+import os
+
+from PyQt5.QtCore import pyqtSlot
+from PyQt5.QtWidgets import QDialog, QDialogButtonBox
+
+from E5Gui import E5FileDialog
+
+from .Ui_PipRequirementsSelectionDialog import \
+    Ui_PipRequirementsSelectionDialog
+
+import Utilities
+import UI.PixmapCache
+
+
+class PipRequirementsSelectionDialog(QDialog,
+                                     Ui_PipRequirementsSelectionDialog):
+    """
+    Class implementing a dialog to enter a requirements file.
+    """
+    def __init__(self, plugin, parent=None):
+        """
+        Constructor
+        
+        @param plugin reference to the plugin object (ToolPipPlugin)
+        @param parent reference to the parent widget (QWidget)
+        """
+        super(PipRequirementsSelectionDialog, self).__init__(parent)
+        self.setupUi(self)
+        
+        self.fileButton.setIcon(UI.PixmapCache.getIcon("open.png"))
+        
+        self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(False)
+        
+        self.__default = self.tr("<Default>")
+        pipExecutables = sorted(plugin.getPreferences("PipExecutables"))
+        self.pipComboBox.addItem(self.__default)
+        self.pipComboBox.addItems(pipExecutables)
+        
+        msh = self.minimumSizeHint()
+        self.resize(max(self.width(), msh.width()), msh.height())
+    
+    @pyqtSlot()
+    def on_fileButton_clicked(self):
+        """
+        Private slot to enter the requirements file via a file selection
+        dialog.
+        """
+        fileName = E5FileDialog.getOpenFileName(
+            self,
+            self.tr("Select the requirements file"),
+            self.requirementsEdit.text() or os.path.expanduser("~"),
+            self.tr("Text Files (*.txt);;All Files (*)")
+        )
+        if fileName:
+            self.requirementsEdit.setText(
+                Utilities.toNativeSeparators(fileName))
+    
+    @pyqtSlot(str)
+    def on_requirementsEdit_textChanged(self, txt):
+        """
+        Private slot handling entering the name of a requirements file.
+        
+        @param txt name of the requirements file (string)
+        """
+        self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(
+            bool(txt) and
+            os.path.exists(Utilities.toNativeSeparators(txt))
+        )
+    
+    def getData(self):
+        """
+        Public method to get the entered data.
+        
+        @return tuple with the pip command (string) and the name of the
+            requirements file (string)
+        """
+        command = self.pipComboBox.currentText()
+        if command == self.__default:
+            command = ""
+        
+        return command, self.requirementsEdit.text()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Plugins/UiExtensionPlugins/PipInterface/PipRequirementsSelectionDialog.ui	Sat Dec 09 18:32:08 2017 +0100
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>PipRequirementsSelectionDialog</class>
+ <widget class="QDialog" name="PipRequirementsSelectionDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>600</width>
+    <height>143</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Select Requirements</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 the pip executable to be used:</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QComboBox" name="pipComboBox">
+     <property name="toolTip">
+      <string>Select the pip command to use</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QLabel" name="label_2">
+     <property name="text">
+      <string>Enter requirements file:</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <item>
+      <widget class="QLineEdit" name="requirementsEdit"/>
+     </item>
+     <item>
+      <widget class="QToolButton" name="fileButton">
+       <property name="toolTip">
+        <string>Select the requirements file through a file selection dialog</string>
+       </property>
+       <property name="text">
+        <string notr="true"/>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </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>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>PipRequirementsSelectionDialog</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>PipRequirementsSelectionDialog</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/Plugins/UiExtensionPlugins/PipInterface/PipSearchDialog.py	Sat Dec 09 18:32:08 2017 +0100
@@ -0,0 +1,432 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2015 - 2017 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a dialog to search PyPI.
+"""
+
+from __future__ import unicode_literals
+
+import textwrap
+
+from PyQt5.QtCore import pyqtSlot, Qt, QEventLoop, QRegExp
+from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QAbstractButton, \
+    QApplication, QTreeWidgetItem, QHeaderView, QInputDialog
+
+from E5Gui import E5MessageBox
+try:
+    from E5Network.E5XmlRpcClient import E5XmlRpcClient
+except ImportError:
+    from .E5XmlRpcClient import E5XmlRpcClient
+
+from .Ui_PipSearchDialog import Ui_PipSearchDialog
+
+from . import DefaultIndexUrl
+
+
+class PipSearchDialog(QDialog, Ui_PipSearchDialog):
+    """
+    Class implementing a dialog to search PyPI.
+    """
+    VersionRole = Qt.UserRole + 1
+    
+    Stopwords = {
+        "a", "and", "are", "as", "at", "be", "but", "by",
+        "for", "if", "in", "into", "is", "it",
+        "no", "not", "of", "on", "or", "such",
+        "that", "the", "their", "then", "there", "these",
+        "they", "this", "to", "was", "will",
+    }
+    
+    def __init__(self, pip, plugin, parent=None):
+        """
+        Constructor
+        
+        @param pip reference to the master object (Pip)
+        @param plugin reference to the plugin object (ToolPipPlugin)
+        @param parent reference to the parent widget (QWidget)
+        """
+        super(PipSearchDialog, self).__init__(parent)
+        self.setupUi(self)
+        self.setWindowFlags(Qt.Window)
+        
+        self.buttonBox.button(QDialogButtonBox.Cancel).setEnabled(False)
+        
+        self.__installButton = self.buttonBox.addButton(
+            self.tr("&Install"), QDialogButtonBox.ActionRole)
+        self.__installButton.setEnabled(False)
+        
+        self.__showDetailsButton = self.buttonBox.addButton(
+            self.tr("&Show Details..."), QDialogButtonBox.ActionRole)
+        self.__showDetailsButton.setEnabled(False)
+        
+        self.__pip = pip
+        self.__client = E5XmlRpcClient(
+            plugin.getPreferences("PipSearchIndex") or DefaultIndexUrl,
+            self)
+        
+        self.__default = self.tr("<Default>")
+        pipExecutables = sorted(plugin.getPreferences("PipExecutables"))
+        self.pipComboBox.addItem(self.__default)
+        self.pipComboBox.addItems(pipExecutables)
+        
+        self.searchEdit.setFocus(Qt.OtherFocusReason)
+        
+        self.__canceled = False
+        self.__detailsData = {}
+        self.__query = []
+    
+    def closeEvent(self, e):
+        """
+        Protected slot implementing a close event handler.
+        
+        @param e close event (QCloseEvent)
+        """
+        QApplication.restoreOverrideCursor()
+        e.accept()
+    
+    @pyqtSlot(str)
+    def on_searchEdit_textChanged(self, txt):
+        """
+        Private slot handling a change of the search term.
+        
+        @param txt search term (string)
+        """
+        self.searchButton.setEnabled(bool(txt))
+    
+    @pyqtSlot()
+    def on_searchButton_clicked(self):
+        """
+        Private slot handling a press of the search button.
+        """
+        self.__search()
+    
+    @pyqtSlot()
+    def on_resultList_itemSelectionChanged(self):
+        """
+        Private slot handling changes of the selection.
+        """
+        self.__installButton.setEnabled(
+            len(self.resultList.selectedItems()) > 0)
+        self.__showDetailsButton.setEnabled(
+            len(self.resultList.selectedItems()) == 1)
+    
+    @pyqtSlot(QAbstractButton)
+    def on_buttonBox_clicked(self, button):
+        """
+        Private slot called by a button of the button box clicked.
+        
+        @param button button that was clicked (QAbstractButton)
+        """
+        if button == self.buttonBox.button(QDialogButtonBox.Close):
+            self.close()
+        elif button == self.buttonBox.button(QDialogButtonBox.Cancel):
+            self.__client.abort()
+            self.__canceled = True
+        elif button == self.__installButton:
+            self.__install()
+        elif button == self.__showDetailsButton:
+            self.__showDetails()
+    
+    def __search(self):
+        """
+        Private method to perform the search.
+        """
+        self.resultList.clear()
+        self.infoLabel.clear()
+        
+        self.buttonBox.button(QDialogButtonBox.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.Cancel).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.Cancel).setDefault(True)
+        self.searchButton.setEnabled(False)
+        QApplication.processEvents(QEventLoop.ExcludeUserInputEvents)
+        
+        QApplication.setOverrideCursor(Qt.WaitCursor)
+        QApplication.processEvents(QEventLoop.ExcludeUserInputEvents)
+        
+        self.__canceled = False
+        
+        self.__query = [term for term in self.searchEdit.text().strip().split()
+                        if term not in PipSearchDialog.Stopwords]
+        self.__client.call(
+            "search",
+            ({"name": self.__query, "summary": self.__query}, "or"),
+            self.__processSearchResult,
+            self.__searchError
+        )
+    
+    def __processSearchResult(self, data):
+        """
+        Private method to process the search result data from PyPI.
+        
+        @param data result data (tuple) with hits in the first element
+        """
+        if data:
+            packages = self.__transformHits(data[0])
+            if packages:
+                self.infoLabel.setText(self.tr("%n package(s) found.", "",
+                                       len(packages)))
+                wrapper = textwrap.TextWrapper(width=80)
+                count = 0
+                total = 0
+                for package in packages:
+                    if self.__canceled:
+                        self.infoLabel.setText(
+                            self.tr("Canceled - only {0} out of %n package(s)"
+                                    " shown", "", len(packages)).format(total))
+                        break
+                    itm = QTreeWidgetItem(
+                        self.resultList, [
+                            package['name'].strip(),
+                            "{0:4d}".format(package['score']),
+                            "\n".join([
+                                wrapper.fill(line) for line in
+                                package['summary'].strip().splitlines()
+                            ])
+                        ])
+                    itm.setData(0, self.VersionRole, package['version'])
+                    count += 1
+                    total += 1
+                    if count == 100:
+                        count = 0
+                        QApplication.processEvents()
+            else:
+                QApplication.restoreOverrideCursor()
+                E5MessageBox.warning(
+                    self,
+                    self.tr("Search PyPI"),
+                    self.tr("""<p>The package search did not return"""
+                            """ anything.</p>"""))
+                self.infoLabel.setText(
+                    self.tr("""<p>The package search did not return"""
+                            """ anything.</p>"""))
+        else:
+            QApplication.restoreOverrideCursor()
+            E5MessageBox.warning(
+                self,
+                self.tr("Search PyPI"),
+                self.tr("""<p>The package search did not return anything."""
+                        """</p>"""))
+            self.infoLabel.setText(
+                self.tr("""<p>The package search did not return anything."""
+                        """</p>"""))
+        
+        header = self.resultList.header()
+        self.resultList.sortItems(1, Qt.DescendingOrder)
+        header.setStretchLastSection(False)
+        header.resizeSections(QHeaderView.ResizeToContents)
+        headerSize = 0
+        for col in range(header.count()):
+            headerSize += header.sectionSize(col)
+        if headerSize < header.width():
+            header.setStretchLastSection(True)
+        
+        self.__finish()
+    
+    def __finish(self):
+        """
+        Private slot performing the finishing actions.
+        """
+        QApplication.restoreOverrideCursor()
+        self.buttonBox.button(QDialogButtonBox.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.Cancel).setEnabled(False)
+        self.searchButton.setEnabled(True)
+        self.searchButton.setDefault(True)
+        self.searchEdit.setFocus(Qt.OtherFocusReason)
+    
+    def __searchError(self, errorCode, errorString):
+        """
+        Private method handling a search error.
+        
+        @param errorCode code of the error (integer)
+        @param errorString error message (string)
+        """
+        self.__finish()
+        E5MessageBox.warning(
+            self,
+            self.tr("Search PyPI"),
+            self.tr("""<p>The package search failed.</p><p>Reason: {0}</p>""")
+            .format(errorString))
+        self.infoLabel.setText(self.tr("Error: {0}").format(errorString))
+    
+    def __transformHits(self, hits):
+        """
+        Private method to convert the list returned from pypi into a
+        packages list.
+        
+        @param hits list returned from pypi (list of dict)
+        @return list of packages (list of dict)
+        """
+        # we only include the record with the highest score
+        packages = {}
+        for hit in hits:
+            name = hit['name'].strip()
+            summary = (hit['summary'] or "").strip()
+            version = hit['version'].strip()
+            score = self.__score(name, summary)
+            # cleanup the summary
+            if summary in ["UNKNOWN", "."]:
+                summary = ""
+
+            if name not in packages:
+                packages[name] = {
+                    'name': name,
+                    'summary': summary,
+                    'version': [version.strip()],
+                    'score': score}
+            else:
+                # TODO: allow for multiple versions using highest score
+                if score > packages[name]['score']:
+                    packages[name]['score'] = score
+                    packages[name]['summary'] = summary
+                    packages[name]['version'].append(version.strip())
+
+        return list(packages.values())
+    
+    def __score(self, name, summary):
+        """
+        Private method to calculate some score for a search result.
+        
+        @param name name of the returned package
+        @type str
+        @param summary summary text for the package
+        @type str
+        @return score value
+        @rtype int
+        """
+        score = 0
+        for queryTerm in self.__query:
+            if queryTerm.lower() in name.lower():
+                score += 4
+                if queryTerm.lower() == name.lower():
+                    score += 4
+            
+            if queryTerm.lower() in summary.lower():
+                if QRegExp(r'\b{0}\b'.format(QRegExp.escape(queryTerm)),
+                           Qt.CaseInsensitive).indexIn(summary) != -1:
+                    # word match gets even higher score
+                    score += 2
+                else:
+                    score += 1
+        
+        return score
+    
+    def __install(self):
+        """
+        Private slot to install the selected packages.
+        """
+        command = self.pipComboBox.currentText()
+        if command == self.__default:
+            command = ""
+        
+        packages = []
+        for itm in self.resultList.selectedItems():
+            packages.append(itm.text(0).strip())
+        if packages:
+            self.__pip.installPackages(packages, cmd=command)
+    
+    def __showDetails(self):
+        """
+        Private slot to show details about the selected package.
+        """
+        self.buttonBox.button(QDialogButtonBox.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.Cancel).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.Cancel).setDefault(True)
+        self.__showDetailsButton.setEnabled(False)
+        QApplication.setOverrideCursor(Qt.WaitCursor)
+        QApplication.processEvents(QEventLoop.ExcludeUserInputEvents)
+        
+        self.__detailsData = {}
+        
+        itm = self.resultList.selectedItems()[0]
+        packageVersions = itm.data(0, self.VersionRole)
+        if len(packageVersions) == 1:
+            packageVersion = packageVersions[0]
+        elif len(packageVersions) == 0:
+            packageVersion = ""
+        else:
+            packageVersion, ok = QInputDialog.getItem(
+                self,
+                self.tr("Show Package Details"),
+                self.tr("Select the package version:"),
+                packageVersions,
+                0, False)
+            if not ok:
+                return
+        
+        packageName = itm.text(0)
+        self.__client.call(
+            "release_data",
+            (packageName, packageVersion),
+            lambda d: self.__getPackageDownloadsData(packageVersion, d),
+            self.__detailsError
+        )
+    
+    def __getPackageDownloadsData(self, packageVersion, data):
+        """
+        Private method to store the details data and get downloads
+        information.
+        
+        @param packageVersion version info
+        @type str
+        @param data result data with package details in the first
+            element
+        @type tuple
+        """
+        if data and data[0]:
+            self.__detailsData = data[0]
+            itm = self.resultList.selectedItems()[0]
+            packageName = itm.text(0)
+            self.__client.call(
+                "release_urls",
+                (packageName, packageVersion),
+                self.__displayPackageDetails,
+                self.__detailsError
+            )
+        else:
+            self.__finish()
+            E5MessageBox.warning(
+                self,
+                self.tr("Search PyPI"),
+                self.tr("""<p>No package details info available.</p>"""))
+    
+    def __displayPackageDetails(self, data):
+        """
+        Private method to display the returned package details.
+        
+        @param data result data (tuple) with downloads information in the first
+            element
+        """
+        self.__finish()
+        self.__showDetailsButton.setEnabled(True)
+        from .PipPackageDetailsDialog import PipPackageDetailsDialog
+        dlg = PipPackageDetailsDialog(self.__detailsData, data[0], self)
+        dlg.exec_()
+    
+    def __detailsError(self, errorCode, errorString):
+        """
+        Private method handling a details error.
+        
+        @param errorCode code of the error (integer)
+        @param errorString error message (string)
+        """
+        self.__finish()
+        self.__showDetailsButton.setEnabled(True)
+        E5MessageBox.warning(
+            self,
+            self.tr("Search PyPI"),
+            self.tr("""<p>Package details info could not be retrieved.</p>"""
+                    """<p>Reason: {0}</p>""")
+            .format(errorString))
+    
+    @pyqtSlot(QTreeWidgetItem, int)
+    def on_resultList_itemActivated(self, item, column):
+        """
+        Private slot reacting on an item activation.
+        
+        @param item reference to the activated item (QTreeWidgetItem)
+        @param column activated column (integer)
+        """
+        self.__showDetails()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Plugins/UiExtensionPlugins/PipInterface/PipSearchDialog.ui	Sat Dec 09 18:32:08 2017 +0100
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>PipSearchDialog</class>
+ <widget class="QDialog" name="PipSearchDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>700</width>
+    <height>600</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Search PyPI</string>
+  </property>
+  <property name="sizeGripEnabled">
+   <bool>true</bool>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <widget class="QComboBox" name="pipComboBox">
+     <property name="toolTip">
+      <string>Select the pip command to use for installing packages</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <item>
+      <widget class="QLabel" name="label">
+       <property name="text">
+        <string>Query:</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QLineEdit" name="searchEdit">
+       <property name="toolTip">
+        <string>Enter the search term</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="searchButton">
+       <property name="enabled">
+        <bool>false</bool>
+       </property>
+       <property name="toolTip">
+        <string>Press to start the search</string>
+       </property>
+       <property name="text">
+        <string>Search</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <widget class="QTreeWidget" name="resultList">
+     <property name="alternatingRowColors">
+      <bool>true</bool>
+     </property>
+     <property name="selectionMode">
+      <enum>QAbstractItemView::ExtendedSelection</enum>
+     </property>
+     <property name="rootIsDecorated">
+      <bool>false</bool>
+     </property>
+     <property name="itemsExpandable">
+      <bool>false</bool>
+     </property>
+     <property name="sortingEnabled">
+      <bool>true</bool>
+     </property>
+     <property name="allColumnsShowFocus">
+      <bool>true</bool>
+     </property>
+     <property name="wordWrap">
+      <bool>true</bool>
+     </property>
+     <column>
+      <property name="text">
+       <string>Package</string>
+      </property>
+     </column>
+     <column>
+      <property name="text">
+       <string>Score</string>
+      </property>
+     </column>
+     <column>
+      <property name="text">
+       <string>Description</string>
+      </property>
+     </column>
+    </widget>
+   </item>
+   <item>
+    <widget class="QLabel" name="infoLabel"/>
+   </item>
+   <item>
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Close</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Plugins/UiExtensionPlugins/PipInterface/__init__.py	Sat Dec 09 18:32:08 2017 +0100
@@ -0,0 +1,12 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2015 - 2017 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Package implementing the various pip dialogs and data.
+"""
+
+from __future__ import unicode_literals
+
+DefaultIndexUrl = "https://pypi.python.org/pypi"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Plugins/UiExtensionPlugins/__init__.py	Sat Dec 09 18:32:08 2017 +0100
@@ -0,0 +1,8 @@
+# -*- coding: utf-8 -*-
+ 
+# Copyright (c) 2017 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+ 
+"""
+Package containing the various interface extension plug-ins.
+"""
--- a/changelog	Sat Dec 09 17:43:24 2017 +0100
+++ b/changelog	Sat Dec 09 18:32:08 2017 +0100
@@ -5,6 +5,8 @@
 - Project
   -- If a project does not contain protobuf files, the old project file format
      (5.1) is generated to make the file backward compatible.
+- Plug-ins
+  -- added the pip interface plug-in to the core plug-ins
 
 Version 17.12:
 - bug fixes
--- a/eric6.e4p	Sat Dec 09 17:43:24 2017 +0100
+++ b/eric6.e4p	Sat Dec 09 18:32:08 2017 +0100
@@ -508,6 +508,7 @@
     <Source>Plugins/PluginCodeStyleChecker.py</Source>
     <Source>Plugins/PluginEricapi.py</Source>
     <Source>Plugins/PluginEricdoc.py</Source>
+    <Source>Plugins/PluginPipInterface.py</Source>
     <Source>Plugins/PluginSyntaxChecker.py</Source>
     <Source>Plugins/PluginTabnanny.py</Source>
     <Source>Plugins/PluginVcsMercurial.py</Source>
@@ -524,6 +525,18 @@
     <Source>Plugins/PluginWizardQMessageBox.py</Source>
     <Source>Plugins/PluginWizardQRegExp.py</Source>
     <Source>Plugins/PluginWizardQRegularExpression.py</Source>
+    <Source>Plugins/UiExtensionPlugins/PipInterface/ConfigurationPage/PipPage.py</Source>
+    <Source>Plugins/UiExtensionPlugins/PipInterface/ConfigurationPage/__init__.py</Source>
+    <Source>Plugins/UiExtensionPlugins/PipInterface/Pip.py</Source>
+    <Source>Plugins/UiExtensionPlugins/PipInterface/PipDialog.py</Source>
+    <Source>Plugins/UiExtensionPlugins/PipInterface/PipFreezeDialog.py</Source>
+    <Source>Plugins/UiExtensionPlugins/PipInterface/PipListDialog.py</Source>
+    <Source>Plugins/UiExtensionPlugins/PipInterface/PipPackageDetailsDialog.py</Source>
+    <Source>Plugins/UiExtensionPlugins/PipInterface/PipPackagesInputDialog.py</Source>
+    <Source>Plugins/UiExtensionPlugins/PipInterface/PipRequirementsSelectionDialog.py</Source>
+    <Source>Plugins/UiExtensionPlugins/PipInterface/PipSearchDialog.py</Source>
+    <Source>Plugins/UiExtensionPlugins/PipInterface/__init__.py</Source>
+    <Source>Plugins/UiExtensionPlugins/__init__.py</Source>
     <Source>Plugins/VcsPlugins/__init__.py</Source>
     <Source>Plugins/VcsPlugins/vcsMercurial/Config.py</Source>
     <Source>Plugins/VcsPlugins/vcsMercurial/ConfigurationPage/MercurialPage.py</Source>
@@ -1678,6 +1691,14 @@
     <Form>Plugins/DocumentationPlugins/Ericapi/EricapiExecDialog.ui</Form>
     <Form>Plugins/DocumentationPlugins/Ericdoc/EricdocConfigDialog.ui</Form>
     <Form>Plugins/DocumentationPlugins/Ericdoc/EricdocExecDialog.ui</Form>
+    <Form>Plugins/UiExtensionPlugins/PipInterface/ConfigurationPage/PipPage.ui</Form>
+    <Form>Plugins/UiExtensionPlugins/PipInterface/PipDialog.ui</Form>
+    <Form>Plugins/UiExtensionPlugins/PipInterface/PipFreezeDialog.ui</Form>
+    <Form>Plugins/UiExtensionPlugins/PipInterface/PipListDialog.ui</Form>
+    <Form>Plugins/UiExtensionPlugins/PipInterface/PipPackageDetailsDialog.ui</Form>
+    <Form>Plugins/UiExtensionPlugins/PipInterface/PipPackagesInputDialog.ui</Form>
+    <Form>Plugins/UiExtensionPlugins/PipInterface/PipRequirementsSelectionDialog.ui</Form>
+    <Form>Plugins/UiExtensionPlugins/PipInterface/PipSearchDialog.ui</Form>
     <Form>Plugins/VcsPlugins/vcsMercurial/ConfigurationPage/MercurialPage.ui</Form>
     <Form>Plugins/VcsPlugins/vcsMercurial/FetchExtension/HgFetchDialog.ui</Form>
     <Form>Plugins/VcsPlugins/vcsMercurial/GpgExtension/HgGpgSignDialog.ui</Form>
Binary file i18n/eric6_cs.qm has changed
--- a/i18n/eric6_cs.ts	Sat Dec 09 17:43:24 2017 +0100
+++ b/i18n/eric6_cs.ts	Sat Dec 09 18:32:08 2017 +0100
@@ -40545,6 +40545,1330 @@
     </message>
 </context>
 <context>
+    <name>Pip</name>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="547"/>
+        <source>pip Executable</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="59"/>
+        <source>pip &amp;Executable</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="64"/>
+        <source>Selects the pip executable to be used</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="66"/>
+        <source>&lt;b&gt;pip Executable&lt;/b&gt;&lt;p&gt;This selects the pip executable to be used. Multiple executables can be pre-configured via the configuration dialog.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="79"/>
+        <source>List Installed Packages</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="79"/>
+        <source>&amp;List Installed Packages...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="84"/>
+        <source>List all installed packages with versions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="86"/>
+        <source>&lt;b&gt;List Installed Packages&lt;/b&gt;&lt;p&gt;This lists all the installed packages together with their versions.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="94"/>
+        <source>List Up-to-date Packages</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="94"/>
+        <source>List Up-to-&amp;date Packages...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="99"/>
+        <source>List all installed, up-to-date packages with versions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="101"/>
+        <source>&lt;b&gt;List Up-to-date Packages&lt;/b&gt;&lt;p&gt;This lists all the installed, up-to-date packages together with their versions.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="110"/>
+        <source>List Outdated Packages</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="110"/>
+        <source>List &amp;Outdated Packages...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="115"/>
+        <source>List all installed, outdated packages with versions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="117"/>
+        <source>&lt;b&gt;List Up-to-date Packages&lt;/b&gt;&lt;p&gt;This lists all the installed, outdated packages together with their current and latest versions.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="886"/>
+        <source>Install Packages</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="130"/>
+        <source>&amp;Install Packages</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="135"/>
+        <source>Install packages according to user input</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="137"/>
+        <source>&lt;b&gt;Install Packages&lt;/b&gt;&lt;p&gt;This installs packages according to user input.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="144"/>
+        <source>Install Requirements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="149"/>
+        <source>Install packages according to a requirements file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="151"/>
+        <source>&lt;b&gt;Install Requirements&lt;/b&gt;&lt;p&gt;This installs packages according to a requirements file.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="160"/>
+        <source>Install Pip</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="165"/>
+        <source>Install the pip package itself</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="167"/>
+        <source>&lt;b&gt;Install Pip&lt;/b&gt;&lt;p&gt;This install the pip package itself.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="174"/>
+        <source>Repair Pip</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="179"/>
+        <source>Repair the pip package</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="181"/>
+        <source>&lt;b&gt;Repair Pip&lt;/b&gt;&lt;p&gt;This repairs the pip package by re-installing it.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="188"/>
+        <source>Upgrade Pip</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="188"/>
+        <source>Upgrade &amp;Pip</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="193"/>
+        <source>Upgrade the pip package itself</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="195"/>
+        <source>&lt;b&gt;Upgrade Pip&lt;/b&gt;&lt;p&gt;This upgrades the pip package itself.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="859"/>
+        <source>Upgrade Packages</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="202"/>
+        <source>&amp;Upgrade Packages</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="207"/>
+        <source>Upgrade packages according to user input</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="209"/>
+        <source>&lt;b&gt;Upgrade Packages&lt;/b&gt;&lt;p&gt;This upgrades packages according to user input.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="971"/>
+        <source>Uninstall Packages</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="225"/>
+        <source>Uninstall packages according to user input</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="227"/>
+        <source>&lt;b&gt;Uninstall Packages&lt;/b&gt;&lt;p&gt;This uninstalls packages according to user input.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="234"/>
+        <source>Uninstall Requirements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="239"/>
+        <source>Uninstall packages according to a requirements file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="241"/>
+        <source>&lt;b&gt;Uninstall Requirements&lt;/b&gt;&lt;p&gt;This uninstalls packages according to a requirements file.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="254"/>
+        <source>Generate Requirements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="254"/>
+        <source>&amp;Generate Requirements...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="259"/>
+        <source>Generate the contents of a requirements file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="261"/>
+        <source>&lt;b&gt;Generate Requirements&lt;/b&gt;&lt;p&gt;This generates the contents of a requirements file.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="273"/>
+        <source>Search PyPI</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="273"/>
+        <source>&amp;Search PyPI...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="278"/>
+        <source>Open a dialog to search the Python Package Index</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="280"/>
+        <source>&lt;b&gt;Search PyPI&lt;/b&gt;&lt;p&gt;This opens a dialog to search the Python Package Index.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="292"/>
+        <source>Edit User Configuration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="292"/>
+        <source>Edit User Configuration...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="297"/>
+        <source>Open the per user configuration file in an editor</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="299"/>
+        <source>&lt;b&gt;Edit User Configuration&lt;/b&gt;&lt;p&gt;This opens the per user configuration file in an editor.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="307"/>
+        <source>Edit Current Virtualenv Configuration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="307"/>
+        <source>Edit Current Virtualenv Configuration...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="312"/>
+        <source>Open the current virtualenv configuration file in an editor</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="314"/>
+        <source>&lt;b&gt;Edit Current Virtualenv Configuration&lt;/b&gt;&lt;p&gt;This opens the current virtualenv configuration file in an editor. &lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="323"/>
+        <source>Configure</source>
+        <translation type="unfinished">Konfigurovat</translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="323"/>
+        <source>Configure...</source>
+        <translation type="unfinished">Konfigurovat...</translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="327"/>
+        <source>Show the configuration dialog with the Python Package Management page selected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="331"/>
+        <source>&lt;b&gt;Configure&lt;/b&gt;&lt;p&gt;Show the configuration dialog with the Python Package Management page selected.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="347"/>
+        <source>P&amp;ython Package Management</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="462"/>
+        <source>pip exited with an error ({0}).</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="469"/>
+        <source>pip did not finish within 30 seconds.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="471"/>
+        <source>pip could not be started.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="537"/>
+        <source>Select pip Executable to be used:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="547"/>
+        <source>No pip executables have been configured yet. Shall this be done now?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="561"/>
+        <source>Installed Packages</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="571"/>
+        <source>Up-to-date Packages</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="581"/>
+        <source>Outdated Packages</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="641"/>
+        <source>Edit Configuration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="641"/>
+        <source>No valid configuartion path determined. Is a virtual environment selected? Aborting</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="746"/>
+        <source>Select Python Executable</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="660"/>
+        <source>Install PIP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="667"/>
+        <source>Select PIP Executable</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="729"/>
+        <source>&lt;Default&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="732"/>
+        <source>Upgrade pip</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="732"/>
+        <source>Select pip Executable:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="721"/>
+        <source>Upgrade PIP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="757"/>
+        <source>Repair PIP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="821"/>
+        <source>You are trying to upgrade PyQt packages. This will not work for the current instance of Python ({0}). Do you want to continue?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="907"/>
+        <source>Install Packages from Requirements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="971"/>
+        <source>Do you really want to uninstall these packages?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="982"/>
+        <source>Uninstall Packages from Requirements</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>PipDialog</name>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/PipDialog.ui" line="14"/>
+        <source>pip</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/PipDialog.ui" line="29"/>
+        <source>Output</source>
+        <translation type="unfinished">Výstup</translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/PipDialog.ui" line="54"/>
+        <source>Errors</source>
+        <translation type="unfinished">Chyby</translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/PipDialog.py" line="133"/>
+        <source>Process Generation Error</source>
+        <translation type="unfinished">Chyba v procesu generování</translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/PipDialog.py" line="133"/>
+        <source>The process {0} could not be started.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>PipFreezeDialog</name>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/PipFreezeDialog.py" line="250"/>
+        <source>Generate Requirements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Plugins/UiExtensionPlugins/PipInterface/PipFreezeDialog.ui" line="17"/>