ProjectExplorerPlugin: Remove remaining used of global object pool

By moving ownership of the respective objects to the
pre-existing private class by making them full members,
following the general pattern used in the other plugins.

Change-Id: Ifea639b68f25f0cbcb06230dc71a16d1dd3ae5ac
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
hjk
2018-02-09 17:08:29 +01:00
parent 8801240881
commit 95deefb5ac
3 changed files with 103 additions and 112 deletions

View File

@@ -107,6 +107,7 @@ private:
friend class Internal::DeviceManagerPrivate;
friend class ProjectExplorerPlugin;
friend class ProjectExplorerPluginPrivate;
};
} // namespace ProjectExplorer

View File

@@ -258,6 +258,21 @@ static bool isTextFile(const QString &fileName)
TextEditor::Constants::C_TEXTEDITOR_MIMETYPE_TEXT);
}
class ProjectsMode : public IMode
{
public:
ProjectsMode()
{
setContext(Context(Constants::C_PROJECTEXPLORER));
setDisplayName(QCoreApplication::translate("ProjectExplorer::ProjectsMode", "Projects"));
setIcon(Utils::Icon::modeIcon(Icons::MODE_PROJECT_CLASSIC,
Icons::MODE_PROJECT_FLAT, Icons::MODE_PROJECT_FLAT_ACTIVE));
setPriority(Constants::P_MODE_SESSION);
setId(Constants::MODE_SESSION);
setContextHelpId(QLatin1String("Managing Projects"));
}
};
class ProjectExplorerPluginPrivate : public QObject
{
Q_DECLARE_TR_FUNCTIONS(ProjectExplorer::ProjectExplorerPlugin)
@@ -399,7 +414,6 @@ public:
QString m_sessionToRestoreAtStartup;
QStringList m_profileMimeTypes;
AppOutputPane *m_outputPane = nullptr;
int m_activeRunControlCount = 0;
int m_shutdownWatchDogId = -1;
@@ -416,33 +430,76 @@ public:
bool m_shouldHaveRunConfiguration = false;
bool m_shuttingDown = false;
Core::Id m_runMode = Constants::NO_RUN_MODE;
ProjectWelcomePage *m_welcomePage = nullptr;
IMode *m_projectsMode = nullptr;
TaskHub *m_taskHub = nullptr;
KitManager *m_kitManager = nullptr;
ToolChainManager *m_toolChainManager = nullptr;
QStringList m_arguments;
#ifdef WITH_JOURNALD
JournaldWatcher *m_journalWatcher = nullptr;
JournaldWatcher m_journalWatcher;
#endif
QThreadPool m_threadPool;
};
class ProjectsMode : public IMode
{
public:
ProjectsMode(QWidget *proWindow)
{
setWidget(proWindow);
setContext(Context(Constants::C_PROJECTEXPLORER));
setDisplayName(QCoreApplication::translate("ProjectExplorer::ProjectsMode", "Projects"));
setIcon(Utils::Icon::modeIcon(Icons::MODE_PROJECT_CLASSIC,
Icons::MODE_PROJECT_FLAT, Icons::MODE_PROJECT_FLAT_ACTIVE));
setPriority(Constants::P_MODE_SESSION);
setId(Constants::MODE_SESSION);
setContextHelpId(QLatin1String("Managing Projects"));
}
DeviceManager m_deviceManager{true};
#ifdef Q_OS_WINDOWS
WinDebugInterface m_winDebugInterface;
MsvcToolChainFactory m_mscvToolChainFactory;
#else
LinuxIccToolChainFactory m_linuxToolChainFactory;
#endif
#ifndef Q_OS_MACOS
MingwToolChainFactory m_mingwToolChainFactory; // Mingw offers cross-compiling to windows
#endif
GccToolChainFactory m_gccToolChainFactory;
ClangToolChainFactory m_clangToolChainFactory;
CustomToolChainFactory m_customToolChainFactory;
DesktopDeviceFactory m_desktopDeviceFactory;
ToolChainOptionsPage m_toolChainOptionsPage;
KitOptionsPage m_kitOptionsPage;
TaskHub m_taskHub;
ProjectWelcomePage m_welcomePage;
CustomWizardMetaFactory<CustomProjectWizard> m_customProjectWizard{IWizardFactory::ProjectWizard};
CustomWizardMetaFactory<CustomWizard> m_fileWizard{IWizardFactory::FileWizard};
ProjectsMode m_projectsMode;
CopyTaskHandler m_copyTaskHandler;
ShowInEditorTaskHandler m_showInEditorTaskHandler;
VcsAnnotateTaskHandler m_vcsAnnotateTaskHandler;
RemoveTaskHandler m_removeTaskHandler;
ConfigTaskHandler m_configTaskHandler{Task::compilerMissingTask(), Constants::KITS_SETTINGS_PAGE_ID};
AppOutputPane m_outputPane;
AllProjectsFilter m_allProjectsFilter;
CurrentProjectFilter m_currentProjectFilter;
ProcessStepFactory m_processStepFactory;
AllProjectsFind m_allProjectsFind;
CurrentProjectFind m_curretProjectFind;
CustomExecutableRunConfigurationFactory m_customExecutableRunConfigFactory;
ProjectFileWizardExtension m_projectFileWizardExtension;
// Settings pages
ProjectExplorerSettingsPage m_projectExplorerSettingsPage;
DeviceSettingsPage m_deviceSettingsPage;
ProjectTreeWidgetFactory m_projectTreeFactory;
FolderNavigationWidgetFactory m_folderNavigationWidgetFactory;
DefaultDeployConfigurationFactory m_defaultDeployConfigFactory;
IDocumentFactory m_documentFactory;
};
static ProjectExplorerPlugin *m_instance = nullptr;
@@ -451,7 +508,6 @@ static ProjectExplorerPluginPrivate *dd = nullptr;
ProjectExplorerPlugin::ProjectExplorerPlugin()
{
m_instance = this;
dd = new ProjectExplorerPluginPrivate;
}
ProjectExplorerPlugin::~ProjectExplorerPlugin()
@@ -462,9 +518,6 @@ ProjectExplorerPlugin::~ProjectExplorerPlugin()
// Force sequence of deletion:
delete dd->m_kitManager; // remove all the profile information
delete dd->m_toolChainManager;
#ifdef WITH_JOURNALD
delete dd->m_journalWatcher;
#endif
ProjectPanelFactory::destroyFactories();
delete dd;
}
@@ -478,33 +531,14 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
{
Q_UNUSED(error);
dd = new ProjectExplorerPluginPrivate;
qRegisterMetaType<ProjectExplorer::RunControl *>();
qRegisterMetaType<ProjectExplorer::DeployableFile>("ProjectExplorer::DeployableFile");
CustomWizard::setVerbose(arguments.count(QLatin1String("-customwizard-verbose")));
JsonWizardFactory::setVerbose(arguments.count(QLatin1String("-customwizard-verbose")));
addAutoReleasedObject(new DeviceManager);
#ifdef WITH_JOURNALD
dd->m_journalWatcher = new JournaldWatcher;
#endif
// Add ToolChainFactories:
if (Utils::HostOsInfo::isWindowsHost()) {
addAutoReleasedObject(new WinDebugInterface);
addAutoReleasedObject(new MsvcToolChainFactory);
} else {
addAutoReleasedObject(new LinuxIccToolChainFactory);
}
if (!Utils::HostOsInfo::isMacHost())
addAutoReleasedObject(new MingwToolChainFactory); // Mingw offers cross-compiling to windows
addAutoReleasedObject(new GccToolChainFactory);
addAutoReleasedObject(new ClangToolChainFactory);
addAutoReleasedObject(new CustomToolChainFactory);
addAutoReleasedObject(new DesktopDeviceFactory);
dd->m_kitManager = new KitManager; // register before ToolChainManager
dd->m_toolChainManager = new ToolChainManager;
@@ -521,11 +555,6 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
KitManager::registerKitInformation(new SysRootKitInformation);
KitManager::registerKitInformation(new EnvironmentKitInformation);
addAutoReleasedObject(new ToolChainOptionsPage);
addAutoReleasedObject(new KitOptionsPage);
addAutoReleasedObject(new TaskHub);
IWizardFactory::registerFactoryCreator([]() -> QList<IWizardFactory *> {
QList<IWizardFactory *> result;
result << CustomWizard::createWizards();
@@ -533,8 +562,7 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
return result;
});
dd->m_welcomePage = new ProjectWelcomePage;
connect(dd->m_welcomePage, &ProjectWelcomePage::manageSessions,
connect(&dd->m_welcomePage, &ProjectWelcomePage::manageSessions,
dd, &ProjectExplorerPluginPrivate::showSessionManager);
auto sessionManager = new SessionManager(this);
@@ -572,9 +600,6 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
: Utils::FileName());
});
addAutoReleasedObject(new CustomWizardMetaFactory<CustomProjectWizard>(IWizardFactory::ProjectWizard));
addAutoReleasedObject(new CustomWizardMetaFactory<CustomWizard>(IWizardFactory::FileWizard));
// For JsonWizard:
JsonWizardFactory::registerPageFactory(new FieldPageFactory);
JsonWizardFactory::registerPageFactory(new FilePageFactory);
@@ -589,26 +614,13 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
Context projecTreeContext(Constants::C_PROJECT_TREE);
dd->m_projectsMode = new ProjectsMode(dd->m_proWindow);
dd->m_projectsMode->setEnabled(false);
addAutoReleasedObject(dd->m_projectsMode);
addAutoReleasedObject(new CopyTaskHandler);
addAutoReleasedObject(new ShowInEditorTaskHandler);
addAutoReleasedObject(new VcsAnnotateTaskHandler);
addAutoReleasedObject(new RemoveTaskHandler);
addAutoReleasedObject(new ConfigTaskHandler(Task::compilerMissingTask(),
Constants::KITS_SETTINGS_PAGE_ID));
dd->m_projectsMode.setWidget(dd->m_proWindow);
dd->m_projectsMode.setEnabled(false);
ICore::addPreCloseListener([]() -> bool { return coreAboutToClose(); });
dd->m_outputPane = new AppOutputPane;
addAutoReleasedObject(dd->m_outputPane);
connect(SessionManager::instance(), &SessionManager::projectRemoved,
dd->m_outputPane, &AppOutputPane::projectRemoved);
addAutoReleasedObject(new AllProjectsFilter);
addAutoReleasedObject(new CurrentProjectFilter);
&dd->m_outputPane, &AppOutputPane::projectRemoved);
// ProjectPanelFactories
auto panelFactory = new ProjectPanelFactory;
@@ -632,11 +644,6 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
panelFactory->setCreateWidgetFunction([](Project *project) { return new DependenciesWidget(project); });
ProjectPanelFactory::registerFactory(panelFactory);
addAutoReleasedObject(new ProcessStepFactory);
addAutoReleasedObject(new AllProjectsFind);
addAutoReleasedObject(new CurrentProjectFind);
auto constraint = [](RunConfiguration *runConfiguration) {
const Runnable runnable = runConfiguration->runnable();
if (!runnable.is<StandardRunnable>())
@@ -650,14 +657,6 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
};
RunControl::registerWorker<SimpleTargetRunner>(Constants::NORMAL_RUN_MODE, constraint);
addAutoReleasedObject(new CustomExecutableRunConfigurationFactory);
addAutoReleasedObject(new ProjectFileWizardExtension);
// Settings pages
addAutoReleasedObject(new ProjectExplorerSettingsPage);
addAutoReleasedObject(new DeviceSettingsPage);
// context menus
ActionContainer *msessionContextMenu =
ActionManager::createMenu(Constants::M_SESSIONCONTEXT);
@@ -1187,10 +1186,6 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
dd->updateWelcomePage();
});
addAutoReleasedObject(new ProjectTreeWidgetFactory);
addAutoReleasedObject(new FolderNavigationWidgetFactory);
addAutoReleasedObject(new DefaultDeployConfigurationFactory);
QSettings *s = ICore::settings();
const QStringList fileNames =
s->value(QLatin1String("ProjectExplorer/RecentProjects/FileNames")).toStringList();
@@ -1600,8 +1595,7 @@ void ProjectExplorerPlugin::extensionsInitialized()
const QString filterSeparator = QLatin1String(";;");
QStringList filterStrings;
auto factory = new IDocumentFactory;
factory->setOpener([](QString fileName) -> IDocument* {
dd->m_documentFactory.setOpener([](QString fileName) {
const QFileInfo fi(fileName);
if (fi.isDir())
fileName = FolderNavigationWidget::projectFilesInDirectory(fi.absoluteFilePath()).value(0, fileName);
@@ -1612,17 +1606,15 @@ void ProjectExplorerPlugin::extensionsInitialized()
return nullptr;
});
factory->addMimeType(QStringLiteral("inode/directory"));
dd->m_documentFactory.addMimeType(QStringLiteral("inode/directory"));
for (const QString &mimeType : dd->m_projectCreators.keys()) {
factory->addMimeType(mimeType);
dd->m_documentFactory.addMimeType(mimeType);
Utils::MimeType mime = Utils::mimeTypeForName(mimeType);
allGlobPatterns.append(mime.globPatterns());
filterStrings.append(mime.filterString());
dd->m_profileMimeTypes += mimeType;
}
addAutoReleasedObject(factory);
QString allProjectsFilter = tr("All Projects");
allProjectsFilter += QLatin1String(" (") + allGlobPatterns.join(QLatin1Char(' '))
+ QLatin1Char(')');
@@ -1655,17 +1647,16 @@ ExtensionSystem::IPlugin::ShutdownFlag ProjectExplorerPlugin::aboutToShutdown()
dd, &ProjectExplorerPluginPrivate::currentModeChanged);
ProjectTree::aboutToShutDown();
SessionManager::closeAllProjects();
dd->m_projectsMode = nullptr;
dd->m_shuttingDown = true;
// Attempt to synchronously shutdown all run controls.
// If that fails, fall back to asynchronous shutdown (Debugger run controls
// might shutdown asynchronously).
delete dd->m_welcomePage;
if (dd->m_activeRunControlCount == 0)
return SynchronousShutdown;
dd->m_outputPane->closeTabs(AppOutputPane::CloseTabNoPrompt /* No prompt any more */);
dd->m_outputPane.closeTabs(AppOutputPane::CloseTabNoPrompt /* No prompt any more */);
dd->m_shutdownWatchDogId = dd->startTimer(10 * 1000); // Make sure we shutdown *somehow*
return AsynchronousShutdown;
}
@@ -1883,7 +1874,7 @@ ProjectExplorerPlugin::OpenProjectResult ProjectExplorerPlugin::openProjects(con
void ProjectExplorerPluginPrivate::updateWelcomePage()
{
m_welcomePage->reloadWelcomeScreenData();
m_welcomePage.reloadWelcomeScreenData();
}
void ProjectExplorerPluginPrivate::currentModeChanged(Id mode, Id oldMode)
@@ -1997,7 +1988,7 @@ void ProjectExplorerPluginPrivate::restoreSession()
// update welcome page
connect(ModeManager::instance(), &ModeManager::currentModeChanged,
dd, &ProjectExplorerPluginPrivate::currentModeChanged);
connect(dd->m_welcomePage, &ProjectWelcomePage::requestProject,
connect(&dd->m_welcomePage, &ProjectWelcomePage::requestProject,
m_instance, &ProjectExplorerPlugin::openProjectWelcomePage);
dd->m_arguments = arguments;
// delay opening projects from the command line even more
@@ -2061,13 +2052,13 @@ void ProjectExplorerPlugin::startRunControl(RunControl *runControl)
void ProjectExplorerPluginPrivate::startRunControl(RunControl *runControl)
{
m_outputPane->createNewOutputWindow(runControl);
m_outputPane->flash(); // one flash for starting
m_outputPane->showTabFor(runControl);
m_outputPane.createNewOutputWindow(runControl);
m_outputPane.flash(); // one flash for starting
m_outputPane.showTabFor(runControl);
Core::Id runMode = runControl->runMode();
bool popup = (runMode == Constants::NORMAL_RUN_MODE && dd->m_projectExplorerSettings.showRunOutput)
|| (runMode == Constants::DEBUG_RUN_MODE && m_projectExplorerSettings.showDebugOutput);
m_outputPane->setBehaviorOnOutput(runControl, popup ? AppOutputPane::Popup : AppOutputPane::Flash);
m_outputPane.setBehaviorOnOutput(runControl, popup ? AppOutputPane::Popup : AppOutputPane::Flash);
connect(runControl, &QObject::destroyed, this, &ProjectExplorerPluginPrivate::checkForShutdown,
Qt::QueuedConnection);
++m_activeRunControlCount;
@@ -2344,7 +2335,7 @@ int ProjectExplorerPluginPrivate::queue(QList<Project *> projects, QList<Id> ste
&& stepIds.contains(Constants::BUILDSTEPS_BUILD)) {
ProjectExplorerSettings::StopBeforeBuild stopCondition = m_projectExplorerSettings.stopBeforeBuild;
const QList<RunControl *> toStop
= Utils::filtered(m_outputPane->allRunControls(), [&projects, stopCondition](RunControl *rc) -> bool {
= Utils::filtered(m_outputPane.allRunControls(), [&projects, stopCondition](RunControl *rc) -> bool {
if (!rc->isRunning())
return false;
@@ -2541,7 +2532,7 @@ bool ProjectExplorerPlugin::coreAboutToClose()
if (box.clickedButton() != closeAnyway)
return false;
}
if (!dd->m_outputPane->aboutToClose())
if (!dd->m_outputPane.aboutToClose())
return false;
return true;
}
@@ -2604,7 +2595,7 @@ void ProjectExplorerPlugin::runRunConfiguration(RunConfiguration *rc,
QList<QPair<Runnable, Utils::ProcessHandle>> ProjectExplorerPlugin::runningRunControlProcesses()
{
QList<QPair<Runnable, Utils::ProcessHandle>> processes;
foreach (RunControl *rc, dd->m_outputPane->allRunControls()) {
foreach (RunControl *rc, dd->m_outputPane.allRunControls()) {
if (rc->isRunning())
processes << qMakePair(rc->runnable(), rc->applicationProcessHandle());
}
@@ -2613,8 +2604,8 @@ QList<QPair<Runnable, Utils::ProcessHandle>> ProjectExplorerPlugin::runningRunCo
void ProjectExplorerPluginPrivate::projectAdded(Project *pro)
{
if (m_projectsMode)
m_projectsMode->setEnabled(true);
m_projectsMode.setEnabled(true);
// more specific action en and disabling ?
pro->subscribeSignal(&BuildConfiguration::enabledChanged, this, [this]() {
auto bc = qobject_cast<BuildConfiguration *>(sender());
@@ -2633,8 +2624,7 @@ void ProjectExplorerPluginPrivate::projectAdded(Project *pro)
void ProjectExplorerPluginPrivate::projectRemoved(Project *pro)
{
Q_UNUSED(pro);
if (m_projectsMode)
m_projectsMode->setEnabled(SessionManager::hasProjects());
m_projectsMode.setEnabled(SessionManager::hasProjects());
}
void ProjectExplorerPluginPrivate::projectDisplayNameChanged(Project *pro)

View File

@@ -79,7 +79,7 @@ private:
static QVector<Core::Id> m_registeredCategories;
friend class ProjectExplorerPlugin;
friend class ProjectExplorerPluginPrivate;
};
} // namespace ProjectExplorer