summaryrefslogtreecommitdiff
path: root/src/plugins/analyzerbase
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/analyzerbase')
-rw-r--r--src/plugins/analyzerbase/analyzerbase.pro2
-rw-r--r--src/plugins/analyzerbase/analyzerconstants.h21
-rw-r--r--src/plugins/analyzerbase/analyzermanager.cpp651
-rw-r--r--src/plugins/analyzerbase/analyzermanager.h48
-rw-r--r--src/plugins/analyzerbase/analyzerruncontrol.cpp50
-rw-r--r--src/plugins/analyzerbase/analyzerruncontrol.h14
-rw-r--r--src/plugins/analyzerbase/analyzerruncontrolfactory.cpp149
-rw-r--r--src/plugins/analyzerbase/analyzerruncontrolfactory.h71
-rw-r--r--src/plugins/analyzerbase/analyzersettings.cpp1
-rw-r--r--src/plugins/analyzerbase/analyzerstartparameters.h11
-rw-r--r--src/plugins/analyzerbase/analyzerutils.cpp7
-rw-r--r--src/plugins/analyzerbase/analyzerutils.h2
-rw-r--r--src/plugins/analyzerbase/ianalyzerengine.cpp20
-rw-r--r--src/plugins/analyzerbase/ianalyzerengine.h33
-rw-r--r--src/plugins/analyzerbase/ianalyzertool.cpp28
-rw-r--r--src/plugins/analyzerbase/ianalyzertool.h49
-rw-r--r--src/plugins/analyzerbase/startremotedialog.cpp4
-rw-r--r--src/plugins/analyzerbase/startremotedialog.h12
18 files changed, 471 insertions, 702 deletions
diff --git a/src/plugins/analyzerbase/analyzerbase.pro b/src/plugins/analyzerbase/analyzerbase.pro
index ad33056b15..e42ee34fa8 100644
--- a/src/plugins/analyzerbase/analyzerbase.pro
+++ b/src/plugins/analyzerbase/analyzerbase.pro
@@ -15,7 +15,6 @@ SOURCES += \
ianalyzertool.cpp \
analyzerplugin.cpp \
analyzerruncontrol.cpp \
- analyzerruncontrolfactory.cpp \
analyzermanager.cpp \
analyzersettings.cpp \
analyzeroptionspage.cpp \
@@ -30,7 +29,6 @@ HEADERS += \
analyzerconstants.h \
analyzerplugin.h \
analyzerruncontrol.h \
- analyzerruncontrolfactory.h \
analyzermanager.h \
analyzersettings.h \
analyzerstartparameters.h \
diff --git a/src/plugins/analyzerbase/analyzerconstants.h b/src/plugins/analyzerbase/analyzerconstants.h
index 883f77b9cf..23f15e7b80 100644
--- a/src/plugins/analyzerbase/analyzerconstants.h
+++ b/src/plugins/analyzerbase/analyzerconstants.h
@@ -39,16 +39,22 @@
namespace Analyzer {
-enum AnalyzerStartMode
+// Special values for currently used modes.
+// Their meaning is interpreted by the individual tools.
+// FIXME: The plan is to remove this entirely from the
+// public interface and let the tools handle that internally.
+
+enum StartMode
{
- StartLocal,
- StartRemote
+ StartLocal = -1,
+ StartRemote = -2,
+ StartQml = -3
};
namespace Constants {
// modes and their priorities
-const char * const MODE_ANALYZE = "Analyzer.Mode.Analyze";
+const char * const MODE_ANALYZE = "Mode.Analyze";
const int P_MODE_ANALYZE = 76;
// context
@@ -61,6 +67,10 @@ const char * const START = "Analyzer.Start";
const char * const STARTREMOTE = "Analyzer.StartRemote";
const char * const STOP = "Analyzer.Stop";
+const char * const G_ANALYZER_CONTROL = "Menu.Group.Analyzer.Control";
+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 =
@@ -76,9 +86,6 @@ const char * const ANALYZER_CONTROL_STOP_ICON =
const char * const ANALYZERTASK_ID = "Analyzer.TaskId";
-// private
-const char * const ANALYZER_DUMMYWIDGET_ID = "Analyzer.DummyWidget";
-
} // namespace Constants
} // namespace Analyzer
diff --git a/src/plugins/analyzerbase/analyzermanager.cpp b/src/plugins/analyzerbase/analyzermanager.cpp
index 8553afab86..cdf4e5d167 100644
--- a/src/plugins/analyzerbase/analyzermanager.cpp
+++ b/src/plugins/analyzerbase/analyzermanager.cpp
@@ -37,12 +37,10 @@
#include "analyzerconstants.h"
#include "analyzerplugin.h"
#include "analyzerruncontrol.h"
-#include "analyzerruncontrolfactory.h"
#include "analyzeroptionspage.h"
#include "analyzerstartparameters.h"
#include "analyzerutils.h"
#include "ianalyzertool.h"
-#include "startremotedialog.h"
#include <coreplugin/coreconstants.h>
#include <coreplugin/findplaceholder.h>
@@ -76,8 +74,6 @@
#include <utils/statuslabel.h>
#include <utils/ssh/sshconnection.h>
-#include <cmakeprojectmanager/cmakeprojectconstants.h>
-
#include <QtCore/QVariant>
#include <QtCore/QDebug>
#include <QtGui/QHBoxLayout>
@@ -98,18 +94,20 @@
#include <QtGui/QPushButton>
using namespace Core;
-using namespace Analyzer;
using namespace Analyzer::Internal;
+using namespace ProjectExplorer;
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 LAST_ACTIVE_TOOL[] = "Analyzer.Plugin.LastActiveTool";
const char INITIAL_DOCK_AREA[] = "initial_dock_area";
-// AnalyzerMode ////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////
+//
+// AnalyzerMode
+//
+////////////////////////////////////////////////////////////////////
class AnalyzerMode : public Core::IMode
{
@@ -142,7 +140,6 @@ public:
};
} // namespace Internal
-} // namespace Analyzer
////////////////////////////////////////////////////////////////////
//
@@ -150,7 +147,7 @@ public:
//
////////////////////////////////////////////////////////////////////
-class AnalyzerManager::AnalyzerManagerPrivate : public QObject
+class AnalyzerManagerPrivate : public QObject
{
Q_OBJECT
@@ -169,60 +166,52 @@ public:
void delayedInit();
void setupActions();
- QWidget *createModeContents();
- QWidget *createModeMainWindow();
+ void createModeMainWindow();
bool showPromptDialog(const QString &title, const QString &text,
const QString &stopButtonText, const QString &cancelButtonText) const;
- void addDock(Qt::DockWidgetArea area, QDockWidget *dockWidget);
- void startAction(int tool);
- void addTool(IAnalyzerTool *tool);
- void addToolAction(IAnalyzerTool *tool, bool local);
- int indexOf(IAnalyzerTool *tool) const;
- int indexOf(QAction *action) const;
- IAnalyzerTool *toolAt(int idx) const;
+ void activateDock(Qt::DockWidgetArea area, QDockWidget *dockWidget);
+ void deactivateDock(QDockWidget *dockWidget);
+ void addTool(IAnalyzerTool *tool, const StartModes &modes);
+ void selectSavedTool();
+ void selectTool(IAnalyzerTool *tool, StartMode mode);
+ void handleToolStarted();
+ void handleToolFinished();
+ void saveToolSettings(IAnalyzerTool *tool, StartMode mode);
+ void loadToolSettings(IAnalyzerTool *tool);
+ QAction *actionFromToolAndMode(IAnalyzerTool *tool, StartMode mode);
+
+ // Convenience.
+ void startLocalTool(IAnalyzerTool *tool, StartMode 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 selectToolboxAction(int);
+ void selectMenuAction();
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;
+ bool m_isRunning;
Utils::FancyMainWindow *m_mainWindow;
- int m_currentIndex;
- QList<ToolData> m_actions;
+ IAnalyzerTool *m_currentTool;
+ StartMode m_currentMode;
+ QHash<QAction *, IAnalyzerTool *> m_toolFromAction;
+ QHash<QAction *, StartMode> m_modeFromAction;
QList<IAnalyzerTool *> m_tools;
+ QList<QAction *> m_actions;
QAction *m_startAction;
QAction *m_stopAction;
ActionContainer *m_menu;
QComboBox *m_toolBox;
- QStackedWidget *m_controlsWidget;
- ActionContainer *m_viewsMenu;
+ QStackedWidget *m_controlsStackWidget;
Utils::StatusLabel *m_statusLabel;
typedef QMap<IAnalyzerTool *, FancyMainWindowSettings> MainWindowSettingsMap;
- QMap<IAnalyzerTool *, QList<QDockWidget *> > m_toolWidgets;
+ QHash<IAnalyzerTool *, QList<QDockWidget *> > m_toolWidgets;
+ QHash<IAnalyzerTool *, QWidget *> m_controlsWidgetFromTool;
MainWindowSettingsMap m_defaultSettings;
// list of dock widgets to prevent memory leak
@@ -230,42 +219,35 @@ public:
QList<DockPtr> m_dockWidgets;
bool m_restartOnStop;
- bool m_initialized;
};
-AnalyzerManager::AnalyzerManagerPrivate::AnalyzerManagerPrivate(AnalyzerManager *qq):
+AnalyzerManagerPrivate::AnalyzerManagerPrivate(AnalyzerManager *qq):
q(qq),
m_mode(0),
- m_runControlFactory(0),
- m_currentRunControl(0),
+ m_isRunning(false),
m_mainWindow(0),
- m_currentIndex(-1),
+ m_currentTool(0),
+ m_currentMode(),
m_startAction(0),
m_stopAction(0),
m_menu(0),
m_toolBox(new QComboBox),
- m_controlsWidget(new QStackedWidget),
- m_viewsMenu(0),
+ m_controlsStackWidget(new QStackedWidget),
m_statusLabel(new Utils::StatusLabel),
- m_restartOnStop(false),
- m_initialized(false)
+ m_restartOnStop(false)
{
m_toolBox->setObjectName(QLatin1String("AnalyzerManagerToolBox"));
- connect(m_toolBox, SIGNAL(currentIndexChanged(int)), SLOT(selectAction(int)));
-
- m_runControlFactory = new AnalyzerRunControlFactory();
- registerRunControlFactory(m_runControlFactory);
+ connect(m_toolBox, SIGNAL(activated(int)), SLOT(selectToolboxAction(int)));
setupActions();
connect(ModeManager::instance(), SIGNAL(currentModeChanged(Core::IMode*)),
this, SLOT(modeChanged(Core::IMode*)));
- ProjectExplorer::ProjectExplorerPlugin *pe =
- ProjectExplorer::ProjectExplorerPlugin::instance();
+ ProjectExplorerPlugin *pe = ProjectExplorerPlugin::instance();
connect(pe, SIGNAL(updateRunActions()), SLOT(updateRunActions()));
}
-AnalyzerManager::AnalyzerManagerPrivate::~AnalyzerManagerPrivate()
+AnalyzerManagerPrivate::~AnalyzerManagerPrivate()
{
// as we have to setParent(0) on dock widget that are not selected,
// we keep track of all and make sure we don't leak any
@@ -275,15 +257,7 @@ AnalyzerManager::AnalyzerManagerPrivate::~AnalyzerManagerPrivate()
}
}
-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()
+void AnalyzerManagerPrivate::setupActions()
{
Core::ICore *core = Core::ICore::instance();
Core::ActionManager *am = core->actionManager();
@@ -295,8 +269,9 @@ 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_CONTROL);
+ 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,52 +282,52 @@ 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);
m_stopAction->setIcon(QIcon(Constants::ANALYZER_CONTROL_STOP_ICON));
command = am->registerAction(m_stopAction, Constants::STOP, globalcontext);
- connect(m_stopAction, SIGNAL(triggered()), this, SLOT(stopTool()));
+ m_menu->addAction(command, Constants::G_ANALYZER_CONTROL);
- QAction *separatorAction = new QAction(m_menu);
- separatorAction->setSeparator(true);
- command = am->registerAction(separatorAction,
- "Menu.Action.Analyzer.Tools.Separator", globalcontext);
- m_menu->addAction(command, G_ANALYZER_REMOTE_TOOLS);
+ QAction *separatorAction1 = new QAction(m_menu);
+ separatorAction1->setSeparator(true);
+ command = am->registerAction(separatorAction1,
+ "Menu.Action.Analyzer.Tools.Separator1", globalcontext);
+ m_menu->addAction(command, Constants::G_ANALYZER_TOOLS);
- m_viewsMenu = am->actionContainer(Core::Id(Core::Constants::M_WINDOW_VIEWS));
+ QAction *separatorAction2 = new QAction(m_menu);
+ separatorAction2->setSeparator(true);
+ command = am->registerAction(separatorAction2,
+ "Menu.Action.Analyzer.Tools.Separator2", globalcontext);
+ m_menu->addAction(command, Constants::G_ANALYZER_REMOTE_TOOLS);
}
-void AnalyzerManager::AnalyzerManagerPrivate::delayedInit()
+void AnalyzerManagerPrivate::delayedInit()
{
- if (m_initialized)
+ if (m_mode)
return;
m_mode = new AnalyzerMode(q);
- m_mode->setWidget(createModeContents());
- AnalyzerPlugin::instance()->addAutoReleasedObject(m_mode);
-
- m_initialized = true;
-}
+ createModeMainWindow();
-QWidget *AnalyzerManager::AnalyzerManagerPrivate::createModeContents()
-{
- // right-side window with editor, output etc.
+ // Right-side window with editor, output etc.
MiniSplitter *mainWindowSplitter = new MiniSplitter;
- mainWindowSplitter->addWidget(createModeMainWindow());
+ mainWindowSplitter->addWidget(m_mainWindow);
mainWindowSplitter->addWidget(new OutputPanePlaceHolder(m_mode, mainWindowSplitter));
mainWindowSplitter->setStretchFactor(0, 10);
mainWindowSplitter->setStretchFactor(1, 0);
mainWindowSplitter->setOrientation(Qt::Vertical);
- // navigation + right-side window
+ // Navigation + right-side window.
MiniSplitter *splitter = new MiniSplitter;
splitter->addWidget(new NavigationWidgetPlaceHolder(m_mode));
splitter->addWidget(mainWindowSplitter);
splitter->setStretchFactor(0, 0);
splitter->setStretchFactor(1, 1);
- return splitter;
+ m_mode->setWidget(splitter);
+
+ AnalyzerPlugin::instance()->addAutoReleasedObject(m_mode);
}
static QToolButton *toolButton(QAction *action)
@@ -362,14 +337,13 @@ static QToolButton *toolButton(QAction *action)
return button;
}
-QWidget *AnalyzerManager::AnalyzerManagerPrivate::createModeMainWindow()
+void AnalyzerManagerPrivate::createModeMainWindow()
{
m_mainWindow = new Utils::FancyMainWindow();
m_mainWindow->setObjectName(QLatin1String("AnalyzerManagerMainWindow"));
m_mainWindow->setDocumentMode(true);
m_mainWindow->setDockNestingEnabled(true);
- m_mainWindow->setDockActionsVisible(ModeManager::instance()->currentMode()->id() ==
- Constants::MODE_ANALYZE);
+ m_mainWindow->setDockActionsVisible(false);
connect(m_mainWindow, SIGNAL(resetLayout()), SLOT(resetLayout()));
QBoxLayout *editorHolderLayout = new QVBoxLayout;
@@ -396,7 +370,7 @@ QWidget *AnalyzerManager::AnalyzerManagerPrivate::createModeMainWindow()
analyzeToolBarLayout->addWidget(toolButton(m_stopAction));
analyzeToolBarLayout->addWidget(new Utils::StyledSeparator);
analyzeToolBarLayout->addWidget(m_toolBox);
- analyzeToolBarLayout->addWidget(m_controlsWidget);
+ analyzeToolBarLayout->addWidget(m_controlsStackWidget);
analyzeToolBarLayout->addWidget(m_statusLabel);
analyzeToolBarLayout->addStretch();
@@ -421,12 +395,9 @@ QWidget *AnalyzerManager::AnalyzerManagerPrivate::createModeMainWindow()
centralLayout->addWidget(documentAndRightPane);
centralLayout->setStretch(0, 1);
centralLayout->setStretch(1, 0);
-
- return m_mainWindow;
}
-void AnalyzerManager::AnalyzerManagerPrivate::addDock(Qt::DockWidgetArea area,
- QDockWidget *dockWidget)
+void AnalyzerManagerPrivate::activateDock(Qt::DockWidgetArea area, QDockWidget *dockWidget)
{
dockWidget->setParent(m_mainWindow);
m_mainWindow->addDockWidget(area, dockWidget);
@@ -436,32 +407,44 @@ void AnalyzerManager::AnalyzerManagerPrivate::addDock(Qt::DockWidgetArea area,
ActionManager *am = ICore::instance()->actionManager();
QAction *toggleViewAction = dockWidget->toggleViewAction();
toggleViewAction->setText(dockWidget->windowTitle());
- Command *cmd = am->registerAction(toggleViewAction, QString("Analyzer." + dockWidget->objectName()),
- globalContext);
+ Command *cmd = am->registerAction(toggleViewAction,
+ QString("Analyzer." + dockWidget->objectName()), globalContext);
cmd->setAttribute(Command::CA_Hide);
- m_viewsMenu->addAction(cmd);
+
+ ActionContainer *viewsMenu =
+ am->actionContainer(Core::Id(Core::Constants::M_WINDOW_VIEWS));
+ viewsMenu->addAction(cmd);
+}
+
+void AnalyzerManagerPrivate::deactivateDock(QDockWidget *dockWidget)
+{
+ ActionManager *am = ICore::instance()->actionManager();
+ QAction *toggleViewAction = dockWidget->toggleViewAction();
+ am->unregisterAction(toggleViewAction, QString("Analyzer." + dockWidget->objectName()));
+ m_mainWindow->removeDockWidget(dockWidget);
+ dockWidget->hide();
+ // Prevent saveState storing the data of the wrong children.
+ dockWidget->setParent(0);
}
bool buildTypeAccepted(IAnalyzerTool::ToolMode toolMode,
- ProjectExplorer::BuildConfiguration::BuildType buildType)
+ BuildConfiguration::BuildType buildType)
{
if (toolMode == IAnalyzerTool::AnyMode)
return true;
- if (buildType == ProjectExplorer::BuildConfiguration::Unknown)
+ if (buildType == BuildConfiguration::Unknown)
return true;
- if (buildType == ProjectExplorer::BuildConfiguration::Debug
+ if (buildType == BuildConfiguration::Debug
&& toolMode == IAnalyzerTool::DebugMode)
return true;
- if (buildType == ProjectExplorer::BuildConfiguration::Release
+ if (buildType == BuildConfiguration::Release
&& toolMode == IAnalyzerTool::ReleaseMode)
return true;
return false;
}
-bool AnalyzerManager::AnalyzerManagerPrivate::showPromptDialog(const QString &title,
- const QString &text,
- const QString &stopButtonText,
- const QString &cancelButtonText) const
+bool AnalyzerManagerPrivate::showPromptDialog(const QString &title, const QString &text,
+ const QString &stopButtonText, const QString &cancelButtonText) const
{
Utils::CheckableMessageBox messageBox(Core::ICore::instance()->mainWindow());
messageBox.setWindowTitle(title);
@@ -477,52 +460,27 @@ bool AnalyzerManager::AnalyzerManagerPrivate::showPromptDialog(const QString &ti
return messageBox.clickedStandardButton() == QDialogButtonBox::Yes;
}
-void AnalyzerManager::AnalyzerManagerPrivate::startToolRemote()
-{
- StartRemoteDialog dlg;
- if (dlg.exec() != QDialog::Accepted)
- return;
-
- AnalyzerStartParameters sp;
- sp.connParams = dlg.sshParams();
- sp.debuggee = dlg.executable();
- sp.debuggeeArgs = dlg.arguments();
- sp.displayName = dlg.executable();
- sp.startMode = StartRemote;
- sp.workingDirectory = dlg.workingDirectory();
-
- AnalyzerRunControl *runControl = m_runControlFactory->create(sp, 0);
-
- QTC_ASSERT(runControl, return);
- ProjectExplorer::ProjectExplorerPlugin::instance()
- ->startRunControl(runControl, Constants::MODE_ANALYZE);
-}
-
-void AnalyzerManager::AnalyzerManagerPrivate::startAction(int index)
+void AnalyzerManagerPrivate::startLocalTool(IAnalyzerTool *tool, StartMode)
{
+ int index = m_tools.indexOf(tool);
QTC_ASSERT(index >= 0, return);
- QTC_ASSERT(index < m_actions.size(), return);
- QTC_ASSERT(index == m_currentIndex, return);
+ QTC_ASSERT(index < m_tools.size(), return);
+ QTC_ASSERT(tool == m_currentTool, return);
- if (!m_actions.at(index).local) {
- startToolRemote();
- return;
- }
-
- // make sure mode is shown
+ // Make sure mode is shown.
q->showMode();
- ProjectExplorer::ProjectExplorerPlugin *pe = ProjectExplorer::ProjectExplorerPlugin::instance();
+ ProjectExplorerPlugin *pe = ProjectExplorerPlugin::instance();
// ### not sure if we're supposed to check if the RunConFiguration isEnabled
- ProjectExplorer::Project *pro = pe->startupProject();
- const ProjectExplorer::RunConfiguration *runConfig = 0;
- ProjectExplorer::BuildConfiguration::BuildType buildType = ProjectExplorer::BuildConfiguration::Unknown;
+ Project *pro = pe->startupProject();
+ const RunConfiguration *runConfig = 0;
+ BuildConfiguration::BuildType buildType = BuildConfiguration::Unknown;
if (pro) {
- if (const ProjectExplorer::Target *target = pro->activeTarget()) {
+ if (const Target *target = pro->activeTarget()) {
runConfig = target->activeRunConfiguration();
// Build configuration is 0 for QML projects.
- if (const ProjectExplorer::BuildConfiguration *buildConfig = target->activeBuildConfiguration())
+ if (const BuildConfiguration *buildConfig = target->activeBuildConfiguration())
buildType = buildConfig->buildType();
}
}
@@ -530,12 +488,12 @@ void AnalyzerManager::AnalyzerManagerPrivate::startAction(int index)
return;
// Check if there already is an analyzer run.
- if (m_currentRunControl) {
+ if (m_isRunning) {
// ask if user wants to restart the analyzer
const QString msg = tr("<html><head/><body><center><i>%1</i> is still running. "
"You have to quit the Analyzer before being able to run another instance."
"<center/><center>Force it to quit?</center></body></html>")
- .arg(m_currentRunControl->displayName());
+ .arg(m_currentTool->displayName());
bool stopRequested = showPromptDialog(tr("Analyzer Still Running"), msg,
tr("Stop Active Run"), tr("Keep Running"));
if (!stopRequested)
@@ -543,37 +501,47 @@ void AnalyzerManager::AnalyzerManagerPrivate::startAction(int index)
// user selected to stop the active run. stop it, activate restart on stop
m_restartOnStop = true;
- stopTool();
+ q->stopTool();
return;
}
- IAnalyzerTool *tool = toolAt(index);
- IAnalyzerTool::ToolMode toolMode = tool->mode();
+ IAnalyzerTool::ToolMode toolMode = tool->toolMode();
// Check the project for whether the build config is in the correct mode
// if not, notify the user and urge him to use the correct mode.
if (!buildTypeAccepted(toolMode, buildType)) {
- const QString &toolName = tool->displayName();
- const QString &toolMode = IAnalyzerTool::modeString(tool->mode());
- const QString currentMode = buildType == ProjectExplorer::BuildConfiguration::Debug ? tr("Debug") : tr("Release");
+ const QString toolName = tool->displayName();
+ const QString currentMode =
+ buildType == BuildConfiguration::Debug ? tr("Debug") : tr("Release");
QSettings *settings = Core::ICore::instance()->settings();
- const QString configKey = QLatin1String(Constants::MODE_ANALYZE) + QLatin1Char('/') + QLatin1String("AnalyzeCorrectMode");
+ const QString configKey = QLatin1String("Analyzer.AnalyzeCorrectMode");
int ret;
if (settings->contains(configKey)) {
ret = settings->value(configKey, QDialog::Accepted).toInt();
} else {
+ QString toolModeString;
+ switch (toolMode) {
+ case IAnalyzerTool::DebugMode:
+ toolModeString = tr("Debug");
+ case IAnalyzerTool::ReleaseMode:
+ toolModeString = tr("Release");
+ case IAnalyzerTool::AnyMode:
+ break;
+ }
const QString title = tr("Run %1 in %2 Mode?").arg(toolName).arg(currentMode);
- const QString message = tr("<html><head/><body><p>You are trying to run the tool '%1' on an application in %2 mode. "
- "The tool is designed to be used in %3 mode.</p><p>"
- "Do you want to continue and run it in %2 mode?</p></body></html>").
- arg(toolName).arg(currentMode).arg(toolMode);
+ const QString message = tr("<html><head/><body><p>You are trying "
+ "to run the tool \"%1\" on an application in %2 mode. "
+ "The tool is designed to be used in %3 mode.</p><p>"
+ "Do you want to continue and run it in %2 mode?</p></body></html>")
+ .arg(toolName).arg(currentMode).arg(toolModeString);
const QString checkBoxText = tr("&Do not ask again");
bool checkBoxSetting = false;
const QDialogButtonBox::StandardButton button =
- Utils::CheckableMessageBox::question(Core::ICore::instance()->mainWindow(), title, message, checkBoxText,
- &checkBoxSetting, QDialogButtonBox::Yes|QDialogButtonBox::Cancel,
- QDialogButtonBox::Cancel);
+ Utils::CheckableMessageBox::question(Core::ICore::instance()->mainWindow(),
+ title, message, checkBoxText,
+ &checkBoxSetting, QDialogButtonBox::Yes|QDialogButtonBox::Cancel,
+ QDialogButtonBox::Cancel);
ret = button == QDialogButtonBox::Yes ? QDialog::Accepted : QDialog::Rejected;
if (checkBoxSetting && ret == QDialog::Accepted)
@@ -583,173 +551,154 @@ void AnalyzerManager::AnalyzerManagerPrivate::startAction(int index)
return;
}
- pe->runProject(pro, Constants::MODE_ANALYZE);
-
+ m_isRunning = true;
+ pe->runProject(pro, tool->id());
updateRunActions();
}
-
-void AnalyzerManager::AnalyzerManagerPrivate::stopTool()
+void AnalyzerManagerPrivate::startTool()
{
- 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();
- // else: wait for the finished() signal to trigger handleToolFinished()
+ m_currentTool->startTool(m_currentMode);
}
-void AnalyzerManager::AnalyzerManagerPrivate::modeChanged(IMode *mode)
+void AnalyzerManagerPrivate::modeChanged(IMode *mode)
{
- if (!m_mainWindow)
- return;
- const bool makeVisible = mode->id() == Constants::MODE_ANALYZE;
- if (!makeVisible)
- return;
- m_mainWindow->setDockActionsVisible(makeVisible);
-}
-
-void AnalyzerManager::AnalyzerManagerPrivate::selectAction(int idx)
-{
- QTC_ASSERT(idx >= 0, return);
- if (m_currentIndex == idx)
- return;
-
- if (m_currentIndex != -1) {
- IAnalyzerTool *oldTool = toolAt(m_currentIndex);
- saveToolSettings(oldTool);
-
- ActionManager *am = ICore::instance()->actionManager();
-
- foreach (QDockWidget *widget, m_toolWidgets.value(oldTool)) {
- QAction *toggleViewAction = widget->toggleViewAction();
- am->unregisterAction(toggleViewAction,
- QString("Analyzer." + widget->objectName()));
- m_mainWindow->removeDockWidget(widget);
- ///NOTE: QMainWindow (and FancyMainWindow) just look at
- /// @c findChildren<QDockWidget*>()
- ///if we don't do this, all kind of havoc might happen, including:
- ///- improper saveState/restoreState
- ///- improper list of qdockwidgets in popup menu
- ///- ...
- widget->setParent(0);
- }
- oldTool->toolDeselected();
- }
-
- m_currentIndex = idx;
-
- m_toolBox->setCurrentIndex(idx);
- m_controlsWidget->setCurrentIndex(idx);
-
- IAnalyzerTool *newTool = toolAt(idx);
-
- const bool firstTime = !m_defaultSettings.contains(newTool);
- if (firstTime) {
- newTool->initializeDockWidgets();
- m_defaultSettings.insert(newTool, m_mainWindow->saveSettings());
+ if (mode && mode == m_mode) {
+ m_mainWindow->setDockActionsVisible(true);
+ static bool firstTime = true;
+ if (firstTime)
+ selectSavedTool();
+ firstTime = false;
+ updateRunActions();
} else {
- foreach (QDockWidget *widget, m_toolWidgets.value(newTool))
- addDock(Qt::DockWidgetArea(widget->property(INITIAL_DOCK_AREA).toInt()), widget);
+ m_mainWindow->setDockActionsVisible(false);
}
-
- loadToolSettings(newTool);
- updateRunActions();
}
-void AnalyzerManager::AnalyzerManagerPrivate::selectAction()
+QAction *AnalyzerManagerPrivate::actionFromToolAndMode(IAnalyzerTool *tool, StartMode mode)
{
- selectAction(qobject_cast<QAction *>(sender()));
+ foreach (QAction *action, m_actions)
+ if (m_toolFromAction.value(action) == tool && m_modeFromAction[action] == mode)
+ return action;
+ QTC_ASSERT(false, /**/);
+ return 0;
}
-void AnalyzerManager::AnalyzerManagerPrivate::selectAction(QAction *action)
+void AnalyzerManagerPrivate::selectSavedTool()
{
- selectAction(indexOf(action));
+ const QSettings *settings = Core::ICore::instance()->settings();
+ const QByteArray lastActiveAction =
+ settings->value(QLatin1String(LAST_ACTIVE_TOOL), QString()).toByteArray();
+ foreach (QAction *action, m_actions) {
+ IAnalyzerTool *tool = m_toolFromAction.value(action);
+ StartMode mode = m_modeFromAction.value(action);
+ if (tool->actionId(mode) == lastActiveAction) {
+ selectTool(tool, mode);
+ break;
+ }
+ }
}
-int AnalyzerManager::AnalyzerManagerPrivate::indexOf(QAction *action) const
+void AnalyzerManagerPrivate::selectMenuAction()
{
- for (int i = 0; i != m_actions.size(); ++i)
- if (m_actions.at(i).action == action)
- return i;
- return -1;
+ QAction *action = qobject_cast<QAction *>(sender());
+ QTC_ASSERT(action, return);
+ IAnalyzerTool *tool = m_toolFromAction.value(action);
+ StartMode mode = m_modeFromAction.value(action);
+ selectTool(tool, mode);
+ tool->startTool(mode);
}
-int AnalyzerManager::AnalyzerManagerPrivate::indexOf(IAnalyzerTool *tool) const
+void AnalyzerManagerPrivate::selectToolboxAction(int index)
{
- for (int i = 0; i != m_actions.size(); ++i)
- if (toolAt(i) == tool)
- return i;
- return -1;
+ QAction *action = m_actions[index];
+ selectTool(m_toolFromAction.value(action), m_modeFromAction.value(action));
}
-IAnalyzerTool *AnalyzerManager::AnalyzerManagerPrivate::toolAt(int idx) const
+void AnalyzerManagerPrivate::selectTool(IAnalyzerTool *tool, StartMode mode)
{
- QTC_ASSERT(idx >= 0, return 0);
- QTC_ASSERT(idx < m_actions.size(), return 0);
- return m_actions.at(idx).tool;
-}
+ if (m_currentTool == tool && m_currentMode == mode)
+ return;
-void AnalyzerManager::AnalyzerManagerPrivate::addToolAction(IAnalyzerTool *tool, bool local)
-{
- ActionManager *am = Core::ICore::instance()->actionManager();
+ QAction *action = actionFromToolAndMode(tool, mode);
+ const int actionIndex = m_actions.indexOf(action);
+ QTC_ASSERT(actionIndex >= 0, return);
- QString actionId = QString("Action.Analyzer.Tools.%1").arg(m_actions.size());
- QString displayName = tool->displayName() + (local ? QString() : tr(" (Remote)"));
- QAction *action = new QAction(displayName, 0);
+ // Clean up old tool.
+ if (m_currentTool) {
+ saveToolSettings(m_currentTool, m_currentMode);
+ foreach (QDockWidget *widget, m_toolWidgets.value(m_currentTool))
+ deactivateDock(widget);
+ m_currentTool->toolDeselected();
+ }
- ToolData data;
- data.tool = tool;
- data.local = local;
- data.action = action;
- m_actions.append(data);
+ // Now change the tool.
+ m_currentTool = tool;
+ m_currentMode = mode;
+
+ if (!m_defaultSettings.contains(tool)) {
+ QWidget *widget = tool->createWidgets();
+ QTC_ASSERT(widget, /**/);
+ m_defaultSettings.insert(tool, m_mainWindow->saveSettings());
+ QTC_ASSERT(!m_controlsWidgetFromTool.contains(tool), /**/);
+ m_controlsWidgetFromTool[tool] = widget;
+ m_controlsStackWidget->addWidget(widget);
+ }
+ foreach (QDockWidget *widget, m_toolWidgets.value(tool))
+ activateDock(Qt::DockWidgetArea(widget->property(INITIAL_DOCK_AREA).toInt()), widget);
- 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()));
+ loadToolSettings(tool);
- const bool blocked = m_toolBox->blockSignals(true); // Do not make current.
- m_toolBox->addItem(displayName);
- m_toolBox->blockSignals(blocked);
- m_toolBox->setEnabled(true);
+ QTC_ASSERT(m_controlsWidgetFromTool.contains(tool), /**/);
+ m_controlsStackWidget->setCurrentWidget(m_controlsWidgetFromTool.value(tool));
+ m_toolBox->setCurrentIndex(actionIndex);
+
+ updateRunActions();
}
-void AnalyzerManager::AnalyzerManagerPrivate::addTool(IAnalyzerTool *tool)
+void AnalyzerManagerPrivate::addTool(IAnalyzerTool *tool, const StartModes &modes)
{
- delayedInit(); // be sure that there is a valid IMode instance
+ delayedInit(); // Make sure that there is a valid IMode instance.
+
+ const bool blocked = m_toolBox->blockSignals(true); // Do not make current.
+ ActionManager *am = Core::ICore::instance()->actionManager();
+ foreach (StartMode mode, modes) {
+ QString actionName = tool->actionName(mode);
+ QString menuGroup = tool->menuGroup(mode);
+ QString actionId = tool->actionId(mode);
+ QAction *action = new QAction(actionName, 0);
+ Core::Command *command = am->registerAction(action, actionId,
+ Core::Context(Core::Constants::C_GLOBAL));
+ m_menu->addAction(command, menuGroup);
+ m_actions.append(action);
+ m_toolFromAction[action] = tool;
+ m_modeFromAction[action] = mode;
+ m_toolBox->addItem(actionName);
+ m_toolBox->blockSignals(blocked);
+ connect(action, SIGNAL(triggered()), SLOT(selectMenuAction()));
+ }
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();
+ m_toolBox->setEnabled(true);
}
-void AnalyzerManager::AnalyzerManagerPrivate::runControlCreated(AnalyzerRunControl *rc)
+void AnalyzerManagerPrivate::handleToolStarted()
{
- QTC_ASSERT(!m_currentRunControl, /**/);
- m_currentRunControl = rc;
- connect(rc, SIGNAL(finished()), this, SLOT(handleToolFinished()));
+ m_isRunning = true; // FIXME: Make less global.
+ updateRunActions();
}
-void AnalyzerManager::AnalyzerManagerPrivate::handleToolFinished()
+void AnalyzerManagerPrivate::handleToolFinished()
{
- m_currentRunControl = 0;
+ m_isRunning = false;
updateRunActions();
if (m_restartOnStop) {
- startAction(m_currentIndex);
+ m_currentTool->startTool(m_currentMode);
m_restartOnStop = false;
}
}
-void AnalyzerManager::AnalyzerManagerPrivate::loadToolSettings(IAnalyzerTool *tool)
+void AnalyzerManagerPrivate::loadToolSettings(IAnalyzerTool *tool)
{
QTC_ASSERT(m_mainWindow, return);
QSettings *settings = Core::ICore::instance()->settings();
@@ -759,7 +708,7 @@ void AnalyzerManager::AnalyzerManagerPrivate::loadToolSettings(IAnalyzerTool *to
settings->endGroup();
}
-void AnalyzerManager::AnalyzerManagerPrivate::saveToolSettings(IAnalyzerTool *tool)
+void AnalyzerManagerPrivate::saveToolSettings(IAnalyzerTool *tool, StartMode mode)
{
if (!tool)
return; // no active tool, do nothing
@@ -770,31 +719,38 @@ void AnalyzerManager::AnalyzerManagerPrivate::saveToolSettings(IAnalyzerTool *to
m_mainWindow->saveSettings(settings);
settings->setValue("ToolSettingsSaved", true);
settings->endGroup();
- settings->setValue(QLatin1String(lastActiveToolC), tool->id());
+ settings->setValue(QLatin1String(LAST_ACTIVE_TOOL), tool->actionId(mode));
}
-void AnalyzerManager::AnalyzerManagerPrivate::updateRunActions()
+void AnalyzerManagerPrivate::updateRunActions()
{
- ProjectExplorer::ProjectExplorerPlugin *pe =
- ProjectExplorer::ProjectExplorerPlugin::instance();
- ProjectExplorer::Project *project = pe->startupProject();
+ static bool previousRunning = true;
+ static IAnalyzerTool *previousTool = 0;
+ if (previousRunning == m_isRunning && previousTool == m_currentTool)
+ return;
+ previousTool = m_currentTool;
+ previousRunning = m_isRunning;
+
+ ProjectExplorerPlugin *pe = ProjectExplorerPlugin::instance();
+ Project *project = pe->startupProject();
- bool startEnabled = !m_currentRunControl
- && pe->canRun(project, Constants::MODE_ANALYZE)
- && m_currentIndex >= 0;
+ bool startEnabled = !m_isRunning
+ && m_currentTool && pe->canRun(project, m_currentTool->id());
QString disabledReason;
- if (m_currentRunControl)
+ if (m_isRunning)
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);
+ disabledReason = pe->cannotRunReason(project, m_currentTool->id());
m_startAction->setEnabled(startEnabled);
m_startAction->setToolTip(disabledReason);
- m_toolBox->setEnabled(!m_currentRunControl);
- m_stopAction->setEnabled(m_currentRunControl);
+ m_toolBox->setEnabled(!m_isRunning);
+ m_stopAction->setEnabled(m_isRunning);
+ foreach (QAction *action, m_actions)
+ action->setEnabled(!m_isRunning);
}
////////////////////////////////////////////////////////////////////
@@ -822,85 +778,57 @@ void AnalyzerManager::extensionsInitialized()
if (d->m_tools.isEmpty())
return;
- const QSettings *settings = Core::ICore::instance()->settings();
- const QString lastActiveToolId =
- settings->value(QLatin1String(lastActiveToolC), QString()).toString();
- int lastAction = 0;
-
- foreach (IAnalyzerTool *tool, d->m_tools) {
+ foreach (IAnalyzerTool *tool, d->m_tools)
tool->extensionsInitialized();
- if (tool->id() == lastActiveToolId)
- lastAction = d->indexOf(tool);
- }
-
- d->selectAction(lastAction);
}
void AnalyzerManager::shutdown()
{
- d->saveToolSettings(d->m_actions[d->m_currentIndex].tool);
+ d->saveToolSettings(d->m_currentTool, d->m_currentMode);
}
-AnalyzerManager *AnalyzerManager::instance()
+void AnalyzerManager::addTool(IAnalyzerTool *tool, const StartModes &modes)
{
- return m_instance;
-}
-
-void AnalyzerManager::registerRunControlFactory(ProjectExplorer::IRunControlFactory *factory)
-{
- d->registerRunControlFactory(factory);
-}
-
-void AnalyzerManager::addTool(IAnalyzerTool *tool)
-{
- d->addTool(tool);
+ m_instance->d->addTool(tool, modes);
}
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));
dockWidget->setWindowTitle(title);
d->m_toolWidgets[tool].push_back(dockWidget);
- d->addDock(area, dockWidget);
return dockWidget;
}
-IAnalyzerEngine *AnalyzerManager::createEngine(const AnalyzerStartParameters &sp,
- ProjectExplorer::RunConfiguration *runConfiguration)
+void AnalyzerManager::selectTool(IAnalyzerTool *tool, StartMode mode)
{
- IAnalyzerTool *tool = d->toolAt(d->m_currentIndex);
- QTC_ASSERT(tool, return 0);
- return tool->createEngine(sp, runConfiguration);
+ m_instance->d->selectTool(tool, mode);
}
-void AnalyzerManager::selectTool(IAnalyzerTool *tool)
+void AnalyzerManager::startTool(IAnalyzerTool *tool, StartMode mode)
{
- d->selectAction(d->indexOf(tool));
+ QTC_ASSERT(tool == m_instance->d->m_currentTool, return);
+ tool->startTool(mode);
}
-void AnalyzerManager::startTool(IAnalyzerTool *tool)
+Utils::FancyMainWindow *AnalyzerManager::mainWindow()
{
- d->startAction(d->indexOf(tool));
+ return m_instance->d->m_mainWindow;
}
-Utils::FancyMainWindow *AnalyzerManager::mainWindow() const
+void AnalyzerManagerPrivate::resetLayout()
{
- return 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 +850,44 @@ 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()
{
- d->stopTool();
+ stopAction()->trigger();
}
+void AnalyzerManager::startLocalTool(IAnalyzerTool *tool, StartMode mode)
+{
+ m_instance->d->startLocalTool(tool, mode);
+}
+
+QAction *AnalyzerManager::stopAction()
+{
+ return m_instance->d->m_stopAction;
+}
+
+void AnalyzerManager::handleToolStarted()
+{
+ m_instance->d->handleToolStarted();
+}
+
+void AnalyzerManager::handleToolFinished()
+{
+ m_instance->d->handleToolFinished();
+}
+
+IAnalyzerTool *AnalyzerManager::toolFromId(const QByteArray &id)
+{
+ foreach (IAnalyzerTool *tool, m_instance->d->m_tools)
+ if (id.startsWith(tool->id()))
+ return tool;
+ QTC_ASSERT(false, qDebug() << "NO ANAYLYZER TOOL FOUND FOR ID" << id);
+ return 0;
+}
+
+} // namespace Analyzer
+
#include "analyzermanager.moc"
diff --git a/src/plugins/analyzerbase/analyzermanager.h b/src/plugins/analyzerbase/analyzermanager.h
index a46ce59cb1..42700cac90 100644
--- a/src/plugins/analyzerbase/analyzermanager.h
+++ b/src/plugins/analyzerbase/analyzermanager.h
@@ -36,6 +36,7 @@
#define ANALYZERMANAGER_H
#include "analyzerbase_global.h"
+#include "analyzerconstants.h"
#include "projectexplorer/runconfiguration.h"
#include <QtCore/QObject>
@@ -48,14 +49,12 @@ namespace Utils {
class FancyMainWindow;
}
-namespace ProjectExplorer {
-class RunConfiguration;
-}
-
namespace Analyzer {
+
+typedef QList<StartMode> StartModes;
+
class IAnalyzerTool;
-class IAnalyzerEngine;
-class AnalyzerStartParameters;
+class AnalyzerManagerPrivate;
class ANALYZER_EXPORT AnalyzerManager : public QObject
{
@@ -65,40 +64,39 @@ public:
explicit AnalyzerManager(QObject *parent = 0);
~AnalyzerManager();
- static AnalyzerManager *instance();
- void registerRunControlFactory(ProjectExplorer::IRunControlFactory *factory);
-
void extensionsInitialized();
void shutdown();
- /**
- * Register a tool and initialize it.
- */
- void addTool(Analyzer::IAnalyzerTool *tool);
+ // Register a tool and initialize it.
+ static void addTool(IAnalyzerTool *tool, const StartModes &mode);
+ static IAnalyzerTool *toolFromId(const QByteArray &id);
+ static StartMode modeFromId(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, StartMode mode);
+ static void startTool(IAnalyzerTool *tool, StartMode mode);
+ static void stopTool();
- void showMode();
- void selectTool(IAnalyzerTool *tool);
- void startTool(IAnalyzerTool *tool);
- void stopTool();
+ // Convenience functions.
+ static void startLocalTool(IAnalyzerTool *tool, StartMode mode);
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 handleToolStarted();
+ static void handleToolFinished();
+ static QAction *stopAction();
private:
- class AnalyzerManagerPrivate;
friend class AnalyzerManagerPrivate;
AnalyzerManagerPrivate *const d;
};
diff --git a/src/plugins/analyzerbase/analyzerruncontrol.cpp b/src/plugins/analyzerbase/analyzerruncontrol.cpp
index 920c62ef10..889b2a911b 100644
--- a/src/plugins/analyzerbase/analyzerruncontrol.cpp
+++ b/src/plugins/analyzerbase/analyzerruncontrol.cpp
@@ -48,9 +48,15 @@
#include <QtCore/QDebug>
-using namespace Analyzer;
+using namespace ProjectExplorer;
-// AnalyzerRunControl::Private ///////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//
+// AnalyzerRunControl::Private
+//
+//////////////////////////////////////////////////////////////////////////
+
+namespace Analyzer {
class AnalyzerRunControl::Private
{
@@ -66,13 +72,18 @@ AnalyzerRunControl::Private::Private()
{}
-// AnalyzerRunControl ////////////////////////////////////////////////////
-AnalyzerRunControl::AnalyzerRunControl(const AnalyzerStartParameters &sp,
- RunConfiguration *runConfiguration)
- : RunControl(runConfiguration, Constants::MODE_ANALYZE),
+//////////////////////////////////////////////////////////////////////////
+//
+// AnalyzerRunControl
+//
+//////////////////////////////////////////////////////////////////////////
+
+AnalyzerRunControl::AnalyzerRunControl(IAnalyzerTool *tool,
+ const AnalyzerStartParameters &sp, RunConfiguration *runConfiguration)
+ : RunControl(runConfiguration, tool->id()),
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 +94,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()
@@ -92,6 +104,7 @@ AnalyzerRunControl::~AnalyzerRunControl()
delete d->m_engine;
d->m_engine = 0;
+ delete d;
}
void AnalyzerRunControl::start()
@@ -103,7 +116,7 @@ void AnalyzerRunControl::start()
// clear about-to-be-outdated tasks
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
- ProjectExplorer::TaskHub *hub = pm->getObject<ProjectExplorer::TaskHub>();
+ TaskHub *hub = pm->getObject<TaskHub>();
hub->clearTasks(Constants::ANALYZERTASK_ID);
d->m_isRunning = true;
@@ -111,7 +124,7 @@ void AnalyzerRunControl::start()
d->m_engine->start();
}
-ProjectExplorer::RunControl::StopResult AnalyzerRunControl::stop()
+RunControl::StopResult AnalyzerRunControl::stop()
{
if (!d->m_engine || !d->m_isRunning)
return StoppedSynchronously;
@@ -121,12 +134,23 @@ ProjectExplorer::RunControl::StopResult AnalyzerRunControl::stop()
return AsynchronousStop;
}
+void AnalyzerRunControl::stopIt()
+{
+ if (stop() == RunControl::StoppedSynchronously)
+ AnalyzerManager::handleToolFinished();
+}
+
void AnalyzerRunControl::engineFinished()
{
d->m_isRunning = false;
emit finished();
}
+void AnalyzerRunControl::runControlFinished()
+{
+ AnalyzerManager::handleToolFinished();
+}
+
bool AnalyzerRunControl::isRunning() const
{
return d->m_isRunning;
@@ -149,12 +173,12 @@ void AnalyzerRunControl::receiveOutput(const QString &text, Utils::OutputFormat
appendMessage(text, format);
}
-void AnalyzerRunControl::addTask(ProjectExplorer::Task::TaskType type, const QString &description,
+void AnalyzerRunControl::addTask(Task::TaskType type, const QString &description,
const QString &file, int line)
{
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
- ProjectExplorer::TaskHub *hub = pm->getObject<ProjectExplorer::TaskHub>();
- hub->addTask(ProjectExplorer::Task(type, description, file, line, Constants::ANALYZERTASK_ID));
+ TaskHub *hub = pm->getObject<TaskHub>();
+ hub->addTask(Task(type, description, file, line, Constants::ANALYZERTASK_ID));
///FIXME: get a better API for this into Qt Creator
QList<Core::IOutputPane *> panes = pm->getObjects<Core::IOutputPane>();
@@ -165,3 +189,5 @@ void AnalyzerRunControl::addTask(ProjectExplorer::Task::TaskType type, const QSt
}
}
}
+
+} // namespace Analyzer
diff --git a/src/plugins/analyzerbase/analyzerruncontrol.h b/src/plugins/analyzerbase/analyzerruncontrol.h
index 59a2a2e720..ff320a4e2b 100644
--- a/src/plugins/analyzerbase/analyzerruncontrol.h
+++ b/src/plugins/analyzerbase/analyzerruncontrol.h
@@ -45,18 +45,18 @@
namespace Analyzer {
class AnalyzerStartParameters;
+class IAnalyzerTool;
-class ANALYZER_EXPORT AnalyzerRunControl: public ProjectExplorer::RunControl
+class ANALYZER_EXPORT AnalyzerRunControl : public ProjectExplorer::RunControl
{
Q_OBJECT
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,
+ ProjectExplorer::RunConfiguration *runConfiguration);
~AnalyzerRunControl();
- // pure virtuals from ProjectExplorer::RunControl
+ // ProjectExplorer::RunControl
void start();
StopResult stop();
bool isRunning() const;
@@ -64,16 +64,18 @@ public:
QIcon icon() const;
private slots:
+ void stopIt();
void receiveOutput(const QString &, Utils::OutputFormat format);
void addTask(ProjectExplorer::Task::TaskType type, const QString &description,
const QString &file, int line);
void engineFinished();
+ void runControlFinished();
private:
class Private;
- QScopedPointer<Private> d;
+ Private *d;
};
} // namespace Analyzer
diff --git a/src/plugins/analyzerbase/analyzerruncontrolfactory.cpp b/src/plugins/analyzerbase/analyzerruncontrolfactory.cpp
deleted file mode 100644
index 3e7efb81e8..0000000000
--- a/src/plugins/analyzerbase/analyzerruncontrolfactory.cpp
+++ /dev/null
@@ -1,149 +0,0 @@
-/**************************************************************************
-**
-** This file is part of Qt Creator
-**
-** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
-**
-** Contact: Nokia Corporation (info@qt.nokia.com)
-**
-**
-** GNU Lesser General Public License Usage
-**
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this file.
-** Please review the following information to ensure the GNU Lesser General
-** Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** Other Usage
-**
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at info@qt.nokia.com.
-**
-**************************************************************************/
-
-#include "analyzerruncontrolfactory.h"
-#include "analyzerruncontrol.h"
-#include "analyzerconstants.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 <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);
-
- 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)
-{
-}
-
-bool AnalyzerRunControlFactory::canRun(RunConfiguration *runConfiguration, const QString &mode) const
-{
- return runConfiguration->isEnabled() && mode == Constants::MODE_ANALYZE;
-}
-
-ProjectExplorer::RunControl *AnalyzerRunControlFactory::create(RunConfiguration *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;
-}
-
-QString AnalyzerRunControlFactory::displayName() const
-{
- return tr("Analyzer");
-}
-
-ProjectExplorer::IRunConfigurationAspect *AnalyzerRunControlFactory::createRunConfigurationAspect()
-{
- return new AnalyzerProjectSettings;
-}
-
-ProjectExplorer::RunConfigWidget *AnalyzerRunControlFactory::createConfigurationWidget(RunConfiguration
- *runConfiguration)
-{
- ProjectExplorer::LocalApplicationRunConfiguration *localRc =
- qobject_cast<ProjectExplorer::LocalApplicationRunConfiguration *>(runConfiguration);
- if (!localRc)
- return 0;
- AnalyzerProjectSettings *settings = runConfiguration->extraAspect<AnalyzerProjectSettings>();
- if (!settings)
- return 0;
-
- AnalyzerRunConfigWidget *ret = new AnalyzerRunConfigWidget;
- ret->setRunConfiguration(runConfiguration);
- return ret;
-}
diff --git a/src/plugins/analyzerbase/analyzerruncontrolfactory.h b/src/plugins/analyzerbase/analyzerruncontrolfactory.h
deleted file mode 100644
index 7c518f15cc..0000000000
--- a/src/plugins/analyzerbase/analyzerruncontrolfactory.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/**************************************************************************
-**
-** This file is part of Qt Creator
-**
-** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
-**
-** Contact: Nokia Corporation (info@qt.nokia.com)
-**
-**
-** GNU Lesser General Public License Usage
-**
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this file.
-** Please review the following information to ensure the GNU Lesser General
-** Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** Other Usage
-**
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at info@qt.nokia.com.
-**
-**************************************************************************/
-
-#ifndef ANALYZERRUNCONTROLFACTORY_H
-#define ANALYZERRUNCONTROLFACTORY_H
-
-#include <projectexplorer/runconfiguration.h>
-
-namespace Analyzer {
-
-class AnalyzerRunControl;
-class AnalyzerStartParameters;
-
-namespace Internal {
-
-class AnalyzerRunControlFactory: public ProjectExplorer::IRunControlFactory
-{
- Q_OBJECT
-
-public:
- AnalyzerRunControlFactory(QObject *parent = 0);
-
- typedef ProjectExplorer::RunConfiguration RunConfiguration;
- typedef ProjectExplorer::RunControl RunControl;
-
- // virtuals from 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();
- ProjectExplorer::RunConfigWidget *createConfigurationWidget(RunConfiguration *runConfiguration);
-
-signals:
- void runControlCreated(Analyzer::AnalyzerRunControl *);
-};
-
-} // namespace Internal
-} // namespace Analyzer
-
-#endif // ANALYZERRUNCONTROLFACTORY_H
diff --git a/src/plugins/analyzerbase/analyzersettings.cpp b/src/plugins/analyzerbase/analyzersettings.cpp
index fa00ab55d0..89fa68b1c2 100644
--- a/src/plugins/analyzerbase/analyzersettings.cpp
+++ b/src/plugins/analyzerbase/analyzersettings.cpp
@@ -40,7 +40,6 @@
#include "analyzeroptionspage.h"
#include <coreplugin/icore.h>
-#include <valgrind/xmlprotocol/error.h>
#include <utils/qtcassert.h>
#include <QtCore/QSettings>
diff --git a/src/plugins/analyzerbase/analyzerstartparameters.h b/src/plugins/analyzerbase/analyzerstartparameters.h
index a867108c42..5265e7099f 100644
--- a/src/plugins/analyzerbase/analyzerstartparameters.h
+++ b/src/plugins/analyzerbase/analyzerstartparameters.h
@@ -50,19 +50,16 @@ class ANALYZER_EXPORT AnalyzerStartParameters
{
public:
AnalyzerStartParameters()
- : startMode(StartLocal)
- , connParams(Utils::SshConnectionParameters::NoProxy)
- { }
+ : connParams(Utils::SshConnectionParameters::NoProxy)
+ {}
- AnalyzerStartMode startMode;
+ StartMode startMode;
Utils::SshConnectionParameters connParams;
+ QByteArray toolId;
QString debuggee;
QString debuggeeArgs;
QString analyzerCmdPrefix;
- QString remoteMountPoint;
- QString localMountDir;
- QString remoteSourcesDir;
QString displayName;
Utils::Environment environment;
QString workingDirectory;
diff --git a/src/plugins/analyzerbase/analyzerutils.cpp b/src/plugins/analyzerbase/analyzerutils.cpp
index 532a3c559f..83107e8312 100644
--- a/src/plugins/analyzerbase/analyzerutils.cpp
+++ b/src/plugins/analyzerbase/analyzerutils.cpp
@@ -116,10 +116,3 @@ CPlusPlus::Symbol *AnalyzerUtils::findSymbolUnderCursor()
const CPlusPlus::LookupItem &lookupItem = lookupItems.first(); // ### TODO: select best candidate.
return lookupItem.declaration();
}
-
-QWidget *AnalyzerUtils::createDummyWidget()
-{
- QWidget *widget = new QWidget;
- widget->setProperty(Constants::ANALYZER_DUMMYWIDGET_ID, QVariant(true));
- return widget;
-}
diff --git a/src/plugins/analyzerbase/analyzerutils.h b/src/plugins/analyzerbase/analyzerutils.h
index cece97438f..61f6b8a98d 100644
--- a/src/plugins/analyzerbase/analyzerutils.h
+++ b/src/plugins/analyzerbase/analyzerutils.h
@@ -46,8 +46,6 @@ class Symbol;
namespace AnalyzerUtils
{
ANALYZER_EXPORT CPlusPlus::Symbol *findSymbolUnderCursor();
-
- ANALYZER_EXPORT QWidget *createDummyWidget();
}
#endif // ANALYZERUTILS_H
diff --git a/src/plugins/analyzerbase/ianalyzerengine.cpp b/src/plugins/analyzerbase/ianalyzerengine.cpp
index 1da091d93c..91da9d098f 100644
--- a/src/plugins/analyzerbase/ianalyzerengine.cpp
+++ b/src/plugins/analyzerbase/ianalyzerengine.cpp
@@ -36,21 +36,19 @@
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)
{
+ m_runConfig = runConfiguration;
+ m_sp = sp;
+ m_tool = tool;
}
-ProjectExplorer::RunConfiguration *IAnalyzerEngine::runConfiguration() const
+IAnalyzerEngine::IAnalyzerEngine(IAnalyzerTool *tool,
+ ProjectExplorer::RunConfiguration *runConfiguration)
{
- return m_runConfig;
-}
-
-AnalyzerStartParameters IAnalyzerEngine::startParameters() const
-{
- return m_sp;
+ m_runConfig = runConfiguration;
+ m_tool = tool;
}
} // namespace Analyzer
diff --git a/src/plugins/analyzerbase/ianalyzerengine.h b/src/plugins/analyzerbase/ianalyzerengine.h
index d8a9bd8895..29c2d0f0b8 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,47 @@ class ANALYZER_EXPORT IAnalyzerEngine : public QObject
Q_OBJECT
public:
- explicit IAnalyzerEngine(const AnalyzerStartParameters &sp,
+ IAnalyzerEngine(IAnalyzerTool *tool, const AnalyzerStartParameters &sp,
ProjectExplorer::RunConfiguration *runConfiguration = 0);
+ IAnalyzerEngine(IAnalyzerTool *tool,
+ ProjectExplorer::RunConfiguration *runConfiguration);
- /// 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() const { return m_tool; }
+ StartMode mode() const { return m_sp.startMode; }
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.cpp b/src/plugins/analyzerbase/ianalyzertool.cpp
index 600d18f844..f0dce04541 100644
--- a/src/plugins/analyzerbase/ianalyzertool.cpp
+++ b/src/plugins/analyzerbase/ianalyzertool.cpp
@@ -33,6 +33,7 @@
**************************************************************************/
#include "ianalyzertool.h"
+#include "analyzermanager.h"
namespace Analyzer {
@@ -40,26 +41,27 @@ IAnalyzerTool::IAnalyzerTool(QObject *parent)
: QObject(parent)
{}
-QString IAnalyzerTool::modeString(ToolMode mode)
+QByteArray IAnalyzerTool::defaultMenuGroup(StartMode mode)
{
- switch (mode) {
- case IAnalyzerTool::DebugMode:
- return tr("Debug");
- case IAnalyzerTool::ReleaseMode:
- return tr("Release");
- case IAnalyzerTool::AnyMode:
- break;
- }
- return QString();
+ if (mode == StartRemote)
+ return Analyzer::Constants::G_ANALYZER_REMOTE_TOOLS;
+ return Analyzer::Constants::G_ANALYZER_TOOLS;
}
-void IAnalyzerTool::initializeDockWidgets()
+QByteArray IAnalyzerTool::defaultActionId(const IAnalyzerTool *tool, StartMode mode)
{
+ QByteArray id = tool->id();
+ if (mode == StartRemote)
+ return "Action." + id + ".RemoteStart." + QByteArray::number(mode);
+ return "Action." + id + ".LocalStart." + QByteArray::number(mode);
}
-QWidget *IAnalyzerTool::createControlWidget()
+QString IAnalyzerTool::defaultActionName(const IAnalyzerTool *tool, StartMode mode)
{
- return 0;
+ QString base = tool->displayName();
+ if (mode == StartRemote)
+ return base + tr(" (Remote)");
+ return base;
}
} // namespace Analyzer
diff --git a/src/plugins/analyzerbase/ianalyzertool.h b/src/plugins/analyzerbase/ianalyzertool.h
index 0e77b82199..8b7e489ad8 100644
--- a/src/plugins/analyzerbase/ianalyzertool.h
+++ b/src/plugins/analyzerbase/ianalyzertool.h
@@ -36,6 +36,7 @@
#define IANALYZERTOOL_H
#include "analyzerbase_global.h"
+#include "analyzerconstants.h"
#include <QtCore/QObject>
@@ -49,8 +50,12 @@ class AnalyzerStartParameters;
class IAnalyzerOutputPaneAdapter;
class IAnalyzerEngine;
+
/**
* This class represents an analyzation tool, e.g. "Valgrind Memcheck".
+ *
+ * Each tool can run in different run modes. The modes are specific to the mode.
+ *
* @code
* bool YourPlugin::initialize(const QStringList &arguments, QString *errorString)
* {
@@ -67,16 +72,25 @@ 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 an id for the start action.
+ virtual QByteArray actionId(StartMode mode) const
+ { return defaultActionId(this, mode); }
+ /// Returns the menu group the start action should go to.
+ virtual QByteArray menuGroup(StartMode mode) const
+ { return defaultMenuGroup(mode); }
+ /// Returns a short user readable action name for this tool.
+ virtual QString actionName(StartMode mode) const
+ { return defaultActionName(this, mode); }
/**
* The mode in which this tool should preferably be run
*
- * The memcheckt tool, for example, requires debug symbols, hence DebugMode
+ * The memcheck tool, for example, requires debug symbols, hence DebugMode
* is preferred. On the other hand, callgrind should look at optimized code,
* hence ReleaseMode.
*/
@@ -85,38 +99,27 @@ public:
ReleaseMode,
AnyMode
};
- virtual ToolMode mode() const = 0;
+ virtual ToolMode toolMode() const = 0;
- static QString modeString(ToolMode mode);
+ /// Convenience implementation.
+ static QByteArray defaultMenuGroup(StartMode mode);
+ static QByteArray defaultActionId(const IAnalyzerTool *tool, StartMode mode);
+ static QString defaultActionName(const IAnalyzerTool *tool, StartMode 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;
- /**
- * This is called to add all dock widgets if tool becomes active first time.
- * \sa AnalzyerManager::createDockWidget
- */
- virtual void initializeDockWidgets();
-
- /// Returns a control widget which will be shown
- /// in the output pane when this tool is selected.
- virtual QWidget *createControlWidget();
+ /// Creates all widgets used by the tool.
+ /// Returns a control widget which will be shown in the status bar when
+ /// this tool is selected. Must be non-zero.
+ virtual QWidget *createWidgets() = 0;
/// Returns a new engine for the given start parameters.
/// Called each time the tool is launched.
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;
+ virtual void startTool(StartMode mode) = 0;
/// Called when tools gets selected.
virtual void toolSelected() const {}
diff --git a/src/plugins/analyzerbase/startremotedialog.cpp b/src/plugins/analyzerbase/startremotedialog.cpp
index cfb2859576..2fdec91bea 100644
--- a/src/plugins/analyzerbase/startremotedialog.cpp
+++ b/src/plugins/analyzerbase/startremotedialog.cpp
@@ -40,8 +40,8 @@
namespace Analyzer {
-StartRemoteDialog::StartRemoteDialog(QWidget *parent, Qt::WindowFlags f)
- : QDialog(parent, f)
+StartRemoteDialog::StartRemoteDialog(QWidget *parent)
+ : QDialog(parent)
, m_ui(new Ui::StartRemoteDialog)
{
m_ui->setupUi(this);
diff --git a/src/plugins/analyzerbase/startremotedialog.h b/src/plugins/analyzerbase/startremotedialog.h
index 24f32b775f..258d45554f 100644
--- a/src/plugins/analyzerbase/startremotedialog.h
+++ b/src/plugins/analyzerbase/startremotedialog.h
@@ -33,12 +33,11 @@
#ifndef STARTREMOTEDIALOG_H
#define STARTREMOTEDIALOG_H
-#include <QtGui/QDialog>
+#include "analyzerbase_global.h"
#include <utils/ssh/sshconnection.h>
-QT_BEGIN_NAMESPACE
-QT_END_NAMESPACE
+#include <QtGui/QDialog>
namespace Analyzer {
@@ -46,11 +45,12 @@ namespace Ui {
class StartRemoteDialog;
}
-class StartRemoteDialog : public QDialog {
+class ANALYZER_EXPORT StartRemoteDialog : public QDialog
+{
Q_OBJECT
public:
- explicit StartRemoteDialog(QWidget *parent = 0, Qt::WindowFlags f = 0);
+ explicit StartRemoteDialog(QWidget *parent = 0);
virtual ~StartRemoteDialog();
Utils::SshConnectionParameters sshParams() const;
@@ -66,6 +66,6 @@ private:
Ui::StartRemoteDialog *m_ui;
};
-}
+} // namespace Analyzer
#endif // STARTREMOTEDIALOG_H