diff --git a/src/plugins/projectexplorer/devicesupport/devicemanager.h b/src/plugins/projectexplorer/devicesupport/devicemanager.h index cbfbafb0ce2..964e10ff819 100644 --- a/src/plugins/projectexplorer/devicesupport/devicemanager.h +++ b/src/plugins/projectexplorer/devicesupport/devicemanager.h @@ -107,6 +107,7 @@ private: friend class Internal::DeviceManagerPrivate; friend class ProjectExplorerPlugin; + friend class ProjectExplorerPluginPrivate; }; } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 8dea33de332..bdadf099fdb 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -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 m_customProjectWizard{IWizardFactory::ProjectWizard}; + CustomWizardMetaFactory 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(); qRegisterMetaType("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 { QList 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(IWizardFactory::ProjectWizard)); - addAutoReleasedObject(new CustomWizardMetaFactory(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()) @@ -650,14 +657,6 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er }; RunControl::registerWorker(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 projects, QList ste && stepIds.contains(Constants::BUILDSTEPS_BUILD)) { ProjectExplorerSettings::StopBeforeBuild stopCondition = m_projectExplorerSettings.stopBeforeBuild; const QList 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> ProjectExplorerPlugin::runningRunControlProcesses() { QList> 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> 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(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) diff --git a/src/plugins/projectexplorer/taskhub.h b/src/plugins/projectexplorer/taskhub.h index 87dbfe6d6a4..80bb6a5219a 100644 --- a/src/plugins/projectexplorer/taskhub.h +++ b/src/plugins/projectexplorer/taskhub.h @@ -79,7 +79,7 @@ private: static QVector m_registeredCategories; - friend class ProjectExplorerPlugin; + friend class ProjectExplorerPluginPrivate; }; } // namespace ProjectExplorer