ProjectExplorer/Analyzer: Merge RunConfigurationAspects

The Analyzer implementation is now simple and still generic enough
to serve as general base.

Change-Id: I050a21919bf128929b77a64da1f46d157691d849
Reviewed-by: Daniel Teske <daniel.teske@digia.com>
This commit is contained in:
hjk
2013-08-12 17:04:10 +02:00
parent 02105ddf62
commit 20d7d5e5b7
28 changed files with 236 additions and 380 deletions

View File

@@ -11,7 +11,6 @@ SOURCES += \
analyzerplugin.cpp \ analyzerplugin.cpp \
analyzerruncontrol.cpp \ analyzerruncontrol.cpp \
analyzermanager.cpp \ analyzermanager.cpp \
analyzersettings.cpp \
analyzerrunconfigwidget.cpp \ analyzerrunconfigwidget.cpp \
analyzerutils.cpp \ analyzerutils.cpp \
startremotedialog.cpp startremotedialog.cpp
@@ -23,7 +22,6 @@ HEADERS += \
analyzerplugin.h \ analyzerplugin.h \
analyzerruncontrol.h \ analyzerruncontrol.h \
analyzermanager.h \ analyzermanager.h \
analyzersettings.h \
analyzerstartparameters.h \ analyzerstartparameters.h \
analyzerrunconfigwidget.h \ analyzerrunconfigwidget.h \
analyzerutils.h \ analyzerutils.h \

View File

@@ -24,8 +24,6 @@ QtcPlugin {
"analyzerrunconfigwidget.h", "analyzerrunconfigwidget.h",
"analyzerruncontrol.cpp", "analyzerruncontrol.cpp",
"analyzerruncontrol.h", "analyzerruncontrol.h",
"analyzersettings.cpp",
"analyzersettings.h",
"analyzerstartparameters.h", "analyzerstartparameters.h",
"analyzerutils.cpp", "analyzerutils.cpp",
"analyzerutils.h", "analyzerutils.h",

View File

@@ -32,7 +32,6 @@
#include "analyzerplugin.h" #include "analyzerplugin.h"
#include "ianalyzertool.h" #include "ianalyzertool.h"
#include "analyzersettings.h"
#include <coreplugin/coreconstants.h> #include <coreplugin/coreconstants.h>
#include <coreplugin/findplaceholder.h> #include <coreplugin/findplaceholder.h>

View File

@@ -41,9 +41,8 @@
#include <QPushButton> #include <QPushButton>
namespace Analyzer { namespace Analyzer {
namespace Internal {
AnalyzerRunConfigWidget::AnalyzerRunConfigWidget(AnalyzerRunConfigurationAspect *aspect) AnalyzerRunConfigWidget::AnalyzerRunConfigWidget(ProjectExplorer::IRunConfigurationAspect *aspect)
{ {
m_aspect = aspect; m_aspect = aspect;
m_config = aspect->projectSettings(); m_config = aspect->projectSettings();
@@ -106,8 +105,7 @@ void AnalyzerRunConfigWidget::chooseSettings(int setting)
void AnalyzerRunConfigWidget::restoreGlobal() void AnalyzerRunConfigWidget::restoreGlobal()
{ {
QTC_ASSERT(m_aspect, return); QTC_ASSERT(m_aspect, return);
m_aspect->resetCustomToGlobalSettings(); m_aspect->resetProjectToGlobalSettings();
} }
} // namespace Internal
} // namespace Analyzer } // namespace Analyzer

View File

@@ -28,10 +28,12 @@
** **
****************************************************************************/ ****************************************************************************/
#ifndef ANALYZER_INTERNAL_ANALYZERRUNCONFIGWIDGET_H #ifndef ANALYZERRUNCONFIGWIDGET_H
#define ANALYZER_INTERNAL_ANALYZERRUNCONFIGWIDGET_H #define ANALYZERRUNCONFIGWIDGET_H
#include "analyzersettings.h" #include "analyzerbase_global.h"
#include <projectexplorer/runconfiguration.h>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QComboBox; class QComboBox;
@@ -41,14 +43,13 @@ QT_END_NAMESPACE
namespace Utils { class DetailsWidget; } namespace Utils { class DetailsWidget; }
namespace Analyzer { namespace Analyzer {
namespace Internal {
class AnalyzerRunConfigWidget : public ProjectExplorer::RunConfigWidget class ANALYZER_EXPORT AnalyzerRunConfigWidget : public ProjectExplorer::RunConfigWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
AnalyzerRunConfigWidget(AnalyzerRunConfigurationAspect *aspect); AnalyzerRunConfigWidget(ProjectExplorer::IRunConfigurationAspect *aspect);
QString displayName() const; QString displayName() const;
@@ -58,14 +59,13 @@ private slots:
private: private:
QWidget *m_configWidget; QWidget *m_configWidget;
AnalyzerRunConfigurationAspect *m_aspect; ProjectExplorer::IRunConfigurationAspect *m_aspect;
ISettingsAspect *m_config; ProjectExplorer::ISettingsAspect *m_config;
QComboBox *m_settingsCombo; QComboBox *m_settingsCombo;
QPushButton *m_restoreButton; QPushButton *m_restoreButton;
Utils::DetailsWidget *m_details; Utils::DetailsWidget *m_details;
}; };
} // namespace Internal
} // namespace Analyzer } // namespace Analyzer
#endif // ANALYZER_INTERNAL_ANALYZERRUNCONFIGWIDGET_H #endif // ANALYZERRUNCONFIGWIDGET_H

View File

@@ -1,117 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
** Author: Milian Wolff, KDAB (milian.wolff@kdab.com)
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia. For licensing terms and
** conditions see http://qt.digia.com/licensing. For further information
** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, 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, Digia gives you certain additional
** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
****************************************************************************/
#include "analyzersettings.h"
#include "analyzermanager.h"
#include "analyzerrunconfigwidget.h"
#include "ianalyzertool.h"
#include "analyzerplugin.h"
#include <coreplugin/icore.h>
#include <utils/qtcassert.h>
#include <QSettings>
using namespace Analyzer::Internal;
static const char useGlobalC[] = "Analyzer.Project.UseGlobal";
namespace Analyzer {
ISettingsAspect *ISettingsAspect::clone() const
{
ISettingsAspect *other = create();
QVariantMap data;
toMap(data);
other->fromMap(data);
return other;
}
AnalyzerRunConfigurationAspect::AnalyzerRunConfigurationAspect(ISettingsAspect *projectSettings,
ISettingsAspect *globalSettings)
{
m_useGlobalSettings = true;
m_projectSettings = projectSettings;
m_globalSettings = globalSettings;
}
ISettingsAspect *AnalyzerRunConfigurationAspect::currentSettings() const
{
return m_useGlobalSettings ? m_globalSettings : m_projectSettings;
}
AnalyzerRunConfigurationAspect::~AnalyzerRunConfigurationAspect()
{
delete m_projectSettings;
}
void AnalyzerRunConfigurationAspect::fromMap(const QVariantMap &map)
{
m_projectSettings->fromMap(map);
m_useGlobalSettings = map.value(QLatin1String(useGlobalC), true).toBool();
}
void AnalyzerRunConfigurationAspect::toMap(QVariantMap &map) const
{
m_projectSettings->toMap(map);
map.insert(QLatin1String(useGlobalC), m_useGlobalSettings);
}
AnalyzerRunConfigurationAspect *AnalyzerRunConfigurationAspect::clone(
ProjectExplorer::RunConfiguration *parent) const
{
Q_UNUSED(parent)
AnalyzerRunConfigurationAspect *other
= new AnalyzerRunConfigurationAspect(m_projectSettings->clone(), m_globalSettings);
other->m_useGlobalSettings = m_useGlobalSettings;
return other;
}
void AnalyzerRunConfigurationAspect::setUsingGlobalSettings(bool value)
{
m_useGlobalSettings = value;
}
void AnalyzerRunConfigurationAspect::resetCustomToGlobalSettings()
{
ISettingsAspect *global = globalSettings();
QTC_ASSERT(global, return);
QVariantMap map;
global->toMap(map);
m_projectSettings->fromMap(map);
}
ProjectExplorer::RunConfigWidget *AnalyzerRunConfigurationAspect::createConfigurationWidget()
{
return new AnalyzerRunConfigWidget(this);
}
} // namespace Analyzer

View File

@@ -1,107 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
** Author: Milian Wolff, KDAB (milian.wolff@kdab.com)
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia. For licensing terms and
** conditions see http://qt.digia.com/licensing. For further information
** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, 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, Digia gives you certain additional
** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
****************************************************************************/
#ifndef ANALYZER_INTERNAL_ANALYZERSETTINGS_H
#define ANALYZER_INTERNAL_ANALYZERSETTINGS_H
#include <QObject>
#include "analyzerbase_global.h"
#include <projectexplorer/runconfiguration.h>
namespace Analyzer {
/**
* Subclass this to add configuration to your analyzer tool.
*
* If global and project-specific settings differ for your tool,
* create one subclass for each.
*/
class ANALYZER_EXPORT ISettingsAspect : public QObject
{
Q_OBJECT
public:
ISettingsAspect() {}
/// Converts current object into map for storage.
virtual void toMap(QVariantMap &map) const = 0;
/// Read object state from @p map.
virtual void fromMap(const QVariantMap &map) = 0;
/// Create a configuration widget for this settings aspect.
virtual QWidget *createConfigWidget(QWidget *parent) = 0;
/// "Virtual default constructor"
virtual ISettingsAspect *create() const = 0;
/// "Virtual copy constructor"
ISettingsAspect *clone() const;
};
/**
* Settings associated with a single project/run configuration
*
*/
class ANALYZER_EXPORT AnalyzerRunConfigurationAspect
: public ProjectExplorer::IRunConfigurationAspect
{
Q_OBJECT
public:
AnalyzerRunConfigurationAspect(ISettingsAspect *projectSettings,
ISettingsAspect *globalSettings);
~AnalyzerRunConfigurationAspect();
AnalyzerRunConfigurationAspect *clone(ProjectExplorer::RunConfiguration *parent) const;
bool isUsingGlobalSettings() const { return m_useGlobalSettings; }
void setUsingGlobalSettings(bool value);
void resetCustomToGlobalSettings();
ISettingsAspect *projectSettings() const { return m_projectSettings; }
ISettingsAspect *globalSettings() const { return m_globalSettings; }
ISettingsAspect *currentSettings() const;
ProjectExplorer::RunConfigWidget *createConfigurationWidget();
protected:
void fromMap(const QVariantMap &map);
void toMap(QVariantMap &map) const;
private:
bool m_useGlobalSettings;
ISettingsAspect *m_projectSettings;
ISettingsAspect *m_globalSettings;
};
} // namespace Analyzer
#endif // ANALYZER_INTERNAL_ANALYZERSETTINGS_H

View File

@@ -204,14 +204,14 @@ void DebuggerMainWindowPrivate::updateUiForRunConfiguration(RunConfiguration *rc
{ {
if (m_previousRunConfiguration) if (m_previousRunConfiguration)
disconnect(m_previousRunConfiguration->extraAspect<Debugger::DebuggerRunConfigurationAspect>(), disconnect(m_previousRunConfiguration->extraAspect<Debugger::DebuggerRunConfigurationAspect>(),
SIGNAL(debuggersChanged()), SIGNAL(requestRunActionsUpdate()),
this, SLOT(updateUiForCurrentRunConfiguration())); this, SLOT(updateUiForCurrentRunConfiguration()));
m_previousRunConfiguration = rc; m_previousRunConfiguration = rc;
updateUiForCurrentRunConfiguration(); updateUiForCurrentRunConfiguration();
if (!rc) if (!rc)
return; return;
connect(m_previousRunConfiguration->extraAspect<Debugger::DebuggerRunConfigurationAspect>(), connect(m_previousRunConfiguration->extraAspect<Debugger::DebuggerRunConfigurationAspect>(),
SIGNAL(debuggersChanged()), SIGNAL(requestRunActionsUpdate()),
SLOT(updateUiForCurrentRunConfiguration())); SLOT(updateUiForCurrentRunConfiguration()));
} }

View File

@@ -194,48 +194,32 @@ void DebuggerRunConfigWidget::useMultiProcessToggled(bool on)
DebuggerRunConfigurationAspect::DebuggerRunConfigurationAspect( DebuggerRunConfigurationAspect::DebuggerRunConfigurationAspect(
ProjectExplorer::RunConfiguration *rc) : ProjectExplorer::RunConfiguration *rc) :
m_runConfiguration(rc), IRunConfigurationAspect(rc),
m_useCppDebugger(AutoEnabledLanguage), m_useCppDebugger(AutoEnabledLanguage),
m_useQmlDebugger(AutoEnabledLanguage), m_useQmlDebugger(AutoEnabledLanguage),
m_qmlDebugServerPort(Constants::QML_DEFAULT_DEBUG_SERVER_PORT), m_qmlDebugServerPort(Constants::QML_DEFAULT_DEBUG_SERVER_PORT),
m_useMultiProcess(false) m_useMultiProcess(false)
{ {
ctor(); setId("DebuggerAspect");
} setDisplayName(tr("Debugger settings"));
DebuggerRunConfigurationAspect::DebuggerRunConfigurationAspect(
ProjectExplorer::RunConfiguration *runConfiguration,
const DebuggerRunConfigurationAspect *other)
: m_runConfiguration(runConfiguration),
m_useCppDebugger(other->m_useCppDebugger),
m_useQmlDebugger(other->m_useQmlDebugger),
m_qmlDebugServerPort(other->m_qmlDebugServerPort),
m_useMultiProcess(other->m_useMultiProcess)
{
ctor();
}
ProjectExplorer::RunConfiguration *DebuggerRunConfigurationAspect::runConfiguration()
{
return m_runConfiguration;
} }
void DebuggerRunConfigurationAspect::setUseQmlDebugger(bool value) void DebuggerRunConfigurationAspect::setUseQmlDebugger(bool value)
{ {
m_useQmlDebugger = value ? EnabledLanguage : DisabledLanguage; m_useQmlDebugger = value ? EnabledLanguage : DisabledLanguage;
emit debuggersChanged(); emit requestRunActionsUpdate();
} }
void DebuggerRunConfigurationAspect::setUseCppDebugger(bool value) void DebuggerRunConfigurationAspect::setUseCppDebugger(bool value)
{ {
m_useCppDebugger = value ? EnabledLanguage : DisabledLanguage; m_useCppDebugger = value ? EnabledLanguage : DisabledLanguage;
emit debuggersChanged(); emit requestRunActionsUpdate();
} }
bool DebuggerRunConfigurationAspect::useCppDebugger() const bool DebuggerRunConfigurationAspect::useCppDebugger() const
{ {
if (m_useCppDebugger == DebuggerRunConfigurationAspect::AutoEnabledLanguage) if (m_useCppDebugger == DebuggerRunConfigurationAspect::AutoEnabledLanguage)
return m_runConfiguration->target()->project()->projectLanguages().contains( return runConfiguration()->target()->project()->projectLanguages().contains(
ProjectExplorer::Constants::LANG_CXX); ProjectExplorer::Constants::LANG_CXX);
return m_useCppDebugger == DebuggerRunConfigurationAspect::EnabledLanguage; return m_useCppDebugger == DebuggerRunConfigurationAspect::EnabledLanguage;
} }
@@ -243,7 +227,7 @@ bool DebuggerRunConfigurationAspect::useCppDebugger() const
bool DebuggerRunConfigurationAspect::useQmlDebugger() const bool DebuggerRunConfigurationAspect::useQmlDebugger() const
{ {
if (m_useQmlDebugger == DebuggerRunConfigurationAspect::AutoEnabledLanguage) if (m_useQmlDebugger == DebuggerRunConfigurationAspect::AutoEnabledLanguage)
return m_runConfiguration->target()->project()->projectLanguages().contains( return runConfiguration()->target()->project()->projectLanguages().contains(
ProjectExplorer::Constants::LANG_QMLJS); ProjectExplorer::Constants::LANG_QMLJS);
return m_useQmlDebugger == DebuggerRunConfigurationAspect::EnabledLanguage; return m_useQmlDebugger == DebuggerRunConfigurationAspect::EnabledLanguage;
} }
@@ -270,7 +254,7 @@ void DebuggerRunConfigurationAspect::setUseMultiProcess(bool value)
bool DebuggerRunConfigurationAspect::isQmlDebuggingSpinboxSuppressed() const bool DebuggerRunConfigurationAspect::isQmlDebuggingSpinboxSuppressed() const
{ {
ProjectExplorer::Kit *k = m_runConfiguration->target()->kit(); ProjectExplorer::Kit *k = runConfiguration()->target()->kit();
ProjectExplorer::IDevice::ConstPtr dev = ProjectExplorer::DeviceKitInformation::device(k); ProjectExplorer::IDevice::ConstPtr dev = ProjectExplorer::DeviceKitInformation::device(k);
if (dev.isNull()) if (dev.isNull())
return false; return false;
@@ -304,10 +288,10 @@ void DebuggerRunConfigurationAspect::fromMap(const QVariantMap &map)
m_useMultiProcess = map.value(QLatin1String(USE_MULTIPROCESS_KEY), false).toBool(); m_useMultiProcess = map.value(QLatin1String(USE_MULTIPROCESS_KEY), false).toBool();
} }
DebuggerRunConfigurationAspect *DebuggerRunConfigurationAspect::clone( DebuggerRunConfigurationAspect *DebuggerRunConfigurationAspect::create
ProjectExplorer::RunConfiguration *parent) const (ProjectExplorer::RunConfiguration *runConfiguration) const
{ {
return new DebuggerRunConfigurationAspect(parent, this); return new DebuggerRunConfigurationAspect(runConfiguration);
} }
ProjectExplorer::RunConfigWidget *DebuggerRunConfigurationAspect::createConfigurationWidget() ProjectExplorer::RunConfigWidget *DebuggerRunConfigurationAspect::createConfigurationWidget()
@@ -315,15 +299,6 @@ ProjectExplorer::RunConfigWidget *DebuggerRunConfigurationAspect::createConfigur
return new Internal::DebuggerRunConfigWidget(this); return new Internal::DebuggerRunConfigWidget(this);
} }
void DebuggerRunConfigurationAspect::ctor()
{
setId("DebuggerAspect");
setDisplayName(tr("Debugger settings"));
connect(this, SIGNAL(debuggersChanged()),
m_runConfiguration, SIGNAL(requestRunActionsUpdate()));
}
} // namespace Debugger } // namespace Debugger

View File

@@ -45,8 +45,7 @@ class DEBUGGER_EXPORT DebuggerRunConfigurationAspect
public: public:
DebuggerRunConfigurationAspect(ProjectExplorer::RunConfiguration *runConfiguration); DebuggerRunConfigurationAspect(ProjectExplorer::RunConfiguration *runConfiguration);
DebuggerRunConfigurationAspect(ProjectExplorer::RunConfiguration *runConfiguration, DebuggerRunConfigurationAspect *create(ProjectExplorer::RunConfiguration *runConfiguration) const;
const DebuggerRunConfigurationAspect *other);
enum DebuggerLanguageStatus { enum DebuggerLanguageStatus {
DisabledLanguage = 0, DisabledLanguage = 0,
@@ -57,7 +56,6 @@ public:
void fromMap(const QVariantMap &map); void fromMap(const QVariantMap &map);
void toMap(QVariantMap &map) const; void toMap(QVariantMap &map) const;
DebuggerRunConfigurationAspect *clone(ProjectExplorer::RunConfiguration *parent) const;
ProjectExplorer::RunConfigWidget *createConfigurationWidget(); ProjectExplorer::RunConfigWidget *createConfigurationWidget();
bool useCppDebugger() const; bool useCppDebugger() const;
@@ -69,15 +67,8 @@ public:
bool useMultiProcess() const; bool useMultiProcess() const;
void setUseMultiProcess(bool on); void setUseMultiProcess(bool on);
bool isQmlDebuggingSpinboxSuppressed() const; bool isQmlDebuggingSpinboxSuppressed() const;
ProjectExplorer::RunConfiguration *runConfiguration();
signals:
void debuggersChanged();
private: private:
void ctor();
ProjectExplorer::RunConfiguration *m_runConfiguration;
DebuggerLanguageStatus m_useCppDebugger; DebuggerLanguageStatus m_useCppDebugger;
DebuggerLanguageStatus m_useQmlDebugger; DebuggerLanguageStatus m_useQmlDebugger;
uint m_qmlDebugServerPort; uint m_qmlDebugServerPort;

View File

@@ -43,21 +43,13 @@ namespace ProjectExplorer {
// EnvironmentAspect: // EnvironmentAspect:
// -------------------------------------------------------------------- // --------------------------------------------------------------------
EnvironmentAspect::EnvironmentAspect(RunConfiguration *rc) : EnvironmentAspect::EnvironmentAspect(RunConfiguration *runConfig)
m_base(-1), : IRunConfigurationAspect(runConfig), m_base(-1)
m_runConfiguration(rc)
{ {
QTC_CHECK(m_runConfiguration);
setDisplayName(tr("Run Environment")); setDisplayName(tr("Run Environment"));
setId("EnvironmentAspect"); setId("EnvironmentAspect");
} }
EnvironmentAspect::EnvironmentAspect(const EnvironmentAspect *other, RunConfiguration *parent) :
m_base(other->m_base),
m_changes(other->m_changes),
m_runConfiguration(parent)
{ }
RunConfigWidget *EnvironmentAspect::createConfigurationWidget() RunConfigWidget *EnvironmentAspect::createConfigurationWidget()
{ {
return new EnvironmentAspectWidget(this); return new EnvironmentAspectWidget(this);

View File

@@ -49,8 +49,6 @@ public:
// IRunConfigurationAspect: // IRunConfigurationAspect:
RunConfigWidget *createConfigurationWidget(); RunConfigWidget *createConfigurationWidget();
virtual RunConfiguration *runConfiguration() const { return m_runConfiguration; }
virtual QList<int> possibleBaseEnvironments() const = 0; virtual QList<int> possibleBaseEnvironments() const = 0;
virtual QString baseEnvironmentDisplayName(int base) const = 0; virtual QString baseEnvironmentDisplayName(int base) const = 0;
@@ -69,15 +67,13 @@ signals:
void environmentChanged(); void environmentChanged();
protected: protected:
EnvironmentAspect(const EnvironmentAspect *other, RunConfiguration *parent); explicit EnvironmentAspect(RunConfiguration *rc);
EnvironmentAspect(RunConfiguration *rc);
void fromMap(const QVariantMap &map); void fromMap(const QVariantMap &map);
void toMap(QVariantMap &map) const; void toMap(QVariantMap &map) const;
private: private:
mutable int m_base; mutable int m_base;
QList<Utils::EnvironmentItem> m_changes; QList<Utils::EnvironmentItem> m_changes;
RunConfiguration *m_runConfiguration;
}; };
} // namespace ProjectExplorer } // namespace ProjectExplorer

View File

@@ -88,22 +88,16 @@ void LocalEnvironmentAspect::buildEnvironmentHasChanged()
emit environmentChanged(); emit environmentChanged();
} }
LocalEnvironmentAspect::LocalEnvironmentAspect(RunConfiguration *rc) : LocalEnvironmentAspect::LocalEnvironmentAspect(RunConfiguration *parent) :
EnvironmentAspect(rc) EnvironmentAspect(parent)
{ {
connect(rc->target(), SIGNAL(environmentChanged()), connect(parent->target(), SIGNAL(environmentChanged()),
this, SLOT(buildEnvironmentHasChanged())); this, SLOT(buildEnvironmentHasChanged()));
} }
LocalEnvironmentAspect::LocalEnvironmentAspect(const LocalEnvironmentAspect *other, LocalEnvironmentAspect *LocalEnvironmentAspect::create(RunConfiguration *parent) const
ProjectExplorer::RunConfiguration *parent) :
EnvironmentAspect(other, parent)
{ }
LocalEnvironmentAspect *LocalEnvironmentAspect::clone(RunConfiguration *parent) const
{ {
Q_UNUSED(parent); return new LocalEnvironmentAspect(parent);
return new LocalEnvironmentAspect(this, parent);
} }
} // namespace ProjectExplorer } // namespace ProjectExplorer

View File

@@ -39,9 +39,8 @@ class PROJECTEXPLORER_EXPORT LocalEnvironmentAspect : public EnvironmentAspect
Q_OBJECT Q_OBJECT
public: public:
LocalEnvironmentAspect(RunConfiguration *rc); LocalEnvironmentAspect(RunConfiguration *parent);
LocalEnvironmentAspect *create(RunConfiguration *parent) const;
LocalEnvironmentAspect *clone(RunConfiguration *parent) const;
QList<int> possibleBaseEnvironments() const; QList<int> possibleBaseEnvironments() const;
QString baseEnvironmentDisplayName(int base) const; QString baseEnvironmentDisplayName(int base) const;
@@ -56,8 +55,6 @@ private:
SystemEnvironmentBase, SystemEnvironmentBase,
BuildEnvironmentBase BuildEnvironmentBase
}; };
LocalEnvironmentAspect(const LocalEnvironmentAspect *other, RunConfiguration *parent);
}; };
} // namespace ProjectExplorer } // namespace ProjectExplorer

View File

@@ -103,15 +103,99 @@ bool ProcessHandle::equals(const ProcessHandle &rhs) const
return m_pid == rhs.m_pid; return m_pid == rhs.m_pid;
} }
///////////////////////////////////////////////////////////////////////
//
// ISettingsAspect
//
///////////////////////////////////////////////////////////////////////
ISettingsAspect *ISettingsAspect::clone() const
{
ISettingsAspect *other = create();
QVariantMap data;
toMap(data);
other->fromMap(data);
return other;
}
///////////////////////////////////////////////////////////////////////
//
// IRunConfigurationAspect
//
///////////////////////////////////////////////////////////////////////
IRunConfigurationAspect::IRunConfigurationAspect(RunConfiguration *parent)
{
m_runConfiguration = parent;
m_projectSettings = 0;
m_globalSettings = 0;
m_useGlobalSettings = false;
connect(this, SIGNAL(requestRunActionsUpdate()), parent, SIGNAL(requestRunActionsUpdate()));
}
IRunConfigurationAspect::~IRunConfigurationAspect()
{
delete m_projectSettings;
}
/*! /*!
\brief Returns the widget used to configure this run configuration. Ownership is transferred to the caller \brief Returns the widget used to configure this run configuration. Ownership is transferred to the caller
*/ */
RunConfigWidget *IRunConfigurationAspect::createConfigurationWidget() RunConfigWidget *IRunConfigurationAspect::createConfigurationWidget()
{ {
return 0; return 0;
} }
void IRunConfigurationAspect::setProjectSettings(ISettingsAspect *settings)
{
m_projectSettings = settings;
}
void IRunConfigurationAspect::setGlobalSettings(ISettingsAspect *settings)
{
m_globalSettings = settings;
}
void IRunConfigurationAspect::setUsingGlobalSettings(bool value)
{
m_useGlobalSettings = value;
}
ISettingsAspect *IRunConfigurationAspect::currentSettings() const
{
return m_useGlobalSettings ? m_globalSettings : m_projectSettings;
}
void IRunConfigurationAspect::fromMap(const QVariantMap &map)
{
m_projectSettings->fromMap(map);
m_useGlobalSettings = map.value(m_id.toString() + QLatin1String(".UseGlobalSettings"), true).toBool();
}
void IRunConfigurationAspect::toMap(QVariantMap &map) const
{
m_projectSettings->toMap(map);
map.insert(m_id.toString() + QLatin1String(".UseGlobalSettings"), m_useGlobalSettings);
}
IRunConfigurationAspect *IRunConfigurationAspect::clone(RunConfiguration *parent) const
{
IRunConfigurationAspect *other = create(parent);
other->m_projectSettings = m_projectSettings->clone();
other->m_globalSettings = m_globalSettings;
other->m_useGlobalSettings = m_useGlobalSettings;
return other;
}
void IRunConfigurationAspect::resetProjectToGlobalSettings()
{
QTC_ASSERT(m_globalSettings, return);
QVariantMap map;
m_globalSettings->toMap(map);
m_projectSettings->fromMap(map);
}
/*! /*!
\class ProjectExplorer::RunConfiguration \class ProjectExplorer::RunConfiguration
@@ -272,6 +356,14 @@ QList<IRunConfigurationAspect *> RunConfiguration::extraAspects() const
QTC_ASSERT(m_aspectsInitialized, return QList<IRunConfigurationAspect *>()); QTC_ASSERT(m_aspectsInitialized, return QList<IRunConfigurationAspect *>());
return m_aspects; return m_aspects;
} }
IRunConfigurationAspect *RunConfiguration::extraAspect(Core::Id id) const
{
QTC_ASSERT(m_aspectsInitialized, return 0);
foreach (IRunConfigurationAspect *aspect, m_aspects)
if (aspect->id() == id)
return aspect;
return 0;
}
Utils::OutputFormatter *RunConfiguration::createOutputFormatter() const Utils::OutputFormatter *RunConfiguration::createOutputFormatter() const
{ {

View File

@@ -47,6 +47,7 @@ namespace Utils { class OutputFormatter; }
namespace ProjectExplorer { namespace ProjectExplorer {
class Abi; class Abi;
class BuildConfiguration; class BuildConfiguration;
class IRunConfigurationAspect;
class RunConfiguration; class RunConfiguration;
class RunConfigWidget; class RunConfigWidget;
class RunControl; class RunControl;
@@ -72,29 +73,85 @@ private:
inline bool operator==(const ProcessHandle &p1, const ProcessHandle &p2) { return p1.equals(p2); } inline bool operator==(const ProcessHandle &p1, const ProcessHandle &p2) { return p1.equals(p2); }
inline bool operator!=(const ProcessHandle &p1, const ProcessHandle &p2) { return !p1.equals(p2); } inline bool operator!=(const ProcessHandle &p1, const ProcessHandle &p2) { return !p1.equals(p2); }
/**
* An interface for a hunk of global or per-project
* configuration data.
*
*/
class PROJECTEXPLORER_EXPORT ISettingsAspect : public QObject
{
Q_OBJECT
public:
ISettingsAspect() {}
/// Create a configuration widget for this settings aspect.
virtual QWidget *createConfigWidget(QWidget *parent) = 0;
/// "Virtual default constructor"
virtual ISettingsAspect *create() const = 0;
/// "Virtual copy constructor"
ISettingsAspect *clone() const;
protected:
///
friend class IRunConfigurationAspect;
/// Converts current object into map for storage.
virtual void toMap(QVariantMap &map) const = 0;
/// Read object state from @p map.
virtual void fromMap(const QVariantMap &map) = 0;
};
/**
* An interface to facilitate switching between hunks of
* global and per-project configuration data.
*
*/
class PROJECTEXPLORER_EXPORT IRunConfigurationAspect : public QObject class PROJECTEXPLORER_EXPORT IRunConfigurationAspect : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
virtual ~IRunConfigurationAspect() {} explicit IRunConfigurationAspect(RunConfiguration *parent);
virtual IRunConfigurationAspect *clone(RunConfiguration *parent) const = 0; ~IRunConfigurationAspect();
virtual IRunConfigurationAspect *create(RunConfiguration *parent) const = 0;
virtual IRunConfigurationAspect *clone(RunConfiguration *parent) const;
virtual RunConfigWidget *createConfigurationWidget(); virtual RunConfigWidget *createConfigurationWidget();
QString displayName() const { return m_displayName; }
void setDisplayName(const QString &displayName) { m_displayName = displayName; }
void setId(Core::Id id) { m_id = id; } void setId(Core::Id id) { m_id = id; }
void setDisplayName(const QString &displayName) { m_displayName = displayName; }
void setProjectSettings(ISettingsAspect *settings);
void setGlobalSettings(ISettingsAspect *settings);
QString displayName() const { return m_displayName; }
Core::Id id() const { return m_id; } Core::Id id() const { return m_id; }
bool isUsingGlobalSettings() const { return m_useGlobalSettings; }
void setUsingGlobalSettings(bool value);
void resetProjectToGlobalSettings();
ISettingsAspect *projectSettings() const { return m_projectSettings; }
ISettingsAspect *globalSettings() const { return m_globalSettings; }
ISettingsAspect *currentSettings() const;
RunConfiguration *runConfiguration() const { return m_runConfiguration; }
signals:
void requestRunActionsUpdate();
protected: protected:
friend class RunConfiguration; friend class RunConfiguration;
virtual void fromMap(const QVariantMap &map) = 0; virtual void fromMap(const QVariantMap &map);
virtual void toMap(QVariantMap &data) const = 0; virtual void toMap(QVariantMap &data) const;
private: private:
QString m_displayName;
Core::Id m_id; Core::Id m_id;
QString m_displayName;
bool m_useGlobalSettings;
RunConfiguration *m_runConfiguration;
ISettingsAspect *m_projectSettings; // Owned if present.
ISettingsAspect *m_globalSettings; // Not owned.
}; };
// Documentation inside. // Documentation inside.
@@ -120,6 +177,7 @@ public:
QVariantMap toMap() const; QVariantMap toMap() const;
QList<IRunConfigurationAspect *> extraAspects() const; QList<IRunConfigurationAspect *> extraAspects() const;
IRunConfigurationAspect *extraAspect(Core::Id id) const;
template <typename T> T *extraAspect() const template <typename T> T *extraAspect() const
{ {
@@ -130,15 +188,6 @@ public:
return 0; return 0;
} }
template <typename T> T *extraAspect(Core::Id id) const
{
QTC_ASSERT(m_aspectsInitialized, return 0);
foreach (IRunConfigurationAspect *aspect, m_aspects)
if (aspect->id() == id)
return qobject_cast<T *>(aspect);
return 0;
}
virtual ProjectExplorer::Abi abi() const; virtual ProjectExplorer::Abi abi() const;
void addExtraAspects(); void addExtraAspects();

View File

@@ -35,7 +35,6 @@
#include <analyzerbase/analyzermanager.h> #include <analyzerbase/analyzermanager.h>
#include <analyzerbase/analyzerstartparameters.h> #include <analyzerbase/analyzerstartparameters.h>
#include <analyzerbase/analyzerruncontrol.h> #include <analyzerbase/analyzerruncontrol.h>
#include <analyzerbase/analyzersettings.h>
#include <debugger/debuggerrunconfigurationaspect.h> #include <debugger/debuggerrunconfigurationaspect.h>

View File

@@ -58,14 +58,9 @@ QmlProjectEnvironmentAspect::QmlProjectEnvironmentAspect(ProjectExplorer::RunCon
ProjectExplorer::EnvironmentAspect(rc) ProjectExplorer::EnvironmentAspect(rc)
{ } { }
QmlProjectEnvironmentAspect *QmlProjectEnvironmentAspect::clone(ProjectExplorer::RunConfiguration *parent) const QmlProjectEnvironmentAspect *QmlProjectEnvironmentAspect::create(ProjectExplorer::RunConfiguration *parent) const
{ {
return new QmlProjectEnvironmentAspect(this, parent); return new QmlProjectEnvironmentAspect(parent);
} }
QmlProjectEnvironmentAspect::QmlProjectEnvironmentAspect(const QmlProjectManager::QmlProjectEnvironmentAspect *other,
ProjectExplorer::RunConfiguration *parent) :
ProjectExplorer::EnvironmentAspect(other, parent)
{ }
} // namespace QmlProjectManager } // namespace QmlProjectManager

View File

@@ -42,7 +42,7 @@ class QmlProjectEnvironmentAspect : public ProjectExplorer::EnvironmentAspect
public: public:
QmlProjectEnvironmentAspect(ProjectExplorer::RunConfiguration *rc); QmlProjectEnvironmentAspect(ProjectExplorer::RunConfiguration *rc);
QmlProjectEnvironmentAspect *clone(ProjectExplorer::RunConfiguration *parent) const; QmlProjectEnvironmentAspect *create(ProjectExplorer::RunConfiguration *parent) const;
QList<int> possibleBaseEnvironments() const; QList<int> possibleBaseEnvironments() const;
QString baseEnvironmentDisplayName(int base) const; QString baseEnvironmentDisplayName(int base) const;
@@ -52,8 +52,6 @@ private:
enum BaseEnvironmentBase { enum BaseEnvironmentBase {
SystemEnvironmentBase = 0 SystemEnvironmentBase = 0
}; };
QmlProjectEnvironmentAspect(const QmlProjectEnvironmentAspect *other, ProjectExplorer::RunConfiguration *parent);
}; };
} // namespace QmlProjectManager } // namespace QmlProjectManager

View File

@@ -41,9 +41,9 @@ RemoteLinuxEnvironmentAspect::RemoteLinuxEnvironmentAspect(ProjectExplorer::RunC
ProjectExplorer::EnvironmentAspect(rc) ProjectExplorer::EnvironmentAspect(rc)
{ } { }
RemoteLinuxEnvironmentAspect *RemoteLinuxEnvironmentAspect::clone(ProjectExplorer::RunConfiguration *parent) const RemoteLinuxEnvironmentAspect *RemoteLinuxEnvironmentAspect::create(ProjectExplorer::RunConfiguration *parent) const
{ {
return new RemoteLinuxEnvironmentAspect(this, parent); return new RemoteLinuxEnvironmentAspect(parent);
} }
ProjectExplorer::RunConfigWidget *RemoteLinuxEnvironmentAspect::createConfigurationWidget() ProjectExplorer::RunConfigWidget *RemoteLinuxEnvironmentAspect::createConfigurationWidget()
@@ -101,10 +101,5 @@ QString RemoteLinuxEnvironmentAspect::userEnvironmentChangesAsString() const
return env.mid(0, env.size() - 1); return env.mid(0, env.size() - 1);
} }
RemoteLinuxEnvironmentAspect::RemoteLinuxEnvironmentAspect(const RemoteLinuxEnvironmentAspect *other,
ProjectExplorer::RunConfiguration *parent) :
ProjectExplorer::EnvironmentAspect(other, parent)
{ }
} // namespace RemoteLinux } // namespace RemoteLinux

View File

@@ -46,7 +46,7 @@ class REMOTELINUX_EXPORT RemoteLinuxEnvironmentAspect : public ProjectExplorer::
public: public:
RemoteLinuxEnvironmentAspect(ProjectExplorer::RunConfiguration *rc); RemoteLinuxEnvironmentAspect(ProjectExplorer::RunConfiguration *rc);
RemoteLinuxEnvironmentAspect *clone(ProjectExplorer::RunConfiguration *parent) const; RemoteLinuxEnvironmentAspect *create(ProjectExplorer::RunConfiguration *parent) const;
ProjectExplorer::RunConfigWidget *createConfigurationWidget(); ProjectExplorer::RunConfigWidget *createConfigurationWidget();
QList<int> possibleBaseEnvironments() const; QList<int> possibleBaseEnvironments() const;
@@ -66,8 +66,6 @@ private:
RemoteBaseEnvironment = 1 RemoteBaseEnvironment = 1
}; };
RemoteLinuxEnvironmentAspect(const RemoteLinuxEnvironmentAspect *other, ProjectExplorer::RunConfiguration *parent);
Utils::Environment m_remoteEnvironment; Utils::Environment m_remoteEnvironment;
}; };

View File

@@ -47,7 +47,6 @@
#include <valgrind/valgrindsettings.h> #include <valgrind/valgrindsettings.h>
#include <analyzerbase/analyzermanager.h> #include <analyzerbase/analyzermanager.h>
#include <analyzerbase/analyzersettings.h>
#include <analyzerbase/analyzerutils.h> #include <analyzerbase/analyzerutils.h>
#include <analyzerbase/analyzerconstants.h> #include <analyzerbase/analyzerconstants.h>
@@ -546,8 +545,7 @@ AnalyzerRunControl *CallgrindToolPrivate::createRunControl(const AnalyzerStartPa
// apply project settings // apply project settings
if (runConfiguration) { if (runConfiguration) {
if (AnalyzerRunConfigurationAspect *analyzerAspect if (IRunConfigurationAspect *analyzerAspect = runConfiguration->extraAspect(ANALYZER_VALGRIND_SETTINGS)) {
= runConfiguration->extraAspect<AnalyzerRunConfigurationAspect>(ANALYZER_VALGRIND_SETTINGS)) {
if (const ValgrindBaseSettings *settings = qobject_cast<ValgrindBaseSettings *>(analyzerAspect->currentSettings())) { if (const ValgrindBaseSettings *settings = qobject_cast<ValgrindBaseSettings *>(analyzerAspect->currentSettings())) {
m_visualisation->setMinimumInclusiveCostRatio(settings->visualisationMinimumInclusiveCostRatio() / 100.0); m_visualisation->setMinimumInclusiveCostRatio(settings->visualisationMinimumInclusiveCostRatio() / 100.0);
m_proxyModel->setMinimumInclusiveCostRatio(settings->minimumInclusiveCostRatio() / 100.0); m_proxyModel->setMinimumInclusiveCostRatio(settings->minimumInclusiveCostRatio() / 100.0);

View File

@@ -32,8 +32,6 @@
#include "valgrindsettings.h" #include "valgrindsettings.h"
#include <analyzerbase/analyzersettings.h>
#include <projectexplorer/projectexplorer.h> #include <projectexplorer/projectexplorer.h>
#include <projectexplorer/taskhub.h> #include <projectexplorer/taskhub.h>

View File

@@ -231,8 +231,8 @@ void MemcheckTool::maybeActiveRunConfigurationChanged()
if (Project *project = pe->startupProject()) if (Project *project = pe->startupProject())
if (Target *target = project->activeTarget()) if (Target *target = project->activeTarget())
if (RunConfiguration *rc = target->activeRunConfiguration()) if (RunConfiguration *rc = target->activeRunConfiguration())
if (AnalyzerRunConfigurationAspect *aspect = rc->extraAspect<AnalyzerRunConfigurationAspect>(ANALYZER_VALGRIND_SETTINGS)) if (IRunConfigurationAspect *aspect = rc->extraAspect(ANALYZER_VALGRIND_SETTINGS))
settings = qobject_cast<ValgrindBaseSettings *>(aspect->projectSettings()); settings = qobject_cast<ValgrindBaseSettings *>(aspect->currentSettings());
if (!settings) // fallback to global settings if (!settings) // fallback to global settings
settings = ValgrindPlugin::globalSettings(); settings = ValgrindPlugin::globalSettings();

View File

@@ -64,8 +64,8 @@ ValgrindRunControl::ValgrindRunControl(const AnalyzerStartParameters &sp,
m_isStopping(false) m_isStopping(false)
{ {
if (runConfiguration) if (runConfiguration)
if (AnalyzerRunConfigurationAspect *aspect = runConfiguration->extraAspect<AnalyzerRunConfigurationAspect>(ANALYZER_VALGRIND_SETTINGS)) if (IRunConfigurationAspect *aspect = runConfiguration->extraAspect(ANALYZER_VALGRIND_SETTINGS))
m_settings = qobject_cast<ValgrindBaseSettings *>(aspect->projectSettings()); m_settings = qobject_cast<ValgrindBaseSettings *>(aspect->currentSettings());
if (!m_settings) if (!m_settings)
m_settings = ValgrindPlugin::globalSettings(); m_settings = ValgrindPlugin::globalSettings();

View File

@@ -34,9 +34,9 @@
#include "memchecktool.h" #include "memchecktool.h"
#include "valgrindruncontrolfactory.h" #include "valgrindruncontrolfactory.h"
#include "valgrindsettings.h" #include "valgrindsettings.h"
#include "valgrindconfigwidget.h"
#include <analyzerbase/analyzermanager.h> #include <analyzerbase/analyzermanager.h>
#include <analyzerbase/analyzersettings.h>
#include <coreplugin/dialogs/ioptionspage.h> #include <coreplugin/dialogs/ioptionspage.h>
#include <coreplugin/actionmanager/actioncontainer.h> #include <coreplugin/actionmanager/actioncontainer.h>
@@ -73,7 +73,7 @@ public:
} }
QWidget *createPage(QWidget *parent) { QWidget *createPage(QWidget *parent) {
return theGlobalSettings->createConfigWidget(parent); return new ValgrindConfigWidget(theGlobalSettings, parent, true);
} }
void apply() { void apply() {

View File

@@ -35,7 +35,7 @@
#include <analyzerbase/analyzermanager.h> #include <analyzerbase/analyzermanager.h>
#include <analyzerbase/analyzerstartparameters.h> #include <analyzerbase/analyzerstartparameters.h>
#include <analyzerbase/analyzerruncontrol.h> #include <analyzerbase/analyzerruncontrol.h>
#include <analyzerbase/analyzersettings.h> #include <analyzerbase/analyzerrunconfigwidget.h>
#include <remotelinux/remotelinuxrunconfiguration.h> #include <remotelinux/remotelinuxrunconfiguration.h>
@@ -108,14 +108,34 @@ RunControl *ValgrindRunControlFactory::create(RunConfiguration *runConfiguration
return AnalyzerManager::createRunControl(sp, runConfiguration); return AnalyzerManager::createRunControl(sp, runConfiguration);
} }
class ValgrindRunConfigurationAspect : public IRunConfigurationAspect
{
public:
ValgrindRunConfigurationAspect(RunConfiguration *parent)
: IRunConfigurationAspect(parent)
{
setProjectSettings(new ValgrindProjectSettings());
setGlobalSettings(ValgrindPlugin::globalSettings());
setId(ANALYZER_VALGRIND_SETTINGS);
setDisplayName(tr("Valgrind Settings"));
}
IRunConfigurationAspect *create(RunConfiguration *parent) const
{
return new ValgrindRunConfigurationAspect(parent);
}
RunConfigWidget *createConfigurationWidget()
{
return new Analyzer::AnalyzerRunConfigWidget(this);
}
};
IRunConfigurationAspect *ValgrindRunControlFactory::createRunConfigurationAspect(RunConfiguration *rc) IRunConfigurationAspect *ValgrindRunControlFactory::createRunConfigurationAspect(RunConfiguration *rc)
{ {
Q_UNUSED(rc); return new ValgrindRunConfigurationAspect(rc);
IRunConfigurationAspect *aspect
= new AnalyzerRunConfigurationAspect(new ValgrindProjectSettings(), ValgrindPlugin::globalSettings());
aspect->setId(ANALYZER_VALGRIND_SETTINGS);
aspect->setDisplayName(tr("Valgrind Settings"));
return aspect;
} }
} // namespace Internal } // namespace Internal

View File

@@ -31,8 +31,8 @@
#ifndef ANALYZER_INTERNAL_VALGRINDSETTINGS_H #ifndef ANALYZER_INTERNAL_VALGRINDSETTINGS_H
#define ANALYZER_INTERNAL_VALGRINDSETTINGS_H #define ANALYZER_INTERNAL_VALGRINDSETTINGS_H
#include <analyzerbase/analyzersettings.h>
#include "callgrindcostdelegate.h" #include "callgrindcostdelegate.h"
#include <projectexplorer/runconfiguration.h>
#include <QObject> #include <QObject>
#include <QString> #include <QString>
@@ -46,7 +46,7 @@ const char ANALYZER_VALGRIND_SETTINGS[] = "Analyzer.Valgrind.Settings";
/** /**
* Valgrind settings shared for global and per-project. * Valgrind settings shared for global and per-project.
*/ */
class ValgrindBaseSettings : public Analyzer::ISettingsAspect class ValgrindBaseSettings : public ProjectExplorer::ISettingsAspect
{ {
Q_OBJECT Q_OBJECT