diff --git a/src/plugins/analyzerbase/analyzerconstants.h b/src/plugins/analyzerbase/analyzerconstants.h index 883f77b9cf4449f19d046e10eabee2fcdc9246e9..4a110a49acfd796e546f1887e7db2c0834c89fa6 100644 --- a/src/plugins/analyzerbase/analyzerconstants.h +++ b/src/plugins/analyzerbase/analyzerconstants.h @@ -61,6 +61,9 @@ const char * const START = "Analyzer.Start"; const char * const STARTREMOTE = "Analyzer.StartRemote"; const char * const STOP = "Analyzer.Stop"; +const char * const G_ANALYZER_TOOLS = "Menu.Group.Analyzer.Tools"; +const char * const G_ANALYZER_REMOTE_TOOLS = "Menu.Group.Analyzer.RemoteTools"; + // options dialog const char * const ANALYZER_SETTINGS_CATEGORY = "T.Analyzer"; const char * const ANALYZER_SETTINGS_TR_CATEGORY = diff --git a/src/plugins/analyzerbase/analyzermanager.cpp b/src/plugins/analyzerbase/analyzermanager.cpp index 8553afab86a1adf278569b0b9e3d9ddfc19deb59..86f5b1d81755037a04ff2da5a4abf13d772090cc 100644 --- a/src/plugins/analyzerbase/analyzermanager.cpp +++ b/src/plugins/analyzerbase/analyzermanager.cpp @@ -76,7 +76,9 @@ #include <utils/statuslabel.h> #include <utils/ssh/sshconnection.h> -#include <cmakeprojectmanager/cmakeprojectconstants.h> +#include <projectexplorer/applicationrunconfiguration.h> +#include <remotelinux/linuxdeviceconfiguration.h> +#include <remotelinux/remotelinuxrunconfiguration.h> #include <QtCore/QVariant> #include <QtCore/QDebug> @@ -105,10 +107,44 @@ namespace Analyzer { namespace Internal { const char lastActiveToolC[] = "Analyzer.Plugin.LastActiveTool"; -const char G_ANALYZER_TOOLS[] = "Menu.Group.Analyzer.Tools"; -const char G_ANALYZER_REMOTE_TOOLS[] = "Menu.Group.Analyzer.RemoteTools"; const char INITIAL_DOCK_AREA[] = "initial_dock_area"; +AnalyzerStartParameters localStartParameters(ProjectExplorer::RunConfiguration *runConfiguration) +{ + AnalyzerStartParameters sp; + QTC_ASSERT(runConfiguration, return sp); + ProjectExplorer::LocalApplicationRunConfiguration *rc = + qobject_cast<ProjectExplorer::LocalApplicationRunConfiguration *>(runConfiguration); + QTC_ASSERT(rc, return sp); + + sp.startMode = StartLocal; + sp.environment = rc->environment(); + sp.workingDirectory = rc->workingDirectory(); + sp.debuggee = rc->executable(); + sp.debuggeeArgs = rc->commandLineArguments(); + sp.displayName = rc->displayName(); + sp.connParams.host = QLatin1String("localhost"); + sp.connParams.port = rc->qmlDebugServerPort(); + return sp; +} + +AnalyzerStartParameters remoteLinuxStartParameters(ProjectExplorer::RunConfiguration *runConfiguration) +{ + AnalyzerStartParameters sp; + RemoteLinux::RemoteLinuxRunConfiguration * const rc + = qobject_cast<RemoteLinux::RemoteLinuxRunConfiguration *>(runConfiguration); + QTC_ASSERT(rc, return sp); + + sp.debuggee = rc->remoteExecutableFilePath(); + sp.debuggeeArgs = rc->arguments(); + sp.connParams = rc->deviceConfig()->sshParameters(); + sp.analyzerCmdPrefix = rc->commandPrefix(); + sp.startMode = StartRemote; + sp.displayName = rc->displayName(); + return sp; +} + + // AnalyzerMode //////////////////////////////////////////////////// class AnalyzerMode : public Core::IMode @@ -175,44 +211,40 @@ public: const QString &stopButtonText, const QString &cancelButtonText) const; void addDock(Qt::DockWidgetArea area, QDockWidget *dockWidget); - void startAction(int tool); + void startLocalTool(IAnalyzerTool *tool); + void startRemoteTool(IAnalyzerTool *tool); void addTool(IAnalyzerTool *tool); - void addToolAction(IAnalyzerTool *tool, bool local); + void stopTool(IAnalyzerTool *tool); + void handleToolFinished(IAnalyzerTool *tool); int indexOf(IAnalyzerTool *tool) const; - int indexOf(QAction *action) const; IAnalyzerTool *toolAt(int idx) const; + void saveToolSettings(IAnalyzerTool *tool); + void loadToolSettings(IAnalyzerTool *tool); + + void registerRunControlFactory(ProjectExplorer::IRunControlFactory *factory); + ProjectExplorer::RunControl *createRunControl + (ProjectExplorer::RunConfiguration *runConfiguration, const QString &mode); public slots: - void startAction() { startAction(m_currentIndex); } - void startToolRemote(); - void stopTool(); - - void handleToolFinished(); - void selectAction(); - void selectAction(int); - void selectAction(QAction *); + void startTool(); + void stopTool() { stopTool(m_currentTool); } + + void selectTool(); + void selectTool(IAnalyzerTool *tool); + void selectTool(QAction *); + void selectTool(int); void modeChanged(Core::IMode *mode); - void runControlCreated(Analyzer::AnalyzerRunControl *); void resetLayout(); - void saveToolSettings(Analyzer::IAnalyzerTool *tool); - void loadToolSettings(Analyzer::IAnalyzerTool *tool); void updateRunActions(); - void registerRunControlFactory(ProjectExplorer::IRunControlFactory *factory); public: - struct ToolData { - IAnalyzerTool *tool; - QAction *action; - bool local; - }; - AnalyzerManager *q; AnalyzerMode *m_mode; AnalyzerRunControlFactory *m_runControlFactory; ProjectExplorer::RunControl *m_currentRunControl; Utils::FancyMainWindow *m_mainWindow; - int m_currentIndex; - QList<ToolData> m_actions; + IAnalyzerTool *m_currentTool; + QHash<QAction *, IAnalyzerTool *> m_toolFromAction; QList<IAnalyzerTool *> m_tools; QAction *m_startAction; QAction *m_stopAction; @@ -222,7 +254,7 @@ public: ActionContainer *m_viewsMenu; Utils::StatusLabel *m_statusLabel; typedef QMap<IAnalyzerTool *, FancyMainWindowSettings> MainWindowSettingsMap; - QMap<IAnalyzerTool *, QList<QDockWidget *> > m_toolWidgets; + QHash<IAnalyzerTool *, QList<QDockWidget *> > m_toolWidgets; MainWindowSettingsMap m_defaultSettings; // list of dock widgets to prevent memory leak @@ -239,7 +271,7 @@ AnalyzerManager::AnalyzerManagerPrivate::AnalyzerManagerPrivate(AnalyzerManager m_runControlFactory(0), m_currentRunControl(0), m_mainWindow(0), - m_currentIndex(-1), + m_currentTool(0), m_startAction(0), m_stopAction(0), m_menu(0), @@ -251,7 +283,7 @@ AnalyzerManager::AnalyzerManagerPrivate::AnalyzerManagerPrivate(AnalyzerManager m_initialized(false) { m_toolBox->setObjectName(QLatin1String("AnalyzerManagerToolBox")); - connect(m_toolBox, SIGNAL(currentIndexChanged(int)), SLOT(selectAction(int))); + connect(m_toolBox, SIGNAL(currentIndexChanged(int)), SLOT(selectTool(int))); m_runControlFactory = new AnalyzerRunControlFactory(); registerRunControlFactory(m_runControlFactory); @@ -279,8 +311,6 @@ void AnalyzerManager::AnalyzerManagerPrivate::registerRunControlFactory (ProjectExplorer::IRunControlFactory *factory) { AnalyzerPlugin::instance()->addAutoReleasedObject(factory); - connect(factory, SIGNAL(runControlCreated(Analyzer::AnalyzerRunControl*)), - this, SLOT(runControlCreated(Analyzer::AnalyzerRunControl*))); } void AnalyzerManager::AnalyzerManagerPrivate::setupActions() @@ -295,8 +325,8 @@ void AnalyzerManager::AnalyzerManagerPrivate::setupActions() m_menu->menu()->setTitle(tr("&Analyze")); m_menu->menu()->setEnabled(true); - m_menu->appendGroup(G_ANALYZER_TOOLS); - m_menu->appendGroup(G_ANALYZER_REMOTE_TOOLS); + m_menu->appendGroup(Constants::G_ANALYZER_TOOLS); + m_menu->appendGroup(Constants::G_ANALYZER_REMOTE_TOOLS); Core::ActionContainer *menubar = am->actionContainer(Core::Constants::MENU_BAR); @@ -307,7 +337,7 @@ void AnalyzerManager::AnalyzerManagerPrivate::setupActions() m_startAction = new QAction(tr("Start"), m_menu); m_startAction->setIcon(QIcon(Constants::ANALYZER_CONTROL_START_ICON)); command = am->registerAction(m_startAction, Constants::START, globalcontext); - connect(m_startAction, SIGNAL(triggered()), this, SLOT(startAction())); + connect(m_startAction, SIGNAL(triggered()), this, SLOT(startTool())); m_stopAction = new QAction(tr("Stop"), m_menu); m_stopAction->setEnabled(false); @@ -319,7 +349,7 @@ void AnalyzerManager::AnalyzerManagerPrivate::setupActions() separatorAction->setSeparator(true); command = am->registerAction(separatorAction, "Menu.Action.Analyzer.Tools.Separator", globalcontext); - m_menu->addAction(command, G_ANALYZER_REMOTE_TOOLS); + m_menu->addAction(command, Constants::G_ANALYZER_REMOTE_TOOLS); m_viewsMenu = am->actionContainer(Core::Id(Core::Constants::M_WINDOW_VIEWS)); } @@ -477,8 +507,30 @@ bool AnalyzerManager::AnalyzerManagerPrivate::showPromptDialog(const QString &ti return messageBox.clickedStandardButton() == QDialogButtonBox::Yes; } -void AnalyzerManager::AnalyzerManagerPrivate::startToolRemote() +ProjectExplorer::RunControl *AnalyzerManager::AnalyzerManagerPrivate::createRunControl + (ProjectExplorer::RunConfiguration *runConfiguration, const QString &mode) { + Q_UNUSED(mode); + + AnalyzerStartParameters sp; + if (qobject_cast<ProjectExplorer::LocalApplicationRunConfiguration *>(runConfiguration)) { + sp = localStartParameters(runConfiguration); + } else if (qobject_cast<RemoteLinux::RemoteLinuxRunConfiguration *>(runConfiguration)) { + sp = remoteLinuxStartParameters(runConfiguration); + } else { + // might be S60DeviceRunfiguration, or something else ... + sp.startMode = StartRemote; + } + + IAnalyzerTool *tool = m_currentTool; + AnalyzerRunControl *rc = new AnalyzerRunControl(tool, sp, runConfiguration); + m_currentRunControl = rc; + return rc; +} + +void AnalyzerManager::AnalyzerManagerPrivate::startRemoteTool(IAnalyzerTool *tool) +{ + Q_UNUSED(tool); StartRemoteDialog dlg; if (dlg.exec() != QDialog::Accepted) return; @@ -491,23 +543,20 @@ void AnalyzerManager::AnalyzerManagerPrivate::startToolRemote() sp.startMode = StartRemote; sp.workingDirectory = dlg.workingDirectory(); - AnalyzerRunControl *runControl = m_runControlFactory->create(sp, 0); + AnalyzerRunControl *runControl = new AnalyzerRunControl(tool, sp, 0); + + m_currentRunControl = runControl; - QTC_ASSERT(runControl, return); ProjectExplorer::ProjectExplorerPlugin::instance() ->startRunControl(runControl, Constants::MODE_ANALYZE); } -void AnalyzerManager::AnalyzerManagerPrivate::startAction(int index) +void AnalyzerManager::AnalyzerManagerPrivate::startLocalTool(IAnalyzerTool *tool) { + int index = indexOf(tool); QTC_ASSERT(index >= 0, return); - QTC_ASSERT(index < m_actions.size(), return); - QTC_ASSERT(index == m_currentIndex, return); - - if (!m_actions.at(index).local) { - startToolRemote(); - return; - } + QTC_ASSERT(index < m_tools.size(), return); + QTC_ASSERT(tool == m_currentTool, return); // make sure mode is shown q->showMode(); @@ -543,11 +592,10 @@ void AnalyzerManager::AnalyzerManagerPrivate::startAction(int index) // user selected to stop the active run. stop it, activate restart on stop m_restartOnStop = true; - stopTool(); + stopTool(m_currentTool); return; } - IAnalyzerTool *tool = toolAt(index); IAnalyzerTool::ToolMode toolMode = tool->mode(); // Check the project for whether the build config is in the correct mode @@ -588,15 +636,21 @@ void AnalyzerManager::AnalyzerManagerPrivate::startAction(int index) updateRunActions(); } +void AnalyzerManager::AnalyzerManagerPrivate::startTool() +{ + if (m_currentTool) + m_currentTool->startTool(); +} -void AnalyzerManager::AnalyzerManagerPrivate::stopTool() +void AnalyzerManager::AnalyzerManagerPrivate::stopTool(IAnalyzerTool *tool) { + QTC_ASSERT(tool == m_currentTool, /**/); if (m_currentRunControl) return; // be sure to call handleToolFinished only once, and only when the engine is really finished if (m_currentRunControl->stop() == ProjectExplorer::RunControl::StoppedSynchronously) - handleToolFinished(); + handleToolFinished(tool); // else: wait for the finished() signal to trigger handleToolFinished() } @@ -610,14 +664,20 @@ void AnalyzerManager::AnalyzerManagerPrivate::modeChanged(IMode *mode) m_mainWindow->setDockActionsVisible(makeVisible); } -void AnalyzerManager::AnalyzerManagerPrivate::selectAction(int idx) +void AnalyzerManager::AnalyzerManagerPrivate::selectTool(int index) { + selectTool(m_tools[index]); +} + +void AnalyzerManager::AnalyzerManagerPrivate::selectTool(IAnalyzerTool *tool) +{ + int idx = indexOf(tool); QTC_ASSERT(idx >= 0, return); - if (m_currentIndex == idx) + if (m_currentTool == tool) return; - if (m_currentIndex != -1) { - IAnalyzerTool *oldTool = toolAt(m_currentIndex); + if (m_currentTool) { + IAnalyzerTool *oldTool = m_currentTool; saveToolSettings(oldTool); ActionManager *am = ICore::instance()->actionManager(); @@ -638,113 +698,81 @@ void AnalyzerManager::AnalyzerManagerPrivate::selectAction(int idx) oldTool->toolDeselected(); } - m_currentIndex = idx; + m_currentTool = tool; m_toolBox->setCurrentIndex(idx); m_controlsWidget->setCurrentIndex(idx); - IAnalyzerTool *newTool = toolAt(idx); - - const bool firstTime = !m_defaultSettings.contains(newTool); + const bool firstTime = !m_defaultSettings.contains(tool); if (firstTime) { - newTool->initializeDockWidgets(); - m_defaultSettings.insert(newTool, m_mainWindow->saveSettings()); + tool->initializeDockWidgets(); + m_defaultSettings.insert(tool, m_mainWindow->saveSettings()); } else { - foreach (QDockWidget *widget, m_toolWidgets.value(newTool)) + foreach (QDockWidget *widget, m_toolWidgets.value(tool)) addDock(Qt::DockWidgetArea(widget->property(INITIAL_DOCK_AREA).toInt()), widget); } - loadToolSettings(newTool); + loadToolSettings(tool); updateRunActions(); } -void AnalyzerManager::AnalyzerManagerPrivate::selectAction() -{ - selectAction(qobject_cast<QAction *>(sender())); -} - -void AnalyzerManager::AnalyzerManagerPrivate::selectAction(QAction *action) +void AnalyzerManager::AnalyzerManagerPrivate::selectTool() { - selectAction(indexOf(action)); + selectTool(qobject_cast<QAction *>(sender())); } -int AnalyzerManager::AnalyzerManagerPrivate::indexOf(QAction *action) const +void AnalyzerManager::AnalyzerManagerPrivate::selectTool(QAction *action) { - for (int i = 0; i != m_actions.size(); ++i) - if (m_actions.at(i).action == action) - return i; - return -1; + selectTool(m_toolFromAction[action]); } int AnalyzerManager::AnalyzerManagerPrivate::indexOf(IAnalyzerTool *tool) const { - for (int i = 0; i != m_actions.size(); ++i) - if (toolAt(i) == tool) - return i; - return -1; + return m_tools.indexOf(tool); } IAnalyzerTool *AnalyzerManager::AnalyzerManagerPrivate::toolAt(int idx) const { QTC_ASSERT(idx >= 0, return 0); - QTC_ASSERT(idx < m_actions.size(), return 0); - return m_actions.at(idx).tool; + QTC_ASSERT(idx < m_tools.size(), return 0); + return m_tools.at(idx); } -void AnalyzerManager::AnalyzerManagerPrivate::addToolAction(IAnalyzerTool *tool, bool local) +void AnalyzerManager::AnalyzerManagerPrivate::addTool(IAnalyzerTool *tool) { ActionManager *am = Core::ICore::instance()->actionManager(); + delayedInit(); // be sure that there is a valid IMode instance - QString actionId = QString("Action.Analyzer.Tools.%1").arg(m_actions.size()); - QString displayName = tool->displayName() + (local ? QString() : tr(" (Remote)")); + QString actionId = QString("Action.Analyzer.Tools." + tool->id()); + QString displayName = tool->displayName(); QAction *action = new QAction(displayName, 0); - - ToolData data; - data.tool = tool; - data.local = local; - data.action = action; - m_actions.append(data); + qDebug() << "ACTION: " << tool << actionId; Core::Command *command = am->registerAction(action, actionId, Core::Context(Core::Constants::C_GLOBAL)); - m_menu->addAction(command, local ? G_ANALYZER_TOOLS : G_ANALYZER_REMOTE_TOOLS); - connect(action, SIGNAL(triggered()), SLOT(selectAction())); + m_menu->addAction(command, QString::fromLatin1(tool->menuGroup())); + connect(action, SIGNAL(triggered()), SLOT(selectTool())); const bool blocked = m_toolBox->blockSignals(true); // Do not make current. m_toolBox->addItem(displayName); m_toolBox->blockSignals(blocked); m_toolBox->setEnabled(true); -} - -void AnalyzerManager::AnalyzerManagerPrivate::addTool(IAnalyzerTool *tool) -{ - delayedInit(); // be sure that there is a valid IMode instance - m_tools.append(tool); - if (tool->canRunLocally()) - addToolAction(tool, true); - if (tool->canRunRemotely()) - addToolAction(tool, false); // Populate controls widget. QWidget *controlWidget = tool->createControlWidget(); // might be 0 m_controlsWidget->addWidget(controlWidget ? controlWidget : AnalyzerUtils::createDummyWidget()); - tool->initialize(); -} - -void AnalyzerManager::AnalyzerManagerPrivate::runControlCreated(AnalyzerRunControl *rc) -{ - QTC_ASSERT(!m_currentRunControl, /**/); - m_currentRunControl = rc; - connect(rc, SIGNAL(finished()), this, SLOT(handleToolFinished())); + m_tools.append(tool); + m_toolFromAction[action] = tool; } -void AnalyzerManager::AnalyzerManagerPrivate::handleToolFinished() +void AnalyzerManager::AnalyzerManagerPrivate::handleToolFinished(IAnalyzerTool *tool) { + QTC_ASSERT(tool == m_currentTool, /**/); m_currentRunControl = 0; updateRunActions(); if (m_restartOnStop) { - startAction(m_currentIndex); + m_currentTool->startTool(); m_restartOnStop = false; } } @@ -781,12 +809,12 @@ void AnalyzerManager::AnalyzerManagerPrivate::updateRunActions() bool startEnabled = !m_currentRunControl && pe->canRun(project, Constants::MODE_ANALYZE) - && m_currentIndex >= 0; + && m_currentTool >= 0; QString disabledReason; if (m_currentRunControl) disabledReason = tr("An analysis is still in progress."); - else if (m_currentIndex == -1) + else if (!m_currentTool) disabledReason = tr("No analyzer tool selected."); else disabledReason = pe->cannotRunReason(project, Constants::MODE_ANALYZE); @@ -825,42 +853,37 @@ void AnalyzerManager::extensionsInitialized() const QSettings *settings = Core::ICore::instance()->settings(); const QString lastActiveToolId = settings->value(QLatin1String(lastActiveToolC), QString()).toString(); - int lastAction = 0; + IAnalyzerTool *lastTool = 0; foreach (IAnalyzerTool *tool, d->m_tools) { tool->extensionsInitialized(); if (tool->id() == lastActiveToolId) - lastAction = d->indexOf(tool); + lastTool = tool; } - d->selectAction(lastAction); + d->selectTool(lastTool); } void AnalyzerManager::shutdown() { - d->saveToolSettings(d->m_actions[d->m_currentIndex].tool); -} - -AnalyzerManager *AnalyzerManager::instance() -{ - return m_instance; + d->saveToolSettings(d->m_currentTool); } void AnalyzerManager::registerRunControlFactory(ProjectExplorer::IRunControlFactory *factory) { - d->registerRunControlFactory(factory); + m_instance->d->registerRunControlFactory(factory); } void AnalyzerManager::addTool(IAnalyzerTool *tool) { - d->addTool(tool); + m_instance->d->addTool(tool); } QDockWidget *AnalyzerManager::createDockWidget(IAnalyzerTool *tool, const QString &title, QWidget *widget, Qt::DockWidgetArea area) { - QTC_ASSERT(!widget->objectName().isEmpty(), return 0;); - + QTC_ASSERT(!widget->objectName().isEmpty(), return 0); + AnalyzerManagerPrivate *d = m_instance->d; QDockWidget *dockWidget = d->m_mainWindow->addDockForWidget(widget); dockWidget->setProperty(INITIAL_DOCK_AREA, int(area)); d->m_dockWidgets.append(AnalyzerManagerPrivate::DockPtr(dockWidget)); @@ -870,37 +893,30 @@ QDockWidget *AnalyzerManager::createDockWidget(IAnalyzerTool *tool, const QStrin return dockWidget; } -IAnalyzerEngine *AnalyzerManager::createEngine(const AnalyzerStartParameters &sp, - ProjectExplorer::RunConfiguration *runConfiguration) -{ - IAnalyzerTool *tool = d->toolAt(d->m_currentIndex); - QTC_ASSERT(tool, return 0); - return tool->createEngine(sp, runConfiguration); -} - void AnalyzerManager::selectTool(IAnalyzerTool *tool) { - d->selectAction(d->indexOf(tool)); + m_instance->d->selectTool(tool); } void AnalyzerManager::startTool(IAnalyzerTool *tool) { - d->startAction(d->indexOf(tool)); + QTC_ASSERT(tool == m_instance->d->m_currentTool, return); + m_instance->d->startTool(); } -Utils::FancyMainWindow *AnalyzerManager::mainWindow() const +Utils::FancyMainWindow *AnalyzerManager::mainWindow() { - return d->m_mainWindow; + return m_instance->d->m_mainWindow; } void AnalyzerManager::AnalyzerManagerPrivate::resetLayout() { - m_mainWindow->restoreSettings(m_defaultSettings.value(toolAt(m_currentIndex))); + m_mainWindow->restoreSettings(m_defaultSettings.value(m_currentTool)); } void AnalyzerManager::showStatusMessage(const QString &message, int timeoutMS) { - d->m_statusLabel->showStatusMessage(message, timeoutMS); + m_instance->d->m_statusLabel->showStatusMessage(message, timeoutMS); } void AnalyzerManager::showPermanentStatusMessage(const QString &message) @@ -922,13 +938,43 @@ QString AnalyzerManager::msgToolFinished(const QString &name, int issuesFound) void AnalyzerManager::showMode() { - if (d->m_mode) - ModeManager::instance()->activateMode(d->m_mode->id()); + if (m_instance->d->m_mode) + ModeManager::instance()->activateMode(m_instance->d->m_mode->id()); +} + +void AnalyzerManager::stopTool(IAnalyzerTool *tool) +{ + m_instance->stopTool(tool); +} + +void AnalyzerManager::startLocalTool(IAnalyzerTool *tool) +{ + m_instance->startLocalTool(tool); +} + +void AnalyzerManager::startRemoteTool(IAnalyzerTool *tool) +{ + m_instance->startRemoteTool(tool); +} + +ProjectExplorer::RunControl *AnalyzerManager::createRunControl + (ProjectExplorer::RunConfiguration *runConfiguration, const QString &mode) +{ + return m_instance->createRunControl(runConfiguration, mode); +} + +void AnalyzerManager::handleToolFinished(IAnalyzerTool *tool) +{ + m_instance->d->handleToolFinished(tool); } -void AnalyzerManager::stopTool() +IAnalyzerTool *AnalyzerManager::toolById(const QByteArray &id) { - d->stopTool(); + foreach (IAnalyzerTool *tool, m_instance->d->m_tools) + if (tool->id() == id) + return tool; + QTC_ASSERT(false, qDebug() << "NO ANAYLYZER TOOL FOUND FOR ID" << id); + return 0; } #include "analyzermanager.moc" diff --git a/src/plugins/analyzerbase/analyzermanager.h b/src/plugins/analyzerbase/analyzermanager.h index a46ce59cb10881843681990017a7044a900a55cc..bb511486bbf95965d278749a44cfba455beb2de1 100644 --- a/src/plugins/analyzerbase/analyzermanager.h +++ b/src/plugins/analyzerbase/analyzermanager.h @@ -48,10 +48,6 @@ namespace Utils { class FancyMainWindow; } -namespace ProjectExplorer { -class RunConfiguration; -} - namespace Analyzer { class IAnalyzerTool; class IAnalyzerEngine; @@ -65,37 +61,39 @@ public: explicit AnalyzerManager(QObject *parent = 0); ~AnalyzerManager(); - static AnalyzerManager *instance(); - void registerRunControlFactory(ProjectExplorer::IRunControlFactory *factory); - + static void registerRunControlFactory(ProjectExplorer::IRunControlFactory *factory); void extensionsInitialized(); void shutdown(); - /** - * Register a tool and initialize it. - */ - void addTool(Analyzer::IAnalyzerTool *tool); + static ProjectExplorer::RunControl *createRunControl + (ProjectExplorer::RunConfiguration *runConfiguration, const QString &mode); + + // Register a tool and initialize it. + static void addTool(Analyzer::IAnalyzerTool *tool); + static IAnalyzerTool *toolById(const QByteArray &id); // Dockwidgets are registered to the main window. - QDockWidget *createDockWidget(IAnalyzerTool *tool, const QString &title, + static QDockWidget *createDockWidget(IAnalyzerTool *tool, const QString &title, QWidget *widget, Qt::DockWidgetArea area = Qt::TopDockWidgetArea); - Utils::FancyMainWindow *mainWindow() const; + static Utils::FancyMainWindow *mainWindow(); + + static void showMode(); + static void selectTool(IAnalyzerTool *tool); + static void startTool(IAnalyzerTool *tool); + static void stopTool(IAnalyzerTool *tool); - void showMode(); - void selectTool(IAnalyzerTool *tool); - void startTool(IAnalyzerTool *tool); - void stopTool(); + // Convienience functions. + static void startLocalTool(IAnalyzerTool *tool); + static void startRemoteTool(IAnalyzerTool *tool); static QString msgToolStarted(const QString &name); static QString msgToolFinished(const QString &name, int issuesFound); - IAnalyzerEngine *createEngine(const AnalyzerStartParameters &sp, - ProjectExplorer::RunConfiguration *runConfiguration); + static void showStatusMessage(const QString &message, int timeoutMS = 10000); + static void showPermanentStatusMessage(const QString &message); -public slots: - void showStatusMessage(const QString &message, int timeoutMS = 10000); - void showPermanentStatusMessage(const QString &message); + static void handleToolFinished(IAnalyzerTool *tool); private: class AnalyzerManagerPrivate; diff --git a/src/plugins/analyzerbase/analyzerruncontrol.cpp b/src/plugins/analyzerbase/analyzerruncontrol.cpp index 920c62ef10759a34e4f4330b8a0b1e298196150a..a9f42e5408a4852ee9c693662ef340dbdf998686 100644 --- a/src/plugins/analyzerbase/analyzerruncontrol.cpp +++ b/src/plugins/analyzerbase/analyzerruncontrol.cpp @@ -47,6 +47,7 @@ #include <coreplugin/ioutputpane.h> #include <QtCore/QDebug> +#include <QtCore/QTimer> using namespace Analyzer; @@ -67,12 +68,12 @@ AnalyzerRunControl::Private::Private() // AnalyzerRunControl //////////////////////////////////////////////////// -AnalyzerRunControl::AnalyzerRunControl(const AnalyzerStartParameters &sp, - RunConfiguration *runConfiguration) +AnalyzerRunControl::AnalyzerRunControl(IAnalyzerTool *tool, + const AnalyzerStartParameters &sp, RunConfiguration *runConfiguration) : RunControl(runConfiguration, Constants::MODE_ANALYZE), d(new Private) { - d->m_engine = AnalyzerManager::instance()->createEngine(sp, runConfiguration); + d->m_engine = tool->createEngine(sp, runConfiguration); if (!d->m_engine) return; @@ -83,6 +84,7 @@ AnalyzerRunControl::AnalyzerRunControl(const AnalyzerStartParameters &sp, SLOT(addTask(ProjectExplorer::Task::TaskType,QString,QString,int))); connect(d->m_engine, SIGNAL(finished()), SLOT(engineFinished())); + connect(this, SIGNAL(finished()), SLOT(runControlFinished()), Qt::QueuedConnection); } AnalyzerRunControl::~AnalyzerRunControl() @@ -127,6 +129,11 @@ void AnalyzerRunControl::engineFinished() emit finished(); } +void AnalyzerRunControl::runControlFinished() +{ + AnalyzerManager::handleToolFinished(d->m_engine->tool()); +} + bool AnalyzerRunControl::isRunning() const { return d->m_isRunning; diff --git a/src/plugins/analyzerbase/analyzerruncontrol.h b/src/plugins/analyzerbase/analyzerruncontrol.h index 59a2a2e7209cc8bb45e68bb95c50111905be7c95..a2d0c893d1d1114be972b9e60cd1e7e0c6e004ec 100644 --- a/src/plugins/analyzerbase/analyzerruncontrol.h +++ b/src/plugins/analyzerbase/analyzerruncontrol.h @@ -45,6 +45,7 @@ namespace Analyzer { class AnalyzerStartParameters; +class IAnalyzerTool; class ANALYZER_EXPORT AnalyzerRunControl: public ProjectExplorer::RunControl { @@ -52,8 +53,8 @@ class ANALYZER_EXPORT AnalyzerRunControl: public ProjectExplorer::RunControl public: typedef ProjectExplorer::RunConfiguration RunConfiguration; - // the constructor is likely to gain more arguments later - explicit AnalyzerRunControl(const AnalyzerStartParameters &sp, RunConfiguration *runConfiguration); + AnalyzerRunControl(IAnalyzerTool *tool, const AnalyzerStartParameters &sp, + RunConfiguration *runConfiguration); ~AnalyzerRunControl(); // pure virtuals from ProjectExplorer::RunControl @@ -70,6 +71,7 @@ private slots: const QString &file, int line); void engineFinished(); + void runControlFinished(); private: class Private; diff --git a/src/plugins/analyzerbase/analyzerruncontrolfactory.cpp b/src/plugins/analyzerbase/analyzerruncontrolfactory.cpp index 3e7efb81e85984e7513a1f379dc66415692ea66e..a3a5258e9b6d2aab5be3416b61884570fb588792 100644 --- a/src/plugins/analyzerbase/analyzerruncontrolfactory.cpp +++ b/src/plugins/analyzerbase/analyzerruncontrolfactory.cpp @@ -33,59 +33,25 @@ #include "analyzerruncontrolfactory.h" #include "analyzerruncontrol.h" #include "analyzerconstants.h" +#include "analyzermanager.h" #include "analyzerrunconfigwidget.h" #include "analyzersettings.h" #include "analyzerstartparameters.h" -#include <utils/qtcassert.h> - #include <projectexplorer/applicationrunconfiguration.h> - -#include <remotelinux/linuxdeviceconfiguration.h> -#include <remotelinux/remotelinuxrunconfiguration.h> +#include <utils/qtcassert.h> #include <QtCore/QDebug> using namespace Analyzer; using namespace Analyzer::Internal; -AnalyzerStartParameters localStartParameters(ProjectExplorer::RunConfiguration *runConfiguration) -{ - AnalyzerStartParameters sp; - QTC_ASSERT(runConfiguration, return sp); - ProjectExplorer::LocalApplicationRunConfiguration *rc = - qobject_cast<ProjectExplorer::LocalApplicationRunConfiguration *>(runConfiguration); - QTC_ASSERT(rc, return sp); - - sp.startMode = StartLocal; - sp.environment = rc->environment(); - sp.workingDirectory = rc->workingDirectory(); - sp.debuggee = rc->executable(); - sp.debuggeeArgs = rc->commandLineArguments(); - sp.displayName = rc->displayName(); - sp.connParams.host = QLatin1String("localhost"); - sp.connParams.port = rc->qmlDebugServerPort(); - return sp; -} - -AnalyzerStartParameters remoteLinuxStartParameters(ProjectExplorer::RunConfiguration *runConfiguration) -{ - AnalyzerStartParameters sp; - RemoteLinux::RemoteLinuxRunConfiguration * const rc - = qobject_cast<RemoteLinux::RemoteLinuxRunConfiguration *>(runConfiguration); - QTC_ASSERT(rc, return sp); +///////////////////////////////////////////////////////////////////////////////// +// +// AnalyzerRunControlFactory +// +///////////////////////////////////////////////////////////////////////////////// - sp.debuggee = rc->remoteExecutableFilePath(); - sp.debuggeeArgs = rc->arguments(); - sp.connParams = rc->deviceConfig()->sshParameters(); - sp.analyzerCmdPrefix = rc->commandPrefix(); - sp.startMode = StartRemote; - sp.displayName = rc->displayName(); - return sp; -} - - -// AnalyzerRunControlFactory //////////////////////////////////////////////////// AnalyzerRunControlFactory::AnalyzerRunControlFactory(QObject *parent) : IRunControlFactory(parent) { @@ -100,26 +66,7 @@ ProjectExplorer::RunControl *AnalyzerRunControlFactory::create(RunConfiguration const QString &mode) { QTC_ASSERT(canRun(runConfiguration, mode), return 0); - - AnalyzerStartParameters sp; - if (qobject_cast<ProjectExplorer::LocalApplicationRunConfiguration *>(runConfiguration)) { - sp = localStartParameters(runConfiguration); - } else if (qobject_cast<RemoteLinux::RemoteLinuxRunConfiguration *>(runConfiguration)) { - sp = remoteLinuxStartParameters(runConfiguration); - } else { - // might be S60DeviceRunfiguration, or something else ... - sp.startMode = StartRemote; - } - - return create(sp, runConfiguration); -} - -AnalyzerRunControl *AnalyzerRunControlFactory::create(const AnalyzerStartParameters &sp, - RunConfiguration *runConfiguration) -{ - AnalyzerRunControl *rc = new AnalyzerRunControl(sp, runConfiguration); - emit runControlCreated(rc); - return rc; + return AnalyzerManager::createRunControl(runConfiguration, mode); } QString AnalyzerRunControlFactory::displayName() const diff --git a/src/plugins/analyzerbase/analyzerruncontrolfactory.h b/src/plugins/analyzerbase/analyzerruncontrolfactory.h index 7c518f15cc8126262e8e238d3ab44029bb83bdd5..573c87bbfff048f71c6dbf9a6cdd13b5b44bd236 100644 --- a/src/plugins/analyzerbase/analyzerruncontrolfactory.h +++ b/src/plugins/analyzerbase/analyzerruncontrolfactory.h @@ -39,6 +39,7 @@ namespace Analyzer { class AnalyzerRunControl; class AnalyzerStartParameters; +class IAnalyzerTool; namespace Internal { @@ -52,10 +53,9 @@ public: typedef ProjectExplorer::RunConfiguration RunConfiguration; typedef ProjectExplorer::RunControl RunControl; - // virtuals from IRunControlFactory + // IRunControlFactory bool canRun(RunConfiguration *runConfiguration, const QString &mode) const; RunControl *create(RunConfiguration *runConfiguration, const QString &mode); - AnalyzerRunControl *create(const AnalyzerStartParameters &sp, RunConfiguration *rc = 0); QString displayName() const; ProjectExplorer::IRunConfigurationAspect *createRunConfigurationAspect(); diff --git a/src/plugins/analyzerbase/analyzerstartparameters.h b/src/plugins/analyzerbase/analyzerstartparameters.h index a867108c42fcbf87bf41fe2a45ffa52734a6c26a..b82a4e85fee9e689f8eb11a0912947d6d029afb3 100644 --- a/src/plugins/analyzerbase/analyzerstartparameters.h +++ b/src/plugins/analyzerbase/analyzerstartparameters.h @@ -57,6 +57,7 @@ public: AnalyzerStartMode startMode; Utils::SshConnectionParameters connParams; + QByteArray toolId; QString debuggee; QString debuggeeArgs; QString analyzerCmdPrefix; diff --git a/src/plugins/analyzerbase/ianalyzerengine.cpp b/src/plugins/analyzerbase/ianalyzerengine.cpp index 1da091d93caee8d96e389599deef73ca241cc414..1d9ac39eab4a3ca26aef4a3a1c2b4340305ee3f0 100644 --- a/src/plugins/analyzerbase/ianalyzerengine.cpp +++ b/src/plugins/analyzerbase/ianalyzerengine.cpp @@ -36,21 +36,12 @@ namespace Analyzer { -IAnalyzerEngine::IAnalyzerEngine(const AnalyzerStartParameters &sp, - ProjectExplorer::RunConfiguration *runConfiguration) - : m_runConfig(runConfiguration) - , m_sp(sp) +IAnalyzerEngine::IAnalyzerEngine(IAnalyzerTool *tool, const AnalyzerStartParameters &sp, + ProjectExplorer::RunConfiguration *runConfiguration) { -} - -ProjectExplorer::RunConfiguration *IAnalyzerEngine::runConfiguration() const -{ - return m_runConfig; -} - -AnalyzerStartParameters IAnalyzerEngine::startParameters() const -{ - return m_sp; + m_runConfig = runConfiguration; + m_sp = sp; + m_tool = tool; } } // namespace Analyzer diff --git a/src/plugins/analyzerbase/ianalyzerengine.h b/src/plugins/analyzerbase/ianalyzerengine.h index d8a9bd889571cb7bad635b6f2656b9cfee26478b..d3191682fc22944e870446028a6c31e1c34b5ada 100644 --- a/src/plugins/analyzerbase/ianalyzerengine.h +++ b/src/plugins/analyzerbase/ianalyzerengine.h @@ -51,6 +51,8 @@ class RunConfiguration; namespace Analyzer { +class IAnalyzerTool; + /** * An IAnalyzerEngine instance handles the launch of an analyzation tool. * @@ -61,40 +63,44 @@ class ANALYZER_EXPORT IAnalyzerEngine : public QObject Q_OBJECT public: - explicit IAnalyzerEngine(const AnalyzerStartParameters &sp, + IAnalyzerEngine(IAnalyzerTool *tool, const AnalyzerStartParameters &sp, ProjectExplorer::RunConfiguration *runConfiguration = 0); - /// start analyzation process + /// Start analyzation process. virtual void start() = 0; - /// trigger async stop of the analyzation process + /// Trigger async stop of the analyzation process. virtual void stop() = 0; - /// controller actions + /// Controller actions. virtual bool canPause() const { return false; } virtual void pause() {} virtual void unpause() {} - /// the active run configuration for this engine, might be zero - ProjectExplorer::RunConfiguration *runConfiguration() const; + /// The active run configuration for this engine, might be zero. + ProjectExplorer::RunConfiguration *runConfiguration() const { return m_runConfig; } + + /// The start parameters for this engine. + const AnalyzerStartParameters &startParameters() const { return m_sp; } - /// the start parameters for this engine - AnalyzerStartParameters startParameters() const; + /// The tool this engine is associated with. + IAnalyzerTool *tool() { return m_tool; } signals: - /// should be emitted when the debuggee outputted something + /// Should be emitted when the debuggee outputted something. void outputReceived(const QString &, Utils::OutputFormat format); - /// can be emitted when you want to show a task, e.g. to display an error + /// Can be emitted when you want to show a task, e.g. to display an error. void taskToBeAdded(ProjectExplorer::Task::TaskType type, const QString &description, const QString &file, int line); - /// must be emitted when the engine finished + /// Must be emitted when the engine finished. void finished(); - /// must be emitted when the engine is starting + /// Must be emitted when the engine is starting. void starting(const Analyzer::IAnalyzerEngine *); private: ProjectExplorer::RunConfiguration *m_runConfig; AnalyzerStartParameters m_sp; + IAnalyzerTool *m_tool; }; } // namespace Analyzer diff --git a/src/plugins/analyzerbase/ianalyzertool.h b/src/plugins/analyzerbase/ianalyzertool.h index 0e77b82199fd44bf572aeec2e36a25e02c8d2d58..222713741c57f459bb9287f3d16279e61f527e0e 100644 --- a/src/plugins/analyzerbase/ianalyzertool.h +++ b/src/plugins/analyzerbase/ianalyzertool.h @@ -67,11 +67,13 @@ public: explicit IAnalyzerTool(QObject *parent = 0); /// Returns a unique ID for this tool. - virtual QString id() const = 0; + virtual QByteArray id() const = 0; /// Returns a short user readable display name for this tool. virtual QString displayName() const = 0; /// Returns a user readable description name for this tool. virtual QString description() const = 0; + /// Returns the name of the menu group of the start action. + virtual QByteArray menuGroup() const = 0; /** * The mode in which this tool should preferably be run @@ -89,11 +91,6 @@ public: static QString modeString(ToolMode mode); - /** - * The implementation should setup widgets for the output pane here and - * optionally add dock widgets in the analyzation mode if wanted. - */ - virtual void initialize() = 0; /// This gets called after all analyzation tools where initialized. virtual void extensionsInitialized() = 0; @@ -112,11 +109,8 @@ public: virtual IAnalyzerEngine *createEngine(const AnalyzerStartParameters &sp, ProjectExplorer::RunConfiguration *runConfiguration = 0) = 0; - /// Returns true when this tool can be run on the loca machine. - virtual bool canRunLocally() const = 0; - - /// Returns true when this tool can be run on a remote machine. - virtual bool canRunRemotely() const = 0; + /// Starts the tool. + virtual void startTool() = 0; /// Called when tools gets selected. virtual void toolSelected() const {} diff --git a/src/plugins/qmlprofiler/qmlprofilerengine.cpp b/src/plugins/qmlprofiler/qmlprofilerengine.cpp index 8d0f1ec981c5297613d5a7b8e97f6a70e69929ab..a1e700c39492f025a4ae63605e81b3c4686e4568 100644 --- a/src/plugins/qmlprofiler/qmlprofilerengine.cpp +++ b/src/plugins/qmlprofiler/qmlprofilerengine.cpp @@ -50,6 +50,8 @@ #include <QtGui/QMainWindow> #include <QtGui/QMessageBox> +using namespace Analyzer; + namespace QmlProfiler { namespace Internal { @@ -65,12 +67,12 @@ public: bool attach(const QString &address, uint port); static AbstractQmlProfilerRunner *createRunner(ProjectExplorer::RunConfiguration *runConfiguration, - const Analyzer::AnalyzerStartParameters &m_params, + const AnalyzerStartParameters &m_params, QObject *parent); QmlProfilerEngine *q; - Analyzer::AnalyzerStartParameters m_params; + AnalyzerStartParameters m_params; AbstractQmlProfilerRunner *m_runner; bool m_running; bool m_fetchingData; @@ -79,11 +81,11 @@ public: AbstractQmlProfilerRunner * QmlProfilerEngine::QmlProfilerEnginePrivate::createRunner(ProjectExplorer::RunConfiguration *configuration, - const Analyzer::AnalyzerStartParameters &m_params, + const AnalyzerStartParameters &m_params, QObject *parent) { AbstractQmlProfilerRunner *runner = 0; - if (m_params.startMode == Analyzer::StartLocal) { + if (m_params.startMode == StartLocal) { LocalQmlProfilerRunner::Configuration configuration; configuration.executable = m_params.debuggee; configuration.executableArguments = m_params.debuggeeArgs; @@ -92,7 +94,7 @@ QmlProfilerEngine::QmlProfilerEnginePrivate::createRunner(ProjectExplorer::RunCo configuration.port = m_params.connParams.port; runner = new LocalQmlProfilerRunner(configuration, parent); - } else if (m_params.startMode == Analyzer::StartRemote) { + } else if (m_params.startMode == StartRemote) { if (Qt4ProjectManager::S60DeviceRunConfiguration *s60Config = qobject_cast<Qt4ProjectManager::S60DeviceRunConfiguration*>(configuration)) { runner = new CodaQmlProfilerRunner(s60Config, parent); @@ -108,9 +110,9 @@ QmlProfilerEngine::QmlProfilerEnginePrivate::createRunner(ProjectExplorer::RunCo // QmlProfilerEngine // -QmlProfilerEngine::QmlProfilerEngine(const Analyzer::AnalyzerStartParameters &sp, - ProjectExplorer::RunConfiguration *runConfiguration) - : IAnalyzerEngine(sp, runConfiguration) +QmlProfilerEngine::QmlProfilerEngine(IAnalyzerTool *tool, const AnalyzerStartParameters &sp, + ProjectExplorer::RunConfiguration *runConfiguration) + : IAnalyzerEngine(tool, sp, runConfiguration) , d(new QmlProfilerEnginePrivate(this)) { d->m_params = sp; @@ -157,7 +159,7 @@ void QmlProfilerEngine::stop() void QmlProfilerEngine::stopped() { d->m_running = false; - Analyzer::AnalyzerManager::instance()->stopTool(); + AnalyzerManager::stopTool(tool()); emit finished(); } diff --git a/src/plugins/qmlprofiler/qmlprofilerengine.h b/src/plugins/qmlprofiler/qmlprofilerengine.h index 85a041dfe5234c6b36e9908cc00bab9922222beb..8a975aee11cbe51571faba9baa9cf4822d2409da 100644 --- a/src/plugins/qmlprofiler/qmlprofilerengine.h +++ b/src/plugins/qmlprofiler/qmlprofilerengine.h @@ -43,9 +43,10 @@ namespace Internal { class QmlProfilerEngine : public Analyzer::IAnalyzerEngine { Q_OBJECT + public: - explicit QmlProfilerEngine(const Analyzer::AnalyzerStartParameters &sp, - ProjectExplorer::RunConfiguration *runConfiguration); + QmlProfilerEngine(Analyzer::IAnalyzerTool *tool, const Analyzer::AnalyzerStartParameters &sp, + ProjectExplorer::RunConfiguration *runConfiguration); ~QmlProfilerEngine(); signals: diff --git a/src/plugins/qmlprofiler/qmlprofilerplugin.cpp b/src/plugins/qmlprofiler/qmlprofilerplugin.cpp index 3f2dd503696f1cc923d0c4c1eb652b6903741478..8e292b9dfcab26407bf363ef8dc5feca4f2f9656 100644 --- a/src/plugins/qmlprofiler/qmlprofilerplugin.cpp +++ b/src/plugins/qmlprofiler/qmlprofilerplugin.cpp @@ -32,98 +32,59 @@ **************************************************************************/ #include "qmlprofilerplugin.h" -#include "qmlprofilerconstants.h" -#include "qmlprojectanalyzerruncontrolfactory.h" -#include <coreplugin/icore.h> -#include <coreplugin/icontext.h> -#include <coreplugin/actionmanager/actionmanager.h> -#include <coreplugin/actionmanager/command.h> -#include <coreplugin/actionmanager/actioncontainer.h> -#include <coreplugin/coreconstants.h> +#include "qmlprofilertool.h" +#include "qmlprojectanalyzerruncontrolfactory.h" #include <analyzerbase/analyzermanager.h> -#include <QtGui/QAction> -#include <QtGui/QMessageBox> -#include <QtGui/QMainWindow> -#include <QtGui/QMenu> - #include <QtCore/QtPlugin> -#include "qmlprofilertool.h" - using namespace Analyzer; using namespace QmlProfiler::Internal; -QmlProfilerPlugin *QmlProfilerPlugin::m_instance = 0; bool QmlProfilerPlugin::debugOutput = false; - class QmlProfilerPlugin::QmlProfilerPluginPrivate { public: - QmlProfilerPluginPrivate(QmlProfilerPlugin *qq): - q(qq) - {} - - void initialize(const QStringList &arguments, QString *errorString); - QmlProjectAnalyzerRunControlFactory *m_runControlFactory; - QmlProfilerPlugin *q; }; -void QmlProfilerPlugin::QmlProfilerPluginPrivate::initialize(const QStringList &arguments, QString *errorString) -{ - Q_UNUSED(arguments) - Q_UNUSED(errorString) - - m_runControlFactory = new QmlProjectAnalyzerRunControlFactory(); - Analyzer::AnalyzerManager::instance()->registerRunControlFactory(m_runControlFactory); -} - - - QmlProfilerPlugin::QmlProfilerPlugin() - : d(new QmlProfilerPluginPrivate(this)) -{ - m_instance = this; -} + : d(new QmlProfilerPluginPrivate()) +{} QmlProfilerPlugin::~QmlProfilerPlugin() { delete d; - m_instance = 0; } bool QmlProfilerPlugin::initialize(const QStringList &arguments, QString *errorString) { - d->initialize(arguments, errorString); - - AnalyzerManager::instance()->addTool(new QmlProfilerTool(this)); - + Q_UNUSED(arguments) + Q_UNUSED(errorString) + d->m_runControlFactory = new QmlProjectAnalyzerRunControlFactory(); + AnalyzerManager::registerRunControlFactory(d->m_runControlFactory); + AnalyzerManager::addTool(new QmlProfilerTool(true, this)); + AnalyzerManager::addTool(new QmlProfilerTool(false, this)); return true; } void QmlProfilerPlugin::extensionsInitialized() { - // Retrieve objects from the plugin manager's object pool + // Retrieve objects from the plugin manager's object pool. // "In the extensionsInitialized method, a plugin can be sure that all // plugins that depend on it are completely initialized." } ExtensionSystem::IPlugin::ShutdownFlag QmlProfilerPlugin::aboutToShutdown() { - // Save settings + // Save settings. // Disconnect from signals that are not needed during shutdown // Hide UI (if you add UI that is not in the main window directly) return SynchronousShutdown; } -QmlProfilerPlugin *QmlProfilerPlugin::instance() -{ - return m_instance; -} - Q_EXPORT_PLUGIN(QmlProfilerPlugin) diff --git a/src/plugins/qmlprofiler/qmlprofilerplugin.h b/src/plugins/qmlprofiler/qmlprofilerplugin.h index aa6a749c8342afd7333eb7a25a3d41dc127dbf59..8690c6d7070bc458118d63e71e38b037624a6bec 100644 --- a/src/plugins/qmlprofiler/qmlprofilerplugin.h +++ b/src/plugins/qmlprofiler/qmlprofilerplugin.h @@ -46,8 +46,6 @@ class QmlProfilerPlugin : public ExtensionSystem::IPlugin Q_OBJECT public: - static QmlProfilerPlugin *instance(); - QmlProfilerPlugin(); ~QmlProfilerPlugin(); @@ -60,8 +58,6 @@ public: private: class QmlProfilerPluginPrivate; QmlProfilerPluginPrivate *d; - - static QmlProfilerPlugin *m_instance; }; } // namespace Internal diff --git a/src/plugins/qmlprofiler/qmlprofilertool.cpp b/src/plugins/qmlprofiler/qmlprofilertool.cpp index bb810d04e86bd262bcc0dad26a297bfc1cfb5a26..a857f5b1bf447bae670811ea675702963bf7cf85 100644 --- a/src/plugins/qmlprofiler/qmlprofilertool.cpp +++ b/src/plugins/qmlprofiler/qmlprofilertool.cpp @@ -92,6 +92,7 @@ public: QmlProfilerTool *q; + bool m_local; QDeclarativeDebugConnection *m_client; QTimer m_connectionTimer; int m_connectionAttempts; @@ -118,9 +119,10 @@ public: QString m_ostDevice; }; -QmlProfilerTool::QmlProfilerTool(QObject *parent) +QmlProfilerTool::QmlProfilerTool(bool local, QObject *parent) : IAnalyzerTool(parent), d(new QmlProfilerToolPrivate(this)) { + d->m_local = local; d->m_client = 0; d->m_connectionAttempts = 0; d->m_traceWindow = 0; @@ -132,6 +134,13 @@ QmlProfilerTool::QmlProfilerTool(QObject *parent) d->m_connectionTimer.setInterval(200); connect(&d->m_connectionTimer, SIGNAL(timeout()), SLOT(tryToConnect())); + + qmlRegisterType<Canvas>("Monitor", 1, 0, "Canvas"); + qmlRegisterType<TiledCanvas>("Monitor", 1, 0, "TiledCanvas"); + qmlRegisterType<Context2D>(); + qmlRegisterType<CanvasImage>(); + qmlRegisterType<CanvasGradient>(); + qmlRegisterType<TimelineView>("Monitor", 1, 0,"TimelineView"); } QmlProfilerTool::~QmlProfilerTool() @@ -140,14 +149,26 @@ QmlProfilerTool::~QmlProfilerTool() delete d; } -QString QmlProfilerTool::id() const +QByteArray QmlProfilerTool::id() const { - return "QmlProfiler"; + return d->m_local ? "QmlLocalProfiler" : "QmlRemoteProfiler"; } QString QmlProfilerTool::displayName() const { - return tr("QML Profiler"); + return d->m_local ? tr("QML Profiler") : tr("QML Profiler (Remote)"); +} + +QByteArray QmlProfilerTool::menuGroup() const +{ + return d->m_local ? Analyzer::Constants::G_ANALYZER_TOOLS + : Analyzer::Constants::G_ANALYZER_REMOTE_TOOLS; +} + +void QmlProfilerTool::startTool() +{ + return d->m_local ? AnalyzerManager::startLocalTool(this) + : AnalyzerManager::startRemoteTool(this); } QString QmlProfilerTool::description() const @@ -164,7 +185,7 @@ IAnalyzerTool::ToolMode QmlProfilerTool::mode() const IAnalyzerEngine *QmlProfilerTool::createEngine(const AnalyzerStartParameters &sp, ProjectExplorer::RunConfiguration *runConfiguration) { - QmlProfilerEngine *engine = new QmlProfilerEngine(sp, runConfiguration); + QmlProfilerEngine *engine = new QmlProfilerEngine(this, sp, runConfiguration); // Check minimum Qt Version. We cannot really be sure what the Qt version // at runtime is, but guess that the active build configuraiton has been used. @@ -218,24 +239,9 @@ IAnalyzerEngine *QmlProfilerTool::createEngine(const AnalyzerStartParameters &sp return engine; } -void QmlProfilerTool::initialize() -{ - qmlRegisterType<Canvas>("Monitor", 1, 0, "Canvas"); - qmlRegisterType<TiledCanvas>("Monitor", 1, 0, "TiledCanvas"); - qmlRegisterType<Context2D>(); - qmlRegisterType<CanvasImage>(); - qmlRegisterType<CanvasGradient>(); - qmlRegisterType<TimelineView>("Monitor", 1, 0,"TimelineView"); -} - -void QmlProfilerTool::extensionsInitialized() -{ -} - void QmlProfilerTool::initializeDockWidgets() { - Analyzer::AnalyzerManager *analyzerMgr = Analyzer::AnalyzerManager::instance(); - Utils::FancyMainWindow *mw = analyzerMgr->mainWindow(); + Utils::FancyMainWindow *mw = AnalyzerManager::mainWindow(); d->m_traceWindow = new TraceWindow(mw); d->m_traceWindow->reset(d->m_client); @@ -282,21 +288,14 @@ void QmlProfilerTool::initializeDockWidgets() updateAttachAction(false); - QDockWidget *summaryDock = - analyzerMgr->createDockWidget(this, tr("Bindings"), - d->m_summary, Qt::BottomDockWidgetArea); - - QDockWidget *timelineDock = - analyzerMgr->createDockWidget(this, tr("Timeline"), - d->m_traceWindow, Qt::BottomDockWidgetArea); - - QDockWidget *calleeDock = - analyzerMgr->createDockWidget(this, tr("Callees"), - d->m_calleetree, Qt::BottomDockWidgetArea); - - QDockWidget *callerDock = - analyzerMgr->createDockWidget(this, tr("Callers"), - d->m_callertree, Qt::BottomDockWidgetArea); + QDockWidget *summaryDock = AnalyzerManager::createDockWidget + (this, tr("Bindings"), d->m_summary, Qt::BottomDockWidgetArea); + QDockWidget *timelineDock = AnalyzerManager::createDockWidget + (this, tr("Timeline"), d->m_traceWindow, Qt::BottomDockWidgetArea); + QDockWidget *calleeDock = AnalyzerManager::createDockWidget + (this, tr("Callees"), d->m_calleetree, Qt::BottomDockWidgetArea); + QDockWidget *callerDock = AnalyzerManager::createDockWidget + (this, tr("Callers"), d->m_callertree, Qt::BottomDockWidgetArea); mw->splitDockWidget(mw->toolBarDockWidget(), summaryDock, Qt::Vertical); mw->tabifyDockWidget(summaryDock, timelineDock); @@ -447,17 +446,6 @@ void QmlProfilerTool::updateProjectFileList() d->m_project->files(ProjectExplorer::Project::ExcludeGeneratedFiles)); } -bool QmlProfilerTool::canRunRemotely() const -{ - // TODO: Is this correct? - return true; -} - -bool QmlProfilerTool::canRunLocally() const -{ - return true; -} - void QmlProfilerTool::clearDisplay() { d->m_traceWindow->clearDisplay(); @@ -479,7 +467,7 @@ void QmlProfilerTool::attach() d->m_tcpHost = dialog.address(); connectClient(d->m_tcpPort); - AnalyzerManager::instance()->showMode(); + AnalyzerManager::showMode(); } else { stopRecording(); } diff --git a/src/plugins/qmlprofiler/qmlprofilertool.h b/src/plugins/qmlprofiler/qmlprofilertool.h index 13e34375cda31c6d9cd64802cfd5334214db2e1f..c5b963aeb89cfda45d71c07832865ee09255001d 100644 --- a/src/plugins/qmlprofiler/qmlprofilertool.h +++ b/src/plugins/qmlprofiler/qmlprofilertool.h @@ -45,28 +45,26 @@ class QmlProfilerTool : public Analyzer::IAnalyzerTool Q_OBJECT public: - explicit QmlProfilerTool(QObject *parent = 0); + QmlProfilerTool(bool local, QObject *parent); ~QmlProfilerTool(); - QString id() const; + QByteArray id() const; QString displayName() const; + QByteArray menuGroup() const; QString description() const; ToolMode mode() const; - void initialize(); - void extensionsInitialized(); + void extensionsInitialized() {} void initializeDockWidgets(); void toolSelected(); void toolDeselected(); + void startTool(); Analyzer::IAnalyzerEngine *createEngine(const Analyzer::AnalyzerStartParameters &sp, ProjectExplorer::RunConfiguration *runConfiguration = 0); QWidget *createControlWidget(); - bool canRunRemotely() const; - bool canRunLocally() const; - public slots: void connectClient(int port); void disconnectClient(); diff --git a/src/plugins/qmlprofiler/qmlprojectanalyzerruncontrolfactory.cpp b/src/plugins/qmlprofiler/qmlprojectanalyzerruncontrolfactory.cpp index aad9d920f1735d3583e785e840e0f7f985ca91f2..e1171609dc2802e1370ad885abb1c46e3719e5f7 100644 --- a/src/plugins/qmlprofiler/qmlprojectanalyzerruncontrolfactory.cpp +++ b/src/plugins/qmlprofiler/qmlprojectanalyzerruncontrolfactory.cpp @@ -33,7 +33,9 @@ #include "qmlprojectanalyzerruncontrolfactory.h" #include "qmlprojectmanager/qmlprojectrunconfiguration.h" + #include <analyzerbase/analyzerstartparameters.h> +#include <analyzerbase/analyzermanager.h> #include <analyzerbase/analyzersettings.h> #include <analyzerbase/analyzerrunconfigwidget.h> @@ -51,6 +53,7 @@ AnalyzerStartParameters localStartParameters(ProjectExplorer::RunConfiguration * qobject_cast<QmlProjectManager::QmlProjectRunConfiguration *>(runConfiguration); QTC_ASSERT(rc, return sp); + sp.toolId = "QmlProfiler"; sp.startMode = StartLocal; sp.environment = rc->environment(); sp.workingDirectory = rc->workingDirectory(); @@ -76,19 +79,15 @@ bool QmlProjectAnalyzerRunControlFactory::canRun(RunConfiguration *runConfigurat RunControl *QmlProjectAnalyzerRunControlFactory::create(RunConfiguration *runConfiguration, const QString &mode) { - if (!qobject_cast<QmlProjectManager::QmlProjectRunConfiguration *>(runConfiguration) - || mode != Constants::MODE_ANALYZE) { - return 0; - } + QTC_ASSERT(canRun(runConfiguration, mode), return 0); const AnalyzerStartParameters sp = localStartParameters(runConfiguration); return create(sp, runConfiguration); } -AnalyzerRunControl *QmlProjectAnalyzerRunControlFactory::create(const Analyzer::AnalyzerStartParameters &sp, RunConfiguration *runConfiguration) +AnalyzerRunControl *QmlProjectAnalyzerRunControlFactory::create + (const Analyzer::AnalyzerStartParameters &sp, RunConfiguration *runConfiguration) { - AnalyzerRunControl *rc = new AnalyzerRunControl(sp, runConfiguration); - emit runControlCreated(rc); - return rc; + return new AnalyzerRunControl(AnalyzerManager::toolById(sp.toolId), sp, runConfiguration); } QString QmlProjectAnalyzerRunControlFactory::displayName() const @@ -104,7 +103,7 @@ IRunConfigurationAspect *QmlProjectAnalyzerRunControlFactory::createRunConfigura RunConfigWidget *QmlProjectAnalyzerRunControlFactory::createConfigurationWidget(RunConfiguration *runConfiguration) { QmlProjectManager::QmlProjectRunConfiguration *localRc = - qobject_cast<QmlProjectManager::QmlProjectRunConfiguration *>(runConfiguration); + qobject_cast<QmlProjectManager::QmlProjectRunConfiguration *>(runConfiguration); if (!localRc) return 0; @@ -113,6 +112,7 @@ RunConfigWidget *QmlProjectAnalyzerRunControlFactory::createConfigurationWidget( return 0; Analyzer::AnalyzerRunConfigWidget *ret = new Analyzer::AnalyzerRunConfigWidget; + ret->setRunConfiguration(runConfiguration); return ret; } diff --git a/src/plugins/qmlprofiler/qmlprojectanalyzerruncontrolfactory.h b/src/plugins/qmlprofiler/qmlprojectanalyzerruncontrolfactory.h index c4de8f60dea957e4be1aa9f3487b645180f0e666..9c5592bc01e2fc5e2592238a22b2f98d97c3a733 100644 --- a/src/plugins/qmlprofiler/qmlprojectanalyzerruncontrolfactory.h +++ b/src/plugins/qmlprofiler/qmlprojectanalyzerruncontrolfactory.h @@ -51,10 +51,12 @@ public: QmlProjectAnalyzerRunControlFactory(QObject *parent = 0); // IRunControlFactory implementation + QString displayName() const; bool canRun(RunConfiguration *runConfiguration, const QString &mode) const; ProjectExplorer::RunControl *create(RunConfiguration *runConfiguration, const QString &mode); - Analyzer::AnalyzerRunControl *create(const Analyzer::AnalyzerStartParameters &sp, RunConfiguration *runConfiguration = 0); - QString displayName() const; + + // FIXME: Remove function. + Analyzer::AnalyzerRunControl *create(const Analyzer::AnalyzerStartParameters &sp, RunConfiguration *runConfiguration); ProjectExplorer::IRunConfigurationAspect *createRunConfigurationAspect(); ProjectExplorer::RunConfigWidget *createConfigurationWidget(RunConfiguration *runConfiguration); diff --git a/src/plugins/valgrind/callgrindengine.cpp b/src/plugins/valgrind/callgrindengine.cpp index 9fc18f85f0b868a890bdda8915ede8395e981db9..988c70932912e51d053bceb9b7fc3e9374bbfc53 100644 --- a/src/plugins/valgrind/callgrindengine.cpp +++ b/src/plugins/valgrind/callgrindengine.cpp @@ -45,22 +45,24 @@ using namespace Analyzer; using namespace Valgrind; using namespace Valgrind::Internal; -CallgrindEngine::CallgrindEngine(const AnalyzerStartParameters &sp, - ProjectExplorer::RunConfiguration *runConfiguration) - : ValgrindEngine(sp, runConfiguration) +CallgrindEngine::CallgrindEngine(IAnalyzerTool *tool, const AnalyzerStartParameters &sp, + ProjectExplorer::RunConfiguration *runConfiguration) + : ValgrindEngine(tool, sp, runConfiguration) , m_markAsPaused(false) { connect(&m_runner, SIGNAL(finished()), this, SLOT(slotFinished())); connect(&m_runner, SIGNAL(started()), this, SLOT(slotStarted())); - connect(m_runner.parser(), SIGNAL(parserDataReady()), this, SLOT(slotFinished())); - - connect(&m_runner, SIGNAL(statusMessage(QString)), - Analyzer::AnalyzerManager::instance(), SLOT(showStatusMessage(QString))); + connect(&m_runner, SIGNAL(statusMessage(QString)), SLOT(showStatusMessage(QString))); m_progress->setProgressRange(0, 2); } +void CallgrindEngine::showStatusMessage(const QString &msg) +{ + AnalyzerManager::showStatusMessage(msg); +} + QStringList CallgrindEngine::toolArguments() const { QStringList arguments; diff --git a/src/plugins/valgrind/callgrindengine.h b/src/plugins/valgrind/callgrindengine.h index 33e8d426ca3088f39c592749e0b539241d74d9ee..53a10a8a4162d4e6d7fc1e72def819cc1868d827 100644 --- a/src/plugins/valgrind/callgrindengine.h +++ b/src/plugins/valgrind/callgrindengine.h @@ -46,8 +46,8 @@ class CallgrindEngine : public Valgrind::Internal::ValgrindEngine Q_OBJECT public: - explicit CallgrindEngine(const Analyzer::AnalyzerStartParameters &sp, - ProjectExplorer::RunConfiguration *runConfiguration); + CallgrindEngine(Analyzer::IAnalyzerTool *tool, const Analyzer::AnalyzerStartParameters &sp, + ProjectExplorer::RunConfiguration *runConfiguration); void start(); @@ -79,15 +79,16 @@ protected: signals: void parserDataReady(CallgrindEngine *engine); +private slots: + void slotFinished(); + void slotStarted(); + void showStatusMessage(const QString &msg); + private: Valgrind::Callgrind::CallgrindRunner m_runner; bool m_markAsPaused; QStringList m_extraArguments; - -private slots: - void slotFinished(); - void slotStarted(); }; } // namespace Internal diff --git a/src/plugins/valgrind/callgrindtool.cpp b/src/plugins/valgrind/callgrindtool.cpp index 874a4fc00c6f36865d8ab68d8a87ef07c7ba8260..9e084c96843f9aa146f8f2f376ccc6f16cc39218 100644 --- a/src/plugins/valgrind/callgrindtool.cpp +++ b/src/plugins/valgrind/callgrindtool.cpp @@ -175,6 +175,7 @@ public slots: public: CallgrindTool *q; + bool m_local; DataModel *m_dataModel; DataProxyModel *m_proxyModel; StackBrowser *m_stackBrowser; @@ -217,6 +218,7 @@ public: CallgrindToolPrivate::CallgrindToolPrivate(CallgrindTool *parent) : q(parent) + , m_local(true) , m_dataModel(new DataModel(this)) , m_proxyModel(new DataProxyModel(this)) , m_stackBrowser(new StackBrowser(this)) @@ -497,10 +499,11 @@ static QToolButton *createToolButton(QAction *action) return button; } -CallgrindTool::CallgrindTool(QObject *parent) +CallgrindTool::CallgrindTool(bool local, QObject *parent) : Analyzer::IAnalyzerTool(parent) { d = new CallgrindToolPrivate(this); + d->m_local = local; Core::ICore *core = Core::ICore::instance(); // EditorManager @@ -514,14 +517,21 @@ CallgrindTool::~CallgrindTool() delete d; } -QString CallgrindTool::id() const +QByteArray CallgrindTool::id() const { - return "Callgrind"; + return d->m_local ? "CallgrindLocal" : "CallgrindRemote"; } QString CallgrindTool::displayName() const { - return tr("Valgrind Function Profile"); + return d->m_local ? tr("Valgrind Function Profile") + : tr("Valgrind Function Profile (Remote)"); +} + +QByteArray CallgrindTool::menuGroup() const +{ + return d->m_local ? Analyzer::Constants::G_ANALYZER_TOOLS + : Analyzer::Constants::G_ANALYZER_REMOTE_TOOLS; } QString CallgrindTool::description() const @@ -530,13 +540,17 @@ QString CallgrindTool::description() const "record function calls when a program runs."); } -IAnalyzerTool::ToolMode CallgrindTool::mode() const +void CallgrindTool::startTool() { - return ReleaseMode; + if (d->m_local) + AnalyzerManager::startLocalTool(this); + else + AnalyzerManager::startRemoteTool(this); } -void CallgrindTool::initialize() +IAnalyzerTool::ToolMode CallgrindTool::mode() const { + return ReleaseMode; } void CallgrindTool::extensionsInitialized() @@ -577,8 +591,7 @@ void CallgrindTool::initializeDockWidgets() void CallgrindToolPrivate::initializeDockWidgets() { - AnalyzerManager *am = AnalyzerManager::instance(); - Utils::FancyMainWindow *mw = am->mainWindow(); + Utils::FancyMainWindow *mw = AnalyzerManager::mainWindow(); m_visualisation = new Visualisation(mw); m_visualisation->setFrameStyle(QFrame::NoFrame); m_visualisation->setObjectName("Valgrind.CallgrindToolPrivate.Visualisation"); @@ -621,21 +634,17 @@ void CallgrindToolPrivate::initializeDockWidgets() updateCostFormat(); - QDockWidget *callersDock = - am->createDockWidget(q, tr("Callers"), m_callersView, - Qt::BottomDockWidgetArea); + QDockWidget *callersDock = AnalyzerManager::createDockWidget + (q, tr("Callers"), m_callersView, Qt::BottomDockWidgetArea); - QDockWidget *flatDock = - am->createDockWidget(q, tr("Functions"), m_flatView, - Qt::BottomDockWidgetArea); + QDockWidget *flatDock = AnalyzerManager::createDockWidget + (q, tr("Functions"), m_flatView, Qt::BottomDockWidgetArea); - QDockWidget *calleesDock = - am->createDockWidget(q, tr("Callees"), m_calleesView, - Qt::BottomDockWidgetArea); + QDockWidget *calleesDock = AnalyzerManager::createDockWidget + (q, tr("Callees"), m_calleesView, Qt::BottomDockWidgetArea); - QDockWidget *visualizationDock = - am->createDockWidget(q, tr("Visualization"), m_visualisation, - Qt::RightDockWidgetArea); + QDockWidget *visualizationDock = AnalyzerManager::createDockWidget + (q, tr("Visualization"), m_visualisation, Qt::RightDockWidgetArea); visualizationDock->hide(); mw->splitDockWidget(mw->toolBarDockWidget(), calleesDock, Qt::Vertical); @@ -653,7 +662,7 @@ IAnalyzerEngine *CallgrindTool::createEngine(const AnalyzerStartParameters &sp, IAnalyzerEngine *CallgrindToolPrivate::createEngine(const AnalyzerStartParameters &sp, ProjectExplorer::RunConfiguration *runConfiguration) { - CallgrindEngine *engine = new CallgrindEngine(sp, runConfiguration); + CallgrindEngine *engine = new CallgrindEngine(q, sp, runConfiguration); connect(engine, SIGNAL(parserDataReady(CallgrindEngine *)), SLOT(takeParserData(CallgrindEngine *))); @@ -673,7 +682,7 @@ IAnalyzerEngine *CallgrindToolPrivate::createEngine(const AnalyzerStartParameter engine->setToggleCollectFunction(m_toggleCollectFunction); m_toggleCollectFunction.clear(); - AnalyzerManager::instance()->showStatusMessage(AnalyzerManager::msgToolStarted(q->displayName())); + AnalyzerManager::showStatusMessage(AnalyzerManager::msgToolStarted(q->displayName())); // apply project settings AnalyzerProjectSettings *analyzerSettings = runConfiguration->extraAspect<AnalyzerProjectSettings>(); @@ -862,7 +871,7 @@ void CallgrindToolPrivate::engineFinished() if (data) showParserResults(data); else - AnalyzerManager::instance()->showStatusMessage(tr("Profiling aborted.")); + AnalyzerManager::showStatusMessage(tr("Profiling aborted.")); } void CallgrindToolPrivate::showParserResults(const ParseData *data) @@ -879,7 +888,7 @@ void CallgrindToolPrivate::showParserResults(const ParseData *data) } else { msg = tr("Parsing failed."); } - AnalyzerManager::instance()->showStatusMessage(msg); + AnalyzerManager::showStatusMessage(msg); } void CallgrindToolPrivate::editorOpened(Core::IEditor *editor) @@ -938,8 +947,8 @@ void CallgrindToolPrivate::handleShowCostsOfFunction() m_toggleCollectFunction = QString("%1()").arg(qualifiedFunctionName); - AnalyzerManager::instance()->selectTool(q); - AnalyzerManager::instance()->startTool(q); + AnalyzerManager::selectTool(q); + AnalyzerManager::startTool(q); } void CallgrindToolPrivate::slotRequestDump() @@ -999,15 +1008,6 @@ void CallgrindToolPrivate::createTextMarks() } } -bool CallgrindTool::canRunLocally() const -{ -#ifdef Q_OS_WINDOWS - return false; -#else - return true; -#endif -} - } // namespace Internal } // namespace Valgrind diff --git a/src/plugins/valgrind/callgrindtool.h b/src/plugins/valgrind/callgrindtool.h index e3a438b70ac80d45f1d305cd41352d96c3fbd597..f6a50b0c89792f4d06b7e4dd1af5efe7130e0237 100644 --- a/src/plugins/valgrind/callgrindtool.h +++ b/src/plugins/valgrind/callgrindtool.h @@ -45,15 +45,16 @@ class CallgrindTool : public Analyzer::IAnalyzerTool Q_OBJECT public: - explicit CallgrindTool(QObject *parent = 0); + CallgrindTool(bool local, QObject *parent); ~CallgrindTool(); - QString id() const; + QByteArray id() const; QString displayName() const; + QByteArray menuGroup() const; QString description() const; ToolMode mode() const; - void initialize(); + void startTool(); void extensionsInitialized(); void initializeDockWidgets(); @@ -61,9 +62,6 @@ public: ProjectExplorer::RunConfiguration *runConfiguration = 0); QWidget *createControlWidget(); - bool canRunRemotely() const { return true; } - bool canRunLocally() const; - private: CallgrindToolPrivate *d; }; diff --git a/src/plugins/valgrind/memcheckengine.cpp b/src/plugins/valgrind/memcheckengine.cpp index 10e82fc1dbcf5cc34c84f35665ff70ba62ed003b..341b7a5470de9c535285a4127dd8c8b954812277 100644 --- a/src/plugins/valgrind/memcheckengine.cpp +++ b/src/plugins/valgrind/memcheckengine.cpp @@ -49,9 +49,9 @@ using namespace Valgrind::XmlProtocol; namespace Valgrind { namespace Internal { -MemcheckEngine::MemcheckEngine(const Analyzer::AnalyzerStartParameters &sp, - ProjectExplorer::RunConfiguration *runConfiguration) - : ValgrindEngine(sp, runConfiguration) +MemcheckEngine::MemcheckEngine(IAnalyzerTool *tool, const AnalyzerStartParameters &sp, + ProjectExplorer::RunConfiguration *runConfiguration) + : ValgrindEngine(tool, sp, runConfiguration) { connect(&m_parser, SIGNAL(error(Valgrind::XmlProtocol::Error)), SIGNAL(parserError(Valgrind::XmlProtocol::Error))); diff --git a/src/plugins/valgrind/memcheckengine.h b/src/plugins/valgrind/memcheckengine.h index de21bdf5cd40a29d37f261b643500468b30a4908..6fb21599db40a15ac9d581d3b5402945bc26db29 100644 --- a/src/plugins/valgrind/memcheckengine.h +++ b/src/plugins/valgrind/memcheckengine.h @@ -46,9 +46,10 @@ namespace Internal { class MemcheckEngine : public ValgrindEngine { Q_OBJECT + public: - explicit MemcheckEngine(const Analyzer::AnalyzerStartParameters &sp, - ProjectExplorer::RunConfiguration *runConfiguration); + MemcheckEngine(Analyzer::IAnalyzerTool *tool, const Analyzer::AnalyzerStartParameters &sp, + ProjectExplorer::RunConfiguration *runConfiguration); void start(); void stop(); diff --git a/src/plugins/valgrind/memchecktool.cpp b/src/plugins/valgrind/memchecktool.cpp index 109029a15b932a0a1dba07c66bf1716c17d9060d..f38f114384550df3a4fb902e72f0c764881b310b 100644 --- a/src/plugins/valgrind/memchecktool.cpp +++ b/src/plugins/valgrind/memchecktool.cpp @@ -184,9 +184,10 @@ static void initKindFilterAction(QAction *action, const QList<int> &kinds) action->setData(data); } -MemcheckTool::MemcheckTool(QObject *parent) +MemcheckTool::MemcheckTool(bool local, QObject *parent) : Analyzer::IAnalyzerTool(parent) { + m_local = local; m_settings = 0; m_errorModel = 0; m_errorProxyModel = 0; @@ -292,9 +293,15 @@ void MemcheckTool::maybeActiveRunConfigurationChanged() m_errorProxyModel->setFilterExternalIssues(memcheckSettings->filterExternalIssues()); } -QString MemcheckTool::id() const +QByteArray MemcheckTool::id() const { - return "Memcheck"; + return m_local ? "MemcheckLocal" : "MemcheckGlobal"; +} + +QByteArray MemcheckTool::menuGroup() const +{ + return m_local ? Analyzer::Constants::G_ANALYZER_TOOLS + : Analyzer::Constants::G_ANALYZER_REMOTE_TOOLS; } QString MemcheckTool::displayName() const @@ -313,6 +320,14 @@ IAnalyzerTool::ToolMode MemcheckTool::mode() const return DebugMode; } +void MemcheckTool::startTool() +{ + if (m_local) + AnalyzerManager::startLocalTool(this); + else + AnalyzerManager::startRemoteTool(this); +} + class FrameFinder : public ErrorListModel::RelevantFrameFinder { public: @@ -369,8 +384,7 @@ void MemcheckTool::ensureWidgets() if (m_errorView) return; - AnalyzerManager *am = AnalyzerManager::instance(); - Utils::FancyMainWindow *mw = am->mainWindow(); + Utils::FancyMainWindow *mw = AnalyzerManager::mainWindow(); m_errorView = new MemcheckErrorView; m_errorView->setObjectName(QLatin1String("MemcheckErrorView")); @@ -390,9 +404,8 @@ void MemcheckTool::ensureWidgets() m_errorView->setAutoScroll(false); m_errorView->setObjectName("Valgrind.MemcheckTool.ErrorView"); - QDockWidget *errorDock = - am->createDockWidget(this, tr("Memory Issues"), m_errorView, - Qt::BottomDockWidgetArea); + QDockWidget *errorDock = AnalyzerManager::createDockWidget + (this, tr("Memory Issues"), m_errorView, Qt::BottomDockWidgetArea); mw->splitDockWidget(mw->toolBarDockWidget(), errorDock, Qt::Vertical); connect(ProjectExplorer::ProjectExplorerPlugin::instance(), @@ -457,9 +470,10 @@ QWidget *MemcheckTool::createControlWidget() IAnalyzerEngine *MemcheckTool::createEngine(const AnalyzerStartParameters &sp, ProjectExplorer::RunConfiguration *runConfiguration) { - m_frameFinder->setFiles(runConfiguration ? runConfiguration->target()->project()->files(ProjectExplorer::Project::AllFiles) : QStringList()); + m_frameFinder->setFiles(runConfiguration ? runConfiguration->target() + ->project()->files(ProjectExplorer::Project::AllFiles) : QStringList()); - MemcheckEngine *engine = new MemcheckEngine(sp, runConfiguration); + MemcheckEngine *engine = new MemcheckEngine(this, sp, runConfiguration); connect(engine, SIGNAL(starting(const Analyzer::IAnalyzerEngine*)), this, SLOT(engineStarting(const Analyzer::IAnalyzerEngine*))); @@ -468,7 +482,7 @@ IAnalyzerEngine *MemcheckTool::createEngine(const AnalyzerStartParameters &sp, connect(engine, SIGNAL(internalParserError(QString)), this, SLOT(internalParserError(QString))); connect(engine, SIGNAL(finished()), this, SLOT(finished())); - AnalyzerManager::instance()->showStatusMessage(AnalyzerManager::msgToolStarted(displayName())); + AnalyzerManager::showStatusMessage(AnalyzerManager::msgToolStarted(displayName())); return engine; } @@ -556,21 +570,7 @@ void MemcheckTool::finished() m_goBack->setEnabled(n > 0); m_goNext->setEnabled(n > 0); const QString msg = AnalyzerManager::msgToolFinished(displayName(), n); - AnalyzerManager::instance()->showStatusMessage(msg); -} - -bool MemcheckTool::canRunRemotely() const -{ - return true; -} - -bool MemcheckTool::canRunLocally() const -{ -#ifdef Q_OS_WINDOWS - return false; -#else - return true; -#endif + AnalyzerManager::showStatusMessage(msg); } } // namespace Internal diff --git a/src/plugins/valgrind/memchecktool.h b/src/plugins/valgrind/memchecktool.h index 611471290cecc6990b271b14f5f158969f0a195f..04ea84851a6544c94779dbafc513237499b49ce9 100644 --- a/src/plugins/valgrind/memchecktool.h +++ b/src/plugins/valgrind/memchecktool.h @@ -91,12 +91,13 @@ class MemcheckTool : public Analyzer::IAnalyzerTool Q_OBJECT public: - explicit MemcheckTool(QObject *parent = 0); + MemcheckTool(bool local, QObject *parent); - QString id() const; + QByteArray id() const; QString displayName() const; QString description() const; - ToolMode mode() const; + QByteArray menuGroup() const; + void startTool(); private slots: void settingsDestroyed(QObject *settings); @@ -111,11 +112,9 @@ private slots: void suppressionActionTriggered(); private: + ToolMode mode() const; void ensureWidgets(); - bool canRunRemotely() const; - bool canRunLocally() const; void initializeDockWidgets(); - void initialize() {} void extensionsInitialized(); QWidget *createControlWidget(); @@ -124,6 +123,8 @@ private: void clearErrorView(); +private: + bool m_local; Analyzer::AnalyzerSettings *m_settings; QMenu *m_filterMenu; diff --git a/src/plugins/valgrind/valgrindengine.cpp b/src/plugins/valgrind/valgrindengine.cpp index e4cddcfd89561678cd03a23a59b1ff41f4f2eca3..d3a01fc7e4ea540d402dd4bf29b821d735c92bc5 100644 --- a/src/plugins/valgrind/valgrindengine.cpp +++ b/src/plugins/valgrind/valgrindengine.cpp @@ -52,9 +52,9 @@ using namespace Analyzer; using namespace Valgrind::Internal; using namespace Utils; -ValgrindEngine::ValgrindEngine(const AnalyzerStartParameters &sp, - ProjectExplorer::RunConfiguration *runConfiguration) - : IAnalyzerEngine(sp, runConfiguration), +ValgrindEngine::ValgrindEngine(IAnalyzerTool *tool, const AnalyzerStartParameters &sp, + ProjectExplorer::RunConfiguration *runConfiguration) + : IAnalyzerEngine(tool, sp, runConfiguration), m_settings(0), m_progress(new QFutureInterface<void>()), m_progressWatcher(new QFutureWatcher<void>()), @@ -130,7 +130,7 @@ QString ValgrindEngine::executable() const void ValgrindEngine::handleProgressCanceled() { - AnalyzerManager::instance()->stopTool(); + AnalyzerManager::stopTool(tool()); } void ValgrindEngine::handleProgressFinished() diff --git a/src/plugins/valgrind/valgrindengine.h b/src/plugins/valgrind/valgrindengine.h index 2a790a59ed7660ea22f7bcce01d49a10d846cca2..9618312d30b421faa5ca904f2080ca277102635d 100644 --- a/src/plugins/valgrind/valgrindengine.h +++ b/src/plugins/valgrind/valgrindengine.h @@ -37,7 +37,6 @@ #include "valgrind_global.h" -#include <analyzerbase/ianalyzerengine.h> #include <analyzerbase/ianalyzerengine.h> #include <utils/environment.h> @@ -59,10 +58,12 @@ namespace Internal { class VALGRINDTOOLBASE_EXPORT ValgrindEngine : public Analyzer::IAnalyzerEngine { Q_OBJECT + public: - explicit ValgrindEngine(const Analyzer::AnalyzerStartParameters &sp, - ProjectExplorer::RunConfiguration *runConfiguration); - virtual ~ValgrindEngine(); + ValgrindEngine(Analyzer::IAnalyzerTool *tool, + const Analyzer::AnalyzerStartParameters &sp, + ProjectExplorer::RunConfiguration *runConfiguration); + ~ValgrindEngine(); void start(); void stop(); diff --git a/src/plugins/valgrind/valgrindplugin.cpp b/src/plugins/valgrind/valgrindplugin.cpp index e9f13d02654ddb09e79b338c32964efb5f2b946e..2ff9472bc7b51019099169d9c15fddf179322ddd 100644 --- a/src/plugins/valgrind/valgrindplugin.cpp +++ b/src/plugins/valgrind/valgrindplugin.cpp @@ -80,14 +80,16 @@ bool ValgrindPlugin::initialize(const QStringList &, QString *) AnalyzerGlobalSettings::instance()->registerSubConfigs(&globalCallgrindFactory, &projectCallgrindFactory); AnalyzerGlobalSettings::instance()->registerSubConfigs(&globalMemcheckFactory, &projectMemcheckFactory); - AnalyzerManager::instance()->addTool(new MemcheckTool(this)); - AnalyzerManager::instance()->addTool(new CallgrindTool(this)); - return true; -} - +#ifndef Q_OS_WIN + AnalyzerManager::addTool(new MemcheckTool(true, this)); +#endif + AnalyzerManager::addTool(new MemcheckTool(false, this)); +#ifndef Q_OS_WIN + AnalyzerManager::addTool(new CallgrindTool(true, this)); +#endif + AnalyzerManager::addTool(new CallgrindTool(false, this)); -void ValgrindPlugin::extensionsInitialized() -{ + return true; } Q_EXPORT_PLUGIN(Valgrind::Internal::ValgrindPlugin) diff --git a/src/plugins/valgrind/valgrindplugin.h b/src/plugins/valgrind/valgrindplugin.h index 6dee7dd5442b4c522e46cf51509bb97d02cd986a..a59bffc585673527bb54d5c253eb35c018f5ff2d 100644 --- a/src/plugins/valgrind/valgrindplugin.h +++ b/src/plugins/valgrind/valgrindplugin.h @@ -48,7 +48,7 @@ public: ValgrindPlugin() {} virtual bool initialize(const QStringList &arguments, QString *errorString); - virtual void extensionsInitialized(); + virtual void extensionsInitialized() {} }; } // namespace Internal