diff options
author | Tobias Hunger <tobias.hunger@nokia.com> | 2012-04-24 15:49:09 +0200 |
---|---|---|
committer | Tobias Hunger <tobias.hunger@nokia.com> | 2012-06-21 12:08:12 +0200 |
commit | 24314562165588b56a318b3b8a846bf5deda7c41 (patch) | |
tree | b5dcf951e76d003c2623011b0e91994e06e7e061 /src | |
parent | 8c77b8c9d7b25d0c89003c8c4a54e8da5bfb7edd (diff) | |
download | qt-creator-24314562165588b56a318b3b8a846bf5deda7c41.tar.gz |
Profile introduction
Introduce Profiles to store sets of values that describe a system/device.
These profiles are held by a target, getting rid of much of the information
stored in the Build-/Run-/DeployConfigurations, greatly simplifying those.
This is a squash of the wip/profile branch which has been on gerrit for a
while, rebased to current master.
Change-Id: I25956c8dd4d1962b2134bfaa8a8076ae3909460f
Reviewed-by: Daniel Teske <daniel.teske@nokia.com>
Diffstat (limited to 'src')
379 files changed, 12568 insertions, 14315 deletions
diff --git a/src/libs/utils/detailsbutton.cpp b/src/libs/utils/detailsbutton.cpp index 15cabc42fd..4bdeeec231 100644 --- a/src/libs/utils/detailsbutton.cpp +++ b/src/libs/utils/detailsbutton.cpp @@ -41,6 +41,39 @@ using namespace Utils; +FadingWidget::FadingWidget(QWidget *parent) : + FadingPanel(parent), + m_opacityEffect(new QGraphicsOpacityEffect) +{ + m_opacityEffect->setOpacity(0); + setGraphicsEffect(m_opacityEffect); + + // Workaround for issue with QGraphicsEffect. GraphicsEffect + // currently clears with Window color. Remove if flickering + // no longer occurs on fade-in + QPalette pal; + pal.setBrush(QPalette::All, QPalette::Window, Qt::transparent); + setPalette(pal); +} + +void FadingWidget::setOpacity(qreal value) +{ + m_opacityEffect->setOpacity(value); +} + +void FadingWidget::fadeTo(qreal value) +{ + QPropertyAnimation *animation = new QPropertyAnimation(m_opacityEffect, "opacity"); + animation->setDuration(200); + animation->setEndValue(value); + animation->start(QAbstractAnimation::DeleteWhenStopped); +} + +qreal FadingWidget::opacity() +{ + return m_opacityEffect->opacity(); +} + DetailsButton::DetailsButton(QWidget *parent) : QAbstractButton(parent), m_fader(0) { setCheckable(true); diff --git a/src/libs/utils/detailsbutton.h b/src/libs/utils/detailsbutton.h index 428bec5c8d..d58d718ad6 100644 --- a/src/libs/utils/detailsbutton.h +++ b/src/libs/utils/detailsbutton.h @@ -38,11 +38,15 @@ #include <QAbstractButton> #include <QPixmap> +#include <QGraphicsOpacityEffect> + QT_FORWARD_DECLARE_CLASS(QGraphicsOpacityEffect) namespace Utils { class QTCREATOR_UTILS_EXPORT FadingPanel : public QWidget { + Q_OBJECT + public: FadingPanel(QWidget *parent = 0) : QWidget(parent) @@ -51,6 +55,18 @@ public: virtual void setOpacity(qreal value) = 0; }; +class QTCREATOR_UTILS_EXPORT FadingWidget : public FadingPanel +{ + Q_OBJECT +public: + FadingWidget(QWidget *parent = 0); + void fadeTo(qreal value); + qreal opacity(); + void setOpacity(qreal value); +protected: + QGraphicsOpacityEffect *m_opacityEffect; +}; + class QTCREATOR_UTILS_EXPORT DetailsButton : public QAbstractButton { Q_OBJECT diff --git a/src/libs/utils/persistentsettings.cpp b/src/libs/utils/persistentsettings.cpp index 3c8da84510..6a9fdfddd8 100644 --- a/src/libs/utils/persistentsettings.cpp +++ b/src/libs/utils/persistentsettings.cpp @@ -340,9 +340,9 @@ PersistentSettingsWriter::PersistentSettingsWriter() static void writeVariantValue(QXmlStreamWriter &w, const Context &ctx, const QVariant &variant, const QString &key = QString()) { - switch (variant.type()) { - case QVariant::StringList: - case QVariant::List: + switch (static_cast<int>(variant.type())) { + case static_cast<int>(QVariant::StringList): + case static_cast<int>(QVariant::List): w.writeStartElement(ctx.valueListElement); w.writeAttribute(ctx.typeAttribute, QLatin1String(QVariant::typeToName(QVariant::List))); if (!key.isEmpty()) @@ -351,7 +351,7 @@ static void writeVariantValue(QXmlStreamWriter &w, const Context &ctx, writeVariantValue(w, ctx, var); w.writeEndElement(); break; - case QVariant::Map: { + case static_cast<int>(QVariant::Map): { w.writeStartElement(ctx.valueMapElement); w.writeAttribute(ctx.typeAttribute, QLatin1String(QVariant::typeToName(QVariant::Map))); if (!key.isEmpty()) @@ -363,6 +363,9 @@ static void writeVariantValue(QXmlStreamWriter &w, const Context &ctx, w.writeEndElement(); } break; + case static_cast<int>(QMetaType::QObjectStar): // ignore QObjects! + case static_cast<int>(QMetaType::VoidStar): // ignore void pointers! + break; default: w.writeStartElement(ctx.valueElement); w.writeAttribute(ctx.typeAttribute, QLatin1String(variant.typeName())); diff --git a/src/plugins/android/android.pro b/src/plugins/android/android.pro index c841fdbae0..2ebfd680bd 100644 --- a/src/plugins/android/android.pro +++ b/src/plugins/android/android.pro @@ -12,6 +12,7 @@ QT += xml network HEADERS += \ androidconstants.h \ androidconfigurations.h \ + androidmanager.h \ androidrunconfiguration.h \ androidruncontrol.h \ androidrunfactories.h \ @@ -32,14 +33,13 @@ HEADERS += \ androidqtversionfactory.h \ androidqtversion.h \ androiddeployconfiguration.h \ - androidtarget.h \ - androidtargetfactory.h \ androidcreatekeystorecertificate.h \ javaparser.h \ androidplugin.h SOURCES += \ androidconfigurations.cpp \ + androidmanager.cpp \ androidrunconfiguration.cpp \ androidruncontrol.cpp \ androidrunfactories.cpp \ @@ -59,8 +59,6 @@ SOURCES += \ androidqtversionfactory.cpp \ androidqtversion.cpp \ androiddeployconfiguration.cpp \ - androidtarget.cpp \ - androidtargetfactory.cpp \ androidcreatekeystorecertificate.cpp \ javaparser.cpp \ androidplugin.cpp diff --git a/src/plugins/android/android.qbs b/src/plugins/android/android.qbs index f4b43ad719..397648e792 100644 --- a/src/plugins/android/android.qbs +++ b/src/plugins/android/android.qbs @@ -42,6 +42,8 @@ QtcPlugin { "androiddeploystepwidget.h", "androiddeploystepwidget.ui", "androidglobal.h", + "androidmanager.h", + "androidmanager.cpp", "androidpackagecreationfactory.cpp", "androidpackagecreationfactory.h", "androidpackagecreationstep.cpp", @@ -73,10 +75,6 @@ QtcPlugin { "androidsettingswidget.cpp", "androidsettingswidget.h", "androidsettingswidget.ui", - "androidtarget.cpp", - "androidtargetfactory.cpp", - "androidtargetfactory.h", - "androidtarget.h", "androidtoolchain.cpp", "androidtoolchain.h", "javaparser.cpp", diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index 88ee1144bf..1873728735 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -124,16 +124,16 @@ QLatin1String AndroidConfigurations::toolsPrefix(ProjectExplorer::Abi::Architect AndroidConfig::AndroidConfig(const QSettings &settings) { // user settings - armGdbLocation = settings.value(ArmGdbLocationKey).toString(); - armGdbserverLocation = settings.value(ArmGdbserverLocationKey).toString(); - x86GdbLocation = settings.value(X86GdbLocationKey).toString(); - x86GdbserverLocation = settings.value(X86GdbserverLocationKey).toString(); + armGdbLocation = Utils::FileName::fromString(settings.value(ArmGdbLocationKey).toString()); + armGdbserverLocation = Utils::FileName::fromString(settings.value(ArmGdbserverLocationKey).toString()); + x86GdbLocation = Utils::FileName::fromString(settings.value(X86GdbLocationKey).toString()); + x86GdbserverLocation = Utils::FileName::fromString(settings.value(X86GdbserverLocationKey).toString()); partitionSize = settings.value(PartitionSizeKey, 1024).toInt(); - sdkLocation = settings.value(SDKLocationKey).toString(); - ndkLocation = settings.value(NDKLocationKey).toString(); - antLocation = settings.value(AntLocationKey).toString(); - openJDKLocation = settings.value(OpenJDKLocationKey).toString(); - keystoreLocation = settings.value(KeystoreLocationKey).toString(); + sdkLocation = Utils::FileName::fromString(settings.value(SDKLocationKey).toString()); + ndkLocation = Utils::FileName::fromString(settings.value(NDKLocationKey).toString()); + antLocation = Utils::FileName::fromString(settings.value(AntLocationKey).toString()); + openJDKLocation = Utils::FileName::fromString(settings.value(OpenJDKLocationKey).toString()); + keystoreLocation = Utils::FileName::fromString(settings.value(KeystoreLocationKey).toString()); QRegExp versionRegExp(NDKGccVersionRegExp); const QString &value = settings.value(NDKToolchainVersionKey).toString(); @@ -147,11 +147,11 @@ AndroidConfig::AndroidConfig(const QSettings &settings) if (reader.load(settingsFileName()) && settings.value(changeTimeStamp).toInt() != QFileInfo(settingsFileName()).lastModified().toMSecsSinceEpoch() / 1000) { // persisten settings - sdkLocation = reader.restoreValue(SDKLocationKey).toString(); - ndkLocation = reader.restoreValue(NDKLocationKey).toString(); - antLocation = reader.restoreValue(AntLocationKey).toString(); - openJDKLocation = reader.restoreValue(OpenJDKLocationKey).toString(); - keystoreLocation = reader.restoreValue(KeystoreLocationKey).toString(); + sdkLocation = Utils::FileName::fromString(reader.restoreValue(SDKLocationKey).toString()); + ndkLocation = Utils::FileName::fromString(reader.restoreValue(NDKLocationKey).toString()); + antLocation = Utils::FileName::fromString(reader.restoreValue(AntLocationKey).toString()); + openJDKLocation = Utils::FileName::fromString(reader.restoreValue(OpenJDKLocationKey).toString()); + keystoreLocation = Utils::FileName::fromString(reader.restoreValue(KeystoreLocationKey).toString()); QRegExp versionRegExp(NDKGccVersionRegExp); const QString &value = reader.restoreValue(NDKToolchainVersionKey).toString(); @@ -160,17 +160,17 @@ AndroidConfig::AndroidConfig(const QSettings &settings) else ndkToolchainVersion = value.mid(versionRegExp.indexIn(value)); - if (!armGdbLocation.length()) - armGdbLocation = reader.restoreValue(ArmGdbLocationKey).toString(); + if (armGdbLocation.isEmpty()) + armGdbLocation = Utils::FileName::fromString(reader.restoreValue(ArmGdbLocationKey).toString()); - if (!armGdbserverLocation.length()) - armGdbserverLocation = reader.restoreValue(ArmGdbserverLocationKey).toString(); + if (armGdbserverLocation.isEmpty()) + armGdbserverLocation = Utils::FileName::fromString(reader.restoreValue(ArmGdbserverLocationKey).toString()); - if (!x86GdbLocation.length()) - x86GdbLocation = reader.restoreValue(X86GdbLocationKey).toString(); + if (x86GdbLocation.isEmpty()) + x86GdbLocation = Utils::FileName::fromString(reader.restoreValue(X86GdbLocationKey).toString()); - if (!x86GdbserverLocation.length()) - x86GdbserverLocation = reader.restoreValue(X86GdbserverLocationKey).toString(); + if (x86GdbserverLocation.isEmpty()) + x86GdbserverLocation = Utils::FileName::fromString(reader.restoreValue(X86GdbserverLocationKey).toString()); // persistent settings } @@ -188,16 +188,16 @@ void AndroidConfig::save(QSettings &settings) const settings.setValue(changeTimeStamp, fileInfo.lastModified().toMSecsSinceEpoch() / 1000); // user settings - settings.setValue(SDKLocationKey, sdkLocation); - settings.setValue(NDKLocationKey, ndkLocation); + settings.setValue(SDKLocationKey, sdkLocation.toString()); + settings.setValue(NDKLocationKey, ndkLocation.toString()); settings.setValue(NDKToolchainVersionKey, ndkToolchainVersion); - settings.setValue(AntLocationKey, antLocation); - settings.setValue(OpenJDKLocationKey, openJDKLocation); - settings.setValue(KeystoreLocationKey, keystoreLocation); - settings.setValue(ArmGdbLocationKey, armGdbLocation); - settings.setValue(ArmGdbserverLocationKey, armGdbserverLocation); - settings.setValue(X86GdbLocationKey, x86GdbLocation); - settings.setValue(X86GdbserverLocationKey, x86GdbserverLocation); + settings.setValue(AntLocationKey, antLocation.toString()); + settings.setValue(OpenJDKLocationKey, openJDKLocation.toString()); + settings.setValue(KeystoreLocationKey, keystoreLocation.toString()); + settings.setValue(ArmGdbLocationKey, armGdbLocation.toString()); + settings.setValue(ArmGdbserverLocationKey, armGdbserverLocation.toString()); + settings.setValue(X86GdbLocationKey, x86GdbLocation.toString()); + settings.setValue(X86GdbserverLocationKey, x86GdbserverLocation.toString()); settings.setValue(PartitionSizeKey, partitionSize); // user settings @@ -214,7 +214,7 @@ void AndroidConfigurations::setConfig(const AndroidConfig &devConfigs) void AndroidConfigurations::updateAvailablePlatforms() { m_availablePlatforms.clear(); - QDirIterator it(m_config.ndkLocation + QLatin1String("/platforms"), QStringList() << QLatin1String("android-*"), QDir::Dirs); + QDirIterator it(m_config.ndkLocation.appendPath(QLatin1String("platforms")).toString(), QStringList() << QLatin1String("android-*"), QDir::Dirs); while (it.hasNext()) { const QString &fileName = it.next(); m_availablePlatforms.push_back(fileName.mid(fileName.lastIndexOf(QLatin1Char('-')) + 1).toInt()); @@ -226,7 +226,7 @@ QStringList AndroidConfigurations::sdkTargets(int minApiLevel) const { QStringList targets; QProcess proc; - proc.start(androidToolPath(), QStringList() << QLatin1String("list") << QLatin1String("target")); // list avaialbe AVDs + proc.start(androidToolPath().toString(), QStringList() << QLatin1String("list") << QLatin1String("target")); // list avaialbe AVDs if (!proc.waitForFinished(-1)) { proc.terminate(); return targets; @@ -248,7 +248,8 @@ QStringList AndroidConfigurations::ndkToolchainVersions() const { QRegExp versionRegExp(NDKGccVersionRegExp); QStringList result; - QDirIterator it(m_config.ndkLocation + QLatin1String("/toolchains"), + Utils::FileName path = m_config.ndkLocation; + QDirIterator it(path.appendPath(QLatin1String("toolchains")).toString(), QStringList() << QLatin1String("*"), QDir::Dirs); while (it.hasNext()) { const QString &fileName = it.next(); @@ -262,66 +263,71 @@ QStringList AndroidConfigurations::ndkToolchainVersions() const return result; } -QString AndroidConfigurations::adbToolPath() const +Utils::FileName AndroidConfigurations::adbToolPath() const { - return m_config.sdkLocation + QLatin1String("/platform-tools/adb" ANDROID_EXE_SUFFIX); + Utils::FileName path = m_config.sdkLocation; + return path.appendPath(QLatin1String("platform-tools/adb"ANDROID_EXE_SUFFIX)); } -QString AndroidConfigurations::androidToolPath() const +Utils::FileName AndroidConfigurations::androidToolPath() const { #ifdef Q_OS_WIN32 // I want to switch from using android.bat to using an executable. All it really does is call // Java and I've made some progress on it. So if android.exe exists, return that instead. - QFileInfo fi(m_config.sdkLocation + QLatin1String("/tools/android" ANDROID_EXE_SUFFIX)); - if (fi.exists()) - return m_config.sdkLocation + QString("/tools/android" ANDROID_EXE_SUFFIX); - else - return m_config.sdkLocation + QLatin1String("/tools/android" ANDROID_BAT_SUFFIX); + Utils::FileName path = m_config.sdkLocation; + path.appendPath(QLatin1String("tools/android"ANDROID_EXE_SUFFIX)); + if (path.toFileInfo().exists()) + return path; + path = m_config.sdkLocation; + return path.appendPath(QLatin1String("tools/android"ANDROID_BAT_SUFFIX)); #else - return m_config.sdkLocation + QLatin1String("/tools/android" ANDROID_EXE_SUFFIX); + Utils::FileName path = m_config.sdkLocation; + return path.appendPath(QLatin1String("tools/android"ANDROID_EXE_SUFFIX)); #endif } -QString AndroidConfigurations::antToolPath() const +Utils::FileName AndroidConfigurations::antToolPath() const { - if (m_config.antLocation.length()) + if (!m_config.antLocation.isEmpty()) return m_config.antLocation; else - return QLatin1String("ant"); + return Utils::FileName::fromString(QLatin1String("ant")); } -QString AndroidConfigurations::emulatorToolPath() const +Utils::FileName AndroidConfigurations::emulatorToolPath() const { - return m_config.sdkLocation + QLatin1String("/tools/emulator" ANDROID_EXE_SUFFIX); + Utils::FileName path = m_config.sdkLocation; + return path.appendPath(QLatin1String("tools/emulator"ANDROID_EXE_SUFFIX)); } -QString AndroidConfigurations::toolPath(ProjectExplorer::Abi::Architecture architecture) const +Utils::FileName AndroidConfigurations::toolPath(ProjectExplorer::Abi::Architecture architecture) const { - return m_config.ndkLocation + QString::fromLatin1("/toolchains/%1-%2/prebuilt/%3/bin/%4") + Utils::FileName path = m_config.ndkLocation; + return path.appendPath(QString::fromLatin1("toolchains/%1-%2/prebuilt/%3/bin/%4") .arg(toolchainPrefix(architecture)) .arg(m_config.ndkToolchainVersion) .arg(ToolchainHost) - .arg(toolsPrefix(architecture)); + .arg(toolsPrefix(architecture))); } -QString AndroidConfigurations::stripPath(ProjectExplorer::Abi::Architecture architecture) const +Utils::FileName AndroidConfigurations::stripPath(ProjectExplorer::Abi::Architecture architecture) const { - return toolPath(architecture) + QLatin1String("-strip" ANDROID_EXE_SUFFIX); + return toolPath(architecture).append(QLatin1String("-strip"ANDROID_EXE_SUFFIX)); } -QString AndroidConfigurations::readelfPath(ProjectExplorer::Abi::Architecture architecture) const +Utils::FileName AndroidConfigurations::readelfPath(ProjectExplorer::Abi::Architecture architecture) const { - return toolPath(architecture) + QLatin1String("-readelf" ANDROID_EXE_SUFFIX); + return toolPath(architecture).append(QLatin1String("-readelf"ANDROID_EXE_SUFFIX)); } -QString AndroidConfigurations::gccPath(ProjectExplorer::Abi::Architecture architecture) const +Utils::FileName AndroidConfigurations::gccPath(ProjectExplorer::Abi::Architecture architecture) const { - return toolPath(architecture) + QLatin1String("-gcc" ANDROID_EXE_SUFFIX); + return toolPath(architecture).append(QLatin1String("-gcc"ANDROID_EXE_SUFFIX)); } -QString AndroidConfigurations::gdbServerPath(ProjectExplorer::Abi::Architecture architecture) const +Utils::FileName AndroidConfigurations::gdbServerPath(ProjectExplorer::Abi::Architecture architecture) const { - QString gdbServerPath; + Utils::FileName gdbServerPath; switch (architecture) { case ProjectExplorer::Abi::ArmArchitecture: gdbServerPath = m_config.armGdbserverLocation; @@ -330,20 +336,21 @@ QString AndroidConfigurations::gdbServerPath(ProjectExplorer::Abi::Architecture gdbServerPath = m_config.x86GdbserverLocation; break; default: - gdbServerPath = Unknown; + gdbServerPath = Utils::FileName::fromString(Unknown); break; } - if (gdbServerPath.length()) + if (!gdbServerPath.isEmpty()) return gdbServerPath; - return m_config.ndkLocation + QString::fromLatin1("/toolchains/%1-%2/prebuilt/gdbserver") - .arg(toolchainPrefix(architecture)) - .arg(m_config.ndkToolchainVersion); + Utils::FileName path = m_config.ndkLocation; + return path.appendPath(QString::fromLatin1("toolchains/%1-%2/prebuilt/gdbserver") + .arg(toolchainPrefix(architecture)) + .arg(m_config.ndkToolchainVersion)); } -QString AndroidConfigurations::gdbPath(ProjectExplorer::Abi::Architecture architecture) const +Utils::FileName AndroidConfigurations::gdbPath(ProjectExplorer::Abi::Architecture architecture) const { - QString gdbPath; + Utils::FileName gdbPath; switch (architecture) { case ProjectExplorer::Abi::ArmArchitecture: gdbPath = m_config.armGdbLocation; @@ -352,45 +359,47 @@ QString AndroidConfigurations::gdbPath(ProjectExplorer::Abi::Architecture archit gdbPath = m_config.x86GdbLocation; break; default: - gdbPath = Unknown; + gdbPath = Utils::FileName::fromString(Unknown); break; } if (!gdbPath.isEmpty()) return gdbPath; - return toolPath(architecture) + QLatin1String("-gdb" ANDROID_EXE_SUFFIX); + return toolPath(architecture).append(QLatin1String("-gdb"ANDROID_EXE_SUFFIX)); } -QString AndroidConfigurations::openJDKPath() const +Utils::FileName AndroidConfigurations::openJDKPath() const { return m_config.openJDKLocation; } -QString AndroidConfigurations::openJDKBinPath() const +Utils::FileName AndroidConfigurations::openJDKBinPath() const { - if (m_config.openJDKLocation.length()) - return m_config.openJDKLocation + QLatin1String("/bin/"); - return QString(); + Utils::FileName path = m_config.openJDKLocation; + if (!path.isEmpty()) + return path.appendPath(QLatin1String("bin")); + return path; } -QString AndroidConfigurations::keytoolPath() const +Utils::FileName AndroidConfigurations::keytoolPath() const { - return openJDKBinPath() + keytoolName; + return openJDKBinPath().appendPath(keytoolName); } -QString AndroidConfigurations::jarsignerPath() const +Utils::FileName AndroidConfigurations::jarsignerPath() const { - return openJDKBinPath() + jarsignerName; + return openJDKBinPath().appendPath(jarsignerName); } QString AndroidConfigurations::getDeployDeviceSerialNumber(int *apiLevel) const { QVector<AndroidDevice> devices = connectedDevices(); - foreach (AndroidDevice device, devices) + foreach (AndroidDevice device, devices) { if (device.sdk >= *apiLevel) { *apiLevel = device.sdk; return device.serialNumber; } + } return startAVD(apiLevel); } @@ -398,7 +407,7 @@ QVector<AndroidDevice> AndroidConfigurations::connectedDevices(int apiLevel) con { QVector<AndroidDevice> devices; QProcess adbProc; - adbProc.start(adbToolPath(), QStringList() << QLatin1String("devices")); + adbProc.start(adbToolPath().toString(), QStringList() << QLatin1String("devices")); if (!adbProc.waitForFinished(-1)) { adbProc.terminate(); return devices; @@ -443,7 +452,7 @@ bool AndroidConfigurations::createAVD(int minApiLevel) const bool AndroidConfigurations::createAVD(const QString &target, const QString &name, int sdcardSize ) const { QProcess proc; - proc.start(androidToolPath(), + proc.start(androidToolPath().toString(), QStringList() << QLatin1String("create") << QLatin1String("avd") << QLatin1String("-a") << QLatin1String("-t") << target << QLatin1String("-n") << name @@ -461,7 +470,7 @@ bool AndroidConfigurations::createAVD(const QString &target, const QString &name bool AndroidConfigurations::removeAVD(const QString &name) const { QProcess proc; - proc.start(androidToolPath(), + proc.start(androidToolPath().toString(), QStringList() << QLatin1String("delete") << QLatin1String("avd") << QLatin1String("-n") << name); if (!proc.waitForFinished(-1)) { @@ -475,7 +484,7 @@ QVector<AndroidDevice> AndroidConfigurations::androidVirtualDevices() const { QVector<AndroidDevice> devices; QProcess proc; - proc.start(androidToolPath(), + proc.start(androidToolPath().toString(), QStringList() << QLatin1String("list") << QLatin1String("avd")); // list available AVDs if (!proc.waitForFinished(-1)) { proc.terminate(); @@ -540,7 +549,7 @@ QString AndroidConfigurations::startAVD(int *apiLevel, const QString &name) cons return avdName; // start the emulator - m_avdProcess->start(emulatorToolPath(), + m_avdProcess->start(emulatorToolPath().toString(), QStringList() << QLatin1String("-partition-size") << QString::number(config().partitionSize) << QLatin1String("-avd") << avdName); if (!m_avdProcess->waitForStarted(-1)) { @@ -550,7 +559,7 @@ QString AndroidConfigurations::startAVD(int *apiLevel, const QString &name) cons // wait until the emulator is online QProcess proc; - proc.start(adbToolPath(), QStringList() << QLatin1String("-e") << QLatin1String("wait-for-device")); + proc.start(adbToolPath().toString(), QStringList() << QLatin1String("-e") << QLatin1String("wait-for-device")); if (!proc.waitForFinished(-1)) { proc.terminate(); return QString(); @@ -558,7 +567,7 @@ QString AndroidConfigurations::startAVD(int *apiLevel, const QString &name) cons sleep(5);// wait for pm to start // workaround for stupid adb bug - proc.start(adbToolPath(), QStringList() << QLatin1String("devices")); + proc.start(adbToolPath().toString(), QStringList() << QLatin1String("devices")); if (!proc.waitForFinished(-1)) { proc.terminate(); return QString(); @@ -577,7 +586,7 @@ int AndroidConfigurations::getSDKVersion(const QString &device) const { QProcess adbProc; - adbProc.start(adbToolPath(), + adbProc.start(adbToolPath().toString(), QStringList() << QLatin1String("-s") << device << QLatin1String("shell") << QLatin1String("getprop") << QLatin1String("ro.build.version.sdk")); diff --git a/src/plugins/android/androidconfigurations.h b/src/plugins/android/androidconfigurations.h index 6fc01f0796..31eedb4573 100644 --- a/src/plugins/android/androidconfigurations.h +++ b/src/plugins/android/androidconfigurations.h @@ -67,16 +67,16 @@ public: AndroidConfig(const QSettings &settings); void save(QSettings &settings) const; - QString sdkLocation; - QString ndkLocation; + Utils::FileName sdkLocation; + Utils::FileName ndkLocation; QString ndkToolchainVersion; - QString antLocation; - QString armGdbLocation; - QString armGdbserverLocation; - QString x86GdbLocation; - QString x86GdbserverLocation; - QString openJDKLocation; - QString keystoreLocation; + Utils::FileName antLocation; + Utils::FileName armGdbLocation; + Utils::FileName armGdbserverLocation; + Utils::FileName x86GdbLocation; + Utils::FileName x86GdbserverLocation; + Utils::FileName openJDKLocation; + Utils::FileName keystoreLocation; unsigned partitionSize; }; @@ -97,18 +97,18 @@ public: void setConfig(const AndroidConfig &config); QStringList sdkTargets(int minApiLevel = 0) const; QStringList ndkToolchainVersions() const; - QString adbToolPath() const; - QString androidToolPath() const; - QString antToolPath() const; - QString emulatorToolPath() const; - QString gccPath(ProjectExplorer::Abi::Architecture architecture) const; - QString gdbServerPath(ProjectExplorer::Abi::Architecture architecture) const; - QString gdbPath(ProjectExplorer::Abi::Architecture architecture) const; - QString openJDKPath() const; - QString keytoolPath() const; - QString jarsignerPath() const; - QString stripPath(ProjectExplorer::Abi::Architecture architecture) const; - QString readelfPath(ProjectExplorer::Abi::Architecture architecture) const; + Utils::FileName adbToolPath() const; + Utils::FileName androidToolPath() const; + Utils::FileName antToolPath() const; + Utils::FileName emulatorToolPath() const; + Utils::FileName gccPath(ProjectExplorer::Abi::Architecture architecture) const; + Utils::FileName gdbServerPath(ProjectExplorer::Abi::Architecture architecture) const; + Utils::FileName gdbPath(ProjectExplorer::Abi::Architecture architecture) const; + Utils::FileName openJDKPath() const; + Utils::FileName keytoolPath() const; + Utils::FileName jarsignerPath() const; + Utils::FileName stripPath(ProjectExplorer::Abi::Architecture architecture) const; + Utils::FileName readelfPath(ProjectExplorer::Abi::Architecture architecture) const; QString getDeployDeviceSerialNumber(int *apiLevel) const; bool createAVD(const QString &target, const QString &name, int sdcardSize) const; bool removeAVD(const QString &name) const; @@ -127,8 +127,8 @@ public slots: bool createAVD(int minApiLevel = 0) const; private: - QString toolPath(ProjectExplorer::Abi::Architecture architecture) const; - QString openJDKBinPath() const; + Utils::FileName toolPath(ProjectExplorer::Abi::Architecture architecture) const; + Utils::FileName openJDKBinPath() const; AndroidConfigurations(QObject *parent); void load(); diff --git a/src/plugins/android/androidconstants.h b/src/plugins/android/androidconstants.h index c7a0b9ae89..ab31c92b08 100644 --- a/src/plugins/android/androidconstants.h +++ b/src/plugins/android/androidconstants.h @@ -56,18 +56,8 @@ enum AndroidQemuStatus { #define ANDROID_BAT_SUFFIX "" #endif -static const char ANDROID_RC_ID[] = ANDROID_PREFIX; static const QLatin1String ANDROID_RC_ID_PREFIX(ANDROID_PREFIX "."); -static const QLatin1String AndroidArgumentsKey(ANDROID_PREFIX ".Arguments"); -static const QLatin1String AndroidSimulatorPathKey(ANDROID_PREFIX ".Simulator"); -static const QLatin1String AndroidDeviceIdKey(ANDROID_PREFIX ".DeviceId"); -static const QLatin1String AndroidProFileKey(ANDROID_PREFIX ".ProFile"); -static const QLatin1String AndroidExportedLocalDirsKey(ANDROID_PREFIX ".ExportedLocalDirs"); -static const QLatin1String AndroidBaseEnvironmentBaseKey(ANDROID_PREFIX ".BaseEnvironmentBase"); -static const QLatin1String AndroidUserEnvironmentChangesKey(ANDROID_PREFIX ".UserEnvironmentChanges"); -static const QLatin1String AndroidUseRemoteGdbKey(ANDROID_PREFIX ".UseRemoteGdb"); - } // namespace Internal namespace Constants { @@ -77,8 +67,6 @@ const char ANDROID_SETTINGS_TR_CATEGORY[] = QT_TRANSLATE_NOOP("Android", "Androi const char ANDROID_SETTINGS_CATEGORY_ICON[] = ":/android/images/QtAndroid.png"; const char ANDROID_TOOLCHAIN_ID[] = "Qt4ProjectManager.ToolChain.Android"; const char ANDROIDQT[] = "Qt4ProjectManager.QtVersion.Android"; -const char ANDROID_PLATFORM[] = "Android"; -const char ANDROID_PLATFORM_TR[] = QT_TRANSLATE_NOOP("QtSupport", "Android"); } } // namespace Android diff --git a/src/plugins/android/androidcreatekeystorecertificate.cpp b/src/plugins/android/androidcreatekeystorecertificate.cpp index 8a326c3b59..a542f7f4d0 100644 --- a/src/plugins/android/androidcreatekeystorecertificate.cpp +++ b/src/plugins/android/androidcreatekeystorecertificate.cpp @@ -56,7 +56,7 @@ AndroidCreateKeystoreCertificate::~AndroidCreateKeystoreCertificate() delete ui; } -QString AndroidCreateKeystoreCertificate::keystoreFilePath() +Utils::FileName AndroidCreateKeystoreCertificate::keystoreFilePath() { return m_keystoreFilePath; } @@ -155,10 +155,10 @@ void AndroidCreateKeystoreCertificate::on_buttonBox_accepted() if (!ui->countryLineEdit->text().length()) ui->countryLineEdit->setFocus(); - m_keystoreFilePath = QFileDialog::getSaveFileName(this, tr("Keystore file name"), - QDir::homePath() + QLatin1String("/android_release.keystore"), - tr("Keystore files (*.keystore *.jks)")); - if (!m_keystoreFilePath.length()) + m_keystoreFilePath = Utils::FileName::fromString(QFileDialog::getSaveFileName(this, tr("Keystore file name"), + QDir::homePath() + QLatin1String("/android_release.keystore"), + tr("Keystore files (*.keystore *.jks)"))); + if (m_keystoreFilePath.isEmpty()) return; QString distinguishedNames(QString::fromLatin1("CN=%1, O=%2, L=%3, C=%4") .arg(ui->commonNameLineEdit->text().replace(QLatin1Char(','), QLatin1String("\\,"))) @@ -174,7 +174,7 @@ void AndroidCreateKeystoreCertificate::on_buttonBox_accepted() QStringList params; params << QLatin1String("-genkey") << QLatin1String("-keyalg") << QLatin1String("RSA") - << QLatin1String("-keystore") << m_keystoreFilePath + << QLatin1String("-keystore") << m_keystoreFilePath.toString() << QLatin1String("-storepass") << ui->keystorePassLineEdit->text() << QLatin1String("-alias") << ui->aliasNameLineEdit->text() << QLatin1String("-keysize") << ui->keySizeSpinBox->text() @@ -183,7 +183,7 @@ void AndroidCreateKeystoreCertificate::on_buttonBox_accepted() << QLatin1String("-dname") << distinguishedNames; QProcess genKeyCertProc; - genKeyCertProc.start(AndroidConfigurations::instance().keytoolPath(), params ); + genKeyCertProc.start(AndroidConfigurations::instance().keytoolPath().toString(), params ); if (!genKeyCertProc.waitForStarted() || !genKeyCertProc.waitForFinished()) return; diff --git a/src/plugins/android/androidcreatekeystorecertificate.h b/src/plugins/android/androidcreatekeystorecertificate.h index 9bc89a6916..2a3edb9093 100644 --- a/src/plugins/android/androidcreatekeystorecertificate.h +++ b/src/plugins/android/androidcreatekeystorecertificate.h @@ -33,6 +33,8 @@ #ifndef ANDROIDCREATEKEYSTORECERTIFICATE_H #define ANDROIDCREATEKEYSTORECERTIFICATE_H +#include <utils/fileutils.h> + #include <QDialog> QT_BEGIN_NAMESPACE @@ -54,7 +56,7 @@ class AndroidCreateKeystoreCertificate : public QDialog public: explicit AndroidCreateKeystoreCertificate(QWidget *parent = 0); ~AndroidCreateKeystoreCertificate(); - QString keystoreFilePath(); + Utils::FileName keystoreFilePath(); QString keystorePassword(); QString certificateAlias(); QString certificatePassword(); @@ -68,7 +70,7 @@ private slots: private: Ui::AndroidCreateKeystoreCertificate *ui; - QString m_keystoreFilePath; + Utils::FileName m_keystoreFilePath; }; } // namespace Internal diff --git a/src/plugins/android/androiddebugsupport.cpp b/src/plugins/android/androiddebugsupport.cpp index 704ce67c6b..5eb5150f34 100644 --- a/src/plugins/android/androiddebugsupport.cpp +++ b/src/plugins/android/androiddebugsupport.cpp @@ -35,17 +35,18 @@ #include "androiddeploystep.h" #include "androidglobal.h" #include "androidrunner.h" -#include "androidtarget.h" +#include "androidmanager.h" #include <debugger/debuggerplugin.h> #include <debugger/debuggerrunner.h> #include <debugger/debuggerengine.h> #include <debugger/debuggerstartparameters.h> +#include <projectexplorer/target.h> #include <qt4projectmanager/qt4buildconfiguration.h> -#include <qt4projectmanager/qt4target.h> -#include <qt4projectmanager/qt4project.h> #include <qt4projectmanager/qt4nodes.h> +#include <qt4projectmanager/qt4project.h> +#include <qtsupport/qtprofileinformation.h> #include <QDir> @@ -62,6 +63,8 @@ static const char * const qMakeVariables[] = { "QT_INSTALL_IMPORTS" }; +static Qt4Project *project(AndroidRunConfiguration *rc) +{ return static_cast<Qt4Project *>(rc->target()->project()); } RunControl *AndroidDebugSupport::createDebugRunControl(AndroidRunConfiguration *runConfig) { @@ -69,19 +72,20 @@ RunControl *AndroidDebugSupport::createDebugRunControl(AndroidRunConfiguration * params.toolChainAbi = runConfig->abi(); params.dumperLibrary = runConfig->dumperLib(); params.startMode = AttachToRemoteServer; - params.executable = runConfig->androidTarget()->qt4Project()->rootQt4ProjectNode()->buildDir() + QLatin1String("/app_process"); - params.debuggerCommand = runConfig->gdbCmd(); + params.executable = project(runConfig)->rootQt4ProjectNode()->buildDir() + QLatin1String("/app_process"); + params.debuggerCommand = runConfig->gdbCmd().toString(); params.remoteChannel = runConfig->remoteChannel(); - params.displayName = runConfig->androidTarget()->packageName(); + params.displayName = AndroidManager::packageName(runConfig->target()); params.solibSearchPath.clear(); - QList<Qt4ProFileNode *> nodes = runConfig->androidTarget()->qt4Project()->allProFiles(); + QList<Qt4ProFileNode *> nodes = project(runConfig)->allProFiles(); foreach (Qt4ProFileNode *node, nodes) if (node->projectType() == ApplicationTemplate) params.solibSearchPath.append(node->targetInformation().buildDir); - params.solibSearchPath.append(qtSoPaths(runConfig->activeQt4BuildConfiguration()->qtVersion())); + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(runConfig->target()->profile()); + params.solibSearchPath.append(qtSoPaths(version)); params.useServerStartScript = true; params.remoteSetupNeeded = true; @@ -148,6 +152,9 @@ void AndroidDebugSupport::handleRemoteErrorOutput(const QByteArray &output) QStringList AndroidDebugSupport::qtSoPaths(QtSupport::BaseQtVersion *qtVersion) { + if (!qtVersion) + return QStringList(); + QSet<QString> paths; for (uint i = 0; i < sizeof qMakeVariables / sizeof qMakeVariables[0]; ++i) { if (!qtVersion->versionInfo().contains(QLatin1String(qMakeVariables[i]))) diff --git a/src/plugins/android/androiddeployconfiguration.cpp b/src/plugins/android/androiddeployconfiguration.cpp index 0efd9a46c0..c07219b793 100644 --- a/src/plugins/android/androiddeployconfiguration.cpp +++ b/src/plugins/android/androiddeployconfiguration.cpp @@ -34,13 +34,14 @@ #include "androidpackageinstallationstep.h" #include "androidpackagecreationstep.h" #include "androiddeployconfiguration.h" -#include "androidtarget.h" +#include "androidmanager.h" #include <projectexplorer/buildsteplist.h> #include <projectexplorer/target.h> -#include <qt4projectmanager/qt4projectmanagerconstants.h> #include <qt4projectmanager/qt4project.h> +#include <qtsupport/qtprofileinformation.h> +#include <qtsupport/qtsupportconstants.h> using namespace Android::Internal; @@ -64,15 +65,11 @@ AndroidDeployConfiguration::AndroidDeployConfiguration(ProjectExplorer::Target * AndroidDeployConfigurationFactory::AndroidDeployConfigurationFactory(QObject *parent) : ProjectExplorer::DeployConfigurationFactory(parent) -{ } +{ setObjectName(QLatin1String("AndroidDeployConfigurationFactory"));} bool AndroidDeployConfigurationFactory::canCreate(ProjectExplorer::Target *parent, const Core::Id id) const { - AndroidTarget *t = qobject_cast<AndroidTarget *>(parent); - if (!t || t->id() != Core::Id(Qt4ProjectManager::Constants::ANDROID_DEVICE_TARGET_ID) - || !id.toString().startsWith(QLatin1String(ANDROID_DEPLOYCONFIGURATION_ID))) - return false; - return true; + return availableCreationIds(parent).contains(id); } ProjectExplorer::DeployConfiguration *AndroidDeployConfigurationFactory::create(ProjectExplorer::Target *parent, const Core::Id id) @@ -96,8 +93,7 @@ ProjectExplorer::DeployConfiguration *AndroidDeployConfigurationFactory::restore { if (!canRestore(parent, map)) return 0; - AndroidTarget *t = static_cast<AndroidTarget *>(parent); - AndroidDeployConfiguration *dc = new AndroidDeployConfiguration(t); + AndroidDeployConfiguration *dc = new AndroidDeployConfiguration(parent); if (dc->fromMap(map)) return dc; @@ -107,7 +103,7 @@ ProjectExplorer::DeployConfiguration *AndroidDeployConfigurationFactory::restore bool AndroidDeployConfigurationFactory::canClone(ProjectExplorer::Target *parent, ProjectExplorer::DeployConfiguration *source) const { - if (!qobject_cast<AndroidTarget *>(parent)) + if (!AndroidManager::supportsAndroid(parent)) return false; return source->id() == Core::Id(ANDROID_DEPLOYCONFIGURATION_ID); } @@ -116,24 +112,24 @@ ProjectExplorer::DeployConfiguration *AndroidDeployConfigurationFactory::clone(P { if (!canClone(parent, source)) return 0; - AndroidTarget *t = static_cast<AndroidTarget *>(parent); - return new AndroidDeployConfiguration(t, source); + return new AndroidDeployConfiguration(parent, source); } QList<Core::Id> AndroidDeployConfigurationFactory::availableCreationIds(ProjectExplorer::Target *parent) const { - AndroidTarget *target = qobject_cast<AndroidTarget *>(parent); - if (!target || - target->id() != Core::Id(Qt4ProjectManager::Constants::ANDROID_DEVICE_TARGET_ID)) + if (!AndroidManager::supportsAndroid(parent)) return QList<Core::Id>(); QList<Core::Id> result; - foreach (const QString &id, target->qt4Project()->applicationProFilePathes(QLatin1String(ANDROID_DC_PREFIX))) + Qt4ProjectManager::Qt4Project *project = static_cast<Qt4ProjectManager::Qt4Project *>(parent->project()); + foreach (const QString &id, project->applicationProFilePathes(QLatin1String(ANDROID_DC_PREFIX))) result << Core::Id(id.toUtf8().constData()); return result; } -QString AndroidDeployConfigurationFactory::displayNameForId(const Core::Id/*id*/) const +QString AndroidDeployConfigurationFactory::displayNameForId(const Core::Id id) const { - return tr("Deploy on Android"); + if (id.toString().startsWith(ANDROID_DC_PREFIX)) + return tr("Deploy on Android"); + return QString(); } diff --git a/src/plugins/android/androiddeployconfiguration.h b/src/plugins/android/androiddeployconfiguration.h index 5a08c4f8ee..546470076c 100644 --- a/src/plugins/android/androiddeployconfiguration.h +++ b/src/plugins/android/androiddeployconfiguration.h @@ -72,7 +72,6 @@ public: QList<Core::Id> availableCreationIds(ProjectExplorer::Target *parent) const; // used to translate the ids to names to display to the user QString displayNameForId(const Core::Id id) const; - }; } // namespace Internal diff --git a/src/plugins/android/androiddeploystep.cpp b/src/plugins/android/androiddeploystep.cpp index 57b6d9d1c8..3cbd1cbea3 100644 --- a/src/plugins/android/androiddeploystep.cpp +++ b/src/plugins/android/androiddeploystep.cpp @@ -37,16 +37,16 @@ #include "androidglobal.h" #include "androidpackagecreationstep.h" #include "androidrunconfiguration.h" -#include "androidtarget.h" +#include "androidmanager.h" #include <projectexplorer/buildconfiguration.h> #include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/target.h> +#include <qt4projectmanager/qt4buildconfiguration.h> #include <qt4projectmanager/qt4project.h> -#include <qt4projectmanager/qt4target.h> #include <qt4projectmanager/qt4nodes.h> -#include <qt4projectmanager/qt4buildconfiguration.h> +#include <qtsupport/qtprofileinformation.h> #include <QDir> @@ -85,14 +85,8 @@ void AndroidDeployStep::ctor() bool AndroidDeployStep::init() { - AndroidTarget *androidTarget = qobject_cast<AndroidTarget *>(target()); - if (!androidTarget) { - raiseError(tr("Cannot deploy: current target is not android.")); - return false; - } - const Qt4BuildConfiguration *const bc = androidTarget->activeQt4BuildConfiguration(); - m_packageName = androidTarget->packageName(); - const QString targetSDK = androidTarget->targetSDK(); + m_packageName = AndroidManager::packageName(target()); + const QString targetSDK = AndroidManager::targetSDK(target()); writeOutput(tr("Please wait, searching for a suitable device for target:%1.").arg(targetSDK)); m_deviceAPILevel = targetSDK.mid(targetSDK.indexOf(QLatin1Char('-')) + 1).toInt(); @@ -103,14 +97,15 @@ bool AndroidDeployStep::init() return false; } - if (!bc->qtVersion()) + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(target()->profile()); + if (!version) return false; - m_qtVersionSourcePath = bc->qtVersion()->sourcePath().toString(); - m_qtVersionQMakeBuildConfig = bc->qtVersion()->defaultBuildConfig(); - m_androidDirPath = androidTarget->androidDirPath(); - m_apkPathDebug = androidTarget->apkPath(AndroidTarget::DebugBuild); - m_apkPathRelease = androidTarget->apkPath(AndroidTarget::ReleaseBuildSigned); - m_buildDirectory = androidTarget->qt4Project()->rootQt4ProjectNode()->buildDir(); + m_qtVersionSourcePath = version->sourcePath().toString(); + m_qtVersionQMakeBuildConfig = version->defaultBuildConfig(); + m_androidDirPath = AndroidManager::dirPath(target()); + m_apkPathDebug = AndroidManager::apkPath(target(), AndroidManager::DebugBuild).toString(); + m_apkPathRelease = AndroidManager::apkPath(target(), AndroidManager::ReleaseBuildSigned).toString(); + m_buildDirectory = static_cast<Qt4Project *>(target()->project())->rootQt4ProjectNode()->buildDir(); m_runQASIPackagePath = m_QASIPackagePath; m_runDeployAction = m_deployAction; return true; @@ -205,12 +200,9 @@ int AndroidDeployStep::deviceAPILevel() return m_deviceAPILevel; } -QString AndroidDeployStep::localLibsRulesFilePath() +Utils::FileName AndroidDeployStep::localLibsRulesFilePath() { - AndroidTarget *androidTarget = qobject_cast<AndroidTarget *>(target()); - if (!androidTarget) - return QString(); - return androidTarget->localLibsRulesFilePath(); + return AndroidManager::localLibsRulesFilePath(target()); } void AndroidDeployStep::copyLibs(const QString &srcPath, const QString &destPath, QStringList &copiedLibs, const QStringList &filter) @@ -241,7 +233,7 @@ bool AndroidDeployStep::deployPackage() if (m_runDeployAction == DeployLocal) { writeOutput(tr("Clean old qt libs")); - runCommand(deployProc, AndroidConfigurations::instance().adbToolPath(), + runCommand(deployProc, AndroidConfigurations::instance().adbToolPath().toString(), QStringList() << QLatin1String("-s") << m_deviceSerialNumber << QLatin1String("shell") << QLatin1String("rm") << QLatin1String("-r") << QLatin1String("/data/local/qt")); @@ -258,7 +250,7 @@ bool AndroidDeployStep::deployPackage() copyLibs(m_qtVersionSourcePath + QLatin1String("/jar"), tempPath + QLatin1String("/jar"), stripFiles); AndroidPackageCreationStep::stripAndroidLibs(stripFiles, target()->activeRunConfiguration()->abi().architecture()); - runCommand(deployProc, AndroidConfigurations::instance().adbToolPath(), + runCommand(deployProc, AndroidConfigurations::instance().adbToolPath().toString(), QStringList() << QLatin1String("-s") << m_deviceSerialNumber << QLatin1String("push") << tempPath << QLatin1String("/data/local/qt")); AndroidPackageCreationStep::removeDirectory(tempPath); @@ -266,7 +258,7 @@ bool AndroidDeployStep::deployPackage() } if (m_runDeployAction == InstallQASI) { - if (!runCommand(deployProc, AndroidConfigurations::instance().adbToolPath(), + if (!runCommand(deployProc, AndroidConfigurations::instance().adbToolPath().toString(), QStringList() << QLatin1String("-s") << m_deviceSerialNumber << QLatin1String("install") << QLatin1String("-r ") << m_runQASIPackagePath)) { raiseError(tr("Qt Android smart installer instalation failed")); @@ -276,10 +268,10 @@ bool AndroidDeployStep::deployPackage() } emit resetDelopyAction(); } - deployProc->setWorkingDirectory(m_androidDirPath); + deployProc->setWorkingDirectory(m_androidDirPath.toString()); writeOutput(tr("Installing package onto %1.").arg(m_deviceSerialNumber)); - runCommand(deployProc, AndroidConfigurations::instance().adbToolPath(), + runCommand(deployProc, AndroidConfigurations::instance().adbToolPath().toString(), QStringList() << QLatin1String("-s") << m_deviceSerialNumber << QLatin1String("uninstall") << m_packageName); QString package = m_apkPathDebug; @@ -287,7 +279,7 @@ bool AndroidDeployStep::deployPackage() && QFile::exists(m_apkPathRelease)) package = m_apkPathRelease; - if (!runCommand(deployProc, AndroidConfigurations::instance().adbToolPath(), + if (!runCommand(deployProc, AndroidConfigurations::instance().adbToolPath().toString(), QStringList() << QLatin1String("-s") << m_deviceSerialNumber << QLatin1String("install") << package)) { raiseError(tr("Package instalation failed")); disconnect(deployProc, 0, this, 0); @@ -296,11 +288,11 @@ bool AndroidDeployStep::deployPackage() } writeOutput(tr("Pulling files necessary for debugging")); - runCommand(deployProc, AndroidConfigurations::instance().adbToolPath(), + runCommand(deployProc, AndroidConfigurations::instance().adbToolPath().toString(), QStringList() << QLatin1String("-s") << m_deviceSerialNumber << QLatin1String("pull") << QLatin1String("/system/bin/app_process") << QString::fromLatin1("%1/app_process").arg(m_buildDirectory)); - runCommand(deployProc, AndroidConfigurations::instance().adbToolPath(), + runCommand(deployProc, AndroidConfigurations::instance().adbToolPath().toString(), QStringList() << QLatin1String("-s") << m_deviceSerialNumber << QLatin1String("pull") << QLatin1String("/system/lib/libc.so") << QString::fromLatin1("%1/libc.so").arg(m_buildDirectory)); diff --git a/src/plugins/android/androiddeploystep.h b/src/plugins/android/androiddeploystep.h index 73553baf84..f76e248c28 100644 --- a/src/plugins/android/androiddeploystep.h +++ b/src/plugins/android/androiddeploystep.h @@ -70,7 +70,7 @@ public: QString deviceSerialNumber(); int deviceAPILevel(); - QString localLibsRulesFilePath(); + Utils::FileName localLibsRulesFilePath(); AndroidDeployAction deployAction(); bool useLocalQtLibs(); @@ -116,7 +116,7 @@ private: QString m_packageName; QString m_qtVersionSourcePath; QtSupport::BaseQtVersion::QmakeBuildConfigs m_qtVersionQMakeBuildConfig; - QString m_androidDirPath; + Utils::FileName m_androidDirPath; QString m_apkPathDebug; QString m_apkPathRelease; QString m_buildDirectory; diff --git a/src/plugins/android/androiddeploystepfactory.cpp b/src/plugins/android/androiddeploystepfactory.cpp index 4344b69208..09ffb190c2 100644 --- a/src/plugins/android/androiddeploystepfactory.cpp +++ b/src/plugins/android/androiddeploystepfactory.cpp @@ -33,11 +33,13 @@ #include "androiddeploystepfactory.h" #include "androiddeploystep.h" +#include "androidmanager.h" #include <projectexplorer/buildsteplist.h> #include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/target.h> -#include <qt4projectmanager/qt4projectmanagerconstants.h> +#include <qtsupport/qtsupportconstants.h> +#include <qtsupport/qtprofileinformation.h> #include <QCoreApplication> @@ -53,27 +55,25 @@ AndroidDeployStepFactory::AndroidDeployStepFactory(QObject *parent) QList<Core::Id> AndroidDeployStepFactory::availableCreationIds(BuildStepList *parent) const { - if (parent->id() == Core::Id(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY) - && parent->target()->id() == Core::Id(Qt4ProjectManager::Constants::ANDROID_DEVICE_TARGET_ID) - && !parent->contains(AndroidDeployStep::Id)) - return QList<Core::Id>() << AndroidDeployStep::Id; - return QList<Core::Id>(); + if (parent->id() != Core::Id(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY)) + return QList<Core::Id>(); + if (!AndroidManager::supportsAndroid(parent->target())) + return QList<Core::Id>(); + if (parent->contains(AndroidDeployStep::Id)) + return QList<Core::Id>(); + return QList<Core::Id>() << AndroidDeployStep::Id; } QString AndroidDeployStepFactory::displayNameForId(const Core::Id id) const { if (id == AndroidDeployStep::Id) - return QCoreApplication::translate("Qt4ProjectManager::Internal::AndroidDeployStepFactory", - "Deploy to Android device/emulator"); + return tr("Deploy to Android device/emulator"); return QString(); } bool AndroidDeployStepFactory::canCreate(BuildStepList *parent, const Core::Id id) const { - return parent->id() == Core::Id(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY) - && id == Core::Id(AndroidDeployStep::Id) - && parent->target()->id() == Core::Id(Qt4ProjectManager::Constants::ANDROID_DEVICE_TARGET_ID) - && !parent->contains(AndroidDeployStep::Id); + return availableCreationIds(parent).contains(id); } BuildStep *AndroidDeployStepFactory::create(BuildStepList *parent, const Core::Id id) diff --git a/src/plugins/android/androiddeploystepwidget.cpp b/src/plugins/android/androiddeploystepwidget.cpp index 9dce27ce61..cd8616ed8c 100644 --- a/src/plugins/android/androiddeploystepwidget.cpp +++ b/src/plugins/android/androiddeploystepwidget.cpp @@ -110,7 +110,7 @@ void AndroidDeployStepWidget::useLocalQtLibsStateChanged(int state) void AndroidDeployStepWidget::editRulesFile() { - Core::ICore::instance()->openFiles(QStringList() << m_step->localLibsRulesFilePath(), Core::ICore::SwitchMode); + Core::ICore::instance()->openFiles(QStringList() << m_step->localLibsRulesFilePath().toString(), Core::ICore::SwitchMode); } } // namespace Internal diff --git a/src/plugins/android/androidtarget.cpp b/src/plugins/android/androidmanager.cpp index 7367c9645c..b95c2bdb3f 100644 --- a/src/plugins/android/androidtarget.cpp +++ b/src/plugins/android/androidmanager.cpp @@ -30,7 +30,7 @@ ** **************************************************************************/ -#include "androidtarget.h" +#include "androidmanager.h" #include "androiddeployconfiguration.h" #include "androidconfigurations.h" #include "androidrunconfiguration.h" @@ -38,12 +38,16 @@ #include "androidglobal.h" #include "androidpackagecreationstep.h" +#include <projectexplorer/projectexplorer.h> +#include <projectexplorer/session.h> +#include <projectexplorer/target.h> #include <qt4projectmanager/qt4nodes.h> #include <qt4projectmanager/qt4project.h> #include <qt4projectmanager/qt4projectmanagerconstants.h> -#include <qt4projectmanager/qt4target.h> #include <qt4projectmanager/qt4buildconfiguration.h> #include <qtsupport/customexecutablerunconfiguration.h> +#include <qtsupport/qtprofileinformation.h> +#include <qtsupport/qtsupportconstants.h> #include <QDir> #include <QFileSystemWatcher> @@ -53,9 +57,6 @@ #include <QApplication> #include <QDomDocument> -using namespace ProjectExplorer; -using namespace Qt4ProjectManager; - namespace { const QLatin1String AndroidDirName("android"); const QLatin1String AndroidManifestName("AndroidManifest.xml"); @@ -78,499 +79,263 @@ namespace { namespace Android { namespace Internal { -AndroidTarget::AndroidTarget(Qt4Project *parent, const Core::Id id) : - Qt4BaseTarget(parent, id) - , m_androidFilesWatcher(new QFileSystemWatcher(this)) - , m_buildConfigurationFactory(new Qt4BuildConfigurationFactory(this)) -{ - setDisplayName(defaultDisplayName()); - setDefaultDisplayName(defaultDisplayName()); - setIcon(QIcon(QLatin1String(Constants::ANDROID_SETTINGS_CATEGORY_ICON))); - connect(parent, SIGNAL(activeTargetChanged(ProjectExplorer::Target*)), - this, SLOT(handleTargetChanged(ProjectExplorer::Target*))); -} +AndroidManager *AndroidManager::m_instance = 0; -AndroidTarget::~AndroidTarget() +AndroidManager *AndroidManager::instance() { - + return m_instance; } -Qt4BuildConfigurationFactory *AndroidTarget::buildConfigurationFactory() const +AndroidManager::~AndroidManager() { - return m_buildConfigurationFactory; } -void AndroidTarget::createApplicationProFiles(bool reparse) +bool AndroidManager::supportsAndroid(ProjectExplorer::Target *target) { - if (!reparse) - removeUnconfiguredCustomExectutableRunConfigurations(); - - QList<Qt4ProFileNode *> profiles = qt4Project()->applicationProFiles(); - QSet<QString> paths; - foreach (Qt4ProFileNode *pro, profiles) - paths << pro->path(); - - foreach (ProjectExplorer::RunConfiguration *rc, runConfigurations()) - if (AndroidRunConfiguration *qt4rc = qobject_cast<AndroidRunConfiguration *>(rc)) - paths.remove(qt4rc->proFilePath()); - - // Only add new runconfigurations if there are none. - foreach (const QString &path, paths) - addRunConfiguration(new AndroidRunConfiguration(this, path)); - - // Oh still none? Add a custom executable runconfiguration - if (runConfigurations().isEmpty()) { - addRunConfiguration(new QtSupport::CustomExecutableRunConfiguration(this)); - } -} - -QList<ProjectExplorer::RunConfiguration *> AndroidTarget::runConfigurationsForNode(ProjectExplorer::Node *n) -{ - QList<ProjectExplorer::RunConfiguration *> result; - foreach (ProjectExplorer::RunConfiguration *rc, runConfigurations()) - if (AndroidRunConfiguration *qt4c = qobject_cast<AndroidRunConfiguration *>(rc)) - if (qt4c->proFilePath() == n->path()) - result << rc; - return result; + if (!qobject_cast<Qt4ProjectManager::Qt4Project *>(target->project())) + return false; + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(target->profile()); + return version && version->platformName() == QtSupport::Constants::ANDROID_PLATFORM; } -QString AndroidTarget::defaultDisplayName() +QString AndroidManager::packageName(ProjectExplorer::Target *target) { - return QApplication::translate("Qt4ProjectManager::Qt4Target", "Android", "Qt4 Android target display name"); + QDomDocument doc; + if (!openManifest(target, doc)) + return QString(); + QDomElement manifestElem = doc.documentElement(); + return manifestElem.attribute(QLatin1String("package")); } -void AndroidTarget::handleTargetChanged(ProjectExplorer::Target *target) +bool AndroidManager::setPackageName(ProjectExplorer::Target *target, const QString &name) { - if (target != this) - return; - - disconnect(project(), SIGNAL(addedTarget(ProjectExplorer::Target*)), - this, SLOT(handleTargetChanged(ProjectExplorer::Target*))); - connect(project(), SIGNAL(aboutToRemoveTarget(ProjectExplorer::Target*)), - SLOT(handleTargetToBeRemoved(ProjectExplorer::Target*))); - - if (!createAndroidTemplatesIfNecessary()) - return; - - m_androidFilesWatcher->addPath(androidDirPath()); - m_androidFilesWatcher->addPath(androidManifestPath()); - m_androidFilesWatcher->addPath(androidSrcPath()); - connect(m_androidFilesWatcher, SIGNAL(directoryChanged(QString)), this, - SIGNAL(androidDirContentsChanged())); - connect(m_androidFilesWatcher, SIGNAL(fileChanged(QString)), this, - SIGNAL(androidDirContentsChanged())); + QDomDocument doc; + if (!openManifest(target, doc)) + return false; + QDomElement manifestElem = doc.documentElement(); + manifestElem.setAttribute(QLatin1String("package"), cleanPackageName(name)); + return saveManifest(target, doc); } -void AndroidTarget::handleTargetToBeRemoved(ProjectExplorer::Target *target) +QString AndroidManager::applicationName(ProjectExplorer::Target *target) { - if (target != this) - return; - -// I don't think is a good idea to remove android directory - -// const QString debianPath = debianDirPath(); -// if (!QFileInfo(debianPath).exists()) -// return; -// const int answer = QMessageBox::warning(0, tr("Qt Creator"), -// tr("Do you want to remove the packaging directory\n" -// "associated with the target '%1'?").arg(displayName()), -// QMessageBox::Yes | QMessageBox::No, QMessageBox::No); -// if (answer == QMessageBox::No) -// return; -// QString error; -// if (!MaemoGlobal::removeRecursively(debianPath, error)) -// qDebug("%s", qPrintable(error)); -// const QString packagingPath = project()->projectDirectory() -// + QLatin1Char('/') + PackagingDirName; -// const QStringList otherContents = QDir(packagingPath).entryList(QDir::Dirs -// | QDir::Files | QDir::Hidden | QDir::NoDotAndDotDot); -// if (otherContents.isEmpty()) { -// if (!MaemoGlobal::removeRecursively(packagingPath, error)) -// qDebug("%s", qPrintable(error)); -// } + QDomDocument doc; + if (!openXmlFile(target, doc, stringsPath(target))) + return QString(); + QDomElement metadataElem = doc.documentElement().firstChildElement(QLatin1String("string")); + while (!metadataElem.isNull()) { + if (metadataElem.attribute(QLatin1String("name")) == QLatin1String("app_name")) + return metadataElem.text(); + metadataElem = metadataElem.nextSiblingElement(QLatin1String("string")); + } + return QString(); } -QString AndroidTarget::androidDirPath() const +bool AndroidManager::setApplicationName(ProjectExplorer::Target *target, const QString &name) { - return project()->projectDirectory() + QLatin1Char('/') + AndroidDirName; + QDomDocument doc; + Utils::FileName path = stringsPath(target); + if (!openXmlFile(target, doc, path)) + return false; + QDomElement metadataElem = doc.documentElement().firstChildElement(QLatin1String("string")); + while (!metadataElem.isNull()) { + if (metadataElem.attribute(QLatin1String("name")) == QLatin1String("app_name")) { + metadataElem.removeChild(metadataElem.firstChild()); + metadataElem.appendChild(doc.createTextNode(name)); + break; + } + metadataElem = metadataElem.nextSiblingElement(QLatin1String("string")); + } + return saveXmlFile(target, doc, path); } -QString AndroidTarget::androidManifestPath() const +QStringList AndroidManager::permissions(ProjectExplorer::Target *target) { - return androidDirPath() + QLatin1Char('/') + AndroidManifestName; + QStringList per; + QDomDocument doc; + if (!openManifest(target, doc)) + return per; + QDomElement permissionElem = doc.documentElement().firstChildElement(QLatin1String("uses-permission")); + while (!permissionElem.isNull()) { + per << permissionElem.attribute(QLatin1String("android:name")); + permissionElem = permissionElem.nextSiblingElement(QLatin1String("uses-permission")); + } + return per; } -QString AndroidTarget::androidLibsPath() const +bool AndroidManager::setPermissions(ProjectExplorer::Target *target, const QStringList &permissions) { - return androidDirPath() + AndroidLibsFileName; -} + QDomDocument doc; + if (!openManifest(target, doc)) + return false; + QDomElement docElement = doc.documentElement(); + QDomElement permissionElem = docElement.firstChildElement(QLatin1String("uses-permission")); + while (!permissionElem.isNull()) { + docElement.removeChild(permissionElem); + permissionElem = docElement.firstChildElement(QLatin1String("uses-permission")); + } -QString AndroidTarget::androidStringsPath() const -{ - return androidDirPath() + AndroidStringsFileName; -} + foreach (const QString &permission, permissions ) { + permissionElem = doc.createElement(QLatin1String("uses-permission")); + permissionElem.setAttribute(QLatin1String("android:name"), permission); + docElement.appendChild(permissionElem); + } -QString AndroidTarget::androidDefaultPropertiesPath() const -{ - return androidDirPath() + QLatin1Char('/') + AndroidDefaultPropertiesName; + return saveManifest(target, doc); } -QString AndroidTarget::androidSrcPath() const +QString AndroidManager::intentName(ProjectExplorer::Target *target) { - return androidDirPath() + QLatin1String("/src"); + return packageName(target) + QLatin1Char('/') + activityName(target); } -QString AndroidTarget::apkPath(BuildType buildType) const +QString AndroidManager::activityName(ProjectExplorer::Target *target) { - return project()->projectDirectory() + QLatin1Char('/') - + AndroidDirName - + QString::fromLatin1("/bin/%1-%2.apk") - .arg(applicationName()) - .arg(buildType == DebugBuild ? QLatin1String("debug") - : (buildType == ReleaseBuildUnsigned) ? QLatin1String("release-unsigned") - : QLatin1String("signed")); + QDomDocument doc; + if (!openManifest(target, doc)) + return QString(); + QDomElement activityElem = doc.documentElement().firstChildElement(QLatin1String("application")).firstChildElement(QLatin1String("activity")); + return activityElem.attribute(QLatin1String("android:name")); } -QString AndroidTarget::localLibsRulesFilePath() const +int AndroidManager::versionCode(ProjectExplorer::Target *target) { - const Qt4Project *const qt4Project = qobject_cast<const Qt4Project *>(project()); - if (!qt4Project || !qt4Project->activeTarget()->activeQt4BuildConfiguration()->qtVersion()) - return QLatin1String(""); - - return qt4Project->activeTarget()->activeQt4BuildConfiguration() - ->qtVersion()->versionInfo()[QLatin1String("QT_INSTALL_LIBS")] + QLatin1String("/rules.xml"); + QDomDocument doc; + if (!openManifest(target, doc)) + return 0; + QDomElement manifestElem = doc.documentElement(); + return manifestElem.attribute(QLatin1String("android:versionCode")).toInt(); } -QString AndroidTarget::loadLocal(int apiLevel, ItemType item) const +bool AndroidManager::setVersionCode(ProjectExplorer::Target *target, int version) { - QString itemType; - if (item == Lib) - itemType = QLatin1String("lib"); - else - itemType = QLatin1String("jar"); - - QString localLibs; - QDomDocument doc; - if (!openXmlFile(doc, localLibsRulesFilePath())) - return localLibs; - - QStringList libs; - libs << qtLibs() << prebundledLibs(); - QDomElement element = doc.documentElement().firstChildElement(QLatin1String("platforms")).firstChildElement(itemType + QLatin1Char('s')).firstChildElement(QLatin1String("version")); - while (!element.isNull()) { - if (element.attribute(QLatin1String("value")).toInt() == apiLevel) { - if (element.hasAttribute(QLatin1String("symlink"))) - apiLevel = element.attribute(QLatin1String("symlink")).toInt(); - break; - } - element = element.nextSiblingElement(QLatin1String("version")); - } - - element = doc.documentElement().firstChildElement(QLatin1String("dependencies")).firstChildElement(QLatin1String("lib")); - while (!element.isNull()) { - if (libs.contains(element.attribute(QLatin1String("name")))) { - QDomElement libElement = element.firstChildElement(QLatin1String("depends")).firstChildElement(itemType); - while (!libElement.isNull()) { - localLibs += libElement.attribute(QLatin1String("file")).arg(apiLevel) + QLatin1Char(':'); - libElement = libElement.nextSiblingElement(itemType); - } - - libElement = element.firstChildElement(QLatin1String("replaces")).firstChildElement(itemType); - while (!libElement.isNull()) { - localLibs.replace(libElement.attribute(QLatin1String("file")).arg(apiLevel) + QLatin1Char(':'), QString()); - libElement = libElement.nextSiblingElement(itemType); - } - } - element = element.nextSiblingElement(QLatin1String("lib")); - } - return localLibs; + if (!openManifest(target, doc)) + return false; + QDomElement manifestElem = doc.documentElement(); + manifestElem.setAttribute(QLatin1String("android:versionCode"), version); + return saveManifest(target, doc); } -QString AndroidTarget::loadLocalLibs(int apiLevel) const +QString AndroidManager::versionName(ProjectExplorer::Target *target) { - return loadLocal(apiLevel, Lib); + QDomDocument doc; + if (!openManifest(target, doc)) + return QString(); + QDomElement manifestElem = doc.documentElement(); + return manifestElem.attribute(QLatin1String("android:versionName")); } -QString AndroidTarget::loadLocalJars(int apiLevel) const +bool AndroidManager::setVersionName(ProjectExplorer::Target *target, const QString &version) { - return loadLocal(apiLevel, Jar); + QDomDocument doc; + if (!openManifest(target, doc)) + return false; + QDomElement manifestElem = doc.documentElement(); + manifestElem.setAttribute(QLatin1String("android:versionName"), version); + return saveManifest(target, doc); } -void AndroidTarget::updateProject(const QString &targetSDK, const QString &name) const +QString AndroidManager::targetSDK(ProjectExplorer::Target *target) { - QString androidDir = androidDirPath(); - - // clean previous build - QProcess androidProc; - androidProc.setWorkingDirectory(androidDir); - androidProc.start(AndroidConfigurations::instance().antToolPath(), QStringList() << QLatin1String("clean")); - if (!androidProc.waitForFinished(-1)) - androidProc.terminate(); - // clean previous build - - int targetSDKNumber = targetSDK.mid(targetSDK.lastIndexOf(QLatin1Char('-')) + 1).toInt(); - bool commentLines = false; - QDirIterator it(androidDir, QStringList() << QLatin1String("*.java"), QDir::Files, QDirIterator::Subdirectories); - while (it.hasNext()) { - it.next(); - QFile file(it.filePath()); - if (!file.open(QIODevice::ReadWrite)) - continue; - QList<QByteArray> lines = file.readAll().trimmed().split('\n'); - - bool modified = false; - bool comment = false; - for (int i = 0; i < lines.size(); i++) { - if (lines[i].contains("@ANDROID-")) { - commentLines = targetSDKNumber < lines[i].mid(lines[i].lastIndexOf('-') + 1).toInt(); - comment = !comment; - continue; - } - if (!comment) - continue; - if (commentLines) { - if (!lines[i].trimmed().startsWith("//QtCreator")) { - lines[i] = "//QtCreator " + lines[i]; - modified = true; - } - } else { if (lines[i].trimmed().startsWith("//QtCreator")) { - lines[i] = lines[i].mid(12); - modified = true; - } - } - } - if (modified) { - file.resize(0); - foreach (const QByteArray &line, lines) { - file.write(line); - file.write("\n"); - } - } - file.close(); + if (!createAndroidTemplatesIfNecessary(target)) + return AndroidConfigurations::instance().bestMatch(QLatin1String("android-8")); + QFile file(defaultPropertiesPath(target).toString()); + if (!file.open(QIODevice::ReadOnly)) + return AndroidConfigurations::instance().bestMatch(QLatin1String("android-8")); + while (!file.atEnd()) { + QByteArray line = file.readLine(); + if (line.startsWith("target=")) + return QString::fromLatin1(line.trimmed().mid(7)); } - - QStringList params; - params << QLatin1String("update") << QLatin1String("project") << QLatin1String("-p") << androidDir; - if (!targetSDK.isEmpty()) - params << QLatin1String("-t") << targetSDK; - if (!name.isEmpty()) - params << QLatin1String("-n") << name; - androidProc.start(AndroidConfigurations::instance().androidToolPath(), params); - if (!androidProc.waitForFinished(-1)) - androidProc.terminate(); + return AndroidConfigurations::instance().bestMatch(QLatin1String("android-8")); } -bool AndroidTarget::createAndroidTemplatesIfNecessary() const +bool AndroidManager::setTargetSDK(ProjectExplorer::Target *target, const QString &sdk) { - const Qt4Project *qt4Project = qobject_cast<Qt4Project*>(project()); - if (!qt4Project || !qt4Project->rootProjectNode() || !qt4Project->activeTarget() || !qt4Project->activeTarget()->activeQt4BuildConfiguration() - || !qt4Project->activeTarget()->activeQt4BuildConfiguration()->qtVersion()) - return false; - QString javaSrcPath = qt4Project->activeTarget()->activeQt4BuildConfiguration()->qtVersion()->versionInfo()[QLatin1String("QT_INSTALL_PREFIX")] + QLatin1String("/src/android/java"); - QDir projectDir(project()->projectDirectory()); - QString androidPath = androidDirPath(); - - QStringList m_ignoreFiles; - bool forceUpdate = false; - QDomDocument srcVersionDoc; - if (openXmlFile(srcVersionDoc, javaSrcPath + QLatin1String("/version.xml"), false)) { - QDomDocument dstVersionDoc; - if (openXmlFile(dstVersionDoc, androidPath + QLatin1String("/version.xml"), false)) - forceUpdate = (srcVersionDoc.documentElement().attribute(QLatin1String("value")).toDouble() - > dstVersionDoc.documentElement().attribute(QLatin1String("value")).toDouble()); - - else - forceUpdate = true; - - if (forceUpdate && QFileInfo(androidPath).exists()) { - QDomElement ignoreFile = srcVersionDoc.documentElement().firstChildElement(QLatin1String("ignore")).firstChildElement(QLatin1String("file")); - while (!ignoreFile.isNull()) { - m_ignoreFiles << ignoreFile.text(); - ignoreFile = ignoreFile.nextSiblingElement(); - } - } - } - - if (!forceUpdate && QFileInfo(androidPath).exists() - && QFileInfo(androidManifestPath()).exists() - && QFileInfo(androidPath + QLatin1String("/src")).exists() - && QFileInfo(androidPath + QLatin1String("/res")).exists()) - return true; - - forceUpdate &= QFileInfo(androidPath).exists(); - - if (!QFileInfo(androidDirPath()).exists() && !projectDir.mkdir(AndroidDirName)) { - raiseError(tr("Error creating Android directory '%1'.") - .arg(AndroidDirName)); - return false; - } - - QStringList androidFiles; - QDirIterator it(javaSrcPath, QDirIterator::Subdirectories); - int pos = it.path().size(); - while (it.hasNext()) { - it.next(); - if (it.fileInfo().isDir()) { - projectDir.mkpath(AndroidDirName + it.filePath().mid(pos)); - } else { - const QString dstFile(androidPath + it.filePath().mid(pos)); - if (m_ignoreFiles.contains(it.fileName())) - continue; - else - { - if (QFile::exists(dstFile)) - QFile::remove(dstFile); - else - androidFiles << dstFile; - } - QFile::copy(it.filePath(), dstFile); - } - } - if (androidFiles.size()) - qt4Project->rootProjectNode()->addFiles(UnknownFileType, androidFiles); - - QStringList sdks = AndroidConfigurations::instance().sdkTargets(); - if (sdks.isEmpty()) { - raiseError(tr("No Qt for Android SDKs were found.\nPlease install at least one SDK.")); - return false; - } - updateProject(AndroidConfigurations::instance().sdkTargets().at(0)); - if (availableTargetApplications().length()) - setTargetApplication(availableTargetApplications()[0]); - - QString applicationName = project()->displayName(); - if (applicationName.length()) { - setPackageName(packageName() + QLatin1Char('.') + applicationName); - applicationName[0] = applicationName[0].toUpper(); - setApplicationName(applicationName); - } - - if (forceUpdate) - QMessageBox::warning(0, tr("Warning"), tr("Android files have been updated automatically")); - + updateTarget(target, sdk, applicationName(target)); return true; } -bool AndroidTarget::openXmlFile(QDomDocument &doc, const QString &fileName, bool createAndroidTemplates) const +QIcon AndroidManager::highDpiIcon(ProjectExplorer::Target *target) { - if (createAndroidTemplates && !createAndroidTemplatesIfNecessary()) - return false; - - QFile f(fileName); - if (!f.open(QIODevice::ReadOnly)) - return false; - - if (!doc.setContent(f.readAll())) { - raiseError(tr("Cannot parse '%1'").arg(fileName)); - return false; - } - return true; + return icon(target, HighDPI); } -bool AndroidTarget::saveXmlFile(QDomDocument &doc, const QString &fileName) const +bool AndroidManager::setHighDpiIcon(ProjectExplorer::Target *target, const QString &iconFilePath) { - if (!createAndroidTemplatesIfNecessary()) - return false; + return setIcon(target, HighDPI, iconFilePath); +} - QFile f(fileName); - if (!f.open(QIODevice::WriteOnly)) { - raiseError(tr("Cannot open '%1'").arg(fileName)); - return false; - } - return f.write(doc.toByteArray(4)) >= 0; +QIcon AndroidManager::mediumDpiIcon(ProjectExplorer::Target *target) +{ + return icon(target, MediumDPI); } -bool AndroidTarget::openAndroidManifest(QDomDocument &doc) const +bool AndroidManager::setMediumDpiIcon(ProjectExplorer::Target *target, const QString &iconFilePath) { - return openXmlFile(doc, androidManifestPath()); + return setIcon(target, MediumDPI, iconFilePath); } -bool AndroidTarget::saveAndroidManifest(QDomDocument &doc) const +QIcon AndroidManager::lowDpiIcon(ProjectExplorer::Target *target) { - return saveXmlFile(doc, androidManifestPath()); + return icon(target, LowDPI); } -bool AndroidTarget::openLibsXml(QDomDocument &doc) const +bool AndroidManager::setLowDpiIcon(ProjectExplorer::Target *target, const QString &iconFilePath) { - return openXmlFile(doc, androidLibsPath()); + return setIcon(target, LowDPI, iconFilePath); } -bool AndroidTarget::saveLibsXml(QDomDocument &doc) const +Utils::FileName AndroidManager::dirPath(ProjectExplorer::Target *target) { - return saveXmlFile(doc, androidLibsPath()); + return Utils::FileName::fromString(target->project()->projectDirectory()).appendPath(AndroidDirName); } -QString AndroidTarget::activityName() const +Utils::FileName AndroidManager::manifestPath(ProjectExplorer::Target *target) { - QDomDocument doc; - if (!openAndroidManifest(doc)) - return QString(); - QDomElement activityElem = doc.documentElement().firstChildElement(QLatin1String("application")).firstChildElement(QLatin1String("activity")); - return activityElem.attribute(QLatin1String("android:name")); + return dirPath(target).appendPath(AndroidManifestName); } -QString AndroidTarget::intentName() const +Utils::FileName AndroidManager::libsPath(ProjectExplorer::Target *target) { - return packageName() + QLatin1Char('/') + activityName(); + return dirPath(target).appendPath(AndroidLibsFileName); } -QString AndroidTarget::packageName() const +Utils::FileName AndroidManager::stringsPath(ProjectExplorer::Target *target) { - QDomDocument doc; - if (!openAndroidManifest(doc)) - return QString(); - QDomElement manifestElem = doc.documentElement(); - return manifestElem.attribute(QLatin1String("package")); + return dirPath(target).append(AndroidStringsFileName); } -bool AndroidTarget::setPackageName(const QString &name) const +Utils::FileName AndroidManager::defaultPropertiesPath(ProjectExplorer::Target *target) { - QDomDocument doc; - if (!openAndroidManifest(doc)) - return false; - QDomElement manifestElem = doc.documentElement(); - manifestElem.setAttribute(QLatin1String("package"), cleanPackageName(name)); - return saveAndroidManifest(doc); + return dirPath(target).appendPath(AndroidDefaultPropertiesName); } -QString AndroidTarget::applicationName() const +Utils::FileName AndroidManager::srcPath(ProjectExplorer::Target *target) { - QDomDocument doc; - if (!openXmlFile(doc, androidStringsPath())) - return QString(); - QDomElement metadataElem = doc.documentElement().firstChildElement(QLatin1String("string")); - while (!metadataElem.isNull()) { - if (metadataElem.attribute(QLatin1String("name")) == QLatin1String("app_name")) - return metadataElem.text(); - metadataElem = metadataElem.nextSiblingElement(QLatin1String("string")); - } - return QString(); + return dirPath(target).appendPath(QLatin1String("/src")); } -bool AndroidTarget::setApplicationName(const QString &name) const +Utils::FileName AndroidManager::apkPath(ProjectExplorer::Target *target, BuildType buildType) { - QDomDocument doc; - if (!openXmlFile(doc, androidStringsPath())) - return false; - QDomElement metadataElem =doc.documentElement().firstChildElement(QLatin1String("string")); - while (!metadataElem.isNull()) { - if (metadataElem.attribute(QLatin1String("name")) == QLatin1String("app_name")) { - metadataElem.removeChild(metadataElem.firstChild()); - metadataElem.appendChild(doc.createTextNode(name)); - break; - } - metadataElem = metadataElem.nextSiblingElement(QLatin1String("string")); - } - return saveXmlFile(doc, androidStringsPath()); + return dirPath(target) + .appendPath(QLatin1String("bin")) + .appendPath(QString::fromLatin1("%1-%2.apk") + .arg(applicationName(target)) + .arg(buildType == DebugBuild + ? QLatin1String("debug") + : (buildType == ReleaseBuildUnsigned) + ? QLatin1String("release-unsigned") + : QLatin1String("signed"))); } -QStringList AndroidTarget::availableTargetApplications() const +QStringList AndroidManager::availableTargetApplications(ProjectExplorer::Target *target) { QStringList apps; - Qt4Project *qt4Project = qobject_cast<Qt4Project *>(project()); - foreach (Qt4ProFileNode *proFile, qt4Project->applicationProFiles()) { - if (proFile->projectType() == ApplicationTemplate) { + Qt4ProjectManager::Qt4Project *qt4Project = qobject_cast<Qt4ProjectManager::Qt4Project *>(target->project()); + foreach (Qt4ProjectManager::Qt4ProFileNode *proFile, qt4Project->applicationProFiles()) { + if (proFile->projectType() == Qt4ProjectManager::ApplicationTemplate) { if (proFile->targetInformation().target.startsWith(QLatin1String("lib")) && proFile->targetInformation().target.endsWith(QLatin1String(".so"))) apps << proFile->targetInformation().target.mid(3, proFile->targetInformation().target.lastIndexOf(QLatin1Char('.')) - 3); @@ -582,10 +347,10 @@ QStringList AndroidTarget::availableTargetApplications() const return apps; } -QString AndroidTarget::targetApplication() const +QString AndroidManager::targetApplication(ProjectExplorer::Target *target) { QDomDocument doc; - if (!openAndroidManifest(doc)) + if (!openManifest(target, doc)) return QString(); QDomElement metadataElem = doc.documentElement().firstChildElement(QLatin1String("application")).firstChildElement(QLatin1String("activity")).firstChildElement(QLatin1String("meta-data")); while (!metadataElem.isNull()) { @@ -596,30 +361,30 @@ QString AndroidTarget::targetApplication() const return QString(); } -bool AndroidTarget::setTargetApplication(const QString &name) const +bool AndroidManager::setTargetApplication(ProjectExplorer::Target *target, const QString &name) { QDomDocument doc; - if (!openAndroidManifest(doc)) + if (!openManifest(target, doc)) return false; QDomElement metadataElem = doc.documentElement().firstChildElement(QLatin1String("application")).firstChildElement(QLatin1String("activity")).firstChildElement(QLatin1String("meta-data")); while (!metadataElem.isNull()) { if (metadataElem.attribute(QLatin1String("android:name")) == QLatin1String("android.app.lib_name")) { metadataElem.setAttribute(QLatin1String("android:value"), name); - return saveAndroidManifest(doc); + return saveManifest(target, doc); } metadataElem = metadataElem.nextSiblingElement(QLatin1String("meta-data")); } return false; } -QString AndroidTarget::targetApplicationPath() const +QString AndroidManager::targetApplicationPath(ProjectExplorer::Target *target) { - QString selectedApp = targetApplication(); - if (!selectedApp.length()) + QString selectedApp = targetApplication(target); + if (selectedApp.isEmpty()) return QString(); - Qt4Project *qt4Project = qobject_cast<Qt4Project *>(project()); - foreach (Qt4ProFileNode *proFile, qt4Project->applicationProFiles()) { - if (proFile->projectType() == ApplicationTemplate) { + Qt4ProjectManager::Qt4Project *qt4Project = qobject_cast<Qt4ProjectManager::Qt4Project *>(target->project()); + foreach (Qt4ProjectManager::Qt4ProFileNode *proFile, qt4Project->applicationProFiles()) { + if (proFile->projectType() == Qt4ProjectManager::ApplicationTemplate) { if (proFile->targetInformation().target.startsWith(QLatin1String("lib")) && proFile->targetInformation().target.endsWith(QLatin1String(".so"))) { if (proFile->targetInformation().target.mid(3, proFile->targetInformation().target.lastIndexOf(QLatin1Char('.')) - 3) @@ -634,145 +399,195 @@ QString AndroidTarget::targetApplicationPath() const return QString(); } -int AndroidTarget::versionCode() const +bool AndroidManager::createAndroidTemplatesIfNecessary(ProjectExplorer::Target *target) { - QDomDocument doc; - if (!openAndroidManifest(doc)) - return 0; - QDomElement manifestElem = doc.documentElement(); - return manifestElem.attribute(QLatin1String("android:versionCode")).toInt(); -} - -bool AndroidTarget::setVersionCode(int version) const -{ - QDomDocument doc; - if (!openAndroidManifest(doc)) + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(target->profile()); + Qt4ProjectManager::Qt4Project *qt4Project = qobject_cast<Qt4ProjectManager::Qt4Project*>(target->project()); + if (!qt4Project || !qt4Project->rootProjectNode() || !version) return false; - QDomElement manifestElem = doc.documentElement(); - manifestElem.setAttribute(QLatin1String("android:versionCode"), version); - return saveAndroidManifest(doc); -} + Utils::FileName javaSrcPath + = Utils::FileName::fromString(version->versionInfo()[QLatin1String("QT_INSTALL_PREFIX")]) + .append(QLatin1String("src/android/java")); + QDir projectDir(qt4Project->projectDirectory()); + Utils::FileName androidPath = dirPath(target); -QString AndroidTarget::versionName() const -{ - QDomDocument doc; - if (!openAndroidManifest(doc)) - return QString(); - QDomElement manifestElem = doc.documentElement(); - return manifestElem.attribute(QLatin1String("android:versionName")); -} + QStringList m_ignoreFiles; + bool forceUpdate = false; + QDomDocument srcVersionDoc; + if (openXmlFile(target, srcVersionDoc, javaSrcPath.append(QLatin1String("version.xml")), false)) { + QDomDocument dstVersionDoc; + if (openXmlFile(target, dstVersionDoc, androidPath.append(QLatin1String("version.xml")), false)) + forceUpdate = (srcVersionDoc.documentElement().attribute(QLatin1String("value")).toDouble() + > dstVersionDoc.documentElement().attribute(QLatin1String("value")).toDouble()); + else + forceUpdate = true; -bool AndroidTarget::setVersionName(const QString &version) const -{ - QDomDocument doc; - if (!openAndroidManifest(doc)) + if (forceUpdate && androidPath.toFileInfo().exists()) { + QDomElement ignoreFile = srcVersionDoc.documentElement().firstChildElement(QLatin1String("ignore")).firstChildElement(QLatin1String("file")); + while (!ignoreFile.isNull()) { + m_ignoreFiles << ignoreFile.text(); + ignoreFile = ignoreFile.nextSiblingElement(); + } + } + } + + if (!forceUpdate && androidPath.toFileInfo().exists() + && manifestPath(target).toFileInfo().exists() + && androidPath.append(QLatin1String("/src")).toFileInfo().exists() + && androidPath.append(QLatin1String("/res")).toFileInfo().exists()) + return true; + + forceUpdate &= androidPath.toFileInfo().exists(); + + if (!dirPath(target).toFileInfo().exists() && !projectDir.mkdir(AndroidDirName)) { + raiseError(tr("Error creating Android directory '%1'.").arg(AndroidDirName)); return false; - QDomElement manifestElem = doc.documentElement(); - manifestElem.setAttribute(QLatin1String("android:versionName"), version); - return saveAndroidManifest(doc); -} + } -QStringList AndroidTarget::permissions() const -{ - QStringList per; - QDomDocument doc; - if (!openAndroidManifest(doc)) - return per; - QDomElement permissionElem = doc.documentElement().firstChildElement(QLatin1String("uses-permission")); - while (!permissionElem.isNull()) { - per << permissionElem.attribute(QLatin1String("android:name")); - permissionElem = permissionElem.nextSiblingElement(QLatin1String("uses-permission")); + QStringList androidFiles; + QDirIterator it(javaSrcPath.toString(), QDirIterator::Subdirectories); + int pos = it.path().size(); + while (it.hasNext()) { + it.next(); + if (it.fileInfo().isDir()) { + projectDir.mkpath(AndroidDirName + it.filePath().mid(pos)); + } else { + const Utils::FileName dstFile = androidPath.append(it.filePath().mid(pos)); + if (m_ignoreFiles.contains(it.fileName())) { + continue; + } else { + if (dstFile.toFileInfo().exists()) + QFile::remove(dstFile.toString()); + else + androidFiles << dstFile.toString(); + } + QFile::copy(it.filePath(), dstFile.toString()); + } } - return per; -} + if (!androidFiles.isEmpty()) + qt4Project->rootProjectNode()->addFiles(ProjectExplorer::UnknownFileType, androidFiles); -bool AndroidTarget::setPermissions(const QStringList &permissions) const -{ - QDomDocument doc; - if (!openAndroidManifest(doc)) + QStringList sdks = AndroidConfigurations::instance().sdkTargets(); + if (sdks.isEmpty()) { + raiseError(tr("No Qt for Android SDKs were found.\nPlease install at least one SDK.")); return false; - QDomElement docElement = doc.documentElement(); - QDomElement permissionElem = docElement.firstChildElement(QLatin1String("uses-permission")); - while (!permissionElem.isNull()) { - docElement.removeChild(permissionElem); - permissionElem = docElement.firstChildElement(QLatin1String("uses-permission")); } + updateTarget(target, AndroidConfigurations::instance().sdkTargets().at(0)); + QStringList apps = availableTargetApplications(target); + if (!apps.isEmpty()) + setTargetApplication(target, apps.at(0)); - foreach (const QString &permission, permissions ) { - permissionElem = doc.createElement(QLatin1String("uses-permission")); - permissionElem.setAttribute(QLatin1String("android:name"), permission); - docElement.appendChild(permissionElem); + QString applicationName = target->project()->displayName(); + if (!applicationName.isEmpty()) { + setPackageName(target, packageName(target) + QLatin1Char('.') + applicationName); + applicationName[0] = applicationName[0].toUpper(); + setApplicationName(target, applicationName); } - return saveAndroidManifest(doc); -} + if (forceUpdate) + QMessageBox::warning(0, tr("Warning"), tr("Android files have been updated automatically")); + return true; +} -QStringList AndroidTarget::getDependencies(const QString &readelfPath, const QString &lib) const +void AndroidManager::updateTarget(ProjectExplorer::Target *target, const QString &targetSDK, const QString &name) { - QStringList libs; + QString androidDir = dirPath(target).toString(); - QProcess readelfProc; - readelfProc.start(readelfPath, QStringList() << QLatin1String("-d") << QLatin1String("-W") << lib); + // clean previous build + QProcess androidProc; + androidProc.setWorkingDirectory(androidDir); + androidProc.start(AndroidConfigurations::instance().antToolPath().toString(), + QStringList() << QLatin1String("clean")); + if (!androidProc.waitForFinished(-1)) + androidProc.terminate(); + // clean previous build - if (!readelfProc.waitForFinished(-1)) { - readelfProc.terminate(); - return libs; - } + int targetSDKNumber = targetSDK.mid(targetSDK.lastIndexOf(QLatin1Char('-')) + 1).toInt(); + bool commentLines = false; + QDirIterator it(androidDir, QStringList() << QLatin1String("*.java"), QDir::Files, QDirIterator::Subdirectories); + while (it.hasNext()) { + it.next(); + QFile file(it.filePath()); + if (!file.open(QIODevice::ReadWrite)) + continue; + QList<QByteArray> lines = file.readAll().trimmed().split('\n'); - QList<QByteArray> lines = readelfProc.readAll().trimmed().split('\n'); - foreach (const QByteArray &line, lines) { - if (line.contains("(NEEDED)") && line.contains("Shared library:") ) { - const int pos = line.lastIndexOf('[') + 1; - libs << QString::fromLatin1(line.mid(pos, line.lastIndexOf(']') - pos)); + bool modified = false; + bool comment = false; + for (int i = 0; i < lines.size(); i++) { + if (lines[i].contains("@ANDROID-")) { + commentLines = targetSDKNumber < lines[i].mid(lines[i].lastIndexOf('-') + 1).toInt(); + comment = !comment; + continue; + } + if (!comment) + continue; + if (commentLines) { + if (!lines[i].trimmed().startsWith("//QtCreator")) { + lines[i] = "//QtCreator " + lines[i]; + modified = true; + } + } else { if (lines[i].trimmed().startsWith("//QtCreator")) { + lines[i] = lines[i].mid(12); + modified = true; + } + } } + if (modified) { + file.resize(0); + foreach (const QByteArray &line, lines) { + file.write(line); + file.write("\n"); + } + } + file.close(); } - return libs; + + QStringList params; + params << QLatin1String("update") << QLatin1String("project") << QLatin1String("-p") << androidDir; + if (!targetSDK.isEmpty()) + params << QLatin1String("-t") << targetSDK; + if (!name.isEmpty()) + params << QLatin1String("-n") << name; + androidProc.start(AndroidConfigurations::instance().androidToolPath().toString(), params); + if (!androidProc.waitForFinished(-1)) + androidProc.terminate(); } -int AndroidTarget::setLibraryLevel(const QString &library, LibrariesMap &mapLibs) const +Utils::FileName AndroidManager::localLibsRulesFilePath(ProjectExplorer::Target *target) { - int maxlevel = mapLibs[library].level; - if (maxlevel > 0) - return maxlevel; - foreach (QString lib, mapLibs[library].dependencies) { - foreach (const QString &key, mapLibs.keys()) { - if (library == key) - continue; - if (key == lib) { - int libLevel = mapLibs[key].level; - - if (libLevel < 0) - libLevel = setLibraryLevel(key, mapLibs); + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(target->profile()); + if (!version) + return Utils::FileName(); + return Utils::FileName::fromString(version->versionInfo()[QLatin1String("QT_INSTALL_LIBS")] + QLatin1String("/rules.xml")); +} - if (libLevel > maxlevel) - maxlevel = libLevel; - break; - } - } - } - if (mapLibs[library].level < 0) - mapLibs[library].level = maxlevel + 1; - return maxlevel + 1; +QString AndroidManager::loadLocalLibs(ProjectExplorer::Target *target, int apiLevel) +{ + return loadLocal(target, apiLevel, Lib); } -bool AndroidTarget::qtLibrariesLessThan(const Library &a, const Library &b) +QString AndroidManager::loadLocalJars(ProjectExplorer::Target *target, int apiLevel) { - if (a.level == b.level) - return a.name < b.name; - return a.level < b.level; + return loadLocal(target, apiLevel, Jar); } -QStringList AndroidTarget::availableQtLibs() const +QStringList AndroidManager::availableQtLibs(ProjectExplorer::Target *target) { - const QString readelfPath = AndroidConfigurations::instance().readelfPath(activeRunConfiguration()->abi().architecture()); + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(target->profile()); + if (!target->activeRunConfiguration()) + return QStringList(); + + Utils::FileName readelfPath = AndroidConfigurations::instance().readelfPath(target->activeRunConfiguration()->abi().architecture()); QStringList libs; - const Qt4Project *const qt4Project = qobject_cast<const Qt4Project *>(project()); - if (!qt4Project || !qt4Project->activeTarget()->activeQt4BuildConfiguration()->qtVersion()) + const Qt4ProjectManager::Qt4Project *const qt4Project + = qobject_cast<const Qt4ProjectManager::Qt4Project *>(target->project()); + if (!qt4Project || !version) return libs; - QString qtLibsPath = qt4Project->activeTarget()->activeQt4BuildConfiguration()->qtVersion()->versionInfo()[QLatin1String("QT_INSTALL_LIBS")]; - if (!QFile::exists(readelfPath)) { + QString qtLibsPath = version->versionInfo()[QLatin1String("QT_INSTALL_LIBS")]; + if (!readelfPath.toFileInfo().exists()) { QDirIterator libsIt(qtLibsPath, QStringList() << QLatin1String("libQt*.so")); while (libsIt.hasNext()) { libsIt.next(); @@ -787,7 +602,7 @@ QStringList AndroidTarget::availableQtLibs() const while (it.hasNext()) { libPath = it.next(); const QString library = libPath.absolutePath().mid(libPath.absolutePath().lastIndexOf(QLatin1Char('/')) + 1); - mapLibs[library].dependencies = getDependencies(readelfPath, libPath.absolutePath()); + mapLibs[library].dependencies = dependencies(readelfPath, libPath.absolutePath()); } // clean dependencies @@ -828,40 +643,169 @@ QStringList AndroidTarget::availableQtLibs() const return libs; } -QIcon AndroidTarget::androidIcon(AndroidIconType type) const +QStringList AndroidManager::qtLibs(ProjectExplorer::Target *target) { - switch (type) { - case HighDPI: - return QIcon(androidDirPath() + QLatin1String("/res/drawable-hdpi/icon.png")); - case MediumDPI: - return QIcon(androidDirPath() + QLatin1String("/res/drawable-mdpi/icon.png")); - case LowDPI: - return QIcon(androidDirPath() + QLatin1String("/res/drawable-ldpi/icon.png")); + return libsXml(target, QLatin1String("qt_libs")); +} + +bool AndroidManager::setQtLibs(ProjectExplorer::Target *target, const QStringList &libs) +{ + return setLibsXml(target, libs, QLatin1String("qt_libs")); +} + +QStringList AndroidManager::availablePrebundledLibs(ProjectExplorer::Target *target) +{ + QStringList libs; + Qt4ProjectManager::Qt4Project *qt4Project = qobject_cast<Qt4ProjectManager::Qt4Project *>(target->project()); + if (!qt4Project) + return libs; + + foreach (Qt4ProjectManager::Qt4ProFileNode *node, qt4Project->allProFiles()) + if (node->projectType() == Qt4ProjectManager::LibraryTemplate) + libs << QLatin1String("lib") + node->targetInformation().target + QLatin1String(".so"); + return libs; +} + +QStringList AndroidManager::prebundledLibs(ProjectExplorer::Target *target) +{ + return libsXml(target, QLatin1String("bundled_libs")); +} + +bool AndroidManager::setPrebundledLibs(ProjectExplorer::Target *target, const QStringList &libs) +{ + return setLibsXml(target, libs, QLatin1String("bundled_libs")); +} + +bool AndroidManager::openLibsXml(ProjectExplorer::Target *target, QDomDocument &doc) +{ + return openXmlFile(target, doc, libsPath(target)); +} + +bool AndroidManager::saveLibsXml(ProjectExplorer::Target *target, QDomDocument &doc) +{ + return saveXmlFile(target, doc, libsPath(target)); +} + +AndroidManager::AndroidManager(QObject *parent) : + QObject(parent) +{ + m_instance = this; + +// ProjectExplorer::SessionManager *sm = ProjectExplorerPlugin::instance()->session(); +// connect(sm, SIGNAL(projectAdded(ProjectExplorer::Project*)), +// this, SLOT(handleProjectAdditions(ProjectExplorer::Project*))); +} + +void AndroidManager::raiseError(const QString &reason) +{ + QMessageBox::critical(0, tr("Error creating Android templates"), reason); +} + +QString AndroidManager::loadLocal(ProjectExplorer::Target *target, int apiLevel, ItemType item) +{ + QString itemType; + if (item == Lib) + itemType = QLatin1String("lib"); + else + itemType = QLatin1String("jar"); + + QString localLibs; + + QDomDocument doc; + if (!openXmlFile(target, doc, localLibsRulesFilePath(target))) + return localLibs; + + QStringList libs; + libs << qtLibs(target) << prebundledLibs(target); + QDomElement element = doc.documentElement().firstChildElement(QLatin1String("platforms")).firstChildElement(itemType + QLatin1Char('s')).firstChildElement(QLatin1String("version")); + while (!element.isNull()) { + if (element.attribute(QLatin1String("value")).toInt() == apiLevel) { + if (element.hasAttribute(QLatin1String("symlink"))) + apiLevel = element.attribute(QLatin1String("symlink")).toInt(); + break; + } + element = element.nextSiblingElement(QLatin1String("version")); } - return QIcon(); + + element = doc.documentElement().firstChildElement(QLatin1String("dependencies")).firstChildElement(QLatin1String("lib")); + while (!element.isNull()) { + if (libs.contains(element.attribute(QLatin1String("name")))) { + QDomElement libElement = element.firstChildElement(QLatin1String("depends")).firstChildElement(itemType); + while (!libElement.isNull()) { + localLibs += libElement.attribute(QLatin1String("file")).arg(apiLevel) + QLatin1Char(':'); + libElement = libElement.nextSiblingElement(itemType); + } + + libElement = element.firstChildElement(QLatin1String("replaces")).firstChildElement(itemType); + while (!libElement.isNull()) { + localLibs.replace(libElement.attribute(QLatin1String("file")).arg(apiLevel) + QLatin1Char(':'), QString()); + libElement = libElement.nextSiblingElement(itemType); + } + } + element = element.nextSiblingElement(QLatin1String("lib")); + } + return localLibs; +} + +bool AndroidManager::openXmlFile(ProjectExplorer::Target *target, QDomDocument &doc, + const Utils::FileName &fileName, bool createAndroidTemplates) +{ + if (createAndroidTemplates && !createAndroidTemplatesIfNecessary(target)) + return false; + + QFile f(fileName.toString()); + if (!f.open(QIODevice::ReadOnly)) + return false; + + if (!doc.setContent(f.readAll())) { + raiseError(tr("Can't parse '%1'").arg(fileName.toUserOutput())); + return false; + } + return true; } -bool AndroidTarget::setAndroidIcon(AndroidIconType type, const QString &iconFileName) const +bool AndroidManager::saveXmlFile(ProjectExplorer::Target *target, QDomDocument &doc, const Utils::FileName &fileName) +{ + if (!createAndroidTemplatesIfNecessary(target)) + return false; + + QFile f(fileName.toString()); + if (!f.open(QIODevice::WriteOnly)) { + raiseError(tr("Can't open '%1'").arg(fileName.toUserOutput())); + return false; + } + return f.write(doc.toByteArray(4)) >= 0; +} + +bool AndroidManager::openManifest(ProjectExplorer::Target *target, QDomDocument &doc) +{ + return openXmlFile(target, doc, manifestPath(target)); +} + +bool AndroidManager::saveManifest(ProjectExplorer::Target *target, QDomDocument &doc) +{ + return saveXmlFile(target, doc, manifestPath(target)); +} + +QString AndroidManager::iconPath(ProjectExplorer::Target *target, AndroidManager::IconType type) { switch (type) { case HighDPI: - QFile::remove(androidDirPath() + QLatin1String("/res/drawable-hdpi/icon.png")); - return QFile::copy(iconFileName, androidDirPath() + QLatin1String("/res/drawable-hdpi/icon.png")); + return dirPath(target).appendPath(QLatin1String("res/drawable-hdpi/icon.png")).toString(); case MediumDPI: - QFile::remove(androidDirPath() + QLatin1String("/res/drawable-mdpi/icon.png")); - return QFile::copy(iconFileName, androidDirPath() + QLatin1String("/res/drawable-mdpi/icon.png")); + return dirPath(target).appendPath(QLatin1String("res/drawable-mdpi/icon.png")).toString(); case LowDPI: - QFile::remove(androidDirPath() + QLatin1String("/res/drawable-ldpi/icon.png")); - return QFile::copy(iconFileName, androidDirPath() + QLatin1String("/res/drawable-ldpi/icon.png")); + return dirPath(target).appendPath(QLatin1String("res/drawable-ldpi/icon.png")).toString(); + default: + return QString(); } - return false; } -QStringList AndroidTarget::libsXml(const QString &tag) const +QStringList AndroidManager::libsXml(ProjectExplorer::Target *target, const QString &tag) { QStringList libs; QDomDocument doc; - if (!openLibsXml(doc)) + if (!openLibsXml(target, doc)) return libs; QDomElement arrayElem = doc.documentElement().firstChildElement(QLatin1String("array")); while (!arrayElem.isNull()) { @@ -878,10 +822,10 @@ QStringList AndroidTarget::libsXml(const QString &tag) const return libs; } -bool AndroidTarget::setLibsXml(const QStringList &libs, const QString &tag) const +bool AndroidManager::setLibsXml(ProjectExplorer::Target *target, const QStringList &libs, const QString &tag) { QDomDocument doc; - if (!openLibsXml(doc)) + if (!openLibsXml(target, doc)) return false; QDomElement arrayElem = doc.documentElement().firstChildElement(QLatin1String("array")); while (!arrayElem.isNull()) { @@ -895,105 +839,83 @@ bool AndroidTarget::setLibsXml(const QStringList &libs, const QString &tag) cons arrayElem.appendChild(item); } doc.documentElement().appendChild(arrayElem); - return saveLibsXml(doc); + return saveLibsXml(target, doc); } arrayElem = arrayElem.nextSiblingElement(QLatin1String("array")); } return false; } -QStringList AndroidTarget::qtLibs() const -{ - return libsXml(QLatin1String("qt_libs")); -} - -bool AndroidTarget::setQtLibs(const QStringList &libs) const -{ - return setLibsXml(libs, QLatin1String("qt_libs")); -} - -QStringList AndroidTarget::availablePrebundledLibs() const -{ - QStringList libs; - Qt4Project *qt4Project = qobject_cast<Qt4Project *>(project()); - QList<Qt4Project *> qt4Projects; - qt4Projects << qt4Project; - foreach (Qt4Project *qt4Project, qt4Projects) - foreach (Qt4ProFileNode *node, qt4Project->allProFiles()) - if (node->projectType() == LibraryTemplate) - libs << QLatin1String("lib") + node->targetInformation().target + QLatin1String(".so"); - - return libs; -} - -QStringList AndroidTarget::prebundledLibs() const +QIcon AndroidManager::icon(ProjectExplorer::Target *target, IconType type) { - return libsXml(QLatin1String("bundled_libs")); + return QIcon(iconPath(target, type)); } -bool AndroidTarget::setPrebundledLibs(const QStringList &libs) const +bool AndroidManager::setIcon(ProjectExplorer::Target *target, IconType type, const QString &iconFileName) { + if (!QFileInfo(iconFileName).exists()) + return false; - return setLibsXml(libs, QLatin1String("bundled_libs")); + const QString path = iconPath(target, type); + QFile::remove(path); + return QFile::copy(iconFileName, path); } -QIcon AndroidTarget::highDpiIcon() const +QStringList AndroidManager::dependencies(const Utils::FileName &readelfPath, const QString &lib) { - return androidIcon(HighDPI); -} + QStringList libs; -bool AndroidTarget::setHighDpiIcon(const QString &iconFilePath) const -{ - return setAndroidIcon(HighDPI, iconFilePath); -} + QProcess readelfProc; + readelfProc.start(readelfPath.toString(), QStringList() << QLatin1String("-d") << QLatin1String("-W") << lib); -QIcon AndroidTarget::mediumDpiIcon() const -{ - return androidIcon(MediumDPI); -} + if (!readelfProc.waitForFinished(-1)) { + readelfProc.terminate(); + return libs; + } -bool AndroidTarget::setMediumDpiIcon(const QString &iconFilePath) const -{ - return setAndroidIcon(MediumDPI, iconFilePath); + QList<QByteArray> lines = readelfProc.readAll().trimmed().split('\n'); + foreach (const QByteArray &line, lines) { + if (line.contains("(NEEDED)") && line.contains("Shared library:") ) { + const int pos = line.lastIndexOf('[') + 1; + libs << QString::fromLatin1(line.mid(pos, line.lastIndexOf(']') - pos)); + } + } + return libs; } -QIcon AndroidTarget::lowDpiIcon() const +int AndroidManager::setLibraryLevel(const QString &library, LibrariesMap &mapLibs) { - return androidIcon(LowDPI); -} + int maxlevel = mapLibs[library].level; + if (maxlevel > 0) + return maxlevel; + foreach (QString lib, mapLibs[library].dependencies) { + foreach (const QString &key, mapLibs.keys()) { + if (library == key) + continue; + if (key == lib) { + int libLevel = mapLibs[key].level; -bool AndroidTarget::setLowDpiIcon(const QString &iconFilePath) const -{ - return setAndroidIcon(LowDPI, iconFilePath); -} + if (libLevel < 0) + libLevel = setLibraryLevel(key, mapLibs); -QString AndroidTarget::targetSDK() const -{ - if (!createAndroidTemplatesIfNecessary()) - return AndroidConfigurations::instance().bestMatch(QLatin1String("android-8")); - QFile file(androidDefaultPropertiesPath()); - if (!file.open(QIODevice::ReadOnly)) - return AndroidConfigurations::instance().bestMatch(QLatin1String("android-8")); - while (!file.atEnd()) { - QByteArray line = file.readLine(); - if (line.startsWith("target=")) - return QString::fromLatin1(line.trimmed().mid(7)); + if (libLevel > maxlevel) + maxlevel = libLevel; + break; + } + } } - return AndroidConfigurations::instance().bestMatch(QLatin1String("android-8")); -} - -bool AndroidTarget::setTargetSDK(const QString &target) const -{ - updateProject(target, applicationName()); - return true; + if (mapLibs[library].level < 0) + mapLibs[library].level = maxlevel + 1; + return maxlevel + 1; } -void AndroidTarget::raiseError(const QString &reason) const +bool AndroidManager::qtLibrariesLessThan(const Library &a, const Library &b) { - QMessageBox::critical(0, tr("Error creating Android templates"), reason); + if (a.level == b.level) + return a.name < b.name; + return a.level < b.level; } - } // namespace Internal } // namespace Qt4ProjectManager diff --git a/src/plugins/android/androidmanager.h b/src/plugins/android/androidmanager.h new file mode 100644 index 0000000000..6c99b32563 --- /dev/null +++ b/src/plugins/android/androidmanager.h @@ -0,0 +1,177 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2012 BogDan Vatra <bog_dan_ro@yahoo.com> +** +** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. +** +**************************************************************************/ + +#ifndef ANDROIDMANAGER_H +#define ANDROIDMANAGER_H + +#include <utils/fileutils.h> + +#include <QDomDocument> +#include <QObject> +#include <QStringList> + +namespace ProjectExplorer { class Target; } + +namespace Android { +class AndroidPlugin; + +namespace Internal { + +class AndroidManager : public QObject +{ + Q_OBJECT + +public: + enum BuildType + { + DebugBuild, + ReleaseBuildUnsigned, + ReleaseBuildSigned + }; + + static AndroidManager *instance(); + + ~AndroidManager(); + + static bool supportsAndroid(ProjectExplorer::Target *target); + + static QString packageName(ProjectExplorer::Target *target); + static bool setPackageName(ProjectExplorer::Target *target, const QString &name); + + static QString applicationName(ProjectExplorer::Target *target); + static bool setApplicationName(ProjectExplorer::Target *target, const QString &name); + + static QStringList permissions(ProjectExplorer::Target *target); + static bool setPermissions(ProjectExplorer::Target *target, const QStringList &permissions); + + static QString intentName(ProjectExplorer::Target *target); + static QString activityName(ProjectExplorer::Target *target); + + static int versionCode(ProjectExplorer::Target *target); + static bool setVersionCode(ProjectExplorer::Target *target, int version); + static QString versionName(ProjectExplorer::Target *target); + static bool setVersionName(ProjectExplorer::Target *target, const QString &version); + + static QIcon highDpiIcon(ProjectExplorer::Target *target); + static bool setHighDpiIcon(ProjectExplorer::Target *target, const QString &iconFilePath); + static QIcon mediumDpiIcon(ProjectExplorer::Target *target); + static bool setMediumDpiIcon(ProjectExplorer::Target *target, const QString &iconFilePath); + static QIcon lowDpiIcon(ProjectExplorer::Target *target); + static bool setLowDpiIcon(ProjectExplorer::Target *target, const QString &iconFilePath); + + static QStringList availableTargetApplications(ProjectExplorer::Target *target); + static QString targetApplication(ProjectExplorer::Target *target); + static bool setTargetApplication(ProjectExplorer::Target *target, const QString &name); + static QString targetApplicationPath(ProjectExplorer::Target *target); + + static QString targetSDK(ProjectExplorer::Target *target); + static bool setTargetSDK(ProjectExplorer::Target *target, const QString &sdk); + + static Utils::FileName dirPath(ProjectExplorer::Target *target); + static Utils::FileName manifestPath(ProjectExplorer::Target *target); + static Utils::FileName libsPath(ProjectExplorer::Target *target); + static Utils::FileName stringsPath(ProjectExplorer::Target *target); + static Utils::FileName defaultPropertiesPath(ProjectExplorer::Target *target); + static Utils::FileName srcPath(ProjectExplorer::Target *target); + static Utils::FileName apkPath(ProjectExplorer::Target *target, BuildType buildType); + + static bool createAndroidTemplatesIfNecessary(ProjectExplorer::Target *target); + static void updateTarget(ProjectExplorer::Target *target, const QString &targetSDK, + const QString &name = QString()); + + static Utils::FileName localLibsRulesFilePath(ProjectExplorer::Target *target); + static QString loadLocalLibs(ProjectExplorer::Target *target, int apiLevel); + static QString loadLocalJars(ProjectExplorer::Target *target, int apiLevel); + + static QStringList availableQtLibs(ProjectExplorer::Target *target); + static QStringList qtLibs(ProjectExplorer::Target *target); + static bool setQtLibs(ProjectExplorer::Target *target, const QStringList &libs); + + static QStringList availablePrebundledLibs(ProjectExplorer::Target *target); + static QStringList prebundledLibs(ProjectExplorer::Target *target); + static bool setPrebundledLibs(ProjectExplorer::Target *target, const QStringList &libs); + +private: + explicit AndroidManager(QObject *parent = 0); + + static void raiseError(const QString &reason); + static bool openXmlFile(ProjectExplorer::Target *target, QDomDocument &doc, + const Utils::FileName &fileName, bool createAndroidTemplates = false); + static bool saveXmlFile(ProjectExplorer::Target *target, QDomDocument &doc, const Utils::FileName &fileName); + static bool openManifest(ProjectExplorer::Target *target, QDomDocument &doc); + static bool saveManifest(ProjectExplorer::Target *target, QDomDocument &doc); + static bool openLibsXml(ProjectExplorer::Target *target, QDomDocument &doc); + static bool saveLibsXml(ProjectExplorer::Target *target, QDomDocument &doc); + static QStringList libsXml(ProjectExplorer::Target *target, const QString &tag); + static bool setLibsXml(ProjectExplorer::Target *target, const QStringList &libs, const QString &tag); + + enum ItemType + { + Lib, + Jar + }; + static QString loadLocal(ProjectExplorer::Target *target, int apiLevel, ItemType item); + + class Library + { + public: + Library() + { level = -1; } + int level; + QStringList dependencies; + QString name; + }; + typedef QMap<QString, Library> LibrariesMap; + + enum IconType + { + HighDPI, + MediumDPI, + LowDPI + }; + static QString iconPath(ProjectExplorer::Target *target, IconType type); + static QIcon icon(ProjectExplorer::Target *target, IconType type); + static bool setIcon(ProjectExplorer::Target *target, IconType type, const QString &iconFileName); + + static QStringList dependencies(const Utils::FileName &readelfPath, const QString &lib); + static int setLibraryLevel(const QString &library, LibrariesMap &mapLibs); + static bool qtLibrariesLessThan(const Library &a, const Library &b); + + static AndroidManager *m_instance; + + friend class Android::AndroidPlugin; +}; + +} // namespace Internal +} // namespace Android + +#endif // ANDROIDMANAGER_H diff --git a/src/plugins/android/androidpackagecreationfactory.cpp b/src/plugins/android/androidpackagecreationfactory.cpp index 7b3429cf72..019b258243 100644 --- a/src/plugins/android/androidpackagecreationfactory.cpp +++ b/src/plugins/android/androidpackagecreationfactory.cpp @@ -33,11 +33,14 @@ #include "androidpackagecreationfactory.h" #include "androidpackagecreationstep.h" +#include "androidmanager.h" #include <projectexplorer/buildsteplist.h> #include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/target.h> #include <qt4projectmanager/qt4projectmanagerconstants.h> +#include <qtsupport/qtprofileinformation.h> +#include <qtsupport/qtsupportconstants.h> #include <QCoreApplication> @@ -54,11 +57,13 @@ AndroidPackageCreationFactory::AndroidPackageCreationFactory(QObject *parent) QList<Core::Id> AndroidPackageCreationFactory::availableCreationIds(ProjectExplorer::BuildStepList *parent) const { - if (parent->id() == Core::Id(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY) - && parent->target()->id() == Core::Id(Qt4ProjectManager::Constants::ANDROID_DEVICE_TARGET_ID) - && !parent->contains(AndroidPackageCreationStep::CreatePackageId)) - return QList<Core::Id>() << AndroidPackageCreationStep::CreatePackageId; - return QList<Core::Id>(); + if (parent->id() != Core::Id(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY)) + return QList<Core::Id>(); + if (!AndroidManager::supportsAndroid(parent->target())) + return QList<Core::Id>(); + if (parent->contains(AndroidPackageCreationStep::CreatePackageId)) + return QList<Core::Id>(); + return QList<Core::Id>() << AndroidPackageCreationStep::CreatePackageId; } QString AndroidPackageCreationFactory::displayNameForId(const Core::Id id) const @@ -71,10 +76,7 @@ QString AndroidPackageCreationFactory::displayNameForId(const Core::Id id) const bool AndroidPackageCreationFactory::canCreate(ProjectExplorer::BuildStepList *parent, const Core::Id id) const { - return parent->id() == Core::Id(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY) - && id == Core::Id(AndroidPackageCreationStep::CreatePackageId) - && parent->target()->id() == Core::Id(Qt4ProjectManager::Constants::ANDROID_DEVICE_TARGET_ID) - && !parent->contains(AndroidPackageCreationStep::CreatePackageId); + return availableCreationIds(parent).contains(id); } BuildStep *AndroidPackageCreationFactory::create(ProjectExplorer::BuildStepList *parent, const Core::Id id) diff --git a/src/plugins/android/androidpackagecreationstep.cpp b/src/plugins/android/androidpackagecreationstep.cpp index f42a4e834f..dccfe9423b 100644 --- a/src/plugins/android/androidpackagecreationstep.cpp +++ b/src/plugins/android/androidpackagecreationstep.cpp @@ -36,15 +36,15 @@ #include "androiddeploystep.h" #include "androidglobal.h" #include "androidpackagecreationwidget.h" -#include "androidtarget.h" +#include "androidmanager.h" #include <projectexplorer/buildsteplist.h> #include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/runconfiguration.h> +#include <projectexplorer/target.h> #include <qt4projectmanager/qt4buildconfiguration.h> #include <qt4projectmanager/qt4project.h> #include <qt4projectmanager/qt4nodes.h> -#include <qt4projectmanager/qt4target.h> #include <coreplugin/icore.h> #include <coreplugin/fileutils.h> @@ -142,35 +142,35 @@ void AndroidPackageCreationStep::ctor() bool AndroidPackageCreationStep::init() { - AndroidTarget *target = androidTarget(); - const Qt4BuildConfiguration *bc = target->activeQt4BuildConfiguration(); - if (!target) { - raiseError(tr("Cannot create android package: current target is not android.")); + const Qt4BuildConfiguration *bc = qobject_cast<Qt4BuildConfiguration *>(target()->activeBuildConfiguration()); + if (!bc) { + raiseError(tr("Cannot create android package: current build configuration is not Qt4.")); return false; } - m_outputParser.setProjectFileList(target->qt4Project()->files(Project::AllFiles)); + Qt4Project *project = static_cast<Qt4Project *>(target()->project()); + m_outputParser.setProjectFileList(project->files(Project::AllFiles)); // Copying - m_androidDir = target->androidDirPath(); - QString androidLibPath; - if (target->qt4Project()->rootQt4ProjectNode()->variableValue(Qt4ProjectManager::ConfigVar).contains(QLatin1String("x86"))) - androidLibPath = m_androidDir + QLatin1String("/libs/x86"); - else if (target->qt4Project()->rootQt4ProjectNode() + m_androidDir = AndroidManager::dirPath(target()); + Utils::FileName androidLibPath; + if (project->rootQt4ProjectNode()->variableValue(Qt4ProjectManager::ConfigVar).contains(QLatin1String("x86"))) + androidLibPath = m_androidDir.appendPath(QLatin1String("libs/x86")); + else if (project->rootQt4ProjectNode() ->variableValue(Qt4ProjectManager::ConfigVar).contains(QLatin1String("armeabi-v7a"))) - androidLibPath = m_androidDir + QLatin1String("/libs/armeabi-v7a"); + androidLibPath = m_androidDir.appendPath(QLatin1String("libs/armeabi-v7a")); else - androidLibPath = m_androidDir + QLatin1String("/libs/armeabi"); - m_gdbServerDestination = androidLibPath + QLatin1String("/gdbserver"); - m_gdbServerSource = AndroidConfigurations::instance().gdbServerPath(target->activeRunConfiguration()->abi().architecture()); + androidLibPath = m_androidDir.appendPath(QLatin1String("libs/armeabi")); + m_gdbServerDestination = androidLibPath.appendPath(QLatin1String("gdbserver")); + m_gdbServerSource = AndroidConfigurations::instance().gdbServerPath(target()->activeRunConfiguration()->abi().architecture()); m_debugBuild = bc->qmakeBuildConfiguration() & QtSupport::BaseQtVersion::DebugBuild; - if (!target->createAndroidTemplatesIfNecessary()) + if (!AndroidManager::createAndroidTemplatesIfNecessary(target())) return false; - target->updateProject(target->targetSDK(), target->applicationName()); + AndroidManager::updateTarget(target(), AndroidManager::targetSDK(target()), AndroidManager::applicationName(target())); m_antToolPath = AndroidConfigurations::instance().antToolPath(); - m_apkPathUnsigned = target->apkPath(AndroidTarget::ReleaseBuildUnsigned); - m_apkPathSigned = target->apkPath(AndroidTarget::ReleaseBuildSigned); + m_apkPathUnsigned = AndroidManager::apkPath(target(), AndroidManager::ReleaseBuildUnsigned); + m_apkPathSigned = AndroidManager::apkPath(target(), AndroidManager::ReleaseBuildSigned); m_keystorePathForRun = m_keystorePath; m_certificatePasswdForRun = m_certificatePasswd; m_jarSigner = AndroidConfigurations::instance().jarsignerPath(); @@ -188,15 +188,10 @@ BuildStepConfigWidget *AndroidPackageCreationStep::createConfigWidget() return new AndroidPackageCreationWidget(this); } -AndroidTarget *AndroidPackageCreationStep::androidTarget() const -{ - return qobject_cast<AndroidTarget *>(target()); -} - void AndroidPackageCreationStep::checkRequiredLibraries() { QProcess readelfProc; - QString appPath = androidTarget()->targetApplicationPath(); + QString appPath = AndroidManager::targetApplicationPath(target()); if (!QFile::exists(appPath)) { raiseError(tr("Cannot find read elf information"), tr("Cannot find '%1'.\n" @@ -204,7 +199,7 @@ void AndroidPackageCreationStep::checkRequiredLibraries() "built successfully and is selected in Application tab ('Run option') ").arg(appPath)); return; } - readelfProc.start(AndroidConfigurations::instance().readelfPath(androidTarget()->activeRunConfiguration()->abi().architecture()), + readelfProc.start(AndroidConfigurations::instance().readelfPath(target()->activeRunConfiguration()->abi().architecture()).toString(), QStringList() << QLatin1String("-d") << QLatin1String("-W") << appPath); if (!readelfProc.waitForFinished(-1)) { readelfProc.terminate(); @@ -218,44 +213,44 @@ void AndroidPackageCreationStep::checkRequiredLibraries() libs << QString::fromLatin1(line.mid(pos, line.length() - pos - 1)); } } - QStringList checkedLibs = androidTarget()->qtLibs(); + QStringList checkedLibs = AndroidManager::qtLibs(target()); QStringList requiredLibraries; - foreach (const QString &qtLib, androidTarget()->availableQtLibs()) { + foreach (const QString &qtLib, AndroidManager::availableQtLibs(target())) { if (libs.contains(QLatin1String("lib") + qtLib + QLatin1String(".so")) || checkedLibs.contains(qtLib)) requiredLibraries << qtLib; } - androidTarget()->setQtLibs(requiredLibraries); + AndroidManager::setQtLibs(target(), requiredLibraries); - checkedLibs = androidTarget()->prebundledLibs(); + checkedLibs = AndroidManager::prebundledLibs(target()); requiredLibraries.clear(); - foreach (const QString &qtLib, androidTarget()->availableQtLibs()) { + foreach (const QString &qtLib, AndroidManager::availableQtLibs(target())) { if (libs.contains(qtLib) || checkedLibs.contains(qtLib)) requiredLibraries << qtLib; } - androidTarget()->setPrebundledLibs(requiredLibraries); + AndroidManager::setPrebundledLibs(target(), requiredLibraries); emit updateRequiredLibrariesModels(); } void AndroidPackageCreationStep::initCheckRequiredLibrariesForRun() { - m_appPath = androidTarget()->targetApplicationPath(); - m_readElf = AndroidConfigurations::instance().readelfPath(androidTarget()->activeRunConfiguration()->abi().architecture()); - m_qtLibs = androidTarget()->qtLibs(); - m_availableQtLibs = androidTarget()->availableQtLibs(); - m_prebundledLibs = androidTarget()->prebundledLibs(); + m_appPath = Utils::FileName::fromString(AndroidManager::targetApplicationPath(target())); + m_readElf = AndroidConfigurations::instance().readelfPath(target()->activeRunConfiguration()->abi().architecture()); + m_qtLibs = AndroidManager::qtLibs(target()); + m_availableQtLibs = AndroidManager::availableQtLibs(target()); + m_prebundledLibs = AndroidManager::prebundledLibs(target()); } void AndroidPackageCreationStep::checkRequiredLibrariesForRun() { QProcess readelfProc; - if (!QFile::exists(m_appPath)) { - raiseError(tr("Cannot find read elf information"), + if (!m_appPath.toFileInfo().exists()) { + raiseError(tr("Can't find read elf information"), tr("Can't find '%1'.\n" "Please make sure your application is " - "built successfully and is selected in Application tab ('Run option') ").arg(m_appPath)); + "built successfully and is selected in Application tab ('Run option') ").arg(m_appPath.toUserOutput())); return; } - readelfProc.start(m_readElf, QStringList() << QLatin1String("-d") << QLatin1String("-W") << m_appPath); + readelfProc.start(m_readElf.toString(), QStringList() << QLatin1String("-d") << QLatin1String("-W") << m_appPath.toUserOutput()); if (!readelfProc.waitForFinished(-1)) { readelfProc.terminate(); return; @@ -290,20 +285,20 @@ void AndroidPackageCreationStep::checkRequiredLibrariesForRun() void AndroidPackageCreationStep::setQtLibs(const QStringList &qtLibs) { - androidTarget()->setQtLibs(qtLibs); + AndroidManager::setQtLibs(target(), qtLibs); } void AndroidPackageCreationStep::setPrebundledLibs(const QStringList &prebundledLibs) { - androidTarget()->setPrebundledLibs(prebundledLibs); + AndroidManager::setPrebundledLibs(target(), prebundledLibs); } -QString AndroidPackageCreationStep::keystorePath() +Utils::FileName AndroidPackageCreationStep::keystorePath() { return m_keystorePath; } -void AndroidPackageCreationStep::setKeystorePath(const QString &path) +void AndroidPackageCreationStep::setKeystorePath(const Utils::FileName &path) { m_keystorePath = path; m_certificatePasswd.clear(); @@ -336,13 +331,13 @@ QAbstractItemModel *AndroidPackageCreationStep::keystoreCertificates() QProcess keytoolProc; while (!rawCerts.length() || !m_keystorePasswd.length()) { QStringList params; - params << QLatin1String("-list") << QLatin1String("-v") << QLatin1String("-keystore") << m_keystorePathForRun << QLatin1String("-storepass"); + params << QLatin1String("-list") << QLatin1String("-v") << QLatin1String("-keystore") << m_keystorePathForRun.toUserOutput() << QLatin1String("-storepass"); if (!m_keystorePasswd.length()) keystorePassword(); if (!m_keystorePasswd.length()) return 0; params << m_keystorePasswd; - keytoolProc.start(AndroidConfigurations::instance().keytoolPath(), params); + keytoolProc.start(AndroidConfigurations::instance().keytoolPath().toString(), params); if (!keytoolProc.waitForStarted() || !keytoolProc.waitForFinished()) { QMessageBox::critical(0, tr("Error"), tr("Failed to run keytool")); @@ -363,14 +358,14 @@ bool AndroidPackageCreationStep::fromMap(const QVariantMap &map) { if (!BuildStep::fromMap(map)) return false; - m_keystorePath = map.value(KeystoreLocationKey).toString(); + m_keystorePath = Utils::FileName::fromString(map.value(KeystoreLocationKey).toString()); return true; } QVariantMap AndroidPackageCreationStep::toMap() const { QVariantMap map(BuildStep::toMap()); - map.insert(KeystoreLocationKey, m_keystorePath); + map.insert(KeystoreLocationKey, m_keystorePath.toString()); return map; } @@ -382,12 +377,12 @@ bool AndroidPackageCreationStep::createPackage() QStringList build; build << QLatin1String("clean"); - QFile::remove(m_gdbServerDestination); + QFile::remove(m_gdbServerDestination.toString()); if (m_debugBuild || !m_certificateAlias.length()) { build << QLatin1String("debug"); - if (!QFile::copy(m_gdbServerSource, m_gdbServerDestination)) { - raiseError(tr("Cannot copy gdbserver from '%1' to '%2'").arg(m_gdbServerSource) - .arg(m_gdbServerDestination)); + if (!QFile::copy(m_gdbServerSource.toString(), m_gdbServerDestination.toString())) { + raiseError(tr("Can't copy gdbserver from '%1' to '%2'").arg(m_gdbServerSource.toUserOutput()) + .arg(m_gdbServerDestination.toUserOutput())); return false; } } else { @@ -403,9 +398,9 @@ bool AndroidPackageCreationStep::createPackage() connect(buildProc, SIGNAL(readyReadStandardError()), this, SLOT(handleBuildStdErrOutput())); - buildProc->setWorkingDirectory(m_androidDir); + buildProc->setWorkingDirectory(m_androidDir.toString()); - if (!runCommand(buildProc, m_antToolPath, build)) { + if (!runCommand(buildProc, m_antToolPath.toString(), build)) { disconnect(buildProc, 0, this, 0); buildProc->deleteLater(); return false; @@ -425,11 +420,11 @@ bool AndroidPackageCreationStep::createPackage() QByteArray keyPass = m_certificatePasswdForRun.toUtf8(); build.clear(); - build << QLatin1String("-verbose") << QLatin1String("-keystore") << m_keystorePathForRun + build << QLatin1String("-verbose") << QLatin1String("-keystore") << m_keystorePathForRun.toUserOutput() << QLatin1String("-storepass") << m_keystorePasswd - << m_apkPathUnsigned + << m_apkPathUnsigned.toUserOutput() << m_certificateAlias; - buildProc->start(m_jarSigner, build); //TODO + buildProc->start(m_jarSigner.toString(), build); //TODO if (!buildProc->waitForStarted()) { disconnect(buildProc, 0, this, 0); buildProc->deleteLater(); @@ -446,9 +441,9 @@ bool AndroidPackageCreationStep::createPackage() emit addOutput(tr("Failed, try again"), ErrorMessageOutput); m_certificatePasswdForRun.clear(); } - if (QFile::rename(m_apkPathUnsigned, m_apkPathSigned)) { + if (QFile::rename(m_apkPathUnsigned.toString(), m_apkPathSigned.toString())) { emit addOutput(tr("Release signed package created to %1") - .arg(m_apkPathSigned) + .arg(m_apkPathSigned.toUserOutput()) , MessageOutput); if (m_openPackageLocation) @@ -465,7 +460,8 @@ void AndroidPackageCreationStep::stripAndroidLibs(const QStringList & files, Abi { QProcess stripProcess; foreach (const QString &file, files) { - stripProcess.start(AndroidConfigurations::instance().stripPath(architecture), QStringList()<<QLatin1String("--strip-unneeded") << file); + stripProcess.start(AndroidConfigurations::instance().stripPath(architecture).toString(), + QStringList()<<QLatin1String("--strip-unneeded") << file); stripProcess.waitForStarted(); if (!stripProcess.waitForFinished()) stripProcess.terminate(); @@ -573,7 +569,7 @@ void AndroidPackageCreationStep::certificatePassword() void AndroidPackageCreationStep::showInGraphicalShell() { - Core::FileUtils::showInGraphicalShell(Core::ICore::instance()->mainWindow(), m_apkPathSigned); + Core::FileUtils::showInGraphicalShell(Core::ICore::instance()->mainWindow(), m_apkPathSigned.toString()); } void AndroidPackageCreationStep::raiseError(const QString &shortMsg, diff --git a/src/plugins/android/androidpackagecreationstep.h b/src/plugins/android/androidpackagecreationstep.h index 9815d0be13..4c530c53af 100644 --- a/src/plugins/android/androidpackagecreationstep.h +++ b/src/plugins/android/androidpackagecreationstep.h @@ -50,7 +50,6 @@ class Qt4BuildConfiguration; namespace Android { namespace Internal { -class AndroidTarget; class AndroidPackageCreationStep : public ProjectExplorer::BuildStep { @@ -66,14 +65,12 @@ public: static const QLatin1String DefaultVersionNumber; - AndroidTarget *androidTarget() const; - void checkRequiredLibraries(); void initCheckRequiredLibrariesForRun(); void checkRequiredLibrariesForRun(); - QString keystorePath(); - void setKeystorePath(const QString &path); + Utils::FileName keystorePath(); + void setKeystorePath(const Utils::FileName &path); void setKeystorePassword(const QString &pwd); void setCertificateAlias(const QString &alias); void setCertificatePassword(const QString &pwd); @@ -110,7 +107,7 @@ private: static const Core::Id CreatePackageId; private: - QString m_keystorePath; + Utils::FileName m_keystorePath; QString m_keystorePasswd; QString m_certificateAlias; QString m_certificatePasswd; @@ -118,19 +115,19 @@ private: JavaParser m_outputParser; // members to pass data from init() to run() - QString m_androidDir; - QString m_gdbServerSource; - QString m_gdbServerDestination; + Utils::FileName m_androidDir; + Utils::FileName m_gdbServerSource; + Utils::FileName m_gdbServerDestination; bool m_debugBuild; - QString m_antToolPath; - QString m_apkPathUnsigned; - QString m_apkPathSigned; - QString m_keystorePathForRun; + Utils::FileName m_antToolPath; + Utils::FileName m_apkPathUnsigned; + Utils::FileName m_apkPathSigned; + Utils::FileName m_keystorePathForRun; QString m_certificatePasswdForRun; - QString m_jarSigner; + Utils::FileName m_jarSigner; // more for checkLibraries - QString m_appPath; - QString m_readElf; + Utils::FileName m_appPath; + Utils::FileName m_readElf; QStringList m_qtLibs; QStringList m_availableQtLibs; QStringList m_prebundledLibs; diff --git a/src/plugins/android/androidpackagecreationwidget.cpp b/src/plugins/android/androidpackagecreationwidget.cpp index e1d62e0fe6..046ec769f0 100644 --- a/src/plugins/android/androidpackagecreationwidget.cpp +++ b/src/plugins/android/androidpackagecreationwidget.cpp @@ -34,7 +34,7 @@ #include "androidpackagecreationstep.h" #include "androidconfigurations.h" #include "androidcreatekeystorecertificate.h" -#include "androidtarget.h" +#include "androidmanager.h" #include "ui_androidpackagecreationwidget.h" #include <projectexplorer/project.h> @@ -49,6 +49,7 @@ #include <QTimer> #include <QFileDialog> +#include <QFileSystemWatcher> #include <QMessageBox> namespace Android { @@ -203,7 +204,8 @@ int PermissionsModel::rowCount(const QModelIndex &parent) const AndroidPackageCreationWidget::AndroidPackageCreationWidget(AndroidPackageCreationStep *step) : ProjectExplorer::BuildStepConfigWidget(), m_step(step), - m_ui(new Ui::AndroidPackageCreationWidget) + m_ui(new Ui::AndroidPackageCreationWidget), + m_fileSystemWatcher(new QFileSystemWatcher(this)) { m_qtLibsModel = new CheckModel(this); m_prebundledLibs = new CheckModel(this); @@ -219,10 +221,16 @@ AndroidPackageCreationWidget::AndroidPackageCreationWidget(AndroidPackageCreatio void AndroidPackageCreationWidget::initGui() { updateAndroidProjectInfo(); - AndroidTarget *target = m_step->androidTarget(); - connect(target, - SIGNAL(androidDirContentsChanged()), - this, SLOT(updateAndroidProjectInfo())); + ProjectExplorer::Target *target = m_step->target(); + + m_fileSystemWatcher->addPath(AndroidManager::dirPath(target).toString()); + m_fileSystemWatcher->addPath(AndroidManager::manifestPath(target).toString()); + m_fileSystemWatcher->addPath(AndroidManager::srcPath(target).toString()); + connect(m_fileSystemWatcher, SIGNAL(directoryChanged(QString)), + this, SIGNAL(updateAndroidProjectInfo())); + connect(m_fileSystemWatcher, SIGNAL(fileChanged(QString)), this, + SIGNAL(updateAndroidProjectInfo())); + m_ui->packageNameLineEdit->setValidator(new QRegExpValidator(QRegExp(packageNameRegExp), this)); connect(m_ui->packageNameLineEdit, SIGNAL(editingFinished()), SLOT(setPackageName())); connect(m_ui->appNameLineEdit, SIGNAL(editingFinished()), SLOT(setApplicationName())); @@ -251,49 +259,50 @@ void AndroidPackageCreationWidget::initGui() m_ui->qtLibsListView->setModel(m_qtLibsModel); m_ui->prebundledLibsListView->setModel(m_prebundledLibs); m_ui->permissionsListView->setModel(m_permissionsModel); - m_ui->KeystoreLocationLineEdit->setText(m_step->keystorePath()); + m_ui->KeystoreLocationLineEdit->setText(m_step->keystorePath().toUserOutput()); } void AndroidPackageCreationWidget::updateAndroidProjectInfo() { - AndroidTarget *target = m_step->androidTarget(); + ProjectExplorer::Target *target = m_step->target(); + const QString packageName = AndroidManager::packageName(target); m_ui->targetSDKComboBox->clear(); QStringList targets = AndroidConfigurations::instance().sdkTargets(); m_ui->targetSDKComboBox->addItems(targets); - m_ui->targetSDKComboBox->setCurrentIndex(targets.indexOf(target->targetSDK())); - m_ui->packageNameLineEdit->setText(target->packageName()); - m_ui->appNameLineEdit->setText(target->applicationName()); + m_ui->targetSDKComboBox->setCurrentIndex(targets.indexOf(AndroidManager::targetSDK(target))); + m_ui->packageNameLineEdit->setText(packageName); + m_ui->appNameLineEdit->setText(AndroidManager::applicationName(target)); if (!m_ui->appNameLineEdit->text().length()) { QString applicationName = target->project()->displayName(); - target->setPackageName(target->packageName() + QLatin1Char('.') + applicationName); - m_ui->packageNameLineEdit->setText(target->packageName()); - if (applicationName.length()) + AndroidManager::setPackageName(target, packageName + QLatin1Char('.') + applicationName); + m_ui->packageNameLineEdit->setText(packageName); + if (!applicationName.isEmpty()) applicationName[0] = applicationName[0].toUpper(); m_ui->appNameLineEdit->setText(applicationName); - target->setApplicationName(applicationName); + AndroidManager::setApplicationName(target, applicationName); } - m_ui->versionCode->setValue(target->versionCode()); - m_ui->versionNameLinedit->setText(target->versionName()); + m_ui->versionCode->setValue(AndroidManager::versionCode(target)); + m_ui->versionNameLinedit->setText(AndroidManager::versionName(target)); - m_qtLibsModel->setAvailableItems(target->availableQtLibs()); - m_qtLibsModel->setCheckedItems(target->qtLibs()); - m_prebundledLibs->setAvailableItems(target->availablePrebundledLibs()); - m_prebundledLibs->setCheckedItems(target->prebundledLibs()); + m_qtLibsModel->setAvailableItems(AndroidManager::availableQtLibs(target)); + m_qtLibsModel->setCheckedItems(AndroidManager::qtLibs(target)); + m_prebundledLibs->setAvailableItems(AndroidManager::availablePrebundledLibs(target)); + m_prebundledLibs->setCheckedItems(AndroidManager::prebundledLibs(target)); - m_permissionsModel->setPermissions(target->permissions()); + m_permissionsModel->setPermissions(AndroidManager::permissions(target)); m_ui->removePermissionButton->setEnabled(m_permissionsModel->permissions().size()); - targets = target->availableTargetApplications(); + targets = AndroidManager::availableTargetApplications(target); m_ui->targetComboBox->clear(); m_ui->targetComboBox->addItems(targets); - m_ui->targetComboBox->setCurrentIndex(targets.indexOf(target->targetApplication())); + m_ui->targetComboBox->setCurrentIndex(targets.indexOf(AndroidManager::targetApplication(target))); if (m_ui->targetComboBox->currentIndex() == -1 && targets.count()) { m_ui->targetComboBox->setCurrentIndex(0); - target->setTargetApplication(m_ui->targetComboBox->currentText()); + AndroidManager::setTargetApplication(target, m_ui->targetComboBox->currentText()); } - m_ui->hIconButton->setIcon(target->highDpiIcon()); - m_ui->mIconButton->setIcon(target->mediumDpiIcon()); - m_ui->lIconButton->setIcon(target->lowDpiIcon()); + m_ui->hIconButton->setIcon(AndroidManager::highDpiIcon(target)); + m_ui->mIconButton->setIcon(AndroidManager::mediumDpiIcon(target)); + m_ui->lIconButton->setIcon(AndroidManager::lowDpiIcon(target)); } void AndroidPackageCreationWidget::setPackageName() @@ -308,26 +317,27 @@ void AndroidPackageCreationWidget::setPackageName() m_ui->packageNameLineEdit->setFocus(); return; } - m_step->androidTarget()->setPackageName(packageName); + AndroidManager::setPackageName(m_step->target(), packageName); } void AndroidPackageCreationWidget::setApplicationName() { - m_step->androidTarget()->setApplicationName(m_ui->appNameLineEdit->text()); + AndroidManager::setApplicationName(m_step->target(), m_ui->appNameLineEdit->text()); } -void AndroidPackageCreationWidget::setTargetSDK(const QString &target) +void AndroidPackageCreationWidget::setTargetSDK(const QString &sdk) { - m_step->androidTarget()->setTargetSDK(target); - Qt4BuildConfiguration *bc = m_step->androidTarget()->activeQt4BuildConfiguration(); - ProjectExplorer::BuildManager *bm = ProjectExplorer::ProjectExplorerPlugin::instance()->buildManager(); + AndroidManager::setTargetSDK(m_step->target(), sdk); + Qt4BuildConfiguration *bc = qobject_cast<Qt4BuildConfiguration *>(m_step->target()->activeBuildConfiguration()); + if (!bc) + return; QMakeStep *qs = bc->qmakeStep(); - if (!qs) return; qs->setForced(true); + ProjectExplorer::BuildManager *bm = ProjectExplorer::ProjectExplorerPlugin::instance()->buildManager(); bm->buildList(bc->stepList(Core::Id(ProjectExplorer::Constants::BUILDSTEPS_CLEAN)), ProjectExplorer::ProjectExplorerPlugin::displayNameForStepId(Core::Id(ProjectExplorer::Constants::BUILDSTEPS_CLEAN))); bm->appendStep(qs, ProjectExplorer::ProjectExplorerPlugin::displayNameForStepId(Core::Id(ProjectExplorer::Constants::BUILDSTEPS_CLEAN))); @@ -341,27 +351,27 @@ void AndroidPackageCreationWidget::setTargetSDK(const QString &target) void AndroidPackageCreationWidget::setVersionCode() { - m_step->androidTarget()->setVersionCode(m_ui->versionCode->value()); + AndroidManager::setVersionCode(m_step->target(), m_ui->versionCode->value()); } void AndroidPackageCreationWidget::setVersionName() { - m_step->androidTarget()->setVersionName(m_ui->versionNameLinedit->text()); + AndroidManager::setVersionName(m_step->target(), m_ui->versionNameLinedit->text()); } void AndroidPackageCreationWidget::setTarget(const QString &target) { - m_step->androidTarget()->setTargetApplication(target); + AndroidManager::setTargetApplication(m_step->target(), target); } void AndroidPackageCreationWidget::setQtLibs(QModelIndex, QModelIndex) { - m_step->androidTarget()->setQtLibs(m_qtLibsModel->checkedItems()); + AndroidManager::setQtLibs(m_step->target(), m_qtLibsModel->checkedItems()); } void AndroidPackageCreationWidget::setPrebundledLibs(QModelIndex, QModelIndex) { - m_step->androidTarget()->setPrebundledLibs(m_prebundledLibs->checkedItems()); + AndroidManager::setPrebundledLibs(m_step->target(), m_prebundledLibs->checkedItems()); } void AndroidPackageCreationWidget::prebundledLibSelected(const QModelIndex &index) @@ -395,8 +405,8 @@ void AndroidPackageCreationWidget::setHDPIIcon() QString file = QFileDialog::getOpenFileName(this, tr("Choose High DPI Icon"), QDir::homePath(), tr("png images (*.png)")); if (!file.length()) return; - m_step->androidTarget()->setHighDpiIcon(file); - m_ui->hIconButton->setIcon(m_step->androidTarget()->highDpiIcon()); + AndroidManager::setHighDpiIcon(m_step->target(), file); + m_ui->hIconButton->setIcon(AndroidManager::highDpiIcon(m_step->target())); } void AndroidPackageCreationWidget::setMDPIIcon() @@ -404,8 +414,8 @@ void AndroidPackageCreationWidget::setMDPIIcon() QString file = QFileDialog::getOpenFileName(this, tr("Choose Medium DPI Icon"), QDir::homePath(), tr("png images (*.png)")); if (!file.length()) return; - m_step->androidTarget()->setMediumDpiIcon(file); - m_ui->mIconButton->setIcon(m_step->androidTarget()->mediumDpiIcon()); + AndroidManager::setMediumDpiIcon(m_step->target(), file); + m_ui->mIconButton->setIcon(AndroidManager::mediumDpiIcon(m_step->target())); } void AndroidPackageCreationWidget::setLDPIIcon() @@ -413,8 +423,8 @@ void AndroidPackageCreationWidget::setLDPIIcon() QString file = QFileDialog::getOpenFileName(this, tr("Choose Low DPI Icon"), QDir::homePath(), tr("png images (*.png)")); if (!file.length()) return; - m_step->androidTarget()->setLowDpiIcon(file); - m_ui->lIconButton->setIcon(m_step->androidTarget()->lowDpiIcon()); + AndroidManager::setLowDpiIcon(m_step->target(), file); + m_ui->lIconButton->setIcon(AndroidManager::lowDpiIcon(m_step->target())); } void AndroidPackageCreationWidget::permissionActivated(QModelIndex index) @@ -451,21 +461,21 @@ void AndroidPackageCreationWidget::removePermission() void AndroidPackageCreationWidget::savePermissionsButton() { setEnabledSaveDiscardButtons(false); - m_step->androidTarget()->setPermissions(m_permissionsModel->permissions()); + AndroidManager::setPermissions(m_step->target(), m_permissionsModel->permissions()); } void AndroidPackageCreationWidget::discardPermissionsButton() { setEnabledSaveDiscardButtons(false); - m_permissionsModel->setPermissions(m_step->androidTarget()->permissions()); + m_permissionsModel->setPermissions(AndroidManager::permissions(m_step->target())); m_ui->permissionsComboBox->setCurrentIndex(-1); m_ui->removePermissionButton->setEnabled(m_permissionsModel->permissions().size()); } void AndroidPackageCreationWidget::updateRequiredLibrariesModels() { - m_qtLibsModel->setCheckedItems(m_step->androidTarget()->qtLibs()); - m_prebundledLibs->setCheckedItems(m_step->androidTarget()->prebundledLibs()); + m_qtLibsModel->setCheckedItems(AndroidManager::qtLibs(m_step->target())); + m_prebundledLibs->setCheckedItems(AndroidManager::prebundledLibs(m_step->target())); } void AndroidPackageCreationWidget::readElfInfo() @@ -502,7 +512,7 @@ void AndroidPackageCreationWidget::on_signPackageCheckBox_toggled(bool checked) { if (!checked) return; - if (m_step->keystorePath().length()) + if (!m_step->keystorePath().isEmpty()) setCertificates(); } @@ -511,7 +521,7 @@ void AndroidPackageCreationWidget::on_KeystoreCreatePushButton_clicked() AndroidCreateKeystoreCertificate d; if (d.exec() != QDialog::Accepted) return; - m_ui->KeystoreLocationLineEdit->setText(d.keystoreFilePath()); + m_ui->KeystoreLocationLineEdit->setText(d.keystoreFilePath().toUserOutput()); m_step->setKeystorePath(d.keystoreFilePath()); m_step->setKeystorePassword(d.keystorePassword()); m_step->setCertificateAlias(d.certificateAlias()); @@ -521,13 +531,13 @@ void AndroidPackageCreationWidget::on_KeystoreCreatePushButton_clicked() void AndroidPackageCreationWidget::on_KeystoreLocationPushButton_clicked() { - QString keystorePath = m_step->keystorePath(); - if (!keystorePath.length()) - keystorePath = QDir::homePath(); - QString file = QFileDialog::getOpenFileName(this, tr("Select Keystore File"), keystorePath, tr("Keystore files (*.keystore *.jks)")); - if (!file.length()) + Utils::FileName keystorePath = m_step->keystorePath(); + if (keystorePath.isEmpty()) + keystorePath = Utils::FileName::fromString(QDir::homePath()); + Utils::FileName file = Utils::FileName::fromString(QFileDialog::getOpenFileName(this, tr("Select keystore file"), keystorePath.toString(), tr("Keystore files (*.keystore *.jks)"))); + if (file.isEmpty()) return; - m_ui->KeystoreLocationLineEdit->setText(file); + m_ui->KeystoreLocationLineEdit->setText(file.toUserOutput()); m_step->setKeystorePath(file); m_ui->signPackageCheckBox->setChecked(false); } @@ -551,6 +561,3 @@ void AndroidPackageCreationWidget::on_openPackageLocationCheckBox_toggled(bool c } // namespace Internal } // namespace Android - - - diff --git a/src/plugins/android/androidpackagecreationwidget.h b/src/plugins/android/androidpackagecreationwidget.h index 59ca55ce86..971f36383c 100644 --- a/src/plugins/android/androidpackagecreationwidget.h +++ b/src/plugins/android/androidpackagecreationwidget.h @@ -38,6 +38,8 @@ #include <QStringList> QT_BEGIN_NAMESPACE +class QFileSystemWatcher; + namespace Ui { class AndroidPackageCreationWidget; } QT_END_NAMESPACE @@ -106,7 +108,7 @@ private slots: void setPackageName(); void setApplicationName(); - void setTargetSDK(const QString &target); + void setTargetSDK(const QString &sdk); void setVersionCode(); void setVersionName(); void setTarget(const QString &target); @@ -142,6 +144,7 @@ private: CheckModel *m_qtLibsModel; CheckModel *m_prebundledLibs; PermissionsModel *m_permissionsModel; + QFileSystemWatcher *m_fileSystemWatcher; }; } // namespace Internal diff --git a/src/plugins/android/androidpackageinstallationfactory.cpp b/src/plugins/android/androidpackageinstallationfactory.cpp index 448746e5b7..641252f248 100644 --- a/src/plugins/android/androidpackageinstallationfactory.cpp +++ b/src/plugins/android/androidpackageinstallationfactory.cpp @@ -33,11 +33,13 @@ #include "androidpackageinstallationfactory.h" #include "androidpackageinstallationstep.h" +#include "androidmanager.h" #include <projectexplorer/buildsteplist.h> #include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/target.h> -#include <qt4projectmanager/qt4projectmanagerconstants.h> +#include <qtsupport/qtprofileinformation.h> +#include <qtsupport/qtsupportconstants.h> #include <QCoreApplication> @@ -53,11 +55,13 @@ AndroidPackageInstallationFactory::AndroidPackageInstallationFactory(QObject *pa QList<Core::Id> AndroidPackageInstallationFactory::availableCreationIds(BuildStepList *parent) const { - if (parent->id() == Core::Id(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY) - && parent->target()->id() == Core::Id(Qt4ProjectManager::Constants::ANDROID_DEVICE_TARGET_ID) - && !parent->contains(Core::Id(AndroidPackageInstallationStep::Id))) - return QList<Core::Id>() << Core::Id(AndroidPackageInstallationStep::Id); - return QList<Core::Id>(); + if (parent->id() != Core::Id(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY)) + return QList<Core::Id>(); + if (!AndroidManager::supportsAndroid(parent->target())) + return QList<Core::Id>(); + if (parent->contains(AndroidPackageInstallationStep::Id)) + return QList<Core::Id>(); + return QList<Core::Id>() << AndroidPackageInstallationStep::Id; } QString AndroidPackageInstallationFactory::displayNameForId(const Core::Id id) const @@ -70,10 +74,7 @@ QString AndroidPackageInstallationFactory::displayNameForId(const Core::Id id) c bool AndroidPackageInstallationFactory::canCreate(BuildStepList *parent, const Core::Id id) const { - return parent->id() == Core::Id(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY) - && id == Core::Id(AndroidPackageInstallationStep::Id) - && parent->target()->id() == Core::Id(Qt4ProjectManager::Constants::ANDROID_DEVICE_TARGET_ID) - && !parent->contains(AndroidPackageInstallationStep::Id); + return availableCreationIds(parent).contains(id); } BuildStep *AndroidPackageInstallationFactory::create(BuildStepList *parent, const Core::Id id) diff --git a/src/plugins/android/androidpackageinstallationstep.cpp b/src/plugins/android/androidpackageinstallationstep.cpp index f1a1efc4ca..b3029a29b2 100644 --- a/src/plugins/android/androidpackageinstallationstep.cpp +++ b/src/plugins/android/androidpackageinstallationstep.cpp @@ -31,7 +31,7 @@ **************************************************************************/ #include "androidpackageinstallationstep.h" -#include "androidtarget.h" +#include "androidmanager.h" #include <QFileInfo> #include <QDir> @@ -54,25 +54,13 @@ AndroidPackageInstallationStep::AndroidPackageInstallationStep(ProjectExplorer:: } AndroidPackageInstallationStep::AndroidPackageInstallationStep(ProjectExplorer::BuildStepList *bc, AndroidPackageInstallationStep *other): MakeStep(bc, other) -{ - const QString name = stepDisplayName(); - setDefaultDisplayName(name); - setDisplayName(name); -} +{ } AndroidPackageInstallationStep::~AndroidPackageInstallationStep() -{ -} +{ } bool AndroidPackageInstallationStep::init() { - AndroidTarget *androidTarget = qobject_cast<AndroidTarget *>(target()); - if (!androidTarget) { - emit addOutput(tr("Current target is not an Android target"), BuildStep::MessageOutput); - return false; - } - - setUserArguments(QString::fromLatin1("INSTALL_ROOT=\"%1\" install").arg(QDir::toNativeSeparators(androidTarget->androidDirPath()))); - + setUserArguments(QString::fromLatin1("INSTALL_ROOT=\"%1\" install").arg(AndroidManager::dirPath(target()).toUserOutput())); return MakeStep::init(); } diff --git a/src/plugins/android/androidplugin.cpp b/src/plugins/android/androidplugin.cpp index 6f27c8c8cf..37703f8558 100644 --- a/src/plugins/android/androidplugin.cpp +++ b/src/plugins/android/androidplugin.cpp @@ -36,51 +36,50 @@ #include "androidconfigurations.h" #include "androiddeploystepfactory.h" #include "androidconfigurations.h" +#include "androidmanager.h" #include "androidpackagecreationfactory.h" #include "androidpackageinstallationfactory.h" #include "androidrunfactories.h" #include "androidsettingspage.h" #include "androidtoolchain.h" #include "androidqtversionfactory.h" -#include "androidtargetfactory.h" #include "androiddeployconfiguration.h" #include <QtPlugin> -using namespace Android; -using namespace Android::Internal; +namespace Android { AndroidPlugin::AndroidPlugin() -{ -} +{ } AndroidPlugin::~AndroidPlugin() -{ -} +{ } bool AndroidPlugin::initialize(const QStringList &arguments, - QString *error_message) + QString *error_message) { - Q_UNUSED(arguments) - Q_UNUSED(error_message) + Q_UNUSED(arguments); + Q_UNUSED(error_message); - AndroidConfigurations::instance(this); + Internal::AndroidConfigurations::instance(this); - addAutoReleasedObject(new AndroidRunControlFactory); - addAutoReleasedObject(new AndroidRunConfigurationFactory); - addAutoReleasedObject(new AndroidPackageInstallationFactory); - addAutoReleasedObject(new AndroidPackageCreationFactory); - addAutoReleasedObject(new AndroidDeployStepFactory); - addAutoReleasedObject(new AndroidSettingsPage); - addAutoReleasedObject(new AndroidTargetFactory); - addAutoReleasedObject(new AndroidQtVersionFactory); - addAutoReleasedObject(new AndroidToolChainFactory); - addAutoReleasedObject(new AndroidDeployConfigurationFactory); + new Internal::AndroidManager(this); + + addAutoReleasedObject(new Internal::AndroidRunControlFactory); + addAutoReleasedObject(new Internal::AndroidRunConfigurationFactory); + addAutoReleasedObject(new Internal::AndroidPackageInstallationFactory); + addAutoReleasedObject(new Internal::AndroidPackageCreationFactory); + addAutoReleasedObject(new Internal::AndroidDeployStepFactory); + addAutoReleasedObject(new Internal::AndroidSettingsPage); + addAutoReleasedObject(new Internal::AndroidQtVersionFactory); + addAutoReleasedObject(new Internal::AndroidToolChainFactory); + addAutoReleasedObject(new Internal::AndroidDeployConfigurationFactory); return true; } void AndroidPlugin::extensionsInitialized() -{ -} +{ } + +} // namespace Android Q_EXPORT_PLUGIN(Android::AndroidPlugin) diff --git a/src/plugins/android/androidplugin.h b/src/plugins/android/androidplugin.h index c8ad7c4a9c..e9a049f74c 100644 --- a/src/plugins/android/androidplugin.h +++ b/src/plugins/android/androidplugin.h @@ -30,8 +30,8 @@ ** **************************************************************************/ -#ifndef ANDROIDMANAGER_H -#define ANDROIDMANAGER_H +#ifndef ANDROIDPLUGIN_H +#define ANDROIDPLUGIN_H #include <extensionsystem/iplugin.h> @@ -47,8 +47,8 @@ public: bool initialize(const QStringList &arguments, QString *error_message); void extensionsInitialized(); - }; -} // namespace Qt4ProjectManager -#endif // ANDROIDMANAGER_H +} // namespace Android + +#endif // ANDROIDPLUGIN_H diff --git a/src/plugins/android/androidqtversion.cpp b/src/plugins/android/androidqtversion.cpp index 9fa3f795c4..6571faa10d 100644 --- a/src/plugins/android/androidqtversion.cpp +++ b/src/plugins/android/androidqtversion.cpp @@ -90,16 +90,6 @@ QList<ProjectExplorer::Abi> AndroidQtVersion::detectQtAbis() const 32); } -bool AndroidQtVersion::supportsTargetId(const Core::Id id) const -{ - return id == Core::Id(Qt4ProjectManager::Constants::ANDROID_DEVICE_TARGET_ID); -} - -QSet<Core::Id> AndroidQtVersion::supportedTargetIds() const -{ - return QSet<Core::Id>() << Core::Id(Qt4ProjectManager::Constants::ANDROID_DEVICE_TARGET_ID); -} - QString AndroidQtVersion::description() const { return QCoreApplication::translate("QtVersion", "Android", "Qt Version is meant for Android"); @@ -114,10 +104,10 @@ Core::FeatureSet AndroidQtVersion::availableFeatures() const QString AndroidQtVersion::platformName() const { - return QLatin1String(Constants::ANDROID_PLATFORM); + return QLatin1String(QtSupport::Constants::ANDROID_PLATFORM); } QString AndroidQtVersion::platformDisplayName() const { - return QLatin1String(Constants::ANDROID_PLATFORM_TR); + return QLatin1String(QtSupport::Constants::ANDROID_PLATFORM_TR); } diff --git a/src/plugins/android/androidqtversion.h b/src/plugins/android/androidqtversion.h index be6f6800fa..486cacd647 100644 --- a/src/plugins/android/androidqtversion.h +++ b/src/plugins/android/androidqtversion.h @@ -52,9 +52,6 @@ public: QList<ProjectExplorer::Abi> detectQtAbis() const; - bool supportsTargetId(const Core::Id id) const; - QSet<Core::Id> supportedTargetIds() const; - Core::FeatureSet availableFeatures() const; QString platformName() const; QString platformDisplayName() const; diff --git a/src/plugins/android/androidrunconfiguration.cpp b/src/plugins/android/androidrunconfiguration.cpp index 0b33498543..db27ab8736 100644 --- a/src/plugins/android/androidrunconfiguration.cpp +++ b/src/plugins/android/androidrunconfiguration.cpp @@ -34,14 +34,19 @@ #include "androiddeploystep.h" #include "androidglobal.h" #include "androidtoolchain.h" -#include "androidtarget.h" +#include "androidmanager.h" +#include <projectexplorer/profileinformation.h> +#include <projectexplorer/target.h> #include <qt4projectmanager/qt4buildconfiguration.h> #include <qt4projectmanager/qt4project.h> +#include <qtsupport/qtprofileinformation.h> + #include <utils/qtcassert.h> #include <qtsupport/qtoutputformatter.h> +#include <qtsupport/qtprofileinformation.h> using namespace Qt4ProjectManager; @@ -50,15 +55,14 @@ namespace Internal { using namespace ProjectExplorer; -AndroidRunConfiguration::AndroidRunConfiguration(AndroidTarget *parent, - const QString &proFilePath) - : RunConfiguration(parent, Core::Id(ANDROID_RC_ID)) - , m_proFilePath(proFilePath) +AndroidRunConfiguration::AndroidRunConfiguration(Target *parent, Core::Id id, const QString &path) + : RunConfiguration(parent, id) + , m_proFilePath(path) { init(); } -AndroidRunConfiguration::AndroidRunConfiguration(AndroidTarget *parent, +AndroidRunConfiguration::AndroidRunConfiguration(ProjectExplorer::Target *parent, AndroidRunConfiguration *source) : RunConfiguration(parent, source) , m_proFilePath(source->m_proFilePath) @@ -75,11 +79,6 @@ AndroidRunConfiguration::~AndroidRunConfiguration() { } -AndroidTarget *AndroidRunConfiguration::androidTarget() const -{ - return static_cast<AndroidTarget *>(target()); -} - Qt4BuildConfiguration *AndroidRunConfiguration::activeQt4BuildConfiguration() const { return static_cast<Qt4BuildConfiguration *>(activeBuildConfiguration()); @@ -92,7 +91,7 @@ QWidget *AndroidRunConfiguration::createConfigurationWidget() Utils::OutputFormatter *AndroidRunConfiguration::createOutputFormatter() const { - return new QtSupport::QtOutputFormatter(androidTarget()->qt4Project()); + return new QtSupport::QtOutputFormatter(target()->project()); } QString AndroidRunConfiguration::defaultDisplayName() @@ -105,9 +104,12 @@ AndroidConfig AndroidRunConfiguration::config() const return AndroidConfigurations::instance().config(); } -const QString AndroidRunConfiguration::gdbCmd() const +const Utils::FileName AndroidRunConfiguration::gdbCmd() const { - return AndroidConfigurations::instance().gdbPath(activeQt4BuildConfiguration()->toolChain()->targetAbi().architecture()); + ToolChain *tc = ToolChainProfileInformation::toolChain(target()->profile()); + if (!tc) + return Utils::FileName(); + return AndroidConfigurations::instance().gdbPath(tc->targetAbi().architecture()); } AndroidDeployStep *AndroidRunConfiguration::deployStep() const @@ -127,8 +129,10 @@ const QString AndroidRunConfiguration::remoteChannel() const const QString AndroidRunConfiguration::dumperLib() const { - Qt4BuildConfiguration *qt4bc(activeQt4BuildConfiguration()); - return qt4bc->qtVersion()->gdbDebuggingHelperLibrary(); + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(target()->profile()); + if (!version) + return QString(); + return version->gdbDebuggingHelperLibrary(); } QString AndroidRunConfiguration::proFilePath() const diff --git a/src/plugins/android/androidrunconfiguration.h b/src/plugins/android/androidrunconfiguration.h index 1e34fac457..b62ee11ef2 100644 --- a/src/plugins/android/androidrunconfiguration.h +++ b/src/plugins/android/androidrunconfiguration.h @@ -56,7 +56,6 @@ class AndroidDeviceConfigListModel; class AndroidDeployStep; class AndroidRunConfigurationFactory; class AndroidToolChain; -class AndroidTarget; class AndroidRunConfiguration : public ProjectExplorer::RunConfiguration { @@ -71,12 +70,11 @@ public: enum DebuggingType { DebugCppOnly, DebugQmlOnly, DebugCppAndQml }; - AndroidRunConfiguration(AndroidTarget *parent, const QString &proFilePath); + AndroidRunConfiguration(ProjectExplorer::Target *parent, Core::Id id, const QString &path); virtual ~AndroidRunConfiguration(); QWidget *createConfigurationWidget(); Utils::OutputFormatter *createOutputFormatter() const; - AndroidTarget *androidTarget() const; Qt4ProjectManager::Qt4BuildConfiguration *activeQt4BuildConfiguration() const; AndroidDeployStep *deployStep() const; @@ -87,12 +85,12 @@ public: DebuggingType debuggingType() const; - const QString gdbCmd() const; + const Utils::FileName gdbCmd() const; const QString remoteChannel() const; const QString dumperLib() const; protected: - AndroidRunConfiguration(AndroidTarget *parent, AndroidRunConfiguration *source); + AndroidRunConfiguration(ProjectExplorer::Target *parent, AndroidRunConfiguration *source); QString defaultDisplayName(); private: diff --git a/src/plugins/android/androidrunfactories.cpp b/src/plugins/android/androidrunfactories.cpp index 1feeb410c7..d576466979 100644 --- a/src/plugins/android/androidrunfactories.cpp +++ b/src/plugins/android/androidrunfactories.cpp @@ -36,13 +36,17 @@ #include "androiddebugsupport.h" #include "androidrunconfiguration.h" #include "androidruncontrol.h" -#include "androidtarget.h" +#include "androidmanager.h" +#include <projectexplorer/project.h> #include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/target.h> #include <debugger/debuggerconstants.h> #include <qt4projectmanager/qt4project.h> #include <qt4projectmanager/qt4nodes.h> -#include <qt4projectmanager/qt4projectmanagerconstants.h> +#include <qtsupport/customexecutablerunconfiguration.h> +#include <qtsupport/qtprofileinformation.h> +#include <qtsupport/qtsupportconstants.h> namespace Android { @@ -55,7 +59,7 @@ namespace { QString pathFromId(const Core::Id id) { - QString pathStr = QString::fromUtf8(id.name()); + QString pathStr = id.toString(); const QString prefix = QLatin1String(ANDROID_RC_ID_PREFIX); if (!pathStr.startsWith(prefix)) return QString(); @@ -65,34 +69,25 @@ QString pathFromId(const Core::Id id) } // namespace AndroidRunConfigurationFactory::AndroidRunConfigurationFactory(QObject *parent) - : IRunConfigurationFactory(parent) -{ -} + : QmakeRunConfigurationFactory(parent) +{ setObjectName(QLatin1String("AndroidRunConfigurationFactory")); } AndroidRunConfigurationFactory::~AndroidRunConfigurationFactory() -{ -} +{ } -bool AndroidRunConfigurationFactory::canCreate(Target *parent, - const Core::Id/*id*/) const +bool AndroidRunConfigurationFactory::canCreate(Target *parent, const Core::Id id) const { - AndroidTarget *target = qobject_cast<AndroidTarget *>(parent); - if (!target - || target->id() != Core::Id(Qt4ProjectManager::Constants::ANDROID_DEVICE_TARGET_ID)) { + if (!canHandle(parent)) return false; - } - return true; + return availableCreationIds(parent).contains(id); } -bool AndroidRunConfigurationFactory::canRestore(Target *parent, - const QVariantMap &map) const +bool AndroidRunConfigurationFactory::canRestore(Target *parent, const QVariantMap &map) const { - Q_UNUSED(parent) - Q_UNUSED(map) - if (!qobject_cast<AndroidTarget *>(parent)) + if (!canHandle(parent)) return false; - QString id = QString::fromUtf8(ProjectExplorer::idFromMap(map).name()); - return id.startsWith(QLatin1String(ANDROID_RC_ID)); + QString id = ProjectExplorer::idFromMap(map).toString(); + return id.startsWith(QLatin1String(ANDROID_RC_ID_PREFIX)); } bool AndroidRunConfigurationFactory::canClone(Target *parent, @@ -104,14 +99,12 @@ bool AndroidRunConfigurationFactory::canClone(Target *parent, QList<Core::Id> AndroidRunConfigurationFactory::availableCreationIds(Target *parent) const { QList<Core::Id> ids; - if (AndroidTarget *t = qobject_cast<AndroidTarget *>(parent)) { - if (t->id() == Core::Id(Qt4ProjectManager::Constants::ANDROID_DEVICE_TARGET_ID)) { - QList<Qt4ProFileNode *> nodes = t->qt4Project()->allProFiles(); - foreach (Qt4ProFileNode *node, nodes) - if (node->projectType() == ApplicationTemplate || node->projectType() == LibraryTemplate) - ids << Core::Id(node->targetInformation().target); - } - } + if (!AndroidManager::supportsAndroid(parent)) + return ids; + QList<Qt4ProFileNode *> nodes = static_cast<Qt4Project *>(parent->project())->allProFiles(); + foreach (Qt4ProFileNode *node, nodes) + if (node->projectType() == ApplicationTemplate || node->projectType() == LibraryTemplate) + ids << Core::Id(node->targetInformation().target); return ids; } @@ -120,14 +113,11 @@ QString AndroidRunConfigurationFactory::displayNameForId(const Core::Id id) cons return QFileInfo(pathFromId(id)).completeBaseName(); } -RunConfiguration *AndroidRunConfigurationFactory::create(Target *parent, - const Core::Id id) +RunConfiguration *AndroidRunConfigurationFactory::create(Target *parent, const Core::Id id) { if (!canCreate(parent, id)) return 0; - AndroidTarget *pqt4parent = static_cast<AndroidTarget *>(parent); - return new AndroidRunConfiguration(pqt4parent, pathFromId(id)); - + return new AndroidRunConfiguration(parent, id, pathFromId(id)); } RunConfiguration *AndroidRunConfigurationFactory::restore(Target *parent, @@ -135,8 +125,8 @@ RunConfiguration *AndroidRunConfigurationFactory::restore(Target *parent, { if (!canRestore(parent, map)) return 0; - AndroidTarget *target = static_cast<AndroidTarget *>(parent); - AndroidRunConfiguration *rc = new AndroidRunConfiguration(target, QString()); + Core::Id id = ProjectExplorer::idFromMap(map); + AndroidRunConfiguration *rc = new AndroidRunConfiguration(parent, id, pathFromId(id)); if (rc->fromMap(map)) return rc; @@ -144,14 +134,30 @@ RunConfiguration *AndroidRunConfigurationFactory::restore(Target *parent, return 0; } -RunConfiguration *AndroidRunConfigurationFactory::clone(Target *parent, - RunConfiguration *source) +RunConfiguration *AndroidRunConfigurationFactory::clone(Target *parent, RunConfiguration *source) { if (!canClone(parent, source)) return 0; AndroidRunConfiguration *old = static_cast<AndroidRunConfiguration *>(source); - return new AndroidRunConfiguration(static_cast<AndroidTarget *>(parent), old); + return new AndroidRunConfiguration(parent, old); +} + +bool AndroidRunConfigurationFactory::canHandle(Target *t) const +{ + if (!t->project()->supportsProfile(t->profile())) + return false; + return AndroidManager::supportsAndroid(t); +} + +QList<RunConfiguration *> AndroidRunConfigurationFactory::runConfigurationsForNode(Target *t, ProjectExplorer::Node *n) +{ + QList<ProjectExplorer::RunConfiguration *> result; + foreach (ProjectExplorer::RunConfiguration *rc, t->runConfigurations()) + if (AndroidRunConfiguration *qt4c = qobject_cast<AndroidRunConfiguration *>(rc)) + if (qt4c->proFilePath() == n->path()) + result << rc; + return result; } // #pragma mark -- AndroidRunControlFactory diff --git a/src/plugins/android/androidrunfactories.h b/src/plugins/android/androidrunfactories.h index fb4ffd40a2..04dc9df80e 100644 --- a/src/plugins/android/androidrunfactories.h +++ b/src/plugins/android/androidrunfactories.h @@ -34,24 +34,26 @@ #define ANDROIDRUNFACTORIES_H #include <projectexplorer/runconfiguration.h> +#include <qt4projectmanager/qmakerunconfigurationfactory.h> namespace ProjectExplorer { - class RunConfiguration; class RunControl; class RunConfigWidget; class Target; } -using ProjectExplorer::IRunConfigurationFactory; + using ProjectExplorer::IRunControlFactory; using ProjectExplorer::RunConfiguration; using ProjectExplorer::RunControl; using ProjectExplorer::RunConfigWidget; using ProjectExplorer::Target; +namespace ProjectExplorer { class Node; } + namespace Android { namespace Internal { -class AndroidRunConfigurationFactory : public IRunConfigurationFactory +class AndroidRunConfigurationFactory : public Qt4ProjectManager::QmakeRunConfigurationFactory { Q_OBJECT @@ -70,6 +72,10 @@ public: bool canClone(Target *parent, RunConfiguration *source) const; RunConfiguration *clone(Target *parent, RunConfiguration *source); + + bool canHandle(ProjectExplorer::Target *t) const; + QList<ProjectExplorer::RunConfiguration *> runConfigurationsForNode(ProjectExplorer::Target *t, + ProjectExplorer::Node *n); }; class AndroidRunControlFactory : public IRunControlFactory diff --git a/src/plugins/android/androidrunner.cpp b/src/plugins/android/androidrunner.cpp index fe578c4ff8..1a15344705 100644 --- a/src/plugins/android/androidrunner.cpp +++ b/src/plugins/android/androidrunner.cpp @@ -36,7 +36,9 @@ #include "androidconfigurations.h" #include "androidglobal.h" #include "androidrunconfiguration.h" -#include "androidtarget.h" +#include "androidmanager.h" + +#include <projectexplorer/target.h> #include <QTime> #include <QtConcurrentRun> @@ -49,13 +51,13 @@ AndroidRunner::AndroidRunner(QObject *parent, : QThread(parent) { m_remoteChannel = runConfig->remoteChannel(); - AndroidTarget * at = runConfig->androidTarget(); - AndroidDeployStep * ds = runConfig->deployStep(); + ProjectExplorer::Target *target = runConfig->target(); + AndroidDeployStep *ds = runConfig->deployStep(); if ((m_useLocalQtLibs = ds->useLocalQtLibs())) { - m_localLibs = at->loadLocalLibs(ds->deviceAPILevel()); - m_localJars = at->loadLocalJars(ds->deviceAPILevel()); + m_localLibs = AndroidManager::loadLocalLibs(target, ds->deviceAPILevel()); + m_localJars = AndroidManager::loadLocalJars(target, ds->deviceAPILevel()); } - m_intentName = at->intentName(); + m_intentName = AndroidManager::intentName(target); m_debugingMode = debugging; m_packageName = m_intentName.left(m_intentName.indexOf(QLatin1Char('/'))); m_deviceSerialNumber = ds->deviceSerialNumber(); @@ -74,7 +76,7 @@ AndroidRunner::~AndroidRunner() void AndroidRunner::checkPID() { QProcess psProc; - psProc.start(AndroidConfigurations::instance().adbToolPath(), + psProc.start(AndroidConfigurations::instance().adbToolPath().toString(), QStringList() << QLatin1String("-s") << m_deviceSerialNumber << QLatin1String("shell") << QLatin1String("ps")); if (!psProc.waitForFinished(-1)) { @@ -148,7 +150,7 @@ void AndroidRunner::asyncStart() arguments << QLatin1String("-s") << m_deviceSerialNumber << QLatin1String("forward") << QString::fromLatin1("tcp%1").arg(m_remoteChannel) << QString::fromLatin1("localfilesystem:/data/data/%1/debug-socket").arg(m_packageName); - adbStarProc.start(AndroidConfigurations::instance().adbToolPath(), arguments); + adbStarProc.start(AndroidConfigurations::instance().adbToolPath().toString(), arguments); if (!adbStarProc.waitForStarted()) { emit remoteProcessFinished(tr("Failed to forward debugging ports. Reason: $1").arg(adbStarProc.errorString())); return; @@ -176,7 +178,7 @@ void AndroidRunner::asyncStart() if (extraParams.length()) arguments << extraParams.split(QLatin1Char(' ')); - adbStarProc.start(AndroidConfigurations::instance().adbToolPath(), arguments); + adbStarProc.start(AndroidConfigurations::instance().adbToolPath().toString(), arguments); if (!adbStarProc.waitForStarted()) { emit remoteProcessFinished(tr("Failed to start the activity. Reason: $1").arg(adbStarProc.errorString())); return; @@ -209,7 +211,7 @@ void AndroidRunner::asyncStart() void AndroidRunner::startLogcat() { m_checkPIDTimer.start(1000); // check if the application is alive every 1 seconds - m_adbLogcatProcess.start(AndroidConfigurations::instance().adbToolPath(), + m_adbLogcatProcess.start(AndroidConfigurations::instance().adbToolPath().toString(), QStringList() << QLatin1String("-s") << m_deviceSerialNumber << QLatin1String("logcat")); emit remoteProcessStarted(5039); @@ -267,7 +269,7 @@ void AndroidRunner::adbKill(qint64 pid, const QString &device, int timeout, cons arguments << QLatin1String("kill") << QLatin1String("-9"); arguments << QString::number(pid); - process.start(AndroidConfigurations::instance().adbToolPath(), arguments); + process.start(AndroidConfigurations::instance().adbToolPath().toString(), arguments); if (!process.waitForFinished(timeout)) process.terminate(); } diff --git a/src/plugins/android/androidsettingswidget.cpp b/src/plugins/android/androidsettingswidget.cpp index 48fa82af5e..0c9b86338d 100644 --- a/src/plugins/android/androidsettingswidget.cpp +++ b/src/plugins/android/androidsettingswidget.cpp @@ -149,19 +149,19 @@ void AndroidSettingsWidget::initGui() m_ui->setupUi(this); m_ui->toolchainVersionComboBox->clear(); if (checkSDK(m_androidConfig.sdkLocation)) - m_ui->SDKLocationLineEdit->setText(m_androidConfig.sdkLocation); + m_ui->SDKLocationLineEdit->setText(m_androidConfig.sdkLocation.toUserOutput()); else m_androidConfig.sdkLocation.clear(); if (checkNDK(m_androidConfig.ndkLocation)) - m_ui->NDKLocationLineEdit->setText(m_androidConfig.ndkLocation); + m_ui->NDKLocationLineEdit->setText(m_androidConfig.ndkLocation.toUserOutput()); else m_androidConfig.ndkLocation.clear(); - m_ui->AntLocationLineEdit->setText(m_androidConfig.antLocation); - m_ui->GdbLocationLineEdit->setText(m_androidConfig.armGdbLocation); - m_ui->GdbserverLocationLineEdit->setText(m_androidConfig.armGdbserverLocation); - m_ui->GdbLocationLineEditx86->setText(m_androidConfig.x86GdbLocation); - m_ui->GdbserverLocationLineEditx86->setText(m_androidConfig.x86GdbserverLocation); - m_ui->OpenJDKLocationLineEdit->setText(m_androidConfig.openJDKLocation); + m_ui->AntLocationLineEdit->setText(m_androidConfig.antLocation.toUserOutput()); + m_ui->GdbLocationLineEdit->setText(m_androidConfig.armGdbLocation.toUserOutput()); + m_ui->GdbserverLocationLineEdit->setText(m_androidConfig.armGdbserverLocation.toUserOutput()); + m_ui->GdbLocationLineEditx86->setText(m_androidConfig.x86GdbLocation.toUserOutput()); + m_ui->GdbserverLocationLineEditx86->setText(m_androidConfig.x86GdbserverLocation.toUserOutput()); + m_ui->OpenJDKLocationLineEdit->setText(m_androidConfig.openJDKLocation.toUserOutput()); m_ui->DataPartitionSizeSpinBox->setValue(m_androidConfig.partitionSize); m_ui->AVDTableView->setModel(&m_AVDModel); m_AVDModel.setAvdList(AndroidConfigurations::instance().androidVirtualDevices()); @@ -181,33 +181,40 @@ void AndroidSettingsWidget::saveSettings(bool saveNow) } -bool AndroidSettingsWidget::checkSDK(const QString &location) +bool AndroidSettingsWidget::checkSDK(const Utils::FileName &location) { - if (!location.length()) + if (location.isEmpty()) return false; - if (!QFile::exists(location + QLatin1String("/platform-tools/adb" ANDROID_EXE_SUFFIX)) - || (!QFile::exists(location + QLatin1String("/tools/android" ANDROID_EXE_SUFFIX)) - && !QFile::exists(location + QLatin1String("/tools/android" ANDROID_BAT_SUFFIX))) - || !QFile::exists(location + QLatin1String("/tools/emulator" ANDROID_EXE_SUFFIX))) { - QMessageBox::critical(this, tr("Android SDK Folder"), tr("\"%1\" doesn't seem to be an Android SDK top folder").arg(location)); + Utils::FileName adb = location; + Utils::FileName androidExe = location; + Utils::FileName androidBat = location; + Utils::FileName emulator = location; + if (!adb.appendPath(QLatin1String("platform-tools/adb" ANDROID_EXE_SUFFIX)).toFileInfo().exists() + || (!androidExe.appendPath(QLatin1String("/tools/android" ANDROID_EXE_SUFFIX)).toFileInfo().exists() + && !androidBat.appendPath(QLatin1String("/tools/android" ANDROID_BAT_SUFFIX)).toFileInfo().exists()) + || !emulator.appendPath(QLatin1String("/tools/emulator" ANDROID_EXE_SUFFIX)).toFileInfo().exists()) { + QMessageBox::critical(this, tr("Android SDK Folder"), tr("\"%1\" doesn't seem to be an Android SDK top folder").arg(location.toUserOutput())); return false; } return true; } -bool AndroidSettingsWidget::checkNDK(const QString &location) +bool AndroidSettingsWidget::checkNDK(const Utils::FileName &location) { m_ui->toolchainVersionComboBox->setEnabled(false); m_ui->GdbLocationLineEdit->setEnabled(false); m_ui->GdbLocationPushButton->setEnabled(false); m_ui->GdbserverLocationLineEdit->setEnabled(false); m_ui->GdbserverLocationPushButton->setEnabled(false); - if (!location.length()) + if (location.isEmpty()) return false; - if (!QFile::exists(location + QLatin1String("/platforms")) - || !QFile::exists(location + QLatin1String("/toolchains")) - || !QFile::exists(location + QLatin1String("/sources/cxx-stl"))) { - QMessageBox::critical(this, tr("Android SDK Folder"), tr("\"%1\" doesn't seem to be an Android NDK top folder").arg(location)); + Utils::FileName platformPath = location; + Utils::FileName toolChainPath = location; + Utils::FileName sourcesPath = location; + if (!platformPath.appendPath(QLatin1String("platforms")).toFileInfo().exists() + || !toolChainPath.appendPath(QLatin1String("toolchains")).toFileInfo().exists() + || !sourcesPath.appendPath(QLatin1String("sources/cxx-stl")).toFileInfo().exists()) { + QMessageBox::critical(this, tr("Android SDK Folder"), tr("\"%1\" doesn't seem to be an Android NDK top folder").arg(location.toUserOutput())); return false; } m_ui->toolchainVersionComboBox->setEnabled(true); @@ -222,7 +229,7 @@ bool AndroidSettingsWidget::checkNDK(const QString &location) void AndroidSettingsWidget::sdkLocationEditingFinished() { - QString location = m_ui->SDKLocationLineEdit->text(); + Utils::FileName location = Utils::FileName::fromUserInput(m_ui->SDKLocationLineEdit->text()); if (!checkSDK(location)) { m_ui->AVDManagerFrame->setEnabled(false); return; @@ -235,8 +242,8 @@ void AndroidSettingsWidget::sdkLocationEditingFinished() void AndroidSettingsWidget::ndkLocationEditingFinished() { - QString location = m_ui->NDKLocationLineEdit->text(); - if (!checkNDK(location)) + Utils::FileName location = Utils::FileName::fromUserInput(m_ui->NDKLocationLineEdit->text()); + if (checkNDK(location)) return; m_androidConfig.ndkLocation = location; saveSettings(true); @@ -264,67 +271,67 @@ void AndroidSettingsWidget::toolchainVersionIndexChanged(QString version) void AndroidSettingsWidget::antLocationEditingFinished() { - QString location = m_ui->AntLocationLineEdit->text(); - if (!location.length() || !QFile::exists(location)) + Utils::FileName location = Utils::FileName::fromUserInput(m_ui->AntLocationLineEdit->text()); + if (location.isEmpty() || !location.toFileInfo().exists()) return; m_androidConfig.antLocation = location; } void AndroidSettingsWidget::gdbLocationEditingFinished() { - QString location = m_ui->GdbLocationLineEdit->text(); - if (!location.length() || !QFile::exists(location)) + Utils::FileName location = Utils::FileName::fromUserInput(m_ui->GdbLocationLineEdit->text()); + if (location.isEmpty() || !location.toFileInfo().exists()) return; m_androidConfig.armGdbLocation = location; } void AndroidSettingsWidget::gdbserverLocationEditingFinished() { - QString location = m_ui->GdbserverLocationLineEdit->text(); - if (!location.length() || !QFile::exists(location)) + Utils::FileName location = Utils::FileName::fromUserInput(m_ui->GdbserverLocationLineEdit->text()); + if (location.isEmpty() || !location.toFileInfo().exists()) return; m_androidConfig.armGdbserverLocation = location; } void AndroidSettingsWidget::gdbLocationX86EditingFinished() { - QString location = m_ui->GdbLocationLineEditx86->text(); - if (!location.length() || !QFile::exists(location)) + Utils::FileName location = Utils::FileName::fromUserInput(m_ui->GdbLocationLineEditx86->text()); + if (location.isEmpty() || !location.toFileInfo().exists()) return; m_androidConfig.x86GdbLocation = location; } void AndroidSettingsWidget::gdbserverLocationX86EditingFinished() { - QString location = m_ui->GdbserverLocationLineEditx86->text(); - if (!location.length() || !QFile::exists(location)) + Utils::FileName location = Utils::FileName::fromUserInput(m_ui->GdbserverLocationLineEditx86->text()); + if (location.isEmpty() || !location.toFileInfo().exists()) return; m_androidConfig.x86GdbserverLocation = location; } void AndroidSettingsWidget::openJDKLocationEditingFinished() { - QString location = m_ui->OpenJDKLocationLineEdit->text(); - if (!location.length() || !QFile::exists(location)) + Utils::FileName location = Utils::FileName::fromUserInput(m_ui->OpenJDKLocationLineEdit->text()); + if (location.isEmpty() || !location.toFileInfo().exists()) return; m_androidConfig.openJDKLocation = location; } void AndroidSettingsWidget::browseSDKLocation() { - QString dir = QFileDialog::getExistingDirectory(this, tr("Select Android SDK Folder")); + Utils::FileName dir = Utils::FileName::fromString(QFileDialog::getExistingDirectory(this, tr("Select Android SDK folder"))); if (!checkSDK(dir)) return; - m_ui->SDKLocationLineEdit->setText(dir); + m_ui->SDKLocationLineEdit->setText(dir.toUserOutput()); sdkLocationEditingFinished(); } void AndroidSettingsWidget::browseNDKLocation() { - QString dir = QFileDialog::getExistingDirectory(this, tr("Select Android NDK Folder")); + Utils::FileName dir = Utils::FileName::fromString(QFileDialog::getExistingDirectory(this, tr("Select Android NDK folder"))); if (!checkNDK(dir)) return; - m_ui->NDKLocationLineEdit->setText(dir); + m_ui->NDKLocationLineEdit->setText(dir.toUserOutput()); ndkLocationEditingFinished(); } @@ -350,55 +357,51 @@ void AndroidSettingsWidget::browseAntLocation() void AndroidSettingsWidget::browseGdbLocation() { - QString gdbPath = AndroidConfigurations::instance().gdbPath(ProjectExplorer::Abi::ArmArchitecture); - QString file = QFileDialog::getOpenFileName(this, tr("Select gdb Executable"),gdbPath); - if (!file.length()) + Utils::FileName gdbPath = AndroidConfigurations::instance().gdbPath(ProjectExplorer::Abi::ArmArchitecture); + Utils::FileName file = Utils::FileName::fromString(QFileDialog::getOpenFileName(this, tr("Select gdb executable"), gdbPath.toString())); + if (file.isEmpty()) return; - m_ui->GdbLocationLineEdit->setText(file); + m_ui->GdbLocationLineEdit->setText(file.toUserOutput()); gdbLocationEditingFinished(); } void AndroidSettingsWidget::browseGdbserverLocation() { - QString gdbserverPath = AndroidConfigurations::instance().gdbServerPath(ProjectExplorer::Abi::ArmArchitecture); - const QString file = - QFileDialog::getOpenFileName(this, tr("Select gdbserver Android Executable"),gdbserverPath); - if (!file.length()) + Utils::FileName gdbserverPath = AndroidConfigurations::instance().gdbServerPath(ProjectExplorer::Abi::ArmArchitecture); + Utils::FileName file = Utils::FileName::fromString(QFileDialog::getOpenFileName(this, tr("Select gdbserver android executable"), gdbserverPath.toString())); + if (file.isEmpty()) return; - m_ui->GdbserverLocationLineEdit->setText(file); + m_ui->GdbserverLocationLineEdit->setText(file.toUserOutput()); gdbserverLocationEditingFinished(); } void AndroidSettingsWidget::browseGdbLocationX86() { - QString gdbPath = AndroidConfigurations::instance().gdbPath(ProjectExplorer::Abi::X86Architecture); - const QString file = - QFileDialog::getOpenFileName(this, tr("Select gdb Executable"),gdbPath); - if (!file.length()) + Utils::FileName gdbPath = AndroidConfigurations::instance().gdbPath(ProjectExplorer::Abi::X86Architecture); + Utils::FileName file = Utils::FileName::fromString(QFileDialog::getOpenFileName(this, tr("Select gdb executable"), gdbPath.toString())); + if (file.isEmpty()) return; - m_ui->GdbLocationLineEditx86->setText(file); + m_ui->GdbLocationLineEditx86->setText(file.toUserOutput()); gdbLocationX86EditingFinished(); } void AndroidSettingsWidget::browseGdbserverLocationX86() { - QString gdbserverPath = AndroidConfigurations::instance().gdbServerPath(ProjectExplorer::Abi::X86Architecture); - const QString file = - QFileDialog::getOpenFileName(this, tr("Select gdbserver Android Executable"), gdbserverPath); - if (!file.length()) + Utils::FileName gdbserverPath = AndroidConfigurations::instance().gdbServerPath(ProjectExplorer::Abi::X86Architecture); + Utils::FileName file = Utils::FileName::fromString(QFileDialog::getOpenFileName(this, tr("Select gdbserver android executable"), gdbserverPath.toString())); + if (file.isEmpty()) return; - m_ui->GdbserverLocationLineEditx86->setText(file); + m_ui->GdbserverLocationLineEditx86->setText(file.toUserOutput()); gdbserverLocationX86EditingFinished(); } void AndroidSettingsWidget::browseOpenJDKLocation() { - QString openJDKPath = AndroidConfigurations::instance().openJDKPath(); - const QString file = - QFileDialog::getOpenFileName(this, tr("Select OpenJDK Path"), openJDKPath); - if (!file.length()) + Utils::FileName openJDKPath = AndroidConfigurations::instance().openJDKPath(); + Utils::FileName file = Utils::FileName::fromString(QFileDialog::getOpenFileName(this, tr("Select OpenJDK path"), openJDKPath.toString())); + if (file.isEmpty()) return; - m_ui->OpenJDKLocationLineEdit->setText(file); + m_ui->OpenJDKLocationLineEdit->setText(file.toUserOutput()); openJDKLocationEditingFinished(); } @@ -436,7 +439,8 @@ void AndroidSettingsWidget::manageAVD() QProcess *avdProcess = new QProcess(); connect(this, SIGNAL(destroyed()), avdProcess, SLOT(deleteLater())); connect(avdProcess, SIGNAL(finished(int)), avdProcess, SLOT(deleteLater())); - avdProcess->start(AndroidConfigurations::instance().androidToolPath(), QStringList() << QLatin1String("avd")); + avdProcess->start(AndroidConfigurations::instance().androidToolPath().toString(), + QStringList() << QLatin1String("avd")); } diff --git a/src/plugins/android/androidsettingswidget.h b/src/plugins/android/androidsettingswidget.h index fa985a6cb7..8de720593d 100644 --- a/src/plugins/android/androidsettingswidget.h +++ b/src/plugins/android/androidsettingswidget.h @@ -72,6 +72,7 @@ class AndroidSettingsWidget : public QWidget { Q_OBJECT public: + // Todo: This would be so much simpler if it just used Utils::PathChooser!!! AndroidSettingsWidget(QWidget *parent); ~AndroidSettingsWidget(); @@ -105,8 +106,8 @@ private slots: private: void initGui(); - bool checkSDK(const QString &location); - bool checkNDK(const QString &location); + bool checkSDK(const Utils::FileName &location); + bool checkNDK(const Utils::FileName &location); void fillToolchainVersions(); Ui_AndroidSettingsWidget *m_ui; diff --git a/src/plugins/android/androidtarget.h b/src/plugins/android/androidtarget.h deleted file mode 100644 index dbbd13273d..0000000000 --- a/src/plugins/android/androidtarget.h +++ /dev/null @@ -1,204 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2012 BogDan Vatra <bog_dan_ro@yahoo.com> -** -** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. -** -**************************************************************************/ - -#ifndef ANDROIDTEMPLATESCREATOR_H -#define ANDROIDTEMPLATESCREATOR_H - -#include "qt4projectmanager/qt4target.h" -#include "qt4projectmanager/qt4buildconfiguration.h" - -#include <QMap> -#include <QIcon> -#include <QDomDocument> - -QT_FORWARD_DECLARE_CLASS(QFileSystemWatcher); - -namespace ProjectExplorer { -class Project; -class ProjectNode; -class Target; -} - -namespace Qt4ProjectManager { -class Qt4Project; -class Qt4Target; -class Qt4ProFileNode; -} - - -namespace Android { -namespace Internal { -class AndroidTargetFactory; - -class AndroidTarget : public Qt4ProjectManager::Qt4BaseTarget -{ - friend class AndroidTargetFactory; - Q_OBJECT - enum AndroidIconType - { - HighDPI, - MediumDPI, - LowDPI - }; - - struct Library - { - Library() - { - level = -1; - } - int level; - QStringList dependencies; - QString name; - }; - typedef QMap<QString, Library> LibrariesMap; -public: - enum BuildType - { - DebugBuild, - ReleaseBuildUnsigned, - ReleaseBuildSigned - }; - - explicit AndroidTarget(Qt4ProjectManager::Qt4Project *parent, const Core::Id id); - virtual ~AndroidTarget(); - - Qt4ProjectManager::Qt4BuildConfigurationFactory *buildConfigurationFactory() const; - - void createApplicationProFiles(bool reparse); - - QList<ProjectExplorer::RunConfiguration *> runConfigurationsForNode(ProjectExplorer::Node *n); - - static QString defaultDisplayName(); - - - QString packageName() const; - bool setPackageName(const QString &name) const; - - QString intentName() const; - QString activityName() const; - - QString applicationName() const; - bool setApplicationName(const QString &name) const; - - QStringList availableTargetApplications() const; - QString targetApplication() const; - bool setTargetApplication(const QString &name) const; - QString targetApplicationPath() const; - - QString targetSDK() const; - bool setTargetSDK(const QString &target) const; - - int versionCode() const; - bool setVersionCode(int version) const; - - QString versionName() const; - bool setVersionName(const QString &version) const; - - QStringList permissions() const; - bool setPermissions(const QStringList &permissions) const; - - QStringList availableQtLibs() const; - QStringList qtLibs() const; - bool setQtLibs(const QStringList &qtLibs) const; - - QStringList availablePrebundledLibs() const; - QStringList prebundledLibs() const; - bool setPrebundledLibs(const QStringList &qtLibs) const; - - QIcon highDpiIcon() const; - bool setHighDpiIcon(const QString &iconFilePath) const; - - QIcon mediumDpiIcon() const; - bool setMediumDpiIcon(const QString &iconFilePath) const; - - QIcon lowDpiIcon() const; - bool setLowDpiIcon(const QString &iconFilePath) const; - - QString androidDirPath() const; - QString androidManifestPath() const; - QString androidLibsPath() const; - QString androidStringsPath() const; - QString androidDefaultPropertiesPath() const; - QString androidSrcPath() const; - QString apkPath(BuildType buildType) const; - QString localLibsRulesFilePath() const; - QString loadLocalLibs(int apiLevel) const; - QString loadLocalJars(int apiLevel) const; - -public slots: - bool createAndroidTemplatesIfNecessary() const; - void updateProject(const QString &targetSDK, const QString &name = QString()) const; - -signals: - void androidDirContentsChanged(); - -private slots: - void handleTargetChanged(ProjectExplorer::Target *target); - void handleTargetToBeRemoved(ProjectExplorer::Target *target); - -private: - enum ItemType - { - Lib, - Jar - }; - - QString loadLocal(int apiLevel, ItemType item) const; - void raiseError(const QString &reason) const; - bool openXmlFile(QDomDocument &doc, const QString &fileName, bool createAndroidTemplates = true) const; - bool saveXmlFile(QDomDocument &doc, const QString &fileName) const; - bool openAndroidManifest(QDomDocument &doc) const; - bool saveAndroidManifest(QDomDocument &doc) const; - bool openLibsXml(QDomDocument &doc) const; - bool saveLibsXml(QDomDocument &doc) const; - - QIcon androidIcon(AndroidIconType type) const; - bool setAndroidIcon(AndroidIconType type, const QString &iconFileName) const; - - QStringList libsXml(const QString &tag) const; - bool setLibsXml(const QStringList &qtLibs, const QString &tag) const; - - static bool qtLibrariesLessThan(const AndroidTarget::Library &a, const AndroidTarget::Library &b); - QStringList getDependencies(const QString &readelfPath, const QString &lib) const; - int setLibraryLevel(const QString &library, LibrariesMap &mapLibs) const; - - - QFileSystemWatcher *const m_androidFilesWatcher; - - Qt4ProjectManager::Qt4BuildConfigurationFactory *m_buildConfigurationFactory; -}; - -} // namespace Internal -} // namespace Android - -#endif // ANDROIDTEMPLATESCREATOR_H diff --git a/src/plugins/android/androidtargetfactory.cpp b/src/plugins/android/androidtargetfactory.cpp deleted file mode 100644 index 180aa851ba..0000000000 --- a/src/plugins/android/androidtargetfactory.cpp +++ /dev/null @@ -1,185 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2012 BogDan Vatra <bog_dan_ro@yahoo.com> -** -** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. -** -**************************************************************************/ - -#include "androidtargetfactory.h" -#include "qt4projectmanager/qt4project.h" -#include "qt4projectmanager/qt4projectmanagerconstants.h" -#include "androiddeploystep.h" -#include "androidglobal.h" -#include "androidpackagecreationstep.h" -#include "androidrunconfiguration.h" -#include "androidtarget.h" -#include "androiddeployconfiguration.h" - -#include <projectexplorer/deployconfiguration.h> -#include <projectexplorer/projectexplorerconstants.h> -#include <qt4projectmanager/buildconfigurationinfo.h> -#include <qtsupport/customexecutablerunconfiguration.h> - -#include <qtsupport/qtversionmanager.h> - -using namespace Qt4ProjectManager; -using namespace Android::Internal; -using ProjectExplorer::idFromMap; - -// ------------------------------------------------------------------------- -// Qt4AndroidTargetFactory -// ------------------------------------------------------------------------- -AndroidTargetFactory::AndroidTargetFactory(QObject *parent) : - Qt4BaseTargetFactory(parent) -{ - connect(QtSupport::QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>,QList<int>,QList<int>)), - this, SIGNAL(canCreateTargetIdsChanged())); -} - -AndroidTargetFactory::~AndroidTargetFactory() -{ -} - -bool AndroidTargetFactory::supportsTargetId(const Core::Id id) const -{ - return id == Core::Id(Qt4ProjectManager::Constants::ANDROID_DEVICE_TARGET_ID); -} - -QSet<QString> AndroidTargetFactory::targetFeatures(const Core::Id id) const -{ - Q_UNUSED(id); - QSet<QString> features; - features << QLatin1String(Qt4ProjectManager::Constants::MOBILE_TARGETFEATURE_ID); - features << QLatin1String(Qt4ProjectManager::Constants::SHADOWBUILD_TARGETFEATURE_ID); - return features; -} - -QList<Core::Id> AndroidTargetFactory::supportedTargetIds() const -{ - return QList<Core::Id>() << Core::Id(Qt4ProjectManager::Constants::ANDROID_DEVICE_TARGET_ID); -} - -QString AndroidTargetFactory::displayNameForId(const Core::Id id) const -{ - if (id == Core::Id(Qt4ProjectManager::Constants::ANDROID_DEVICE_TARGET_ID)) - return AndroidTarget::defaultDisplayName(); - return QString(); -} - -QIcon AndroidTargetFactory::iconForId(const Core::Id id) const -{ - Q_UNUSED(id) - return QIcon(QLatin1String(Constants::ANDROID_SETTINGS_CATEGORY_ICON)); -} - -bool AndroidTargetFactory::canCreate(ProjectExplorer::Project *parent, const Core::Id id) const -{ - if (!qobject_cast<Qt4Project *>(parent)) - return false; - if (!supportsTargetId(id)) - return false; - return QtSupport::QtVersionManager::instance()->supportsTargetId(id); -} - -bool AndroidTargetFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const -{ - return canCreate(parent, idFromMap(map)); -} - -Qt4BaseTarget *AndroidTargetFactory::restore(ProjectExplorer::Project *parent, const QVariantMap &map) -{ - if (!canRestore(parent, map)) - return 0; - - const Core::Id id = idFromMap(map); - AndroidTarget *target = 0; - Qt4Project *qt4project = static_cast<Qt4Project *>(parent); - if (id == Core::Id(Qt4ProjectManager::Constants::ANDROID_DEVICE_TARGET_ID)) - target = new AndroidTarget(qt4project, id); - if (target && target->fromMap(map)) - return target; - delete target; - return 0; -} - -Qt4BaseTarget *AndroidTargetFactory::create(ProjectExplorer::Project *parent, const Core::Id id) -{ - if (!canCreate(parent, id)) - return 0; - - QList<QtSupport::BaseQtVersion *> knownVersions = QtSupport::QtVersionManager::instance()->versionsForTargetId(id); - if (knownVersions.isEmpty()) - return 0; - - QtSupport::BaseQtVersion *qtVersion = knownVersions.first(); - bool buildAll = qtVersion->isValid() && (qtVersion->defaultBuildConfig() & QtSupport::BaseQtVersion::BuildAll); - QtSupport::BaseQtVersion::QmakeBuildConfigs config = buildAll ? QtSupport::BaseQtVersion::BuildAll : QtSupport::BaseQtVersion::QmakeBuildConfig(0); - - QList<Qt4ProjectManager::BuildConfigurationInfo> infos; - infos.append(Qt4ProjectManager::BuildConfigurationInfo(qtVersion->uniqueId(), config, QString(), QString())); - infos.append(Qt4ProjectManager::BuildConfigurationInfo(qtVersion->uniqueId(), config ^ QtSupport::BaseQtVersion::DebugBuild, QString(), QString())); - - return create(parent, id, infos); -} - -Qt4BaseTarget *AndroidTargetFactory::create(ProjectExplorer::Project *parent, const Core::Id id, - const QList<Qt4ProjectManager::BuildConfigurationInfo> &infos) -{ - if (!canCreate(parent, id)) - return 0; - - AndroidTarget *target = 0; - if (id == Core::Id(Qt4ProjectManager::Constants::ANDROID_DEVICE_TARGET_ID)) - target = new AndroidTarget(static_cast<Qt4Project *>(parent), id); - Q_ASSERT(target); - - foreach (const Qt4ProjectManager::BuildConfigurationInfo &info, infos) { - QString displayName = info.version()->displayName() + QLatin1Char(' '); - displayName += (info.buildConfig & QtSupport::BaseQtVersion::DebugBuild) ? tr("Debug") : tr("Release"); - target->addQt4BuildConfiguration(displayName, QString(), - info.version(), - info.buildConfig, - info.additionalArguments, - info.directory, - info.importing); - } - - target->addDeployConfiguration(target->createDeployConfiguration(Core::Id(ANDROID_DEPLOYCONFIGURATION_ID))); - - target->createApplicationProFiles(false); - if (target->runConfigurations().isEmpty()) - target->addRunConfiguration(new QtSupport::CustomExecutableRunConfiguration(target)); - return target; -} - -QString AndroidTargetFactory::buildNameForId(const Core::Id id) const -{ - if (id == Core::Id(Qt4ProjectManager::Constants::ANDROID_DEVICE_TARGET_ID)) - return QLatin1String("android"); - return QString(); -} diff --git a/src/plugins/android/androidtargetfactory.h b/src/plugins/android/androidtargetfactory.h deleted file mode 100644 index c0f77f390d..0000000000 --- a/src/plugins/android/androidtargetfactory.h +++ /dev/null @@ -1,70 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2012 BogDan Vatra <bog_dan_ro@yahoo.com> -** -** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. -** -**************************************************************************/ - -#ifndef QT4ANDROIDTARGETFACTORY_H -#define QT4ANDROIDTARGETFACTORY_H - -#include "qt4projectmanager/qt4basetargetfactory.h" -#include "qt4projectmanager/qt4target.h" - -namespace Android { -namespace Internal { - -class AndroidTargetFactory : public Qt4ProjectManager::Qt4BaseTargetFactory -{ - Q_OBJECT -public: - AndroidTargetFactory(QObject *parent = 0); - ~AndroidTargetFactory(); - - QList<Core::Id> supportedTargetIds() const; - QString displayNameForId(const Core::Id id) const; - QIcon iconForId(const Core::Id id) const; - - bool canCreate(ProjectExplorer::Project *parent, const Core::Id id) const; - bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const; - Qt4ProjectManager::Qt4BaseTarget *restore(ProjectExplorer::Project *parent, const QVariantMap &map); - - bool supportsTargetId(const Core::Id id) const; - virtual QSet<QString> targetFeatures(const Core::Id id) const; - - Qt4ProjectManager::Qt4BaseTarget *create(ProjectExplorer::Project *parent, const Core::Id id); - Qt4ProjectManager::Qt4BaseTarget *create(ProjectExplorer::Project *parent, const Core::Id id, - const QList<Qt4ProjectManager::BuildConfigurationInfo> &infos); - - QString buildNameForId(const Core::Id id) const; -}; - -} // namespace Internal -} // namespace Android - -#endif // QT4ANDROIDTARGETFACTORY_H diff --git a/src/plugins/android/androidtoolchain.cpp b/src/plugins/android/androidtoolchain.cpp index 1c6c9c1a3a..d9955c805b 100644 --- a/src/plugins/android/androidtoolchain.cpp +++ b/src/plugins/android/androidtoolchain.cpp @@ -33,7 +33,7 @@ #include "androidtoolchain.h" #include "androidconstants.h" #include "androidconfigurations.h" -#include "androidtarget.h" +#include "androidmanager.h" #include "androidqtversion.h" #include "qt4projectmanager/qt4projectmanagerconstants.h" @@ -103,21 +103,17 @@ void AndroidToolChain::addToEnvironment(Utils::Environment &env) const // this env vars are used by qmake mkspecs to generate makefiles (check QTDIR/mkspecs/android-g++/qmake.conf for more info) env.set(QLatin1String("ANDROID_NDK_HOST"), ndk_host); - env.set(QLatin1String("ANDROID_NDK_ROOT"), - QDir::toNativeSeparators(AndroidConfigurations::instance().config().ndkLocation)); + env.set(QLatin1String("ANDROID_NDK_ROOT"), AndroidConfigurations::instance().config().ndkLocation.toUserOutput()); env.set(QLatin1String("ANDROID_NDK_TOOLCHAIN_PREFIX"), AndroidConfigurations::toolchainPrefix(targetAbi().architecture())); env.set(QLatin1String("ANDROID_NDK_TOOLS_PREFIX"), AndroidConfigurations::toolsPrefix(targetAbi().architecture())); env.set(QLatin1String("ANDROID_NDK_TOOLCHAIN_VERSION"), AndroidConfigurations::instance().config().ndkToolchainVersion); // TODO that is very ugly and likely to be wrong... Qt4Project *qt4pro = qobject_cast<Qt4Project *>(ProjectExplorer::ProjectExplorerPlugin::instance()->currentProject()); - if (!qt4pro) - return; - AndroidTarget *at = qobject_cast<AndroidTarget *>(qt4pro->activeTarget()); - if (!at) + if (!qt4pro || !qt4pro->activeTarget()) return; env.set(QLatin1String("ANDROID_NDK_PLATFORM"), - AndroidConfigurations::instance().bestMatch(at->targetSDK())); + AndroidConfigurations::instance().bestMatch(AndroidManager::targetSDK(qt4pro->activeTarget()))); } bool AndroidToolChain::operator ==(const ProjectExplorer::ToolChain &tc) const @@ -202,11 +198,6 @@ QList<ProjectExplorer::Abi> AndroidToolChain::detectSupportedAbis() const return aqv->qtAbis(); } -QString AndroidToolChain::legacyId() const -{ - return QString::fromLatin1("%1:%2").arg(QLatin1String(Constants::ANDROID_TOOLCHAIN_ID)).arg(m_qtVersionId); -} - // -------------------------------------------------------------------------- // ToolChainConfigWidget // -------------------------------------------------------------------------- @@ -218,7 +209,7 @@ AndroidToolChainConfigWidget::AndroidToolChainConfigWidget(AndroidToolChain *tc) QLabel *label = new QLabel; QtSupport::BaseQtVersion *v = QtSupport::QtVersionManager::instance()->version(tc->qtVersionId()); Q_ASSERT(v); - label->setText(tr("NDK Root: %1").arg(AndroidConfigurations::instance().config().ndkLocation)); + label->setText(tr("NDK Root: %1").arg(AndroidConfigurations::instance().config().ndkLocation.toUserOutput())); layout->addWidget(label); } @@ -323,7 +314,7 @@ QList<ProjectExplorer::ToolChain *> AndroidToolChainFactory::createToolChainList aTc->setDisplayName(tr("Android GCC (%1-%2)") .arg(ProjectExplorer::Abi::toString(aTc->targetAbi().architecture())) .arg(AndroidConfigurations::instance().config().ndkToolchainVersion)); - aTc->setCompilerCommand(Utils::FileName::fromString(AndroidConfigurations::instance().gccPath(aTc->targetAbi().architecture()))); + aTc->setCompilerCommand(AndroidConfigurations::instance().gccPath(aTc->targetAbi().architecture())); result.append(aTc); } return result; diff --git a/src/plugins/android/androidtoolchain.h b/src/plugins/android/androidtoolchain.h index e38cbaf9c5..7563a2e6af 100644 --- a/src/plugins/android/androidtoolchain.h +++ b/src/plugins/android/androidtoolchain.h @@ -67,7 +67,7 @@ public: void setQtVersionId(int); int qtVersionId() const; - QString legacyId() const; + protected: virtual QList<ProjectExplorer::Abi> detectSupportedAbis() const; diff --git a/src/plugins/autotoolsprojectmanager/autogenstep.cpp b/src/plugins/autotoolsprojectmanager/autogenstep.cpp index b3c3176784..c19f8a241a 100644 --- a/src/plugins/autotoolsprojectmanager/autogenstep.cpp +++ b/src/plugins/autotoolsprojectmanager/autogenstep.cpp @@ -34,11 +34,11 @@ #include "autogenstep.h" #include "autotoolsproject.h" -#include "autotoolstarget.h" #include "autotoolsbuildconfiguration.h" #include "autotoolsprojectconstants.h" #include <projectexplorer/buildsteplist.h> +#include <projectexplorer/target.h> #include <projectexplorer/toolchain.h> #include <projectexplorer/gnumakeparser.h> #include <projectexplorer/projectexplorer.h> @@ -67,9 +67,9 @@ AutogenStepFactory::AutogenStepFactory(QObject *parent) : QList<Core::Id> AutogenStepFactory::availableCreationIds(BuildStepList *parent) const { - if (parent->target()->project()->id() == Core::Id(Constants::AUTOTOOLS_PROJECT_ID)) - return QList<Core::Id>() << Core::Id(AUTOGEN_STEP_ID); - return QList<Core::Id>(); + if (!canHandle(parent)) + return QList<Core::Id>(); + return QList<Core::Id>() << Core::Id(AUTOGEN_STEP_ID); } QString AutogenStepFactory::displayNameForId(const Core::Id id) const @@ -81,13 +81,7 @@ QString AutogenStepFactory::displayNameForId(const Core::Id id) const bool AutogenStepFactory::canCreate(BuildStepList *parent, const Core::Id id) const { - if (parent->target()->project()->id() != Core::Id(Constants::AUTOTOOLS_PROJECT_ID)) - return false; - - if (parent->id() != Core::Id(ProjectExplorer::Constants::BUILDSTEPS_BUILD)) - return false; - - return Core::Id(AUTOGEN_STEP_ID) == id; + return canHandle(parent) && Core::Id(AUTOGEN_STEP_ID) == id; } BuildStep *AutogenStepFactory::create(BuildStepList *parent, const Core::Id id) @@ -125,6 +119,13 @@ BuildStep *AutogenStepFactory::restore(BuildStepList *parent, const QVariantMap return 0; } +bool AutogenStepFactory::canHandle(BuildStepList *parent) const +{ + if (parent->target()->project()->id() != Core::Id(Constants::AUTOTOOLS_PROJECT_ID)) + return false; + return parent->id() == Core::Id(ProjectExplorer::Constants::BUILDSTEPS_BUILD); +} + //////////////////////// // AutogenStep class //////////////////////// diff --git a/src/plugins/autotoolsprojectmanager/autogenstep.h b/src/plugins/autotoolsprojectmanager/autogenstep.h index e000b322c7..e3d719c8e3 100644 --- a/src/plugins/autotoolsprojectmanager/autogenstep.h +++ b/src/plugins/autotoolsprojectmanager/autogenstep.h @@ -72,6 +72,8 @@ public: ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *source); bool canRestore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map) const; ProjectExplorer::BuildStep *restore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map); + + bool canHandle(ProjectExplorer::BuildStepList *parent) const; }; /////////////////////// diff --git a/src/plugins/autotoolsprojectmanager/autoreconfstep.cpp b/src/plugins/autotoolsprojectmanager/autoreconfstep.cpp index 9b43fe8f2c..cba3fd3aa8 100644 --- a/src/plugins/autotoolsprojectmanager/autoreconfstep.cpp +++ b/src/plugins/autotoolsprojectmanager/autoreconfstep.cpp @@ -34,11 +34,11 @@ #include "autoreconfstep.h" #include "autotoolsproject.h" -#include "autotoolstarget.h" #include "autotoolsbuildconfiguration.h" #include "autotoolsprojectconstants.h" #include <projectexplorer/buildsteplist.h> +#include <projectexplorer/target.h> #include <projectexplorer/toolchain.h> #include <projectexplorer/gnumakeparser.h> #include <projectexplorer/projectexplorer.h> @@ -66,9 +66,9 @@ AutoreconfStepFactory::AutoreconfStepFactory(QObject *parent) : QList<Core::Id> AutoreconfStepFactory::availableCreationIds(BuildStepList *parent) const { - if (parent->target()->project()->id() == Core::Id(Constants::AUTOTOOLS_PROJECT_ID)) - return QList<Core::Id>() << Core::Id(AUTORECONF_STEP_ID); - return QList<Core::Id>(); + if (!canHandle(parent)) + return QList<Core::Id>(); + return QList<Core::Id>() << Core::Id(AUTORECONF_STEP_ID); } QString AutoreconfStepFactory::displayNameForId(const Core::Id id) const @@ -80,13 +80,7 @@ QString AutoreconfStepFactory::displayNameForId(const Core::Id id) const bool AutoreconfStepFactory::canCreate(BuildStepList *parent, const Core::Id id) const { - if (parent->target()->project()->id() != Core::Id(Constants::AUTOTOOLS_PROJECT_ID)) - return false; - - if (parent->id() != Core::Id(ProjectExplorer::Constants::BUILDSTEPS_BUILD)) - return false; - - return Core::Id(AUTORECONF_STEP_ID) == id; + return canHandle(parent) && Core::Id(AUTORECONF_STEP_ID) == id; } BuildStep *AutoreconfStepFactory::create(BuildStepList *parent, const Core::Id id) @@ -124,6 +118,13 @@ BuildStep *AutoreconfStepFactory::restore(BuildStepList *parent, const QVariantM return 0; } +bool AutoreconfStepFactory::canHandle(BuildStepList *parent) const +{ + if (parent->target()->project()->id() != Core::Id(Constants::AUTOTOOLS_PROJECT_ID)) + return false; + return parent->id() == Core::Id(ProjectExplorer::Constants::BUILDSTEPS_BUILD); +} + ///////////////////////// // AutoreconfStep class ///////////////////////// diff --git a/src/plugins/autotoolsprojectmanager/autoreconfstep.h b/src/plugins/autotoolsprojectmanager/autoreconfstep.h index c5c5b82980..7cbae99ec0 100644 --- a/src/plugins/autotoolsprojectmanager/autoreconfstep.h +++ b/src/plugins/autotoolsprojectmanager/autoreconfstep.h @@ -72,6 +72,8 @@ public: ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *source); bool canRestore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map) const; ProjectExplorer::BuildStep *restore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map); + + bool canHandle(ProjectExplorer::BuildStepList *parent) const; }; ///////////////////////// diff --git a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp index d4a4fb2adb..1a003558f8 100644 --- a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp +++ b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp @@ -35,15 +35,16 @@ #include "autotoolsbuildconfiguration.h" #include "makestep.h" #include "autotoolsproject.h" -#include "autotoolstarget.h" #include "autotoolsprojectconstants.h" #include "autogenstep.h" #include "autoreconfstep.h" #include "configurestep.h" #include <projectexplorer/buildsteplist.h> -#include <projectexplorer/toolchain.h> +#include <projectexplorer/profileinformation.h> #include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/target.h> +#include <projectexplorer/toolchain.h> #include <qtsupport/customexecutablerunconfiguration.h> #include <utils/qtcassert.h> @@ -58,18 +59,26 @@ using namespace ProjectExplorer::Constants; ////////////////////////////////////// // AutotoolsBuildConfiguration class ////////////////////////////////////// -AutotoolsBuildConfiguration::AutotoolsBuildConfiguration(AutotoolsTarget *parent) +AutotoolsBuildConfiguration::AutotoolsBuildConfiguration(ProjectExplorer::Target *parent) : BuildConfiguration(parent, Core::Id(AUTOTOOLS_BC_ID)) { - m_buildDirectory = autotoolsTarget()->defaultBuildDirectory(); + AutotoolsProject *project = qobject_cast<AutotoolsProject *>(parent->project()); + if (project) + m_buildDirectory = project->defaultBuildDirectory(); +} + +BuildConfigWidget *AutotoolsBuildConfiguration::createConfigWidget() +{ + return new AutotoolsBuildSettingsWidget; } -AutotoolsBuildConfiguration::AutotoolsBuildConfiguration(AutotoolsTarget *parent, const Core::Id id) +AutotoolsBuildConfiguration::AutotoolsBuildConfiguration(ProjectExplorer::Target *parent, const Core::Id id) : BuildConfiguration(parent, id) { } -AutotoolsBuildConfiguration::AutotoolsBuildConfiguration(AutotoolsTarget *parent, AutotoolsBuildConfiguration *source) +AutotoolsBuildConfiguration::AutotoolsBuildConfiguration(ProjectExplorer::Target *parent, + AutotoolsBuildConfiguration *source) : BuildConfiguration(parent, source), m_buildDirectory(source->m_buildDirectory) { @@ -88,7 +97,7 @@ bool AutotoolsBuildConfiguration::fromMap(const QVariantMap &map) if (!BuildConfiguration::fromMap(map)) return false; - m_buildDirectory = map.value(QLatin1String(BUILD_DIRECTORY_KEY), autotoolsTarget()->defaultBuildDirectory()).toString(); + m_buildDirectory = map.value(QLatin1String(BUILD_DIRECTORY_KEY)).toString(); return true; } @@ -105,14 +114,9 @@ void AutotoolsBuildConfiguration::setBuildDirectory(const QString &buildDirector emit buildDirectoryChanged(); } -AutotoolsTarget *AutotoolsBuildConfiguration::autotoolsTarget() const -{ - return static_cast<AutotoolsTarget *>(target()); -} - IOutputParser *AutotoolsBuildConfiguration::createOutputParser() const { - ToolChain *tc = autotoolsTarget()->autotoolsProject()->toolChain(); + ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(target()->profile()); if (tc) return tc->outputParser(); return 0; @@ -126,9 +130,9 @@ AutotoolsBuildConfigurationFactory::AutotoolsBuildConfigurationFactory(QObject * { } -QList<Core::Id> AutotoolsBuildConfigurationFactory::availableCreationIds(Target *parent) const +QList<Core::Id> AutotoolsBuildConfigurationFactory::availableCreationIds(const Target *parent) const { - if (!qobject_cast<AutotoolsTarget *>(parent)) + if (!canHandle(parent)) return QList<Core::Id>(); return QList<Core::Id>() << Core::Id(AUTOTOOLS_BC_ID); } @@ -140,52 +144,45 @@ QString AutotoolsBuildConfigurationFactory::displayNameForId(const Core::Id id) return QString(); } -bool AutotoolsBuildConfigurationFactory::canCreate(Target *parent, const Core::Id id) const +bool AutotoolsBuildConfigurationFactory::canCreate(const Target *parent, const Core::Id id) const { - if (!qobject_cast<AutotoolsTarget *>(parent)) + if (!canHandle(parent)) return false; if (id == Core::Id(AUTOTOOLS_BC_ID)) return true; return false; } -AutotoolsBuildConfiguration *AutotoolsBuildConfigurationFactory::create(Target *parent, const Core::Id id) +AutotoolsBuildConfiguration *AutotoolsBuildConfigurationFactory::create(Target *parent, const Core::Id id, const QString &name) { if (!canCreate(parent, id)) return 0; - AutotoolsTarget *t = static_cast<AutotoolsTarget *>(parent); - AutotoolsBuildConfiguration *bc = createDefaultConfiguration(t); - - bool ok; - QString buildConfigurationName = QInputDialog::getText(0, - tr("New Configuration"), - tr("New configuration name:"), - QLineEdit::Normal, - QString(), - &ok); - + bool ok = true; + QString buildConfigurationName = name; + if (buildConfigurationName.isEmpty()) + buildConfigurationName = QInputDialog::getText(0, + tr("New Configuration"), + tr("New configuration name:"), + QLineEdit::Normal, + QString(), &ok); + buildConfigurationName = buildConfigurationName.trimmed(); if (!ok || buildConfigurationName.isEmpty()) return 0; - bc->setDisplayName(buildConfigurationName); - - t->addBuildConfiguration(bc); - t->addDeployConfiguration(t->createDeployConfiguration(Core::Id(DEFAULT_DEPLOYCONFIGURATION_ID))); - // User needs to choose where the executable file is. - // TODO: Parse the file in *Anjuta style* to be able to add custom RunConfigurations. - t->addRunConfiguration(new QtSupport::CustomExecutableRunConfiguration(t)); + AutotoolsBuildConfiguration *bc = createDefaultConfiguration(parent); + bc->setDisplayName(buildConfigurationName); return bc; } -AutotoolsBuildConfiguration *AutotoolsBuildConfigurationFactory::createDefaultConfiguration(AutotoolsTarget *target) const +AutotoolsBuildConfiguration *AutotoolsBuildConfigurationFactory::createDefaultConfiguration(ProjectExplorer::Target *target) { AutotoolsBuildConfiguration *bc = new AutotoolsBuildConfiguration(target); BuildStepList *buildSteps = bc->stepList(Core::Id(BUILDSTEPS_BUILD)); // ### Build Steps Build ### // autogen.sh or autoreconf - QFile autogenFile(target->autotoolsProject()->projectDirectory() + QLatin1String("/autogen.sh")); + QFile autogenFile(target->project()->projectDirectory() + QLatin1String("/autogen.sh")); if (autogenFile.exists()) { AutogenStep *autogenStep = new AutogenStep(buildSteps); buildSteps->insertStep(0, autogenStep); @@ -214,7 +211,14 @@ AutotoolsBuildConfiguration *AutotoolsBuildConfigurationFactory::createDefaultCo return bc; } -bool AutotoolsBuildConfigurationFactory::canClone(Target *parent, BuildConfiguration *source) const +bool AutotoolsBuildConfigurationFactory::canHandle(const Target *t) const +{ + if (!t->project()->supportsProfile(t->profile())) + return false; + return t->project()->id() == Core::Id(Constants::AUTOTOOLS_PROJECT_ID); +} + +bool AutotoolsBuildConfigurationFactory::canClone(const Target *parent, BuildConfiguration *source) const { return canCreate(parent, source->id()); } @@ -225,11 +229,10 @@ AutotoolsBuildConfiguration *AutotoolsBuildConfigurationFactory::clone(Target *p return 0; AutotoolsBuildConfiguration *origin = static_cast<AutotoolsBuildConfiguration *>(source); - AutotoolsTarget *target(static_cast<AutotoolsTarget *>(parent)); - return new AutotoolsBuildConfiguration(target, origin); + return new AutotoolsBuildConfiguration(parent, origin); } -bool AutotoolsBuildConfigurationFactory::canRestore(Target *parent, const QVariantMap &map) const +bool AutotoolsBuildConfigurationFactory::canRestore(const Target *parent, const QVariantMap &map) const { return canCreate(parent, idFromMap(map)); } @@ -238,8 +241,7 @@ AutotoolsBuildConfiguration *AutotoolsBuildConfigurationFactory::restore(Target { if (!canRestore(parent, map)) return 0; - AutotoolsTarget *target(static_cast<AutotoolsTarget *>(parent)); - AutotoolsBuildConfiguration *bc = new AutotoolsBuildConfiguration(target); + AutotoolsBuildConfiguration *bc = new AutotoolsBuildConfiguration(parent); if (bc->fromMap(map)) return bc; delete bc; @@ -251,3 +253,8 @@ BuildConfiguration::BuildType AutotoolsBuildConfiguration::buildType() const // TODO: Should I return something different from Unknown? return Unknown; } + +void AutotoolsBuildConfiguration::emitBuildDirectoryInitialized() +{ + emit buildDirectoryInitialized(); +} diff --git a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.h b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.h index b4880f17fc..d6f712b044 100644 --- a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.h +++ b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.h @@ -35,6 +35,8 @@ #ifndef AUTOTOOLSBUILDCONFIGURATION_H #define AUTOTOOLSBUILDCONFIGURATION_H +#include "autotoolsbuildsettingswidget.h" + #include <projectexplorer/buildconfiguration.h> namespace AutotoolsProjectManager { @@ -49,18 +51,21 @@ class AutotoolsBuildConfiguration : public ProjectExplorer::BuildConfiguration friend class AutotoolsBuildConfigurationFactory; public: - explicit AutotoolsBuildConfiguration(AutotoolsTarget *parent); + explicit AutotoolsBuildConfiguration(ProjectExplorer::Target *parent); + + ProjectExplorer::BuildConfigWidget *createConfigWidget(); - AutotoolsTarget *autotoolsTarget() const; QString buildDirectory() const; void setBuildDirectory(const QString &buildDirectory); QVariantMap toMap() const; ProjectExplorer::IOutputParser *createOutputParser() const; BuildType buildType() const; + void emitBuildDirectoryInitialized(); + protected: - AutotoolsBuildConfiguration(AutotoolsTarget *parent, const Core::Id id); - AutotoolsBuildConfiguration(AutotoolsTarget *parent, AutotoolsBuildConfiguration *source); + AutotoolsBuildConfiguration(ProjectExplorer::Target *parent, const Core::Id id); + AutotoolsBuildConfiguration(ProjectExplorer::Target *parent, AutotoolsBuildConfiguration *source); bool fromMap(const QVariantMap &map); @@ -75,16 +80,20 @@ class AutotoolsBuildConfigurationFactory : public ProjectExplorer::IBuildConfigu public: explicit AutotoolsBuildConfigurationFactory(QObject *parent = 0); - QList<Core::Id> availableCreationIds(ProjectExplorer::Target *parent) const; + QList<Core::Id> availableCreationIds(const ProjectExplorer::Target *parent) const; QString displayNameForId(const Core::Id id) const; - bool canCreate(ProjectExplorer::Target *parent, const Core::Id id) const; - AutotoolsBuildConfiguration *create(ProjectExplorer::Target *parent, const Core::Id id); - AutotoolsBuildConfiguration *createDefaultConfiguration(AutotoolsTarget *target) const; - bool canClone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const; + bool canCreate(const ProjectExplorer::Target *parent, const Core::Id id) const; + AutotoolsBuildConfiguration *create(ProjectExplorer::Target *parent, const Core::Id id, const QString &name = QString()); + bool canClone(const ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const; AutotoolsBuildConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source); - bool canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const; + bool canRestore(const ProjectExplorer::Target *parent, const QVariantMap &map) const; AutotoolsBuildConfiguration *restore(ProjectExplorer::Target *parent, const QVariantMap &map); + + static AutotoolsBuildConfiguration *createDefaultConfiguration(ProjectExplorer::Target *target); + +private: + bool canHandle(const ProjectExplorer::Target *t) const; }; } // namespace Internal diff --git a/src/plugins/autotoolsprojectmanager/autotoolsbuildsettingswidget.cpp b/src/plugins/autotoolsprojectmanager/autotoolsbuildsettingswidget.cpp index 72ed2dc159..9f8315c4cd 100644 --- a/src/plugins/autotoolsprojectmanager/autotoolsbuildsettingswidget.cpp +++ b/src/plugins/autotoolsprojectmanager/autotoolsbuildsettingswidget.cpp @@ -37,7 +37,7 @@ #include "autotoolsbuildconfiguration.h" #include <projectexplorer/projectexplorer.h> -#include <projectexplorer/toolchainmanager.h> +#include <projectexplorer/target.h> #include <QGridLayout> #include <QLabel> @@ -50,10 +50,7 @@ using namespace AutotoolsProjectManager; using namespace AutotoolsProjectManager::Internal; using namespace ProjectExplorer; -AutotoolsBuildSettingsWidget::AutotoolsBuildSettingsWidget(AutotoolsTarget *target) : - m_target(target), - m_pathChooser(0), - m_toolChainChooser(0), +AutotoolsBuildSettingsWidget::AutotoolsBuildSettingsWidget() : m_buildConfiguration(0) { QFormLayout *fl = new QFormLayout(this); @@ -63,23 +60,8 @@ AutotoolsBuildSettingsWidget::AutotoolsBuildSettingsWidget(AutotoolsTarget *targ m_pathChooser = new Utils::PathChooser(this); m_pathChooser->setEnabled(true); m_pathChooser->setExpectedKind(Utils::PathChooser::Directory); - m_pathChooser->setBaseDirectory(m_target->autotoolsProject()->projectDirectory()); fl->addRow(tr("Build directory:"), m_pathChooser); connect(m_pathChooser, SIGNAL(changed(QString)), this, SLOT(buildDirectoryChanged())); - - // tool chain - m_toolChainChooser = new QComboBox; - m_toolChainChooser->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - updateToolChainList(); - - fl->addRow(tr("Tool chain:"), m_toolChainChooser); - connect(m_toolChainChooser, SIGNAL(activated(int)), this, SLOT(toolChainSelected(int))); - connect(m_target->autotoolsProject(), SIGNAL(toolChainChanged(ProjectExplorer::ToolChain*)), - this, SLOT(toolChainChanged(ProjectExplorer::ToolChain*))); - connect(ProjectExplorer::ToolChainManager::instance(), SIGNAL(toolChainAdded(ProjectExplorer::ToolChain*)), - this, SLOT(updateToolChainList())); - connect(ProjectExplorer::ToolChainManager::instance(), SIGNAL(toolChainRemoved(ProjectExplorer::ToolChain*)), - this, SLOT(updateToolChainList())); } QString AutotoolsBuildSettingsWidget::displayName() const @@ -90,6 +72,7 @@ QString AutotoolsBuildSettingsWidget::displayName() const void AutotoolsBuildSettingsWidget::init(BuildConfiguration *bc) { m_buildConfiguration = static_cast<AutotoolsBuildConfiguration *>(bc); + m_pathChooser->setBaseDirectory(bc->target()->project()->projectDirectory()); m_pathChooser->setPath(m_buildConfiguration->buildDirectory()); } @@ -97,39 +80,3 @@ void AutotoolsBuildSettingsWidget::buildDirectoryChanged() { m_buildConfiguration->setBuildDirectory(m_pathChooser->rawPath()); } - -void AutotoolsBuildSettingsWidget::toolChainSelected(int index) -{ - using namespace ProjectExplorer; - - ToolChain *tc = static_cast<ToolChain *>(m_toolChainChooser->itemData(index).value<void *>()); - m_target->autotoolsProject()->setToolChain(tc); -} - -void AutotoolsBuildSettingsWidget::toolChainChanged(ProjectExplorer::ToolChain *tc) -{ - for (int i = 0; i < m_toolChainChooser->count(); ++i) { - ToolChain *currentTc = static_cast<ToolChain *>(m_toolChainChooser->itemData(i).value<void *>()); - if (currentTc != tc) - continue; - m_toolChainChooser->setCurrentIndex(i); - return; - } -} - -void AutotoolsBuildSettingsWidget::updateToolChainList() -{ - m_toolChainChooser->clear(); - - QList<ToolChain *> tcs = ToolChainManager::instance()->toolChains(); - if (!m_target->autotoolsProject()->toolChain()) { - m_toolChainChooser->addItem(tr("<Invalid tool chain>"), qVariantFromValue(static_cast<void *>(0))); - m_toolChainChooser->setCurrentIndex(0); - } - foreach (ToolChain *tc, tcs) { - m_toolChainChooser->addItem(tc->displayName(), qVariantFromValue(static_cast<void *>(tc))); - if (m_target->autotoolsProject()->toolChain() - && m_target->autotoolsProject()->toolChain()->id() == tc->id()) - m_toolChainChooser->setCurrentIndex(m_toolChainChooser->count() - 1); - } -} diff --git a/src/plugins/autotoolsprojectmanager/autotoolsbuildsettingswidget.h b/src/plugins/autotoolsprojectmanager/autotoolsbuildsettingswidget.h index 2cf39a5c11..4550c4906c 100644 --- a/src/plugins/autotoolsprojectmanager/autotoolsbuildsettingswidget.h +++ b/src/plugins/autotoolsprojectmanager/autotoolsbuildsettingswidget.h @@ -35,12 +35,10 @@ #ifndef AUTOTOOLSBUILDSETTINGSWIDGET_H #define AUTOTOOLSBUILDSETTINGSWIDGET_H -#include "autotoolstarget.h" #include "autotoolsbuildconfiguration.h" #include <projectexplorer/buildconfiguration.h> #include <projectexplorer/project.h> -#include <projectexplorer/toolchain.h> #include <projectexplorer/buildstep.h> #include <utils/pathchooser.h> @@ -51,7 +49,7 @@ QT_END_NAMESPACE namespace AutotoolsProjectManager { namespace Internal { -class AutotoolsProject; +class AutotoolsBuildConfiguration; /** * @brief Implementation of ProjectExplorer::BuildConfigWidget interface. @@ -63,21 +61,16 @@ class AutotoolsBuildSettingsWidget : public ProjectExplorer::BuildConfigWidget Q_OBJECT public: - explicit AutotoolsBuildSettingsWidget(AutotoolsTarget *target); + AutotoolsBuildSettingsWidget(); QString displayName() const; void init(ProjectExplorer::BuildConfiguration *bc); private slots: void buildDirectoryChanged(); - void toolChainSelected(int index); - void toolChainChanged(ProjectExplorer::ToolChain *tc); - void updateToolChainList(); private: - AutotoolsTarget *m_target; Utils::PathChooser *m_pathChooser; - QComboBox *m_toolChainChooser; AutotoolsBuildConfiguration *m_buildConfiguration; }; diff --git a/src/plugins/autotoolsprojectmanager/autotoolsproject.cpp b/src/plugins/autotoolsprojectmanager/autotoolsproject.cpp index 190792f830..7f293b6141 100644 --- a/src/plugins/autotoolsprojectmanager/autotoolsproject.cpp +++ b/src/plugins/autotoolsprojectmanager/autotoolsproject.cpp @@ -33,6 +33,7 @@ **************************************************************************/ #include "autotoolsproject.h" +#include "autotoolsbuildconfiguration.h" #include "autotoolsprojectconstants.h" #include "autotoolsmanager.h" #include "autotoolsprojectnode.h" @@ -43,10 +44,12 @@ #include <projectexplorer/abi.h> #include <projectexplorer/buildenvironmentwidget.h> -#include <projectexplorer/toolchainmanager.h> +#include <projectexplorer/profilemanager.h> +#include <projectexplorer/profileinformation.h> #include <projectexplorer/buildconfiguration.h> #include <projectexplorer/buildsteplist.h> #include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/target.h> #include <extensionsystem/pluginmanager.h> #include <cpptools/ModelManagerInterface.h> #include <coreplugin/icore.h> @@ -65,8 +68,6 @@ using namespace AutotoolsProjectManager; using namespace AutotoolsProjectManager::Internal; using namespace ProjectExplorer; -const char TOOLCHAIN_KEY[] = "AutotoolsProjectManager.AutotoolsProject.Toolchain"; - AutotoolsProject::AutotoolsProject(AutotoolsManager *manager, const QString &fileName) : m_manager(manager), m_fileName(fileName), @@ -75,8 +76,7 @@ AutotoolsProject::AutotoolsProject(AutotoolsManager *manager, const QString &fil m_rootNode(new AutotoolsProjectNode(this, m_file)), m_fileWatcher(new Utils::FileSystemWatcher(this)), m_watchedFiles(), - m_makefileParserThread(0), - m_toolChain(0) + m_makefileParserThread(0) { setProjectContext(Core::Context(Constants::PROJECT_CONTEXT)); setProjectLanguage(Core::Context(ProjectExplorer::Constants::LANG_CXX)); @@ -103,26 +103,6 @@ AutotoolsProject::~AutotoolsProject() } } -void AutotoolsProject::setToolChain(ToolChain *tc) -{ - if (m_toolChain == tc) - return; - - m_toolChain = tc; - - foreach (Target *t, targets()) { - foreach (BuildConfiguration *bc, t->buildConfigurations()) - bc->setToolChain(tc); - } - - emit toolChainChanged(m_toolChain); -} - -ToolChain *AutotoolsProject::toolChain() const -{ - return m_toolChain; -} - QString AutotoolsProject::displayName() const { return m_projectName; @@ -143,11 +123,6 @@ IProjectManager *AutotoolsProject::projectManager() const return m_manager; } -AutotoolsTarget *AutotoolsProject::activeTarget() const -{ - return static_cast<AutotoolsTarget *>(Project::activeTarget()); -} - QString AutotoolsProject::defaultBuildDirectory() const { return projectDirectory(); @@ -169,13 +144,6 @@ QStringList AutotoolsProject::files(FilesMode fileMode) const return m_files; } -QVariantMap AutotoolsProject::toMap() const -{ - QVariantMap map = Project::toMap(); - map.insert(QLatin1String(TOOLCHAIN_KEY), m_toolChain ? m_toolChain->id() : QString()); - return map; -} - // This function, is called at the very beginning, to // restore the settings if there are some stored. bool AutotoolsProject::fromMap(const QVariantMap &map) @@ -183,57 +151,19 @@ bool AutotoolsProject::fromMap(const QVariantMap &map) if (!Project::fromMap(map)) return false; - // Check if this project was already loaded by checking - // if there already exists a .user file. - bool hasUserFile = activeTarget(); - if (!hasUserFile) { - AutotoolsTargetFactory *factory = - ExtensionSystem::PluginManager::getObject<AutotoolsTargetFactory>(); - AutotoolsTarget *t = factory->create(this, Core::Id(Constants::DEFAULT_AUTOTOOLS_TARGET_ID)); - - QTC_ASSERT(t, return false); - QTC_ASSERT(t->activeBuildConfiguration(), return false); - - // Ask the user for where he/she wants to build it. - QPointer<AutotoolsOpenProjectWizard> wizard = new AutotoolsOpenProjectWizard(m_manager, projectDirectory()); - if (!wizard->exec() == QDialog::Accepted) - return false; - - AutotoolsBuildConfiguration *bc = - static_cast<AutotoolsBuildConfiguration *>(t->buildConfigurations().at(0)); - if (!wizard->buildDirectory().isEmpty()) - bc->setBuildDirectory(wizard->buildDirectory()); - - addTarget(t); - } - - // Toolchain - QString id = map.value(QLatin1String(TOOLCHAIN_KEY)).toString(); - const ToolChainManager *toolChainManager = ToolChainManager::instance(); - - if (!id.isNull()) { - setToolChain(toolChainManager->findToolChain(id)); - } else { - Abi abi = Abi::hostAbi(); - abi = Abi(abi.architecture(), abi.os(), Abi::UnknownFlavor, - abi.binaryFormat(), abi.wordWidth() == 32 ? 32 : 0); - QList<ToolChain *> tcs = toolChainManager->findToolChains(abi); - if (tcs.isEmpty()) - tcs = toolChainManager->toolChains(); - if (!tcs.isEmpty()) - setToolChain(tcs.at(0)); - } - connect(m_fileWatcher, SIGNAL(fileChanged(QString)), this, SLOT(onFileChanged(QString))); // Load the project tree structure. - loadProjectTree(); + evaluateBuildSystem(); + + if (!activeTarget()) + addTarget(createTarget(ProfileManager::instance()->defaultProfile())); return true; } -void AutotoolsProject::loadProjectTree() +void AutotoolsProject::evaluateBuildSystem() { if (m_makefileParserThread != 0) { // The thread is still busy parsing a previus configuration. @@ -325,12 +255,14 @@ void AutotoolsProject::makefileParsingFinished() m_makefileParserThread->deleteLater(); m_makefileParserThread = 0; + + buildSystemEvaluationFinished(true); } void AutotoolsProject::onFileChanged(const QString &file) { Q_UNUSED(file); - loadProjectTree(); + evaluateBuildSystem(); } QStringList AutotoolsProject::buildTargets() const @@ -483,15 +415,20 @@ void AutotoolsProject::updateCppCodeModel() QStringList allIncludePaths = m_makefileParserThread->includePaths(); QStringList allFrameworkPaths; - - if (m_toolChain) { - const QList<HeaderPath> allHeaderPaths = m_toolChain->systemHeaderPaths(); - foreach (const HeaderPath &headerPath, allHeaderPaths) { - if (headerPath.kind() == HeaderPath::FrameworkHeaderPath) { - allFrameworkPaths.append(headerPath.path()); - } else { - allIncludePaths.append(headerPath.path()); + QByteArray macros; + + if (activeTarget()) { + ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(activeTarget()->profile()); + if (tc) { + const QList<HeaderPath> allHeaderPaths = tc->systemHeaderPaths(); + foreach (const HeaderPath &headerPath, allHeaderPaths) { + if (headerPath.kind() == HeaderPath::FrameworkHeaderPath) + allFrameworkPaths.append(headerPath.path()); + else + allIncludePaths.append(headerPath.path()); } + macros = tc->predefinedMacros(QStringList()); + macros += '\n'; } } @@ -499,7 +436,7 @@ void AutotoolsProject::updateCppCodeModel() const bool update = (pinfo.includePaths() != allIncludePaths) || (pinfo.sourceFiles() != m_files) - || (pinfo.defines() != m_toolChain->predefinedMacros(QStringList())) + || (pinfo.defines() != macros) || (pinfo.frameworkPaths() != allFrameworkPaths); if (update) { pinfo.clearProjectParts(); @@ -507,8 +444,7 @@ void AutotoolsProject::updateCppCodeModel() new CPlusPlus::CppModelManagerInterface::ProjectPart); part->includePaths = allIncludePaths; part->sourceFiles = m_files; - if (m_toolChain) - part->defines = m_toolChain->predefinedMacros(QStringList()); + part->defines = macros; part->frameworkPaths = allFrameworkPaths; part->language = CPlusPlus::CppModelManagerInterface::CXX; pinfo.appendProjectPart(part); diff --git a/src/plugins/autotoolsprojectmanager/autotoolsproject.h b/src/plugins/autotoolsprojectmanager/autotoolsproject.h index e253ecc5fa..55612306bb 100644 --- a/src/plugins/autotoolsprojectmanager/autotoolsproject.h +++ b/src/plugins/autotoolsprojectmanager/autotoolsproject.h @@ -35,10 +35,7 @@ #ifndef AUTOTOOLSPROJECT_H #define AUTOTOOLSPROJECT_H -#include "autotoolstarget.h" - #include <coreplugin/editormanager/ieditor.h> -#include <projectexplorer/toolchain.h> #include <projectexplorer/project.h> #include <projectexplorer/projectexplorer.h> #include <projectexplorer/projectnodes.h> @@ -47,10 +44,6 @@ #include <QPointer> #include <QDir> -namespace ProjectExplorer { -class ToolChain; -} - namespace AutotoolsProjectManager { namespace Internal { class AutotoolsConfigurationFactory; @@ -80,18 +73,11 @@ public: Core::Id id() const; Core::IDocument *document() const; ProjectExplorer::IProjectManager *projectManager() const; - AutotoolsTarget *activeTarget() const; QList<ProjectExplorer::BuildConfigWidget*> subConfigWidgets(); ProjectExplorer::ProjectNode *rootProjectNode() const; QStringList files(FilesMode fileMode) const; QString defaultBuildDirectory() const; QStringList buildTargets() const; - ProjectExplorer::ToolChain *toolChain() const; - void setToolChain(ProjectExplorer::ToolChain *tc); - QVariantMap toMap() const; - -signals: - void toolChainChanged(ProjectExplorer::ToolChain *tc); protected: bool fromMap(const QVariantMap &map); @@ -100,7 +86,7 @@ private slots: /** * Loads the project tree by parsing the makefiles. */ - void loadProjectTree(); + void evaluateBuildSystem(); /** * Is invoked when the makefile parsing by m_makefileParserThread has @@ -171,8 +157,6 @@ private: /// Responsible for parsing the makefiles asynchronously in a thread MakefileParserThread *m_makefileParserThread; - - ProjectExplorer::ToolChain *m_toolChain; }; } // namespace Internal diff --git a/src/plugins/autotoolsprojectmanager/autotoolsprojectconstants.h b/src/plugins/autotoolsprojectmanager/autotoolsprojectconstants.h index cbc442ec60..a3b3c358b2 100644 --- a/src/plugins/autotoolsprojectmanager/autotoolsprojectconstants.h +++ b/src/plugins/autotoolsprojectmanager/autotoolsprojectconstants.h @@ -46,9 +46,6 @@ namespace Constants { const char AUTOTOOLS_BC_ID[] = "AutotoolsProjectManager.AutotoolsBuildConfiguration"; const char BUILD_DIRECTORY_KEY[] = "AutotoolsProjectManager.AutotoolsBuildConfiguration.BuildDirectory"; -//Target - const char DEFAULT_AUTOTOOLS_TARGET_ID[] = "AutotoolsProjectManager.DefaultAutotoolsTarget"; - //Project const char AUTOTOOLS_PROJECT_ID[] = "AutotoolsProjectManager.AutotoolsProject"; const char PROJECT_CONTEXT[] = "AutotoolsProject.ProjectContext"; diff --git a/src/plugins/autotoolsprojectmanager/autotoolsprojectmanager.pro b/src/plugins/autotoolsprojectmanager/autotoolsprojectmanager.pro index b428d54a28..92cc4bc09c 100644 --- a/src/plugins/autotoolsprojectmanager/autotoolsprojectmanager.pro +++ b/src/plugins/autotoolsprojectmanager/autotoolsprojectmanager.pro @@ -12,7 +12,6 @@ HEADERS = autotoolsprojectplugin.h\ autotoolsprojectfile.h\ autotoolsprojectnode.h\ autotoolsproject.h\ - autotoolstarget.h\ autotoolsbuildsettingswidget.h\ autotoolsbuildconfiguration.h\ autotoolsprojectconstants.h\ @@ -28,7 +27,6 @@ SOURCES = autotoolsprojectplugin.cpp\ autotoolsprojectfile.cpp\ autotoolsprojectnode.cpp\ autotoolsproject.cpp\ - autotoolstarget.cpp\ autotoolsbuildsettingswidget.cpp\ autotoolsbuildconfiguration.cpp\ makestep.cpp\ diff --git a/src/plugins/autotoolsprojectmanager/autotoolsprojectmanager.qbs b/src/plugins/autotoolsprojectmanager/autotoolsprojectmanager.qbs index c4925be4a1..78d4a6ab53 100644 --- a/src/plugins/autotoolsprojectmanager/autotoolsprojectmanager.qbs +++ b/src/plugins/autotoolsprojectmanager/autotoolsprojectmanager.qbs @@ -43,8 +43,6 @@ QtcPlugin { "autotoolsprojectnode.h", "autotoolsprojectplugin.cpp", "autotoolsprojectplugin.h", - "autotoolstarget.cpp", - "autotoolstarget.h", "configurestep.cpp", "configurestep.h", "makefileparser.cpp", diff --git a/src/plugins/autotoolsprojectmanager/autotoolsprojectplugin.cpp b/src/plugins/autotoolsprojectmanager/autotoolsprojectplugin.cpp index f8389b6c37..364594f669 100644 --- a/src/plugins/autotoolsprojectmanager/autotoolsprojectplugin.cpp +++ b/src/plugins/autotoolsprojectmanager/autotoolsprojectplugin.cpp @@ -34,7 +34,6 @@ #include "autotoolsprojectplugin.h" #include "autotoolsmanager.h" -#include "autotoolstarget.h" #include "autotoolsbuildconfiguration.h" #include "makestep.h" #include "autogenstep.h" @@ -66,7 +65,7 @@ bool AutotoolsProjectPlugin::initialize(const QStringList &arguments, if (!Core::ICore::mimeDatabase()->addMimeTypes(QLatin1String(":autotoolsproject/AutotoolsProject.mimetypes.xml"), errorString)) return false; - addAutoReleasedObject(new AutotoolsTargetFactory); + addAutoReleasedObject(new AutotoolsBuildConfigurationFactory); addAutoReleasedObject(new MakeStepFactory); addAutoReleasedObject(new AutogenStepFactory); addAutoReleasedObject(new ConfigureStepFactory); diff --git a/src/plugins/autotoolsprojectmanager/autotoolstarget.cpp b/src/plugins/autotoolsprojectmanager/autotoolstarget.cpp deleted file mode 100644 index c7917e50b1..0000000000 --- a/src/plugins/autotoolsprojectmanager/autotoolstarget.cpp +++ /dev/null @@ -1,175 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2010-2011 Openismus GmbH. -** Authors: Peter Penz (ppenz@openismus.com) -** Patricia Santana Cruz (patriciasantanacruz@gmail.com) -** -** 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 "autotoolstarget.h" -#include "autotoolsproject.h" -#include "autotoolsprojectconstants.h" -#include "autotoolsbuildsettingswidget.h" -#include "autotoolsbuildconfiguration.h" -#include "makestep.h" -#include "autogenstep.h" -#include "autoreconfstep.h" -#include "configurestep.h" - -#include <projectexplorer/buildsteplist.h> -#include <projectexplorer/projectexplorerconstants.h> -#include <qtsupport/customexecutablerunconfiguration.h> -#include <extensionsystem/pluginmanager.h> - -#include <QApplication> -#include <QStyle> - -using namespace AutotoolsProjectManager; -using namespace AutotoolsProjectManager::Internal; -using namespace ProjectExplorer; - -static QString displayNameForId(const Core::Id id) -{ - if (id == Core::Id(AutotoolsProjectManager::Constants::DEFAULT_AUTOTOOLS_TARGET_ID)) - return QApplication::translate("AutotoolsProjectManager::Internal::AutotoolsTarget", - "Desktop", "Autotools Default target display name"); - return QString(); -} - -////////////////////////// -// AutotoolsTarget class -////////////////////////// - -AutotoolsTarget::AutotoolsTarget(AutotoolsProject *parent) : - Target(parent, Core::Id(Constants::DEFAULT_AUTOTOOLS_TARGET_ID)), - m_buildConfigurationFactory(new AutotoolsBuildConfigurationFactory(this)) -{ - setDefaultDisplayName(displayNameForId(id())); - setIcon(qApp->style()->standardIcon(QStyle::SP_ComputerIcon)); -} - -BuildConfigWidget *AutotoolsTarget::createConfigWidget() -{ - return new AutotoolsBuildSettingsWidget(this); -} - - -AutotoolsProject *AutotoolsTarget::autotoolsProject() const -{ - return static_cast<AutotoolsProject *>(project()); -} - -AutotoolsBuildConfiguration *AutotoolsTarget::activeBuildConfiguration() const -{ - return static_cast<AutotoolsBuildConfiguration *>(Target::activeBuildConfiguration()); -} - -AutotoolsBuildConfigurationFactory *AutotoolsTarget::buildConfigurationFactory() const -{ - return m_buildConfigurationFactory; -} - -QString AutotoolsTarget::defaultBuildDirectory() const -{ - return autotoolsProject()->defaultBuildDirectory(); -} - -bool AutotoolsTarget::fromMap(const QVariantMap &map) -{ - return Target::fromMap(map); -} - -///////////////////////////////// -// AutotoolsTargetFactory class -///////////////////////////////// -AutotoolsTargetFactory::AutotoolsTargetFactory(QObject *parent) : - ITargetFactory(parent) -{ -} - -bool AutotoolsTargetFactory::supportsTargetId(const Core::Id id) const -{ - return id == Core::Id(Constants::DEFAULT_AUTOTOOLS_TARGET_ID); -} - -QList<Core::Id> AutotoolsTargetFactory::supportedTargetIds() const -{ - return QList<Core::Id>() << Core::Id(Constants::DEFAULT_AUTOTOOLS_TARGET_ID); -} - -QString AutotoolsTargetFactory::displayNameForId(const Core::Id id) const -{ - return ::displayNameForId(id); -} - -bool AutotoolsTargetFactory::canCreate(Project *parent, const Core::Id id) const -{ - if (!qobject_cast<AutotoolsProject *>(parent)) - return false; - return id == Core::Id(Constants::DEFAULT_AUTOTOOLS_TARGET_ID); -} - -AutotoolsTarget *AutotoolsTargetFactory::create(Project *parent, const Core::Id id) -{ - if (!canCreate(parent, id)) - return 0; - - AutotoolsProject *project(static_cast<AutotoolsProject *>(parent)); - AutotoolsTarget *t = new AutotoolsTarget(project); - - // Add default build configuration: - AutotoolsBuildConfigurationFactory *bcf = t->buildConfigurationFactory(); - AutotoolsBuildConfiguration *bc = bcf->createDefaultConfiguration(t); - bc->setDisplayName(tr("Default Build")); - - t->addBuildConfiguration(bc); - t->addDeployConfiguration(t->createDeployConfiguration(Core::Id(ProjectExplorer::Constants::DEFAULT_DEPLOYCONFIGURATION_ID))); - // User needs to choose where the executable file is. - // TODO: Parse the file in *Anjuta style* to be able to add custom RunConfigurations. - t->addRunConfiguration(new QtSupport::CustomExecutableRunConfiguration(t)); - - return t; -} - -bool AutotoolsTargetFactory::canRestore(Project *parent, const QVariantMap &map) const -{ - return canCreate(parent, idFromMap(map)); -} - -AutotoolsTarget *AutotoolsTargetFactory::restore(Project *parent, const QVariantMap &map) -{ - if (!canRestore(parent, map)) - return 0; - AutotoolsProject *autotoolsproject(static_cast<AutotoolsProject *>(parent)); - AutotoolsTarget *target = new AutotoolsTarget(autotoolsproject); - if (target->fromMap(map)) - return target; - delete target; - return 0; -} diff --git a/src/plugins/autotoolsprojectmanager/autotoolstarget.h b/src/plugins/autotoolsprojectmanager/autotoolstarget.h deleted file mode 100644 index 64589805a3..0000000000 --- a/src/plugins/autotoolsprojectmanager/autotoolstarget.h +++ /dev/null @@ -1,99 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2010-2011 Openismus GmbH. -** Authors: Peter Penz (ppenz@openismus.com) -** Patricia Santana Cruz (patriciasantanacruz@gmail.com) -** -** 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 AUTOTOOLSTARGET_H -#define AUTOTOOLSTARGET_H - -#include "autotoolsbuildconfiguration.h" - -#include <projectexplorer/target.h> - -namespace AutotoolsProjectManager { -namespace Internal { - -class AutotoolsTargetFactory; -class AutotoolsBuildConfiguration; -class AutotoolsBuildConfigurationFactory; -class AutotoolsProject; - -/////////////////////////// -//// AutotoolsTarget class -/////////////////////////// -class AutotoolsTarget : public ProjectExplorer::Target -{ - Q_OBJECT - friend class AutotoolsTargetFactory; - -public: - explicit AutotoolsTarget(AutotoolsProject *parent); - - ProjectExplorer::BuildConfigWidget *createConfigWidget(); - AutotoolsProject *autotoolsProject() const; - AutotoolsBuildConfigurationFactory *buildConfigurationFactory() const; - AutotoolsBuildConfiguration *activeBuildConfiguration() const; - QString defaultBuildDirectory() const; - -protected: - bool fromMap(const QVariantMap &map); - -private: - AutotoolsBuildConfigurationFactory *m_buildConfigurationFactory; -}; - - -////////////////////////////////// -//// AutotoolsTargetFactory class -////////////////////////////////// -class AutotoolsTargetFactory : public ProjectExplorer::ITargetFactory -{ - Q_OBJECT - -public: - explicit AutotoolsTargetFactory(QObject *parent = 0); - - bool supportsTargetId(const Core::Id id) const; - - QList<Core::Id> supportedTargetIds() const; - QString displayNameForId(const Core::Id id) const; - - bool canCreate(ProjectExplorer::Project *parent, const Core::Id id) const; - AutotoolsTarget *create(ProjectExplorer::Project *parent, const Core::Id id); - bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const; - AutotoolsTarget *restore(ProjectExplorer::Project *parent, const QVariantMap &map); -}; - -} // namespace Internal -} // namespace AutotoolsProjectManager - -#endif // AUTOTOOLSTARGET_H diff --git a/src/plugins/autotoolsprojectmanager/configurestep.cpp b/src/plugins/autotoolsprojectmanager/configurestep.cpp index e1af40dd17..b6bdbef72b 100644 --- a/src/plugins/autotoolsprojectmanager/configurestep.cpp +++ b/src/plugins/autotoolsprojectmanager/configurestep.cpp @@ -34,11 +34,11 @@ #include "configurestep.h" #include "autotoolsproject.h" -#include "autotoolstarget.h" #include "autotoolsbuildconfiguration.h" #include "autotoolsprojectconstants.h" #include <projectexplorer/buildsteplist.h> +#include <projectexplorer/target.h> #include <projectexplorer/toolchain.h> #include <projectexplorer/gnumakeparser.h> #include <projectexplorer/projectexplorer.h> @@ -67,9 +67,9 @@ ConfigureStepFactory::ConfigureStepFactory(QObject *parent) : QList<Core::Id> ConfigureStepFactory::availableCreationIds(BuildStepList *parent) const { - if (parent->target()->project()->id() == Core::Id(Constants::AUTOTOOLS_PROJECT_ID)) - return QList<Core::Id>() << Core::Id(CONFIGURE_STEP_ID); - return QList<Core::Id>(); + if (!canHandle(parent)) + return QList<Core::Id>(); + return QList<Core::Id>() << Core::Id(CONFIGURE_STEP_ID); } QString ConfigureStepFactory::displayNameForId(const Core::Id id) const @@ -81,13 +81,7 @@ QString ConfigureStepFactory::displayNameForId(const Core::Id id) const bool ConfigureStepFactory::canCreate(BuildStepList *parent, const Core::Id id) const { - if (parent->target()->project()->id() != Core::Id(Constants::AUTOTOOLS_PROJECT_ID)) - return false; - - if (parent->id() != Core::Id(ProjectExplorer::Constants::BUILDSTEPS_BUILD)) - return false; - - return Core::Id(CONFIGURE_STEP_ID) == id; + return canHandle(parent) && Core::Id(CONFIGURE_STEP_ID) == id; } BuildStep *ConfigureStepFactory::create(BuildStepList *parent, const Core::Id id) @@ -125,6 +119,13 @@ BuildStep *ConfigureStepFactory::restore(BuildStepList *parent, const QVariantMa return 0; } +bool ConfigureStepFactory::canHandle(BuildStepList *parent) const +{ + if (parent->target()->project()->id() != Core::Id(Constants::AUTOTOOLS_PROJECT_ID)) + return false; + return parent->id() == Core::Id(ProjectExplorer::Constants::BUILDSTEPS_BUILD); +} + //////////////////////// // ConfigureStep class //////////////////////// @@ -229,6 +230,19 @@ QVariantMap ConfigureStep::toMap() const return map; } +bool ConfigureStep::processSucceeded(int exitCode, QProcess::ExitStatus status) +{ + if (exitCode != 0 || status != QProcess::NormalExit) + return false; + AutotoolsBuildConfiguration *bc = qobject_cast<AutotoolsBuildConfiguration *>(buildConfiguration()); + if (!bc) + bc = qobject_cast<AutotoolsBuildConfiguration *>(target()->activeBuildConfiguration()); + if (!bc) + return true; + bc->emitBuildDirectoryInitialized(); + return true; +} + bool ConfigureStep::fromMap(const QVariantMap &map) { m_additionalArguments = map.value(QLatin1String(CONFIGURE_ADDITIONAL_ARGUMENTS_KEY)).toString(); diff --git a/src/plugins/autotoolsprojectmanager/configurestep.h b/src/plugins/autotoolsprojectmanager/configurestep.h index 884384427b..eb749385f6 100644 --- a/src/plugins/autotoolsprojectmanager/configurestep.h +++ b/src/plugins/autotoolsprojectmanager/configurestep.h @@ -72,6 +72,8 @@ public: ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *source); bool canRestore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map) const; ProjectExplorer::BuildStep *restore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map); + + bool canHandle(ProjectExplorer::BuildStepList *parent) const; }; ////////////////////////// @@ -104,6 +106,8 @@ public: QString additionalArguments() const; QVariantMap toMap() const; + bool processSucceeded(int exitCode, QProcess::ExitStatus status); + public slots: void setAdditionalArguments(const QString &list); diff --git a/src/plugins/autotoolsprojectmanager/makestep.cpp b/src/plugins/autotoolsprojectmanager/makestep.cpp index d01a13a8ce..508ab16371 100644 --- a/src/plugins/autotoolsprojectmanager/makestep.cpp +++ b/src/plugins/autotoolsprojectmanager/makestep.cpp @@ -36,11 +36,12 @@ #include "autotoolsproject.h" #include "autotoolsprojectconstants.h" #include "autotoolsbuildconfiguration.h" -#include "autotoolstarget.h" #include <projectexplorer/buildsteplist.h> +#include <projectexplorer/target.h> #include <projectexplorer/toolchain.h> #include <projectexplorer/gnumakeparser.h> +#include <projectexplorer/profileinformation.h> #include <projectexplorer/projectexplorer.h> #include <projectexplorer/projectexplorerconstants.h> #include <utils/qtcprocess.h> @@ -65,8 +66,7 @@ const char MAKE_STEP_ADDITIONAL_ARGUMENTS_KEY[] = "AutotoolsProjectManager.MakeS ////////////////////////// MakeStepFactory::MakeStepFactory(QObject *parent) : IBuildStepFactory(parent) -{ -} +{ setObjectName(QLatin1String("Autotools::MakeStepFactory")); } QList<Core::Id> MakeStepFactory::availableCreationIds(BuildStepList *parent) const { @@ -87,9 +87,6 @@ bool MakeStepFactory::canCreate(BuildStepList *parent, const Core::Id id) const if (parent->target()->project()->id() != Core::Id(AUTOTOOLS_PROJECT_ID)) return false; - if (parent->id() != Core::Id(BUILDSTEPS_BUILD)) - return false; - return Core::Id(MAKE_STEP_ID) == id; } @@ -178,16 +175,18 @@ bool MakeStep::init() setIgnoreReturnValue(m_clean); + ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(bc->target()->profile()); + ProcessParameters *pp = processParameters(); pp->setMacroExpander(bc->macroExpander()); pp->setEnvironment(bc->environment()); pp->setWorkingDirectory(bc->buildDirectory()); - pp->setCommand(bc->toolChain()->makeCommand()); + pp->setCommand(tc ? tc->makeCommand() : QLatin1String("make")); pp->setArguments(arguments); setOutputParser(new GnuMakeParser()); - if (bc->autotoolsTarget()->autotoolsProject()->toolChain()) - appendOutputParser(bc->autotoolsTarget()->autotoolsProject()->toolChain()->outputParser()); + if (tc) + appendOutputParser(tc->outputParser()); outputParser()->setWorkingDirectory(pp->effectiveWorkingDirectory()); return AbstractProcessStep::init(); @@ -291,7 +290,7 @@ QString MakeStepConfigWidget::summaryText() const void MakeStepConfigWidget::updateDetails() { AutotoolsBuildConfiguration *bc = m_makeStep->autotoolsBuildConfiguration(); - ToolChain *tc = bc->toolChain(); + ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(m_makeStep->target()->profile()); if (tc) { QString arguments = Utils::QtcProcess::joinArgs(m_makeStep->m_buildTargets); @@ -305,7 +304,7 @@ void MakeStepConfigWidget::updateDetails() param.setArguments(arguments); m_summaryText = param.summary(displayName()); } else { - m_summaryText = tr("<b>Unknown tool chain</b>"); + m_summaryText = tr("<b>No tool chain set up for this profile</b>"); } emit updateSummary(); diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index 38ba67a582..5597225e4a 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -34,12 +34,11 @@ #include "cmakeopenprojectwizard.h" #include "cmakeproject.h" -#include "cmaketarget.h" -#include <projectexplorer/projectexplorerconstants.h> -#include <projectexplorer/toolchainmanager.h> -#include <projectexplorer/toolchain.h> #include <projectexplorer/buildsteplist.h> +#include <projectexplorer/profileinformation.h> +#include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/target.h> #include <utils/qtcassert.h> #include <QInputDialog> @@ -49,17 +48,19 @@ using namespace Internal; namespace { const char CMAKE_BC_ID[] = "CMakeProjectManager.CMakeBuildConfiguration"; -const char TOOLCHAIN_KEY[] = "CMakeProjectManager.CMakeBuildConfiguration.ToolChain"; const char BUILD_DIRECTORY_KEY[] = "CMakeProjectManager.CMakeBuildConfiguration.BuildDirectory"; } // namespace -CMakeBuildConfiguration::CMakeBuildConfiguration(CMakeTarget *parent) : +CMakeBuildConfiguration::CMakeBuildConfiguration(ProjectExplorer::Target *parent) : BuildConfiguration(parent, Core::Id(CMAKE_BC_ID)) { - m_buildDirectory = cmakeTarget()->defaultBuildDirectory(); + CMakeProject *project = qobject_cast<CMakeProject *>(parent->project()); + if (project) + m_buildDirectory = project->defaultBuildDirectory(); } -CMakeBuildConfiguration::CMakeBuildConfiguration(CMakeTarget *parent, CMakeBuildConfiguration *source) : +CMakeBuildConfiguration::CMakeBuildConfiguration(ProjectExplorer::Target *parent, + CMakeBuildConfiguration *source) : BuildConfiguration(parent, source), m_buildDirectory(source->m_buildDirectory), m_msvcVersion(source->m_msvcVersion) @@ -71,7 +72,6 @@ CMakeBuildConfiguration::CMakeBuildConfiguration(CMakeTarget *parent, CMakeBuild QVariantMap CMakeBuildConfiguration::toMap() const { QVariantMap map(ProjectExplorer::BuildConfiguration::toMap()); - map.insert(QLatin1String(TOOLCHAIN_KEY), toolChain() ? toolChain()->id() : QString()); map.insert(QLatin1String(BUILD_DIRECTORY_KEY), m_buildDirectory); return map; } @@ -81,46 +81,17 @@ bool CMakeBuildConfiguration::fromMap(const QVariantMap &map) if (!BuildConfiguration::fromMap(map)) return false; - setToolChain(ProjectExplorer::ToolChainManager::instance()-> - findToolChain(map.value(QLatin1String(TOOLCHAIN_KEY)).toString())); - - if (!toolChain()) { - // restoring from older versions? - QList<ProjectExplorer::ToolChain *> list = ProjectExplorer::ToolChainManager::instance()->toolChains(); - if (!map.value("CMakeProjectManager.CMakeBuildConfiguration.MsvcVersion").toString().isEmpty()) { - foreach (ProjectExplorer::ToolChain *tc, list) { - if (tc->id().startsWith(ProjectExplorer::Constants::MSVC_TOOLCHAIN_ID)) { - setToolChain(tc); - break; - } - } - } else { -#ifdef Q_OS_WIN - QString toolChainId = ProjectExplorer::Constants::MINGW_TOOLCHAIN_ID; -#else - QString toolChainId = ProjectExplorer::Constants::GCC_TOOLCHAIN_ID; -#endif - foreach (ProjectExplorer::ToolChain *tc, list) { - if (tc->id().startsWith(toolChainId)) { - setToolChain(tc); - break; - } - } - } - } - - m_buildDirectory = map.value(QLatin1String(BUILD_DIRECTORY_KEY), cmakeTarget()->defaultBuildDirectory()).toString(); + m_buildDirectory = map.value(QLatin1String(BUILD_DIRECTORY_KEY)).toString(); return true; } CMakeBuildConfiguration::~CMakeBuildConfiguration() -{ -} +{ } -CMakeTarget *CMakeBuildConfiguration::cmakeTarget() const +ProjectExplorer::BuildConfigWidget *CMakeBuildConfiguration::createConfigWidget() { - return static_cast<CMakeTarget *>(target()); + return new CMakeBuildSettingsWidget; } QString CMakeBuildConfiguration::buildDirectory() const @@ -139,16 +110,16 @@ void CMakeBuildConfiguration::setBuildDirectory(const QString &buildDirectory) ProjectExplorer::IOutputParser *CMakeBuildConfiguration::createOutputParser() const { - if (toolChain()) - return toolChain()->outputParser(); + ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(target()->profile()); + if (tc) + return tc->outputParser(); return 0; } Utils::Environment CMakeBuildConfiguration::baseEnvironment() const { Utils::Environment env = BuildConfiguration::baseEnvironment(); - if (toolChain()) - toolChain()->addToEnvironment(env); + target()->profile()->addToEnvironment(env); return env; } @@ -165,9 +136,9 @@ CMakeBuildConfigurationFactory::~CMakeBuildConfigurationFactory() { } -QList<Core::Id> CMakeBuildConfigurationFactory::availableCreationIds(ProjectExplorer::Target *parent) const +QList<Core::Id> CMakeBuildConfigurationFactory::availableCreationIds(const ProjectExplorer::Target *parent) const { - if (!qobject_cast<CMakeTarget *>(parent)) + if (!canHandle(parent)) return QList<Core::Id>(); return QList<Core::Id>() << Core::Id(CMAKE_BC_ID); } @@ -179,34 +150,37 @@ QString CMakeBuildConfigurationFactory::displayNameForId(const Core::Id id) cons return QString(); } -bool CMakeBuildConfigurationFactory::canCreate(ProjectExplorer::Target *parent, const Core::Id id) const +bool CMakeBuildConfigurationFactory::canCreate(const ProjectExplorer::Target *parent, const Core::Id id) const { - if (!qobject_cast<CMakeTarget *>(parent)) + if (!canHandle(parent)) return false; if (id == Core::Id(CMAKE_BC_ID)) return true; return false; } -CMakeBuildConfiguration *CMakeBuildConfigurationFactory::create(ProjectExplorer::Target *parent, const Core::Id id) +CMakeBuildConfiguration *CMakeBuildConfigurationFactory::create(ProjectExplorer::Target *parent, const Core::Id id, const QString &name) { if (!canCreate(parent, id)) return 0; - CMakeTarget *cmtarget = static_cast<CMakeTarget *>(parent); - Q_ASSERT(cmtarget); - - //TODO configuration name should be part of the cmakeopenprojectwizard - bool ok; - QString buildConfigurationName = QInputDialog::getText(0, - tr("New Configuration"), - tr("New configuration name:"), - QLineEdit::Normal, - QString(), - &ok); + CMakeProject *project = qobject_cast<CMakeProject *>(parent->project()); + if (!project) + return 0; + + bool ok = true; + QString buildConfigurationName = name; + if (buildConfigurationName.isEmpty()) + buildConfigurationName = QInputDialog::getText(0, + tr("New Configuration"), + tr("New configuration name:"), + QLineEdit::Normal, + QString(), &ok); + buildConfigurationName = buildConfigurationName.trimmed(); if (!ok || buildConfigurationName.isEmpty()) return 0; - CMakeBuildConfiguration *bc = new CMakeBuildConfiguration(cmtarget); + + CMakeBuildConfiguration *bc = new CMakeBuildConfiguration(parent); bc->setDisplayName(buildConfigurationName); ProjectExplorer::BuildStepList *buildSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); @@ -220,28 +194,25 @@ CMakeBuildConfiguration *CMakeBuildConfigurationFactory::create(ProjectExplorer: cleanMakeStep->setAdditionalArguments("clean"); cleanMakeStep->setClean(true); - CMakeOpenProjectWizard copw(cmtarget->cmakeProject()->projectManager(), - cmtarget->project()->projectDirectory(), + CMakeOpenProjectWizard copw(project->projectManager(), + project->projectDirectory(), bc->buildDirectory(), bc->environment()); if (copw.exec() != QDialog::Accepted) { delete bc; return 0; } - bc->setToolChain(copw.toolChain()); - cmtarget->addBuildConfiguration(bc); // this also makes the name unique bc->setBuildDirectory(copw.buildDirectory()); - cmtarget->cmakeProject()->parseCMakeLists(); // Default to all - if (cmtarget->cmakeProject()->hasBuildTarget("all")) + if (project->hasBuildTarget("all")) makeStep->setBuildTarget("all", true); return bc; } -bool CMakeBuildConfigurationFactory::canClone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const +bool CMakeBuildConfigurationFactory::canClone(const ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const { return canCreate(parent, source->id()); } @@ -251,11 +222,10 @@ CMakeBuildConfiguration *CMakeBuildConfigurationFactory::clone(ProjectExplorer:: if (!canClone(parent, source)) return 0; CMakeBuildConfiguration *old = static_cast<CMakeBuildConfiguration *>(source); - CMakeTarget *cmtarget(static_cast<CMakeTarget *>(parent)); - return new CMakeBuildConfiguration(cmtarget, old); + return new CMakeBuildConfiguration(parent, old); } -bool CMakeBuildConfigurationFactory::canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const +bool CMakeBuildConfigurationFactory::canRestore(const ProjectExplorer::Target *parent, const QVariantMap &map) const { return canCreate(parent, ProjectExplorer::idFromMap(map)); } @@ -264,14 +234,20 @@ CMakeBuildConfiguration *CMakeBuildConfigurationFactory::restore(ProjectExplorer { if (!canRestore(parent, map)) return 0; - CMakeTarget *cmtarget(static_cast<CMakeTarget *>(parent)); - CMakeBuildConfiguration *bc = new CMakeBuildConfiguration(cmtarget); + CMakeBuildConfiguration *bc = new CMakeBuildConfiguration(parent); if (bc->fromMap(map)) return bc; delete bc; return 0; } +bool CMakeBuildConfigurationFactory::canHandle(const ProjectExplorer::Target *t) const +{ + if (!t->project()->supportsProfile(t->profile())) + return false; + return qobject_cast<CMakeProject *>(t->project()); +} + ProjectExplorer::BuildConfiguration::BuildType CMakeBuildConfiguration::buildType() const { QString cmakeBuildType; @@ -303,4 +279,3 @@ ProjectExplorer::BuildConfiguration::BuildType CMakeBuildConfiguration::buildTyp return Unknown; } - diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h index b0f7bb33dd..01be5dab51 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h @@ -43,7 +43,6 @@ class ToolChain; namespace CMakeProjectManager { namespace Internal { -class CMakeTarget; class CMakeBuildConfigurationFactory; class CMakeBuildConfiguration : public ProjectExplorer::BuildConfiguration @@ -52,12 +51,11 @@ class CMakeBuildConfiguration : public ProjectExplorer::BuildConfiguration friend class CMakeBuildConfigurationFactory; public: - CMakeBuildConfiguration(CMakeTarget *parent); + CMakeBuildConfiguration(ProjectExplorer::Target *parent); ~CMakeBuildConfiguration(); - CMakeTarget *cmakeTarget() const; - - virtual QString buildDirectory() const; + ProjectExplorer::BuildConfigWidget *createConfigWidget(); + QString buildDirectory() const; void setBuildDirectory(const QString &buildDirectory); @@ -70,7 +68,7 @@ public: BuildType buildType() const; protected: - CMakeBuildConfiguration(CMakeTarget *parent, CMakeBuildConfiguration *source); + CMakeBuildConfiguration(ProjectExplorer::Target *parent, CMakeBuildConfiguration *source); virtual bool fromMap(const QVariantMap &map); private: @@ -86,15 +84,18 @@ public: CMakeBuildConfigurationFactory(QObject *parent = 0); ~CMakeBuildConfigurationFactory(); - QList<Core::Id> availableCreationIds(ProjectExplorer::Target *parent) const; + QList<Core::Id> availableCreationIds(const ProjectExplorer::Target *parent) const; QString displayNameForId(const Core::Id id) const; - bool canCreate(ProjectExplorer::Target *parent, const Core::Id id) const; - CMakeBuildConfiguration *create(ProjectExplorer::Target *parent, const Core::Id id); - bool canClone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const; + bool canCreate(const ProjectExplorer::Target *parent, const Core::Id id) const; + CMakeBuildConfiguration *create(ProjectExplorer::Target *parent, const Core::Id id, const QString &name = QString()); + bool canClone(const ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const; CMakeBuildConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source); - bool canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const; + bool canRestore(const ProjectExplorer::Target *parent, const QVariantMap &map) const; CMakeBuildConfiguration *restore(ProjectExplorer::Target *parent, const QVariantMap &map); + +private: + bool canHandle(const ProjectExplorer::Target *t) const; }; } // namespace Internal diff --git a/src/plugins/cmakeprojectmanager/cmakelocatorfilter.cpp b/src/plugins/cmakeprojectmanager/cmakelocatorfilter.cpp index 50cdf33bf3..03f2a90cc2 100644 --- a/src/plugins/cmakeprojectmanager/cmakelocatorfilter.cpp +++ b/src/plugins/cmakeprojectmanager/cmakelocatorfilter.cpp @@ -31,12 +31,12 @@ **************************************************************************/ #include "cmakelocatorfilter.h" -#include "cmaketarget.h" #include "cmakeproject.h" #include "makestep.h" #include <projectexplorer/projectexplorer.h> #include <projectexplorer/session.h> +#include <projectexplorer/target.h> #include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/buildsteplist.h> diff --git a/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.cpp b/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.cpp index c21b5a4559..d4461b54e5 100644 --- a/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.cpp @@ -34,7 +34,8 @@ #include "cmakeprojectmanager.h" #include <utils/pathchooser.h> -#include <projectexplorer/toolchainmanager.h> +#include <projectexplorer/profileinformation.h> +#include <projectexplorer/profilemanager.h> #include <projectexplorer/toolchain.h> #include <projectexplorer/abi.h> #include <texteditor/fontsettings.h> @@ -65,8 +66,7 @@ CMakeOpenProjectWizard::CMakeOpenProjectWizard(CMakeManager *cmakeManager, const : m_cmakeManager(cmakeManager), m_sourceDirectory(sourceDirectory), m_creatingCbpFiles(false), - m_environment(env), - m_toolChain(0) + m_environment(env) { int startid; if (hasInSourceBuild()) { @@ -98,8 +98,7 @@ CMakeOpenProjectWizard::CMakeOpenProjectWizard(CMakeManager *cmakeManager, const : m_cmakeManager(cmakeManager), m_sourceDirectory(sourceDirectory), m_creatingCbpFiles(true), - m_environment(env), - m_toolChain(0) + m_environment(env) { CMakeRunPage::Mode rmode; @@ -119,8 +118,7 @@ CMakeOpenProjectWizard::CMakeOpenProjectWizard(CMakeManager *cmakeManager, const : m_cmakeManager(cmakeManager), m_sourceDirectory(sourceDirectory), m_creatingCbpFiles(true), - m_environment(env), - m_toolChain(0) + m_environment(env) { m_buildDirectory = oldBuildDirectory; addPage(new ShadowBuildPage(this, true)); @@ -200,17 +198,6 @@ void CMakeOpenProjectWizard::setArguments(const QString &args) m_arguments = args; } -ProjectExplorer::ToolChain *CMakeOpenProjectWizard::toolChain() const -{ - return m_toolChain; -} - -void CMakeOpenProjectWizard::setToolChain(ProjectExplorer::ToolChain *tc) -{ - m_toolChain = tc; -} - - Utils::Environment CMakeOpenProjectWizard::environment() const { return m_environment; @@ -414,51 +401,50 @@ void CMakeRunPage::initializePage() Q_UNUSED(cmakeCxxCompiler); m_generatorComboBox->clear(); bool hasCodeBlocksGenerator = m_cmakeWizard->cmakeManager()->hasCodeBlocksMsvcGenerator(); - ProjectExplorer::Abi abi = ProjectExplorer::Abi::hostAbi(); - abi = ProjectExplorer::Abi(abi.architecture(), abi.os(), ProjectExplorer::Abi::UnknownFlavor, - abi.binaryFormat(), 0); - QList<ProjectExplorer::ToolChain *> tcs = - ProjectExplorer::ToolChainManager::instance()->findToolChains(abi); - foreach (ProjectExplorer::ToolChain *tc, tcs) { + QList<ProjectExplorer::Profile *> profileList = + ProjectExplorer::ProfileManager::instance()->profiles(); + + foreach (ProjectExplorer::Profile *p, profileList) { + QVariant profileVariant = qVariantFromValue(static_cast<void *>(p)); + + ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(p); ProjectExplorer::Abi targetAbi = tc->targetAbi(); - QVariant tcVariant = qVariantFromValue(static_cast<void *>(tc)); if (targetAbi.os() == ProjectExplorer::Abi::WindowsOS) { if (targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2005Flavor || targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2008Flavor || targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2010Flavor) { if (hasCodeBlocksGenerator && (cachedGenerator.isEmpty() || cachedGenerator == "NMake Makefiles")) - m_generatorComboBox->addItem(tr("NMake Generator (%1)").arg(tc->displayName()), tcVariant); + m_generatorComboBox->addItem(tr("NMake Generator (%1)").arg(p->displayName()), profileVariant); } else if (targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMSysFlavor) { if (cachedGenerator.isEmpty() || cachedGenerator == "MinGW Makefiles") - m_generatorComboBox->addItem(tr("MinGW Generator (%1)").arg(tc->displayName()), tcVariant); + m_generatorComboBox->addItem(tr("MinGW Generator (%1)").arg(p->displayName()), profileVariant); } } else { // Non windows if (cachedGenerator.isEmpty() || cachedGenerator == "Unix Makefiles") - m_generatorComboBox->addItem(tr("Unix Generator (%1)").arg(tc->displayName()), tcVariant); + m_generatorComboBox->addItem(tr("Unix Generator (%1)").arg(p->displayName()), profileVariant); } } } void CMakeRunPage::runCMake() { - if (m_cmakeExecutable) { + if (m_cmakeExecutable) // We asked the user for the cmake executable m_cmakeWizard->cmakeManager()->setCMakeExecutable(m_cmakeExecutable->path()); - } int index = m_generatorComboBox->currentIndex(); - ProjectExplorer::ToolChain *tc = 0; + ProjectExplorer::Profile *p = 0; if (index >= 0) - tc = static_cast<ProjectExplorer::ToolChain *>(m_generatorComboBox->itemData(index).value<void *>()); - if (!tc) { + p = static_cast<ProjectExplorer::Profile *>(m_generatorComboBox->itemData(index).value<void *>()); + if (!p) { m_output->appendPlainText(tr("No generator selected.")); return; } - m_cmakeWizard->setToolChain(tc); + ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(p); m_runCMake->setEnabled(false); m_argumentsLineEdit->setEnabled(false); @@ -473,12 +459,9 @@ void CMakeRunPage::runCMake() generator = QLatin1String("-GCodeBlocks - NMake Makefiles"); } - Utils::Environment env = m_cmakeWizard->environment(); tc->addToEnvironment(env); - - m_output->clear(); if (m_cmakeWizard->cmakeManager()->isCMakeExecutableValid()) { diff --git a/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.h b/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.h index 5a0984de77..2118649e15 100644 --- a/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.h +++ b/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.h @@ -90,8 +90,6 @@ public: CMakeManager *cmakeManager() const; QString arguments() const; void setArguments(const QString &args); - ProjectExplorer::ToolChain *toolChain() const; - void setToolChain(ProjectExplorer::ToolChain *); Utils::Environment environment() const; bool existsUpToDateXmlFile() const; @@ -104,7 +102,6 @@ private: QString m_arguments; bool m_creatingCbpFiles; Utils::Environment m_environment; - ProjectExplorer::ToolChain *m_toolChain; }; class InSourceBuildPage : public QWizardPage diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index 1e2b642a40..8423f85d33 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -31,10 +31,11 @@ **************************************************************************/ #include "cmakeproject.h" + +#include "cmakebuildconfiguration.h" #include "cmakeprojectconstants.h" #include "cmakeprojectnodes.h" #include "cmakerunconfiguration.h" -#include "cmaketarget.h" #include "makestep.h" #include "cmakeopenprojectwizard.h" #include "cmakebuildconfiguration.h" @@ -46,7 +47,11 @@ #include <projectexplorer/buildenvironmentwidget.h> #include <projectexplorer/buildsteplist.h> #include <projectexplorer/buildmanager.h> +#include <projectexplorer/profileinformation.h> +#include <projectexplorer/profilemanager.h> #include <projectexplorer/toolchain.h> +#include <projectexplorer/target.h> +#include <qtsupport/customexecutablerunconfiguration.h> #include <cpptools/ModelManagerInterface.h> #include <extensionsystem/pluginmanager.h> #include <utils/qtcassert.h> @@ -107,6 +112,8 @@ CMakeProject::CMakeProject(CMakeManager *manager, const QString &fileName) connect(this, SIGNAL(addedTarget(ProjectExplorer::Target*)), SLOT(targetAdded(ProjectExplorer::Target*))); + connect(this, SIGNAL(buildDirectoryChanged()), + this, SLOT(triggerBuildSystemEvaluation())); } CMakeProject::~CMakeProject() @@ -130,7 +137,7 @@ void CMakeProject::fileChanged(const QString &fileName) { Q_UNUSED(fileName) - parseCMakeLists(); + evaluateBuildSystem(); } void CMakeProject::changeActiveBuildConfiguration(ProjectExplorer::BuildConfiguration *bc) @@ -168,7 +175,7 @@ void CMakeProject::changeActiveBuildConfiguration(ProjectExplorer::BuildConfigur copw.exec(); } // reparse - parseCMakeLists(); + evaluateBuildSystem(); } void CMakeProject::targetAdded(ProjectExplorer::Target *t) @@ -183,7 +190,7 @@ void CMakeProject::targetAdded(ProjectExplorer::Target *t) void CMakeProject::changeBuildDirectory(CMakeBuildConfiguration *bc, const QString &newBuildDirectory) { bc->setBuildDirectory(newBuildDirectory); - parseCMakeLists(); + evaluateBuildSystem(); } QString CMakeProject::defaultBuildDirectory() const @@ -191,23 +198,31 @@ QString CMakeProject::defaultBuildDirectory() const return projectDirectory() + QLatin1String("/qtcreator-build"); } -bool CMakeProject::parseCMakeLists() +void CMakeProject::evaluateBuildSystem() { if (!activeTarget() || - !activeTarget()->activeBuildConfiguration()) - return false; + !activeTarget()->activeBuildConfiguration()) { + buildSystemEvaluationFinished(false); + return; + } + + CMakeBuildConfiguration *activeBC = qobject_cast<CMakeBuildConfiguration *>(activeTarget()->activeBuildConfiguration()); + if (!activeBC) { + buildSystemEvaluationFinished(false); + return; + } foreach (Core::IEditor *editor, Core::EditorManager::instance()->openedEditors()) if (isProjectFile(editor->document()->fileName())) editor->document()->infoBar()->removeInfo(QLatin1String("CMakeEditor.RunCMake")); // Find cbp file - CMakeBuildConfiguration *activeBC = activeTarget()->activeBuildConfiguration(); QString cbpFile = CMakeManager::findCbpFile(activeBC->buildDirectory()); if (cbpFile.isEmpty()) { emit buildTargetsChanged(); - return false; + buildSystemEvaluationFinished(true); + return; } // setFolderName @@ -218,7 +233,8 @@ bool CMakeProject::parseCMakeLists() if (!cbpparser.parseCbpFile(cbpFile)) { // TODO report error emit buildTargetsChanged(); - return false; + buildSystemEvaluationFinished(true); + return; } foreach (const QString &file, m_watcher->files()) @@ -228,8 +244,6 @@ bool CMakeProject::parseCMakeLists() // how can we ensure that it is completely written? m_watcher->addPath(cbpFile); - // ToolChain - // activeBC->updateToolChain(cbpparser.compilerName()); m_projectName = cbpparser.projectName(); m_rootNode->setDisplayName(cbpparser.projectName()); @@ -285,22 +299,24 @@ bool CMakeProject::parseCMakeLists() createUiCodeModelSupport(); - if (!activeBC->toolChain()) - return true; + ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(activeTarget()->profile()); + if (!tc) { + buildSystemEvaluationFinished(true); + return; + } QStringList allIncludePaths; // This explicitly adds -I. to the include paths allIncludePaths.append(projectDirectory()); allIncludePaths.append(cbpparser.includeFiles()); - QByteArray allDefines; - allDefines.append(activeBC->toolChain()->predefinedMacros(QStringList())); - allDefines.append(cbpparser.defines()); + QByteArray allDefines; + allDefines.append(tc->predefinedMacros(QStringList())); + allDefines.append(cbpparser.defines()); QStringList allFrameworkPaths; QList<ProjectExplorer::HeaderPath> allHeaderPaths; - if (activeBC->toolChain()) - allHeaderPaths = activeBC->toolChain()->systemHeaderPaths(); + allHeaderPaths = tc->systemHeaderPaths(); foreach (const ProjectExplorer::HeaderPath &headerPath, allHeaderPaths) { if (headerPath.kind() == ProjectExplorer::HeaderPath::FrameworkHeaderPath) allFrameworkPaths.append(headerPath.path()); @@ -333,7 +349,8 @@ bool CMakeProject::parseCMakeLists() } emit buildTargetsChanged(); emit fileListChanged(); - return true; + + buildSystemEvaluationFinished(true); } bool CMakeProject::isProjectFile(const QString &fileName) @@ -501,11 +518,6 @@ CMakeManager *CMakeProject::projectManager() const return m_manager; } -CMakeTarget *CMakeProject::activeTarget() const -{ - return static_cast<CMakeTarget *>(Project::activeTarget()); -} - QList<ProjectExplorer::BuildConfigWidget*> CMakeProject::subConfigWidgets() { QList<ProjectExplorer::BuildConfigWidget*> list; @@ -530,74 +542,49 @@ bool CMakeProject::fromMap(const QVariantMap &map) if (!Project::fromMap(map)) return false; - bool hasUserFile = activeTarget(); - if (!hasUserFile) { - CMakeTargetFactory *factory = - ExtensionSystem::PluginManager::getObject<CMakeTargetFactory>(); - CMakeTarget *t = factory->create(this, Core::Id(DEFAULT_CMAKE_TARGET_ID)); + if (!activeTarget()) + addTarget(createTarget(ProfileManager::instance()->defaultProfile())); - Q_ASSERT(t); - Q_ASSERT(t->activeBuildConfiguration()); + // We have a user file, but we could still be missing the cbp file + // or simply run createXml with the saved settings + QFileInfo sourceFileInfo(m_fileName); + CMakeBuildConfiguration *activeBC = qobject_cast<CMakeBuildConfiguration *>(activeTarget()->activeBuildConfiguration()); + if (!activeBC) + return false; + QString cbpFile = CMakeManager::findCbpFile(QDir(activeBC->buildDirectory())); + QFileInfo cbpFileFi(cbpFile); - // Ask the user for where he wants to build it - // and the cmake command line + CMakeOpenProjectWizard::Mode mode = CMakeOpenProjectWizard::Nothing; + if (!cbpFileFi.exists()) + mode = CMakeOpenProjectWizard::NeedToCreate; + else if (cbpFileFi.lastModified() < sourceFileInfo.lastModified()) + mode = CMakeOpenProjectWizard::NeedToUpdate; - CMakeOpenProjectWizard copw(m_manager, projectDirectory(), Utils::Environment::systemEnvironment()); + if (mode != CMakeOpenProjectWizard::Nothing) { + CMakeOpenProjectWizard copw(m_manager, + sourceFileInfo.absolutePath(), + activeBC->buildDirectory(), + mode, + activeBC->environment()); if (copw.exec() != QDialog::Accepted) return false; - - CMakeBuildConfiguration *bc = - static_cast<CMakeBuildConfiguration *>(t->buildConfigurations().at(0)); - if (!copw.buildDirectory().isEmpty()) - bc->setBuildDirectory(copw.buildDirectory()); - bc->setToolChain(copw.toolChain()); - - addTarget(t); - } else { - // We have a user file, but we could still be missing the cbp file - // or simply run createXml with the saved settings - QFileInfo sourceFileInfo(m_fileName); - CMakeBuildConfiguration *activeBC = activeTarget()->activeBuildConfiguration(); - QString cbpFile = CMakeManager::findCbpFile(QDir(activeBC->buildDirectory())); - QFileInfo cbpFileFi(cbpFile); - - CMakeOpenProjectWizard::Mode mode = CMakeOpenProjectWizard::Nothing; - if (!cbpFileFi.exists()) - mode = CMakeOpenProjectWizard::NeedToCreate; - else if (cbpFileFi.lastModified() < sourceFileInfo.lastModified()) - mode = CMakeOpenProjectWizard::NeedToUpdate; - - if (mode != CMakeOpenProjectWizard::Nothing) { - CMakeOpenProjectWizard copw(m_manager, - sourceFileInfo.absolutePath(), - activeBC->buildDirectory(), - mode, - activeBC->environment()); - if (copw.exec() != QDialog::Accepted) - return false; - activeBC->setToolChain(copw.toolChain()); - } } m_watcher = new QFileSystemWatcher(this); connect(m_watcher, SIGNAL(fileChanged(QString)), this, SLOT(fileChanged(QString))); - if (!parseCMakeLists()) // Gets the directory from the active buildconfiguration - return false; + triggerBuildSystemEvaluation(); - if (!hasUserFile && hasBuildTarget("all")) { + if (hasBuildTarget("all")) { MakeStep *makeStep = qobject_cast<MakeStep *>( activeTarget()->activeBuildConfiguration()->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD)->at(0)); Q_ASSERT(makeStep); makeStep->setBuildTarget("all", true); } - foreach (Target *t, targets()) { + foreach (Target *t, targets()) connect(t, SIGNAL(activeBuildConfigurationChanged(ProjectExplorer::BuildConfiguration*)), this, SLOT(changeActiveBuildConfiguration(ProjectExplorer::BuildConfiguration*))); - connect(t, SIGNAL(environmentChanged()), - this, SLOT(changeEnvironment())); - } connect(Core::EditorManager::instance(), SIGNAL(editorAboutToClose(Core::IEditor*)), this, SLOT(editorAboutToClose(Core::IEditor*))); @@ -817,8 +804,7 @@ bool CMakeFile::reload(QString *errorString, ReloadFlag flag, ChangeType type) return true; } -CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeTarget *target) - : m_target(target), m_buildConfiguration(0) +CMakeBuildSettingsWidget::CMakeBuildSettingsWidget() : m_buildConfiguration(0) { QFormLayout *fl = new QFormLayout(this); fl->setContentsMargins(20, -1, 0, -1); @@ -853,7 +839,7 @@ void CMakeBuildSettingsWidget::init(BuildConfiguration *bc) { m_buildConfiguration = static_cast<CMakeBuildConfiguration *>(bc); m_pathLineEdit->setText(m_buildConfiguration->buildDirectory()); - if (m_buildConfiguration->buildDirectory() == m_target->cmakeProject()->projectDirectory()) + if (m_buildConfiguration->buildDirectory() == bc->target()->project()->projectDirectory()) m_changeButton->setEnabled(false); else m_changeButton->setEnabled(true); @@ -861,7 +847,9 @@ void CMakeBuildSettingsWidget::init(BuildConfiguration *bc) void CMakeBuildSettingsWidget::openChangeBuildDirectoryDialog() { - CMakeProject *project = m_target->cmakeProject(); + CMakeProject *project = qobject_cast<CMakeProject *>(m_buildConfiguration->target()->project()); + if (!project) + return; CMakeOpenProjectWizard copw(project->projectManager(), project->projectDirectory(), m_buildConfiguration->buildDirectory(), @@ -875,15 +863,16 @@ void CMakeBuildSettingsWidget::openChangeBuildDirectoryDialog() void CMakeBuildSettingsWidget::runCMake() { // TODO skip build directory - CMakeProject *project = m_target->cmakeProject(); + CMakeProject *project = qobject_cast<CMakeProject *>(m_buildConfiguration->target()->project()); + if (!project) + return; CMakeOpenProjectWizard copw(project->projectManager(), project->projectDirectory(), m_buildConfiguration->buildDirectory(), CMakeOpenProjectWizard::WantToUpdate, m_buildConfiguration->environment()); - if (copw.exec() == QDialog::Accepted) { - project->parseCMakeLists(); - } + if (copw.exec() == QDialog::Accepted) + project->evaluateBuildSystem(); } ///// diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.h b/src/plugins/cmakeprojectmanager/cmakeproject.h index 6166a348b2..88f8933fd8 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.h +++ b/src/plugins/cmakeprojectmanager/cmakeproject.h @@ -36,7 +36,6 @@ #include "cmakeprojectmanager.h" #include "cmakeprojectnodes.h" #include "cmakebuildconfiguration.h" -#include "cmaketarget.h" #include "makestep.h" #include <projectexplorer/project.h> @@ -87,8 +86,6 @@ public: Core::IDocument *document() const; CMakeManager *projectManager() const; - CMakeTarget *activeTarget() const; - QList<ProjectExplorer::BuildConfigWidget*> subConfigWidgets(); ProjectExplorer::ProjectNode *rootProjectNode() const; @@ -102,12 +99,12 @@ public: QString defaultBuildDirectory() const; - bool parseCMakeLists(); QString uicCommand() const; bool isProjectFile(const QString &fileName); + signals: /// emitted after parsing void buildTargetsChanged(); @@ -128,12 +125,15 @@ private slots: void uiEditorContentsChanged(); void buildStateChanged(ProjectExplorer::Project *project); private: + void evaluateBuildSystem(); + void buildTree(CMakeProjectNode *rootNode, QList<ProjectExplorer::FileNode *> list); void gatherFileNodes(ProjectExplorer::FolderNode *parent, QList<ProjectExplorer::FileNode *> &list); ProjectExplorer::FolderNode *findOrCreateFolder(CMakeProjectNode *rootNode, QString directory); void updateCodeModelSupportFromEditor(const QString &uiFileName, const QString &contents); void createUiCodeModelSupport(); QString uiHeaderFile(const QString &uiFile); + void updateRunConfigurations(ProjectExplorer::Target *t); CMakeManager *m_manager; QString m_fileName; @@ -228,16 +228,16 @@ class CMakeBuildSettingsWidget : public ProjectExplorer::BuildConfigWidget { Q_OBJECT public: - explicit CMakeBuildSettingsWidget(CMakeTarget *target); + CMakeBuildSettingsWidget(); QString displayName() const; // This is called to set up the config widget before showing it - virtual void init(ProjectExplorer::BuildConfiguration *bc); + void init(ProjectExplorer::BuildConfiguration *bc); + private slots: void openChangeBuildDirectoryDialog(); void runCMake(); private: - CMakeTarget *m_target; QLineEdit *m_pathLineEdit; QPushButton *m_changeButton; CMakeBuildConfiguration *m_buildConfiguration; diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp index e6b81c209b..7384153647 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp @@ -45,6 +45,7 @@ #include <coreplugin/actionmanager/actioncontainer.h> #include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/projectexplorer.h> +#include <projectexplorer/target.h> #include <utils/QtConcurrentTools> #include <QtConcurrentRun> #include <QCoreApplication> @@ -114,22 +115,21 @@ void CMakeManager::runCMake(ProjectExplorer::Project *project) if (!project) return; CMakeProject *cmakeProject = qobject_cast<CMakeProject *>(project); - if (!cmakeProject) + if (!cmakeProject || !cmakeProject->activeTarget() || !cmakeProject->activeTarget()->activeBuildConfiguration()) return; - if (!cmakeProject->activeTarget()) + CMakeBuildConfiguration *bc + = qobject_cast<CMakeBuildConfiguration *>(cmakeProject->activeTarget()->activeBuildConfiguration()); + if (!bc) return; - if (!cmakeProject->activeTarget()->activeBuildConfiguration()) - return; - CMakeBuildConfiguration *bc = cmakeProject->activeTarget()->activeBuildConfiguration(); + CMakeOpenProjectWizard copw(this, cmakeProject->projectDirectory(), bc->buildDirectory(), CMakeOpenProjectWizard::WantToUpdate, bc->environment()); - if (copw.exec() == QDialog::Accepted) { - cmakeProject->parseCMakeLists(); - } + if (copw.exec() == QDialog::Accepted) + cmakeProject->triggerBuildSystemEvaluation(); } ProjectExplorer::Project *CMakeManager::openProject(const QString &fileName, QString *errorString) diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.pro b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.pro index d1c2914899..b0b516944d 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.pro +++ b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.pro @@ -9,7 +9,6 @@ HEADERS = cmakeproject.h \ cmakeprojectmanager.h \ cmakeprojectconstants.h \ cmakeprojectnodes.h \ - cmaketarget.h \ makestep.h \ cmakerunconfiguration.h \ cmakeopenprojectwizard.h \ @@ -24,7 +23,6 @@ SOURCES = cmakeproject.cpp \ cmakeprojectplugin.cpp \ cmakeprojectmanager.cpp \ cmakeprojectnodes.cpp \ - cmaketarget.cpp \ makestep.cpp \ cmakerunconfiguration.cpp \ cmakeopenprojectwizard.cpp \ diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.qbs b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.qbs index e0e8b6c0e7..541176d66a 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.qbs +++ b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.qbs @@ -48,8 +48,6 @@ QtcPlugin { "cmakeprojectplugin.h", "cmakerunconfiguration.cpp", "cmakerunconfiguration.h", - "cmaketarget.cpp", - "cmaketarget.h", "cmakeuicodemodelsupport.cpp", "cmakeuicodemodelsupport.h", "makestep.cpp", diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp index 46b1db69d9..1d9614a9a8 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp @@ -32,11 +32,11 @@ #include "cmakeprojectplugin.h" #include "cmakeprojectmanager.h" +#include "cmakebuildconfiguration.h" #include "cmakerunconfiguration.h" #include "cmakeeditorfactory.h" #include "makestep.h" #include "cmakeprojectconstants.h" -#include "cmaketarget.h" #include "cmakelocatorfilter.h" #include <coreplugin/icore.h> @@ -67,9 +67,9 @@ bool CMakeProjectPlugin::initialize(const QStringList & /*arguments*/, QString * addAutoReleasedObject(manager); addAutoReleasedObject(new MakeStepFactory); addAutoReleasedObject(new CMakeRunConfigurationFactory); + addAutoReleasedObject(new CMakeBuildConfigurationFactory); addAutoReleasedObject(new CMakeEditorFactory(manager)); - addAutoReleasedObject(new CMakeTargetFactory); addAutoReleasedObject(new CMakeLocatorFilter); return true; diff --git a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp index 1f3f2f1c8d..6fdd343cb0 100644 --- a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp @@ -35,12 +35,12 @@ #include "cmakebuildconfiguration.h" #include "cmakeproject.h" #include "cmakeprojectconstants.h" -#include "cmaketarget.h" #include <coreplugin/coreconstants.h> #include <coreplugin/helpmanager.h> #include <qtsupport/debugginghelper.h> #include <projectexplorer/environmentwidget.h> +#include <projectexplorer/target.h> #include <utils/pathchooser.h> #include <utils/detailswidget.h> @@ -60,7 +60,6 @@ using namespace CMakeProjectManager; using namespace CMakeProjectManager::Internal; namespace { -const char CMAKE_RC_ID[] = "CMakeProjectManager.CMakeRunConfiguration"; const char CMAKE_RC_PREFIX[] = "CMakeProjectManager.CMakeRunConfiguration."; const char USER_WORKING_DIRECTORY_KEY[] = "CMakeProjectManager.CMakeRunConfiguration.UserWorkingDirectory"; @@ -86,8 +85,9 @@ Core::Id idFromBuildTarget(const QString &target) } // namespace -CMakeRunConfiguration::CMakeRunConfiguration(CMakeTarget *parent, const QString &target, const QString &workingDirectory, const QString &title) : - ProjectExplorer::LocalApplicationRunConfiguration(parent, Core::Id(CMAKE_RC_PREFIX)), +CMakeRunConfiguration::CMakeRunConfiguration(ProjectExplorer::Target *parent, Core::Id id, const QString &target, + const QString &workingDirectory, const QString &title) : + ProjectExplorer::LocalApplicationRunConfiguration(parent, id), m_runMode(Gui), m_buildTarget(target), m_workingDirectory(workingDirectory), @@ -98,7 +98,7 @@ CMakeRunConfiguration::CMakeRunConfiguration(CMakeTarget *parent, const QString ctor(); } -CMakeRunConfiguration::CMakeRunConfiguration(CMakeTarget *parent, CMakeRunConfiguration *source) : +CMakeRunConfiguration::CMakeRunConfiguration(ProjectExplorer::Target *parent, CMakeRunConfiguration *source) : ProjectExplorer::LocalApplicationRunConfiguration(parent, source), m_runMode(source->m_runMode), m_buildTarget(source->m_buildTarget), @@ -122,14 +122,9 @@ void CMakeRunConfiguration::ctor() setDefaultDisplayName(defaultDisplayName()); } -CMakeTarget *CMakeRunConfiguration::cmakeTarget() const +ProjectExplorer::BuildConfiguration *CMakeRunConfiguration::activeBuildConfiguration() const { - return static_cast<CMakeTarget *>(target()); -} - -CMakeBuildConfiguration *CMakeRunConfiguration::activeBuildConfiguration() const -{ - return cmakeTarget()->activeBuildConfiguration(); + return target()->activeBuildConfiguration(); } QString CMakeRunConfiguration::executable() const @@ -496,8 +491,7 @@ void CMakeRunConfigurationWidget::setArguments(const QString &args) // Factory CMakeRunConfigurationFactory::CMakeRunConfigurationFactory(QObject *parent) : ProjectExplorer::IRunConfigurationFactory(parent) -{ -} +{ setObjectName(QLatin1String("CMakeRunConfigurationFactory")); } CMakeRunConfigurationFactory::~CMakeRunConfigurationFactory() { @@ -506,11 +500,11 @@ CMakeRunConfigurationFactory::~CMakeRunConfigurationFactory() // used to show the list of possible additons to a project, returns a list of ids QList<Core::Id> CMakeRunConfigurationFactory::availableCreationIds(ProjectExplorer::Target *parent) const { - CMakeTarget *t(qobject_cast<CMakeTarget *>(parent)); - if (!t) + CMakeProject *project = qobject_cast<CMakeProject *>(parent->project()); + if (!canHandle(parent)) return QList<Core::Id>(); QList<Core::Id> allIds; - foreach (const QString &buildTarget, t->cmakeProject()->buildTargetTitles()) + foreach (const QString &buildTarget, project->buildTargetTitles()) allIds << idFromBuildTarget(buildTarget); return allIds; } @@ -521,12 +515,19 @@ QString CMakeRunConfigurationFactory::displayNameForId(const Core::Id id) const return buildTargetFromId(id); } +bool CMakeRunConfigurationFactory::canHandle(ProjectExplorer::Target *parent) const +{ + if (!parent->project()->supportsProfile(parent->profile())) + return false; + return qobject_cast<CMakeProject *>(parent->project()); +} + bool CMakeRunConfigurationFactory::canCreate(ProjectExplorer::Target *parent, const Core::Id id) const { - CMakeTarget *t(qobject_cast<CMakeTarget *>(parent)); - if (!t) + if (!canHandle(parent)) return false; - return t->cmakeProject()->hasBuildTarget(buildTargetFromId(id)); + CMakeProject *project = static_cast<CMakeProject *>(parent->project()); + return project->hasBuildTarget(buildTargetFromId(id)); } ProjectExplorer::RunConfiguration *CMakeRunConfigurationFactory::create(ProjectExplorer::Target *parent, @@ -534,43 +535,41 @@ ProjectExplorer::RunConfiguration *CMakeRunConfigurationFactory::create(ProjectE { if (!canCreate(parent, id)) return 0; - CMakeTarget *t(static_cast<CMakeTarget *>(parent)); - + CMakeProject *project = static_cast<CMakeProject *>(parent->project()); const QString title(buildTargetFromId(id)); - const CMakeBuildTarget &ct = t->cmakeProject()->buildTargetForTitle(title); - return new CMakeRunConfiguration(t, ct.executable, ct.workingDirectory, ct.title); + const CMakeBuildTarget &ct = project->buildTargetForTitle(title); + return new CMakeRunConfiguration(parent, id, ct.executable, ct.workingDirectory, ct.title); } bool CMakeRunConfigurationFactory::canClone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration *source) const { - if (!qobject_cast<CMakeTarget *>(parent)) + if (!canHandle(parent)) return false; - return source->id() == Core::Id(CMAKE_RC_ID); + return source->id().toString().startsWith(QLatin1String(CMAKE_RC_PREFIX)); } ProjectExplorer::RunConfiguration *CMakeRunConfigurationFactory::clone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration * source) { if (!canClone(parent, source)) return 0; - CMakeTarget *t(static_cast<CMakeTarget *>(parent)); CMakeRunConfiguration *crc(static_cast<CMakeRunConfiguration *>(source)); - return new CMakeRunConfiguration(t, crc); + return new CMakeRunConfiguration(parent, crc); } bool CMakeRunConfigurationFactory::canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const { - if (!qobject_cast<CMakeTarget *>(parent)) + if (!qobject_cast<CMakeProject *>(parent->project())) return false; QString id = QString::fromUtf8(ProjectExplorer::idFromMap(map).name()); - return id.startsWith(QLatin1String(CMAKE_RC_ID)); + return id.startsWith(QLatin1String(CMAKE_RC_PREFIX)); } ProjectExplorer::RunConfiguration *CMakeRunConfigurationFactory::restore(ProjectExplorer::Target *parent, const QVariantMap &map) { if (!canRestore(parent, map)) return 0; - CMakeTarget *t(static_cast<CMakeTarget *>(parent)); - CMakeRunConfiguration *rc(new CMakeRunConfiguration(t, QString(), QString(), QString())); + CMakeRunConfiguration *rc(new CMakeRunConfiguration(parent, ProjectExplorer::idFromMap(map), + QString(), QString(), QString())); if (rc->fromMap(map)) return rc; delete rc; diff --git a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h index bf64aa3691..5d5d81816f 100644 --- a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h +++ b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h @@ -62,12 +62,11 @@ class CMakeRunConfiguration : public ProjectExplorer::LocalApplicationRunConfigu friend class CMakeRunConfigurationFactory; public: - CMakeRunConfiguration(CMakeTarget *parent, const QString &target, + CMakeRunConfiguration(ProjectExplorer::Target *parent, Core::Id id, const QString &target, const QString &workingDirectory, const QString &title); ~CMakeRunConfiguration(); - CMakeTarget *cmakeTarget() const; - CMakeBuildConfiguration *activeBuildConfiguration() const; + ProjectExplorer::BuildConfiguration *activeBuildConfiguration() const; QString executable() const; RunMode runMode() const; @@ -101,7 +100,7 @@ private slots: void setCommandLineArguments(const QString &newText); protected: - CMakeRunConfiguration(CMakeTarget *parent, CMakeRunConfiguration *source); + CMakeRunConfiguration(ProjectExplorer::Target *parent, CMakeRunConfiguration *source); virtual bool fromMap(const QVariantMap &map); QString defaultDisplayName() const; @@ -177,6 +176,8 @@ public: QList<Core::Id> availableCreationIds(ProjectExplorer::Target *parent) const; QString displayNameForId(const Core::Id id) const; + + bool canHandle(ProjectExplorer::Target *parent) const; }; } diff --git a/src/plugins/cmakeprojectmanager/cmaketarget.cpp b/src/plugins/cmakeprojectmanager/cmaketarget.cpp deleted file mode 100644 index 97aee20fb4..0000000000 --- a/src/plugins/cmakeprojectmanager/cmaketarget.cpp +++ /dev/null @@ -1,242 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. -** -**************************************************************************/ - -#include "cmaketarget.h" - -#include "cmakeproject.h" -#include "cmakerunconfiguration.h" -#include "cmakebuildconfiguration.h" - -#include <projectexplorer/buildsteplist.h> -#include <projectexplorer/deployconfiguration.h> -#include <projectexplorer/projectexplorerconstants.h> -#include <qtsupport/customexecutablerunconfiguration.h> - -#include <QApplication> -#include <QStyle> - -using namespace CMakeProjectManager; -using namespace CMakeProjectManager::Internal; - -namespace { - -QString displayNameForId(const Core::Id id) { - if (id == Core::Id(DEFAULT_CMAKE_TARGET_ID)) - return QApplication::translate("CMakeProjectManager::Internal::CMakeTarget", "Desktop", "CMake Default target display name"); - return QString(); -} - -} // namespace - -// ------------------------------------------------------------------------- -// CMakeTarget -// ------------------------------------------------------------------------- - -CMakeTarget::CMakeTarget(CMakeProject *parent) : - ProjectExplorer::Target(parent, Core::Id(DEFAULT_CMAKE_TARGET_ID)), - m_buildConfigurationFactory(new CMakeBuildConfigurationFactory(this)) -{ - setDefaultDisplayName(displayNameForId(id())); - setIcon(qApp->style()->standardIcon(QStyle::SP_ComputerIcon)); - connect(parent, SIGNAL(buildTargetsChanged()), SLOT(updateRunConfigurations())); -} - -CMakeTarget::~CMakeTarget() -{ -} - -CMakeProject *CMakeTarget::cmakeProject() const -{ - return static_cast<CMakeProject *>(project()); -} - -ProjectExplorer::BuildConfigWidget *CMakeTarget::createConfigWidget() -{ - return new CMakeBuildSettingsWidget(this); -} - -bool CMakeTargetFactory::supportsTargetId(const Core::Id id) const -{ - return id == Core::Id(DEFAULT_CMAKE_TARGET_ID); -} - -CMakeBuildConfiguration *CMakeTarget::activeBuildConfiguration() const -{ - return static_cast<CMakeBuildConfiguration *>(Target::activeBuildConfiguration()); -} - -CMakeBuildConfigurationFactory *CMakeTarget::buildConfigurationFactory() const -{ - return m_buildConfigurationFactory; -} - -QString CMakeTarget::defaultBuildDirectory() const -{ - return cmakeProject()->defaultBuildDirectory(); -} - -bool CMakeTarget::fromMap(const QVariantMap &map) -{ - return Target::fromMap(map); -} - -void CMakeTarget::updateRunConfigurations() -{ - // *Update* runconfigurations: - QMultiMap<QString, CMakeRunConfiguration*> existingRunConfigurations; - QList<ProjectExplorer::RunConfiguration *> toRemove; - foreach (ProjectExplorer::RunConfiguration* rc, runConfigurations()) { - if (CMakeRunConfiguration* cmakeRC = qobject_cast<CMakeRunConfiguration *>(rc)) - existingRunConfigurations.insert(cmakeRC->title(), cmakeRC); - QtSupport::CustomExecutableRunConfiguration *ceRC = - qobject_cast<QtSupport::CustomExecutableRunConfiguration *>(rc); - if (ceRC && !ceRC->isConfigured()) - toRemove << rc; - } - - foreach (const CMakeBuildTarget &ct, cmakeProject()->buildTargets()) { - if (ct.library) - continue; - if (ct.executable.isEmpty()) - continue; - if (ct.title.endsWith("/fast")) - continue; - QList<CMakeRunConfiguration *> list = existingRunConfigurations.values(ct.title); - if (!list.isEmpty()) { - // Already exists, so override the settings... - foreach (CMakeRunConfiguration *rc, list) { - rc->setExecutable(ct.executable); - rc->setBaseWorkingDirectory(ct.workingDirectory); - rc->setEnabled(true); - } - existingRunConfigurations.remove(ct.title); - } else { - // Does not exist yet - addRunConfiguration(new CMakeRunConfiguration(this, ct.executable, ct.workingDirectory, ct.title)); - } - } - QMultiMap<QString, CMakeRunConfiguration *>::const_iterator it = - existingRunConfigurations.constBegin(); - for ( ; it != existingRunConfigurations.constEnd(); ++it) { - CMakeRunConfiguration *rc = it.value(); - // The executables for those runconfigurations aren't build by the current buildconfiguration - // We just set a disable flag and show that in the display name - rc->setEnabled(false); - // removeRunConfiguration(rc); - } - - foreach (ProjectExplorer::RunConfiguration *rc, toRemove) - removeRunConfiguration(rc); - - if (runConfigurations().isEmpty()) { - // Oh no, no run configuration, - // create a custom executable run configuration - addRunConfiguration(new QtSupport::CustomExecutableRunConfiguration(this)); - } -} - -// ------------------------------------------------------------------------- -// CMakeTargetFactory -// ------------------------------------------------------------------------- - -CMakeTargetFactory::CMakeTargetFactory(QObject *parent) : - ITargetFactory(parent) -{ -} - -CMakeTargetFactory::~CMakeTargetFactory() -{ -} - -QList<Core::Id> CMakeTargetFactory::supportedTargetIds() const -{ - return QList<Core::Id>() << Core::Id(DEFAULT_CMAKE_TARGET_ID); -} -QString CMakeTargetFactory::displayNameForId(const Core::Id id) const -{ - return ::displayNameForId(id); -} - -bool CMakeTargetFactory::canCreate(ProjectExplorer::Project *parent, const Core::Id id) const -{ - if (!qobject_cast<CMakeProject *>(parent)) - return false; - return id == Core::Id(DEFAULT_CMAKE_TARGET_ID); -} - -CMakeTarget *CMakeTargetFactory::create(ProjectExplorer::Project *parent, const Core::Id id) -{ - if (!canCreate(parent, id)) - return 0; - CMakeProject *cmakeparent(static_cast<CMakeProject *>(parent)); - CMakeTarget *t(new CMakeTarget(cmakeparent)); - - // Add default build configuration: - CMakeBuildConfiguration *bc(new CMakeBuildConfiguration(t)); - bc->setDefaultDisplayName("all"); - - ProjectExplorer::BuildStepList *buildSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); - ProjectExplorer::BuildStepList *cleanSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN); - - // Now create a standard build configuration - buildSteps->insertStep(0, new MakeStep(buildSteps)); - - MakeStep *cleanMakeStep = new MakeStep(cleanSteps); - cleanSteps->insertStep(0, cleanMakeStep); - cleanMakeStep->setAdditionalArguments("clean"); - cleanMakeStep->setClean(true); - - t->addBuildConfiguration(bc); - - t->addDeployConfiguration(t->createDeployConfiguration(ProjectExplorer::Constants::DEFAULT_DEPLOYCONFIGURATION_ID)); - - t->updateRunConfigurations(); - - return t; -} - -bool CMakeTargetFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const -{ - return canCreate(parent, ProjectExplorer::idFromMap(map)); -} - -CMakeTarget *CMakeTargetFactory::restore(ProjectExplorer::Project *parent, const QVariantMap &map) -{ - if (!canRestore(parent, map)) - return 0; - CMakeProject *cmakeparent(static_cast<CMakeProject *>(parent)); - CMakeTarget *t(new CMakeTarget(cmakeparent)); - if (t->fromMap(map)) - return t; - delete t; - return 0; -} diff --git a/src/plugins/cmakeprojectmanager/cmaketarget.h b/src/plugins/cmakeprojectmanager/cmaketarget.h deleted file mode 100644 index d9e44487d9..0000000000 --- a/src/plugins/cmakeprojectmanager/cmaketarget.h +++ /dev/null @@ -1,100 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. -** -**************************************************************************/ - -#ifndef CMAKETARGET_H -#define CMAKETARGET_H - -#include "cmakebuildconfiguration.h" - -#include <projectexplorer/target.h> - -namespace CMakeProjectManager { -namespace Internal { - -const char DEFAULT_CMAKE_TARGET_ID[] = "CMakeProjectManager.DefaultCMakeTarget"; - -class CMakeBuildConfiguration; -class CMakeBuildConfigurationFactory; -class CMakeProject; -class CMakeTargetFactory; - -class CMakeTarget : public ProjectExplorer::Target -{ - Q_OBJECT - friend class CMakeTargetFactory; - -public: - CMakeTarget(CMakeProject *parent); - ~CMakeTarget(); - - ProjectExplorer::BuildConfigWidget *createConfigWidget(); - - CMakeProject *cmakeProject() const; - CMakeBuildConfiguration *activeBuildConfiguration() const; - - CMakeBuildConfigurationFactory *buildConfigurationFactory() const; - - QString defaultBuildDirectory() const; - -protected: - bool fromMap(const QVariantMap &map); - -private slots: - void updateRunConfigurations(); - -private: - CMakeBuildConfigurationFactory *m_buildConfigurationFactory; -}; - -class CMakeTargetFactory : public ProjectExplorer::ITargetFactory -{ - Q_OBJECT - -public: - CMakeTargetFactory(QObject *parent = 0); - ~CMakeTargetFactory(); - - bool supportsTargetId(const Core::Id id) const; - - QList<Core::Id> supportedTargetIds() const; - QString displayNameForId(const Core::Id id) const; - - bool canCreate(ProjectExplorer::Project *parent, const Core::Id id) const; - CMakeTarget *create(ProjectExplorer::Project *parent, const Core::Id id); - bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const; - CMakeTarget *restore(ProjectExplorer::Project *parent, const QVariantMap &map); -}; - -} // namespace Internal -} // namespace CMakeProjectManager - -#endif // CMAKETARGET_H diff --git a/src/plugins/cmakeprojectmanager/cmakeuicodemodelsupport.cpp b/src/plugins/cmakeprojectmanager/cmakeuicodemodelsupport.cpp index 1a4e427cf9..b41ab0254d 100644 --- a/src/plugins/cmakeprojectmanager/cmakeuicodemodelsupport.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeuicodemodelsupport.cpp @@ -32,10 +32,10 @@ #include "cmakeuicodemodelsupport.h" #include "cmakeproject.h" -#include "cmaketarget.h" #include "cmakebuildconfiguration.h" #include <cpptools/ModelManagerInterface.h> +#include <projectexplorer/target.h> #include <QProcess> @@ -48,14 +48,10 @@ CMakeUiCodeModelSupport::CMakeUiCodeModelSupport(CPlusPlus::CppModelManagerInter const QString &uiHeaderFile) : CppTools::UiCodeModelSupport(modelmanager, source, uiHeaderFile), m_project(project) -{ - -} +{ } CMakeUiCodeModelSupport::~CMakeUiCodeModelSupport() -{ - -} +{ } QString CMakeUiCodeModelSupport::uicCommand() const { @@ -64,6 +60,7 @@ QString CMakeUiCodeModelSupport::uicCommand() const QStringList CMakeUiCodeModelSupport::environment() const { - CMakeBuildConfiguration *bc = m_project->activeTarget()->activeBuildConfiguration(); - return bc->environment().toStringList(); + if (!m_project || !m_project->activeTarget() || !m_project->activeTarget()->activeBuildConfiguration()) + return QStringList(); + return m_project->activeTarget()->activeBuildConfiguration()->environment().toStringList(); } diff --git a/src/plugins/cmakeprojectmanager/makestep.cpp b/src/plugins/cmakeprojectmanager/makestep.cpp index a28afbd02e..fc8f885b54 100644 --- a/src/plugins/cmakeprojectmanager/makestep.cpp +++ b/src/plugins/cmakeprojectmanager/makestep.cpp @@ -34,14 +34,16 @@ #include "cmakeprojectconstants.h" #include "cmakeproject.h" -#include "cmaketarget.h" #include "cmakebuildconfiguration.h" #include <projectexplorer/buildsteplist.h> -#include <projectexplorer/toolchain.h> -#include <projectexplorer/projectexplorer.h> +#include <projectexplorer/deployconfiguration.h> #include <projectexplorer/gnumakeparser.h> +#include <projectexplorer/profileinformation.h> +#include <projectexplorer/projectexplorer.h> #include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/target.h> +#include <projectexplorer/toolchain.h> #include <utils/qtcprocess.h> @@ -138,19 +140,20 @@ bool MakeStep::init() setIgnoreReturnValue(m_clean); + ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(target()->profile()); ProcessParameters *pp = processParameters(); pp->setMacroExpander(bc->macroExpander()); pp->setEnvironment(bc->environment()); pp->setWorkingDirectory(bc->buildDirectory()); - if (bc->toolChain()) - pp->setCommand(bc->toolChain()->makeCommand()); + if (tc) + pp->setCommand(tc->makeCommand()); else pp->setCommand(QLatin1String("make")); pp->setArguments(arguments); setOutputParser(new ProjectExplorer::GnuMakeParser()); - if (bc->toolChain()) - appendOutputParser(bc->toolChain()->outputParser()); + if (tc) + appendOutputParser(tc->outputParser()); outputParser()->setWorkingDirectory(pp->effectiveWorkingDirectory()); return AbstractProcessStep::init(); @@ -302,7 +305,13 @@ void MakeStepConfigWidget::updateDetails() CMakeBuildConfiguration *bc = m_makeStep->cmakeBuildConfiguration(); if (!bc) bc = static_cast<CMakeBuildConfiguration *>(m_makeStep->target()->activeBuildConfiguration()); - ProjectExplorer::ToolChain *tc = bc->toolChain(); + if (!bc) { + m_summaryText = tr("<b>No build configuration found on this target.</b>"); + updateSummary(); + return; + } + + ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(m_makeStep->target()->profile()); if (tc) { QString arguments = Utils::QtcProcess::joinArgs(m_makeStep->buildTargets()); Utils::QtcProcess::addArgs(&arguments, m_makeStep->additionalArguments()); @@ -315,7 +324,7 @@ void MakeStepConfigWidget::updateDetails() param.setArguments(arguments); m_summaryText = param.summary(displayName()); } else { - m_summaryText = tr("<b>Unknown tool chain</b>"); + m_summaryText = tr("<b>No tool chain set for this target</b>"); } emit updateSummary(); } diff --git a/src/plugins/debugger/debugger.pro b/src/plugins/debugger/debugger.pro index afe40429e6..e633c50ab4 100644 --- a/src/plugins/debugger/debugger.pro +++ b/src/plugins/debugger/debugger.pro @@ -38,6 +38,8 @@ HEADERS += \ debuggerstartparameters.h \ debuggerstreamops.h \ debuggerstringutils.h \ + debuggerprofileconfigwidget.h \ + debuggerprofileinformation.h \ disassembleragent.h \ disassemblerlines.h \ loadremotecoredialog.h \ @@ -92,6 +94,8 @@ SOURCES += \ debuggerplugin.cpp \ debuggerrunner.cpp \ debuggerstreamops.cpp \ + debuggerprofileconfigwidget.cpp \ + debuggerprofileinformation.cpp \ disassembleragent.cpp \ disassemblerlines.cpp \ loadremotecoredialog.cpp \ diff --git a/src/plugins/debugger/debugger.qbs b/src/plugins/debugger/debugger.qbs index ca68ebc7b6..a2de81509e 100644 --- a/src/plugins/debugger/debugger.qbs +++ b/src/plugins/debugger/debugger.qbs @@ -36,6 +36,10 @@ QtcPlugin { "breakcondition.ui", "breakpoint.ui", "debugger.qrc", + "debuggerprofileconfigwidget.cpp", + "debuggerprofileconfigwidget.h", + "debuggerprofileinformation.cpp", + "debuggerprofileinformation.h", "attachcoredialog.ui", "attachexternaldialog.ui", "attachtoqmlportdialog.ui", diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index 01846f3bf7..fecdfa25e7 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -43,6 +43,7 @@ #include "debuggerrunner.h" #include "debuggerruncontrolfactory.h" #include "debuggerstringutils.h" +#include "debuggerprofileinformation.h" #include "memoryagent.h" #include "breakpoint.h" #include "breakhandler.h" @@ -99,6 +100,8 @@ #include <projectexplorer/projectexplorersettings.h> #include <projectexplorer/project.h> #include <projectexplorer/session.h> +#include <projectexplorer/profileinformation.h> +#include <projectexplorer/profilemanager.h> #include <projectexplorer/target.h> #include <projectexplorer/toolchain.h> #include <projectexplorer/toolchainmanager.h> @@ -2839,18 +2842,27 @@ QString DebuggerPluginPrivate::debuggerForAbi(const Abi &abi, DebuggerEngineType qDebug() << "debuggerForAbi" << abi.toString() << searchAbis.size() << searchAbis.front().toString() << et; - foreach (const Abi &searchAbi, searchAbis) { - const QList<ToolChain *> toolchains = - ToolChainManager::instance()->findToolChains(searchAbi); - // Find manually configured ones first - for (int i = toolchains.size() - 1; i >= 0; i--) { - const QString debugger = toolchains.at(i)->debuggerCommand().toString(); - if (debug) - qDebug() << i << toolchains.at(i)->displayName() << debugger; - if (!debugger.isEmpty()) - return debugger; + QList<Profile *> profileList = ProfileManager::instance()->profiles(); + // Note: stList is not sorted with autodected first! + QStringList debuggerList; + foreach (Profile *p, profileList) { + if (!p->isValid()) + continue; + ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(p); + if (!tc) + continue; + if (searchAbis.contains(tc->targetAbi())) { + const QString debugger = DebuggerProfileInformation::debuggerCommand(p).toString(); + if (!debugger.isEmpty()) { + if (p->isAutoDetected()) + debuggerList.append(debugger); + else + debuggerList.prepend(debugger); + } } } + if (!debuggerList.isEmpty()) + return debuggerList.at(0); return QString(); } @@ -3620,6 +3632,8 @@ bool DebuggerPlugin::initialize(const QStringList &arguments, QString *errorMess mstart->addSeparator(globalcontext, Constants::G_MANUAL_REMOTE); mstart->addSeparator(globalcontext, Constants::G_AUTOMATIC_REMOTE); + ProfileManager::instance()->registerProfileInformation(new DebuggerProfileInformation); + return theDebuggerCore->initialize(arguments, errorMessage); } @@ -3711,35 +3725,23 @@ void DebuggerPluginPrivate::testUnloadProject() invoke<void>(pe, "unloadProject"); } -static Project *currentProject() -{ - return ProjectExplorerPlugin::instance()->currentProject(); -} - static Target *activeTarget() { - Project *project = currentProject(); + Project *project = ProjectExplorerPlugin::instance()->currentProject(); return project->activeTarget(); } -static BuildConfiguration *activeBuildConfiguration() -{ - return activeTarget()->activeBuildConfiguration(); -} - -static RunConfiguration *activeRunConfiguration() -{ - return activeTarget()->activeRunConfiguration(); -} - static ToolChain *currentToolChain() { - return activeBuildConfiguration()->toolChain(); + Target *t = activeTarget(); + if (!t || !t->isEnabled()) + return 0; + return ToolChainProfileInformation::toolChain(activeTarget()->profile()); } static LocalApplicationRunConfiguration *activeLocalRunConfiguration() { - return qobject_cast<LocalApplicationRunConfiguration *>(activeRunConfiguration()); + return qobject_cast<LocalApplicationRunConfiguration *>(activeTarget()->activeRunConfiguration()); } void DebuggerPluginPrivate::testRunProject(const DebuggerStartParameters &sp, const TestCallBack &cb) diff --git a/src/plugins/debugger/debuggerprofileconfigwidget.cpp b/src/plugins/debugger/debuggerprofileconfigwidget.cpp new file mode 100644 index 0000000000..735a2584a7 --- /dev/null +++ b/src/plugins/debugger/debuggerprofileconfigwidget.cpp @@ -0,0 +1,148 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. +** +**************************************************************************/ + +#include "debuggerprofileconfigwidget.h" + +#include "debuggerprofileinformation.h" + +#include <projectexplorer/abi.h> +#include <projectexplorer/profileinformation.h> + +#include <utils/pathchooser.h> +#include <utils/qtcassert.h> + +#ifdef Q_OS_WIN +#include <utils/winutils.h> +#endif + +#include <QUrl> + +#include <QDesktopServices> +#include <QHBoxLayout> +#include <QPushButton> +#include <QVBoxLayout> + +namespace Debugger { +namespace Internal { + + +static const char dgbToolsDownloadLink32C[] = "http://www.microsoft.com/whdc/devtools/debugging/installx86.Mspx"; +static const char dgbToolsDownloadLink64C[] = "http://www.microsoft.com/whdc/devtools/debugging/install64bit.Mspx"; +// ----------------------------------------------------------------------- +// DebuggerProfileConfigWidget: +// ----------------------------------------------------------------------- + +DebuggerProfileConfigWidget::DebuggerProfileConfigWidget(ProjectExplorer::Profile *p, + const DebuggerProfileInformation *pi, + QWidget *parent) : + ProjectExplorer::ProfileConfigWidget(parent), + m_profile(p), + m_info(pi), + m_chooser(new Utils::PathChooser) +{ + QVBoxLayout *layout = new QVBoxLayout(this); + layout->setMargin(0); + + ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(p); + if (tc && tc->targetAbi().os() == ProjectExplorer::Abi::WindowsOS + && tc->targetAbi().osFlavor() != ProjectExplorer::Abi::WindowsMSysFlavor) { + QLabel *msvcDebuggerConfigLabel = new QLabel; +#ifdef Q_OS_WIN + const bool is64bit = Utils::winIs64BitSystem(); +#else + const bool is64bit = false; +#endif + const QString link = is64bit ? QLatin1String(dgbToolsDownloadLink64C) : QLatin1String(dgbToolsDownloadLink32C); + //: Label text for path configuration. %2 is "x-bit version". + msvcDebuggerConfigLabel->setText(tr("<html><body><p>Specify the path to the " + "<a href=\"%1\">Windows Console Debugger executable</a>" + " (%2) here.</p>" + "</body></html>").arg(link, (is64bit ? tr("64-bit version") + : tr("32-bit version")))); + msvcDebuggerConfigLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); + msvcDebuggerConfigLabel->setOpenExternalLinks(true); + layout->addWidget(msvcDebuggerConfigLabel); + + } + + m_chooser->setContentsMargins(0, 0, 0, 0); + m_chooser->setExpectedKind(Utils::PathChooser::ExistingCommand); + + QPushButton *button = new QPushButton(tr("Auto detect")); + button->setContentsMargins(0, 0, 0, 0); + connect(button, SIGNAL(clicked()), this, SLOT(autoDetectDebugger())); + + QHBoxLayout *box = dynamic_cast<QHBoxLayout *>(m_chooser->layout()); + QTC_CHECK(box); + if (box) + box->insertWidget(1, button); + layout->addWidget(m_chooser); + + discard(); + connect(m_chooser, SIGNAL(changed(QString)), this, SIGNAL(dirty())); +} + +QString DebuggerProfileConfigWidget::displayName() const +{ + return tr("Debugger command:"); +} + +void DebuggerProfileConfigWidget::makeReadOnly() +{ + m_chooser->setEnabled(false); +} + +void DebuggerProfileConfigWidget::apply() +{ + Utils::FileName fn = m_chooser->fileName(); + DebuggerProfileInformation::setDebuggerCommand(m_profile, fn); +} + +void DebuggerProfileConfigWidget::discard() +{ + m_chooser->setFileName(DebuggerProfileInformation::debuggerCommand(m_profile)); +} + +bool DebuggerProfileConfigWidget::isDirty() const +{ + return m_chooser->fileName() != DebuggerProfileInformation::debuggerCommand(m_profile); +} + +void DebuggerProfileConfigWidget::autoDetectDebugger() +{ + QVariant v = m_info->defaultValue(m_profile); + m_chooser->setFileName(Utils::FileName::fromString(v.toString())); +} + +} // namespace Internal + +} // namespace Debugger diff --git a/src/plugins/debugger/debuggerprofileconfigwidget.h b/src/plugins/debugger/debuggerprofileconfigwidget.h new file mode 100644 index 0000000000..f0bc7e329d --- /dev/null +++ b/src/plugins/debugger/debuggerprofileconfigwidget.h @@ -0,0 +1,81 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. +** +**************************************************************************/ + +#ifndef DEBUGGER_DEBUGGERPROFILECONFIGWIDGET_H +#define DEBUGGER_DEBUGGERPROFILECONFIGWIDGET_H + +#include <projectexplorer/profileconfigwidget.h> + +#include <QLabel> +#include <debuggerprofileinformation.h> + +namespace ProjectExplorer { class Profile; } +namespace Utils { class PathChooser; } + +namespace Debugger { +class DebuggerProfileInformation; + +namespace Internal { +// ----------------------------------------------------------------------- +// DebuggerProfileConfigWidget: +// ----------------------------------------------------------------------- + +class DebuggerProfileConfigWidget : public ProjectExplorer::ProfileConfigWidget +{ + Q_OBJECT + +public: + DebuggerProfileConfigWidget(ProjectExplorer::Profile *p, + const DebuggerProfileInformation *pi, + QWidget *parent = 0); + + QString displayName() const; + + void makeReadOnly(); + + void apply(); + void discard(); + bool isDirty() const; + +private slots: + void autoDetectDebugger(); + +private: + ProjectExplorer::Profile *m_profile; + const DebuggerProfileInformation *m_info; + Utils::PathChooser *m_chooser; +}; + +} // namespace Internal +} // namespace Debugger + +#endif // DEBUGGER_DEBUGGERPROFILEINFORMATION_H diff --git a/src/plugins/debugger/debuggerprofileinformation.cpp b/src/plugins/debugger/debuggerprofileinformation.cpp new file mode 100644 index 0000000000..e644978fa9 --- /dev/null +++ b/src/plugins/debugger/debuggerprofileinformation.cpp @@ -0,0 +1,208 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. +** +**************************************************************************/ + +#include "debuggerprofileinformation.h" + +#include "debuggerprofileconfigwidget.h" + +#include <projectexplorer/abi.h> +#include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/toolchain.h> + +#include <utils/environment.h> + +#include <QDir> +#include <QPair> + +// -------------------------------------------------------------------------- +// Helpers: +// -------------------------------------------------------------------------- + +static QPair<QString, QString> autoDetectCdbDebugger() +{ + QPair<QString, QString> result; + QList<Utils::FileName> cdbs; + + QStringList programDirs; + programDirs.append(QString::fromLocal8Bit(qgetenv("ProgramFiles"))); + programDirs.append(QString::fromLocal8Bit(qgetenv("ProgramFiles(x86)"))); + programDirs.append(QString::fromLocal8Bit(qgetenv("ProgramW6432"))); + + foreach (const QString &dirName, programDirs) { + if (dirName.isEmpty()) + continue; + QDir dir(dirName); + // Windows SDK's starting from version 8 live in + // "ProgramDir\Windows Kits\<version>" + const QString windowsKitsFolderName = QLatin1String("Windows Kits"); + if (dir.exists(windowsKitsFolderName)) { + QDir windowKitsFolder = dir; + if (windowKitsFolder.cd(windowsKitsFolderName)) { + // Check in reverse order (latest first) + const QFileInfoList kitFolders = + windowKitsFolder.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot, + QDir::Time | QDir::Reversed); + foreach (const QFileInfo &kitFolderFi, kitFolders) { + const QString path = kitFolderFi.absoluteFilePath(); + const QFileInfo cdb32(path + QLatin1String("/Debuggers/x86/cdb.exe")); + if (cdb32.isExecutable()) + cdbs.push_back(Utils::FileName::fromString(cdb32.absoluteFilePath())); + const QFileInfo cdb64(path + QLatin1String("/Debuggers/x64/cdb.exe")); + if (cdb64.isExecutable()) + cdbs.push_back(Utils::FileName::fromString(cdb64.absoluteFilePath())); + } // for Kits + } // can cd to "Windows Kits" + } // "Windows Kits" exists + + // Pre Windows SDK 8: Check 'Debugging Tools for Windows' + foreach (const QFileInfo &fi, dir.entryInfoList(QStringList(QLatin1String("Debugging Tools for Windows*")), + QDir::Dirs | QDir::NoDotAndDotDot)) { + Utils::FileName filePath(fi); + filePath.appendPath(QLatin1String("cdb.exe")); + if (!cdbs.contains(filePath)) + cdbs.append(filePath); + } + } + + foreach (const Utils::FileName &cdb, cdbs) { + QList<ProjectExplorer::Abi> abis = ProjectExplorer::Abi::abisOfBinary(cdb); + if (abis.isEmpty()) + continue; + if (abis.first().wordWidth() == 32) + result.first = cdb.toString(); + else if (abis.first().wordWidth() == 64) + result.second = cdb.toString(); + } + + // prefer 64bit debugger, even for 32bit binaries: + if (!result.second.isEmpty()) + result.first = result.second; + + return result; +} + +namespace Debugger { + +// -------------------------------------------------------------------------- +// DebuggerProfileInformation: +// -------------------------------------------------------------------------- + +static const char DEBUGGER_INFORMATION[] = "Debugger.Information"; + +DebuggerProfileInformation::DebuggerProfileInformation() +{ + setObjectName(QLatin1String("DebuggerProfileInformation")); +} + +Core::Id DebuggerProfileInformation::dataId() const +{ + static Core::Id id = Core::Id(DEBUGGER_INFORMATION); + return id; +} + +unsigned int DebuggerProfileInformation::priority() const +{ + return 28000; +} + +QVariant DebuggerProfileInformation::defaultValue(ProjectExplorer::Profile *p) const +{ + ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(p); + ProjectExplorer::Abi abi = ProjectExplorer::Abi::hostAbi(); + if (tc) + abi = tc->targetAbi(); + + // CDB for windows: + if (abi.os() == ProjectExplorer::Abi::WindowsOS + && abi.osFlavor() != ProjectExplorer::Abi::WindowsMSysFlavor) { + QPair<QString, QString> cdbs = autoDetectCdbDebugger(); + return (abi.wordWidth() == 32) ? cdbs.first : cdbs.second; + } + + // Check suggestions from the SDK: + if (tc) { + const QString path = tc->suggestedDebugger().toString(); + if (!path.isEmpty()) + return path; + } + + // fall back to system GDB: + Utils::Environment env = Utils::Environment::systemEnvironment(); + return env.searchInPath(QLatin1String("gdb")); +} + +QList<ProjectExplorer::Task> DebuggerProfileInformation::validate(ProjectExplorer::Profile *p) const +{ + QList<ProjectExplorer::Task> result; + Utils::FileName dbg = debuggerCommand(p); + if (dbg.isEmpty()) { + result << ProjectExplorer::Task(ProjectExplorer::Task::Warning, + tr("No debugger set up."), Utils::FileName(), -1, + Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM)); + return result; + } + + QFileInfo fi = dbg.toFileInfo(); + if (!fi.exists() || fi.isDir()) + result << ProjectExplorer::Task(ProjectExplorer::Task::Error, + tr("Debugger not found."), Utils::FileName(), -1, + Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM)); + else if (!fi.isExecutable()) + result << ProjectExplorer::Task(ProjectExplorer::Task::Error, + tr("Debugger not exectutable."), Utils::FileName(), -1, + Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM)); + + return result; +} + +ProjectExplorer::ProfileConfigWidget * +DebuggerProfileInformation::createConfigWidget(ProjectExplorer::Profile *p) const +{ + return new Internal::DebuggerProfileConfigWidget(p, this); +} + +ProjectExplorer::ProfileInformation::ItemList DebuggerProfileInformation::toUserOutput(ProjectExplorer::Profile *p) const +{ + return ItemList() << qMakePair(tr("Debugger"), debuggerCommand(p).toUserOutput()); +} + +Utils::FileName DebuggerProfileInformation::debuggerCommand(const ProjectExplorer::Profile *p) +{ + return Utils::FileName::fromString(p->value(Core::Id(DEBUGGER_INFORMATION)).toString()); +} + +void DebuggerProfileInformation::setDebuggerCommand(ProjectExplorer::Profile *p, Utils::FileName &command) +{ + p->setValue(Core::Id(DEBUGGER_INFORMATION), command.toString()); +} + +} // namespace Debugger diff --git a/src/plugins/debugger/debuggerprofileinformation.h b/src/plugins/debugger/debuggerprofileinformation.h new file mode 100644 index 0000000000..aaf990e79b --- /dev/null +++ b/src/plugins/debugger/debuggerprofileinformation.h @@ -0,0 +1,67 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. +** +**************************************************************************/ + +#ifndef DEBUGGER_DEBUGGERPROFILEINFORMATION_H +#define DEBUGGER_DEBUGGERPROFILEINFORMATION_H + +#include "debugger_global.h" + +#include <projectexplorer/profileinformation.h> + +namespace Debugger { + +class DEBUGGER_EXPORT DebuggerProfileInformation : public ProjectExplorer::ProfileInformation +{ + Q_OBJECT + +public: + DebuggerProfileInformation(); + + Core::Id dataId() const; + + unsigned int priority() const; // the higher the closer to the top. + + QVariant defaultValue(ProjectExplorer::Profile *p) const; + + QList<ProjectExplorer::Task> validate(ProjectExplorer::Profile *p) const; + + ProjectExplorer::ProfileConfigWidget *createConfigWidget(ProjectExplorer::Profile *p) const; + + ItemList toUserOutput(ProjectExplorer::Profile *p) const; + + static Utils::FileName debuggerCommand(const ProjectExplorer::Profile *p); + static void setDebuggerCommand(ProjectExplorer::Profile *p, Utils::FileName &command); +}; + +} // namespace Debugger + +#endif // DEBUGGER_DEBUGGERPROFILEINFORMATION_H diff --git a/src/plugins/debugger/debuggerrunner.cpp b/src/plugins/debugger/debuggerrunner.cpp index b6ab4e1404..9d95678f8e 100644 --- a/src/plugins/debugger/debuggerrunner.cpp +++ b/src/plugins/debugger/debuggerrunner.cpp @@ -41,6 +41,7 @@ #include "debuggerplugin.h" #include "debuggerstringutils.h" #include "debuggerstartparameters.h" +#include "debuggerprofileinformation.h" #include "lldb/lldbenginehost.h" #include "debuggertooltipmanager.h" #include "qml/qmlengine.h" @@ -905,6 +906,12 @@ static DebuggerStartParameters localStartParameters(RunConfiguration *runConfigu if (const ProjectExplorer::Target *target = runConfiguration->target()) { if (QByteArray(target->metaObject()->className()).contains("Qt4")) { + // FIXME: Get this from the profile? + // We could query the QtVersion for this information directly, but then we + // will need to add a dependency on QtSupport to the debugger. + // + // The profile could also get a method to extract the required information from + // its information to avoid this dependecy (as we do for the environment). const Utils::FileName qmake = Utils::BuildableHelperLibrary::findSystemQt(sp.environment); if (!qmake.isEmpty()) sp.qtInstallPath = findQtInstallPath(qmake); @@ -913,8 +920,8 @@ static DebuggerStartParameters localStartParameters(RunConfiguration *runConfigu sp.projectSourceDirectory = project->projectDirectory(); if (const ProjectExplorer::BuildConfiguration *buildConfig = target->activeBuildConfiguration()) { sp.projectBuildDirectory = buildConfig->buildDirectory(); - if (const ProjectExplorer::ToolChain *tc = buildConfig->toolChain()) - sp.debuggerCommand = tc->debuggerCommand().toString(); + const ProjectExplorer::Profile *p = runConfiguration->target()->profile(); + sp.debuggerCommand = DebuggerProfileInformation::debuggerCommand(p).toString(); } sp.projectSourceFiles = project->files(Project::ExcludeGeneratedFiles); } diff --git a/src/plugins/debugger/debuggertoolchaincombobox.cpp b/src/plugins/debugger/debuggertoolchaincombobox.cpp index 32a0eeb5bb..0148a8807a 100644 --- a/src/plugins/debugger/debuggertoolchaincombobox.cpp +++ b/src/plugins/debugger/debuggertoolchaincombobox.cpp @@ -32,8 +32,10 @@ #include "debuggertoolchaincombobox.h" -#include <projectexplorer/toolchainmanager.h> -#include <projectexplorer/toolchain.h> +#include "debuggerprofileinformation.h" + +#include <projectexplorer/profileinformation.h> +#include <projectexplorer/profilemanager.h> #include <projectexplorer/abi.h> #include <utils/qtcassert.h> @@ -58,17 +60,25 @@ DebuggerToolChainComboBox::DebuggerToolChainComboBox(QWidget *parent) : void DebuggerToolChainComboBox::init(bool hostAbiOnly) { const ProjectExplorer::Abi hostAbi = ProjectExplorer::Abi::hostAbi(); - foreach (const ProjectExplorer::ToolChain *tc, ProjectExplorer::ToolChainManager::instance()->toolChains()) { + foreach (const ProjectExplorer::Profile *st, + ProjectExplorer::ProfileManager::instance()->profiles()) { + if (!st->isValid()) + continue; + ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(st); + if (!tc) + continue; const ProjectExplorer::Abi abi = tc->targetAbi(); - if (!hostAbiOnly || hostAbi.isCompatibleWith(abi)) { - const QString debuggerCommand = tc->debuggerCommand().toString(); - if (!debuggerCommand.isEmpty()) { - const AbiDebuggerCommandPair data(abi, debuggerCommand); - const QString completeBase = QFileInfo(debuggerCommand).completeBaseName(); - const QString name = tr("%1 (%2)").arg(tc->displayName(), completeBase); - addItem(name, qVariantFromValue(data)); - } - } + if (hostAbiOnly && hostAbi.os() != abi.os()) + continue; + + const QString debuggerCommand = DebuggerProfileInformation::debuggerCommand(st).toString(); + if (debuggerCommand.isEmpty()) + continue; + + const AbiDebuggerCommandPair data(abi, debuggerCommand); + const QString completeBase = QFileInfo(debuggerCommand).completeBaseName(); + const QString name = tr("%1 (%2)").arg(st->displayName(), completeBase); + addItem(name, qVariantFromValue(data)); } setEnabled(count() > 1); } diff --git a/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp b/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp index 56fde6ba6b..d48728b809 100644 --- a/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp +++ b/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp @@ -34,13 +34,15 @@ #include "genericmakestep.h" #include "genericproject.h" -#include "generictarget.h" #include <projectexplorer/buildsteplist.h> -#include <projectexplorer/toolchain.h> +#include <projectexplorer/profileinformation.h> #include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/toolchain.h> +#include <utils/pathchooser.h> #include <utils/qtcassert.h> +#include <QFormLayout> #include <QInputDialog> using namespace GenericProjectManager; @@ -53,17 +55,17 @@ const char * const GENERIC_BC_ID("GenericProjectManager.GenericBuildConfiguratio const char * const BUILD_DIRECTORY_KEY("GenericProjectManager.GenericBuildConfiguration.BuildDirectory"); } -GenericBuildConfiguration::GenericBuildConfiguration(GenericTarget *parent) +GenericBuildConfiguration::GenericBuildConfiguration(ProjectExplorer::Target *parent) : BuildConfiguration(parent, Core::Id(GENERIC_BC_ID)) { } -GenericBuildConfiguration::GenericBuildConfiguration(GenericTarget *parent, const Core::Id id) +GenericBuildConfiguration::GenericBuildConfiguration(ProjectExplorer::Target *parent, const Core::Id id) : BuildConfiguration(parent, id) { } -GenericBuildConfiguration::GenericBuildConfiguration(GenericTarget *parent, GenericBuildConfiguration *source) : +GenericBuildConfiguration::GenericBuildConfiguration(ProjectExplorer::Target *parent, GenericBuildConfiguration *source) : BuildConfiguration(parent, source), m_buildDirectory(source->m_buildDirectory) { @@ -112,17 +114,16 @@ void GenericBuildConfiguration::setBuildDirectory(const QString &buildDirectory) emit buildDirectoryChanged(); } -GenericTarget *GenericBuildConfiguration::genericTarget() const +ProjectExplorer::BuildConfigWidget *GenericBuildConfiguration::createConfigWidget() { - return static_cast<GenericTarget *>(target()); + return new GenericBuildSettingsWidget; } ProjectExplorer::IOutputParser *GenericBuildConfiguration::createOutputParser() const { - ProjectExplorer::ToolChain *tc = genericTarget()->genericProject()->toolChain(); - if (tc) - return tc->outputParser(); - return 0; + ProjectExplorer::ToolChain *tc = + ProjectExplorer::ToolChainProfileInformation::toolChain(target()->profile()); + return tc ? tc->outputParser() : 0; } @@ -139,9 +140,9 @@ GenericBuildConfigurationFactory::~GenericBuildConfigurationFactory() { } -QList<Core::Id> GenericBuildConfigurationFactory::availableCreationIds(ProjectExplorer::Target *parent) const +QList<Core::Id> GenericBuildConfigurationFactory::availableCreationIds(const ProjectExplorer::Target *parent) const { - if (!qobject_cast<GenericTarget *>(parent)) + if (!canHandle(parent)) return QList<Core::Id>(); return QList<Core::Id>() << Core::Id(GENERIC_BC_ID); } @@ -153,33 +154,35 @@ QString GenericBuildConfigurationFactory::displayNameForId(const Core::Id id) co return QString(); } -bool GenericBuildConfigurationFactory::canCreate(ProjectExplorer::Target *parent, const Core::Id id) const +bool GenericBuildConfigurationFactory::canCreate(const ProjectExplorer::Target *parent, const Core::Id id) const { - if (!qobject_cast<GenericTarget *>(parent)) + if (!canHandle(parent)) return false; if (id == Core::Id(GENERIC_BC_ID)) return true; return false; } -BuildConfiguration *GenericBuildConfigurationFactory::create(ProjectExplorer::Target *parent, const Core::Id id) +BuildConfiguration *GenericBuildConfigurationFactory::create(ProjectExplorer::Target *parent, const Core::Id id, const QString &name) { if (!canCreate(parent, id)) return 0; - GenericTarget *target(static_cast<GenericTarget *>(parent)); //TODO asking for name is duplicated everywhere, but maybe more - // wizards will show up, that incorporate choosing the name - bool ok; - QString buildConfigurationName = QInputDialog::getText(0, - tr("New Configuration"), - tr("New configuration name:"), - QLineEdit::Normal, - QString(), - &ok); + // wizards will show up, that incorporate choosing the nam + bool ok = true; + QString buildConfigurationName = name; + if (buildConfigurationName.isEmpty()) + buildConfigurationName = QInputDialog::getText(0, + tr("New Configuration"), + tr("New configuration name:"), + QLineEdit::Normal, + QString(), &ok); + buildConfigurationName = buildConfigurationName.trimmed(); if (!ok || buildConfigurationName.isEmpty()) return 0; - GenericBuildConfiguration *bc = new GenericBuildConfiguration(target); + + GenericBuildConfiguration *bc = new GenericBuildConfiguration(parent); bc->setDisplayName(buildConfigurationName); ProjectExplorer::BuildStepList *buildSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); @@ -196,11 +199,10 @@ BuildConfiguration *GenericBuildConfigurationFactory::create(ProjectExplorer::Ta cleanMakeStep->setBuildTarget(QLatin1String("clean"), /* on = */ true); cleanMakeStep->setClean(true); - target->addBuildConfiguration(bc); // also makes the name unique... return bc; } -bool GenericBuildConfigurationFactory::canClone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const +bool GenericBuildConfigurationFactory::canClone(const ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const { return canCreate(parent, source->id()); } @@ -209,11 +211,10 @@ BuildConfiguration *GenericBuildConfigurationFactory::clone(ProjectExplorer::Tar { if (!canClone(parent, source)) return 0; - GenericTarget *target(static_cast<GenericTarget *>(parent)); - return new GenericBuildConfiguration(target, qobject_cast<GenericBuildConfiguration *>(source)); + return new GenericBuildConfiguration(parent, qobject_cast<GenericBuildConfiguration *>(source)); } -bool GenericBuildConfigurationFactory::canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const +bool GenericBuildConfigurationFactory::canRestore(const ProjectExplorer::Target *parent, const QVariantMap &map) const { return canCreate(parent, ProjectExplorer::idFromMap(map)); } @@ -222,16 +223,53 @@ BuildConfiguration *GenericBuildConfigurationFactory::restore(ProjectExplorer::T { if (!canRestore(parent, map)) return 0; - GenericTarget *target(static_cast<GenericTarget *>(parent)); - GenericBuildConfiguration *bc(new GenericBuildConfiguration(target)); + GenericBuildConfiguration *bc(new GenericBuildConfiguration(parent)); if (bc->fromMap(map)) return bc; delete bc; return 0; } +bool GenericBuildConfigurationFactory::canHandle(const ProjectExplorer::Target *t) const +{ + if (!t->project()->supportsProfile(t->profile())) + return false; + return qobject_cast<GenericProject *>(t->project()); +} + BuildConfiguration::BuildType GenericBuildConfiguration::buildType() const { return Unknown; } +//////////////////////////////////////////////////////////////////////////////////// +// GenericBuildSettingsWidget +//////////////////////////////////////////////////////////////////////////////////// + +GenericBuildSettingsWidget::GenericBuildSettingsWidget() : m_buildConfiguration(0) +{ + QFormLayout *fl = new QFormLayout(this); + fl->setContentsMargins(0, -1, 0, -1); + fl->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow); + + // build directory + m_pathChooser = new Utils::PathChooser(this); + m_pathChooser->setEnabled(true); + fl->addRow(tr("Build directory:"), m_pathChooser); + connect(m_pathChooser, SIGNAL(changed(QString)), this, SLOT(buildDirectoryChanged())); +} + +QString GenericBuildSettingsWidget::displayName() const +{ return tr("Generic Manager"); } + +void GenericBuildSettingsWidget::init(BuildConfiguration *bc) +{ + m_buildConfiguration = static_cast<GenericBuildConfiguration *>(bc); + m_pathChooser->setBaseDirectory(bc->target()->project()->projectDirectory()); + m_pathChooser->setPath(m_buildConfiguration->rawBuildDirectory()); +} + +void GenericBuildSettingsWidget::buildDirectoryChanged() +{ + m_buildConfiguration->setBuildDirectory(m_pathChooser->rawPath()); +} diff --git a/src/plugins/genericprojectmanager/genericbuildconfiguration.h b/src/plugins/genericprojectmanager/genericbuildconfiguration.h index 6a2058861a..0f34074485 100644 --- a/src/plugins/genericprojectmanager/genericbuildconfiguration.h +++ b/src/plugins/genericprojectmanager/genericbuildconfiguration.h @@ -34,6 +34,9 @@ #define GENERICBUILDCONFIGURATION_H #include <projectexplorer/buildconfiguration.h> +#include <projectexplorer/buildstep.h> // for BuildConfigWidget + +namespace Utils { class PathChooser; } namespace GenericProjectManager { namespace Internal { @@ -47,11 +50,10 @@ class GenericBuildConfiguration : public ProjectExplorer::BuildConfiguration friend class GenericBuildConfigurationFactory; public: - explicit GenericBuildConfiguration(GenericTarget *parent); + explicit GenericBuildConfiguration(ProjectExplorer::Target *parent); virtual ~GenericBuildConfiguration(); - GenericTarget *genericTarget() const; - + ProjectExplorer::BuildConfigWidget *createConfigWidget(); virtual QString buildDirectory() const; QString rawBuildDirectory() const; @@ -64,8 +66,8 @@ public: BuildType buildType() const; protected: - GenericBuildConfiguration(GenericTarget *parent, GenericBuildConfiguration *source); - GenericBuildConfiguration(GenericTarget *parent, const Core::Id id); + GenericBuildConfiguration(ProjectExplorer::Target *parent, GenericBuildConfiguration *source); + GenericBuildConfiguration(ProjectExplorer::Target *parent, const Core::Id id); virtual bool fromMap(const QVariantMap &map); private: @@ -80,17 +82,39 @@ public: explicit GenericBuildConfigurationFactory(QObject *parent = 0); ~GenericBuildConfigurationFactory(); - QList<Core::Id> availableCreationIds(ProjectExplorer::Target *parent) const; + QList<Core::Id> availableCreationIds(const ProjectExplorer::Target *parent) const; QString displayNameForId(const Core::Id id) const; - bool canCreate(ProjectExplorer::Target *parent, const Core::Id id) const; - ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent, const Core::Id id); - bool canClone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const; + bool canCreate(const ProjectExplorer::Target *parent, const Core::Id id) const; + ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent, const Core::Id id, const QString &name = QString()); + bool canClone(const ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const; ProjectExplorer::BuildConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source); - bool canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const; + bool canRestore(const ProjectExplorer::Target *parent, const QVariantMap &map) const; ProjectExplorer::BuildConfiguration *restore(ProjectExplorer::Target *parent, const QVariantMap &map); + +private: + bool canHandle(const ProjectExplorer::Target *t) const; +}; + +class GenericBuildSettingsWidget : public ProjectExplorer::BuildConfigWidget +{ + Q_OBJECT + +public: + GenericBuildSettingsWidget(); + + QString displayName() const; + + void init(ProjectExplorer::BuildConfiguration *bc); + +private slots: + void buildDirectoryChanged(); + +private: + Utils::PathChooser *m_pathChooser; + GenericBuildConfiguration *m_buildConfiguration; }; -} // namespace GenericProjectManager } // namespace Internal +} // namespace GenericProjectManager #endif // GENERICBUILDCONFIGURATION_H diff --git a/src/plugins/genericprojectmanager/genericmakestep.cpp b/src/plugins/genericprojectmanager/genericmakestep.cpp index 37dcc2566d..d6d176667e 100644 --- a/src/plugins/genericprojectmanager/genericmakestep.cpp +++ b/src/plugins/genericprojectmanager/genericmakestep.cpp @@ -33,16 +33,16 @@ #include "genericmakestep.h" #include "genericprojectconstants.h" #include "genericproject.h" -#include "generictarget.h" #include "ui_genericmakestep.h" #include "genericbuildconfiguration.h" #include <extensionsystem/pluginmanager.h> #include <projectexplorer/buildsteplist.h> -#include <projectexplorer/toolchain.h> -#include <projectexplorer/projectexplorer.h> #include <projectexplorer/gnumakeparser.h> +#include <projectexplorer/profileinformation.h> +#include <projectexplorer/projectexplorer.h> #include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/toolchain.h> #include <coreplugin/variablemanager.h> #include <utils/stringutils.h> #include <utils/qtcassert.h> @@ -126,8 +126,10 @@ bool GenericMakeStep::init() setIgnoreReturnValue(m_clean); setOutputParser(new ProjectExplorer::GnuMakeParser()); - if (bc->genericTarget()->genericProject()->toolChain()) - appendOutputParser(bc->genericTarget()->genericProject()->toolChain()->outputParser()); + ProjectExplorer::ToolChain *tc = + ProjectExplorer::ToolChainProfileInformation::toolChain(bc->target()->profile()); + if (tc) + appendOutputParser(tc->outputParser()); outputParser()->setWorkingDirectory(pp->effectiveWorkingDirectory()); return AbstractProcessStep::init(); @@ -175,9 +177,9 @@ QString GenericMakeStep::makeCommand() const { QString command = m_makeCommand; if (command.isEmpty()) { - GenericProject *pro = static_cast<GenericProject *>(target()->project()); - if (ProjectExplorer::ToolChain *toolChain = pro->toolChain()) - command = toolChain->makeCommand(); + ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(target()->profile()); + if (tc) + command = tc->makeCommand(); else command = QLatin1String("make"); } @@ -249,7 +251,7 @@ GenericMakeStepConfigWidget::GenericMakeStepConfigWidget(GenericMakeStep *makeSt connect(ProjectExplorer::ProjectExplorerPlugin::instance(), SIGNAL(settingsChanged()), this, SLOT(updateDetails())); - connect(pro, SIGNAL(toolChainChanged(ProjectExplorer::ToolChain*)), + connect(m_makeStep->target(), SIGNAL(profileChanged()), this, SLOT(updateMakeOverrrideLabel())); } diff --git a/src/plugins/genericprojectmanager/genericproject.cpp b/src/plugins/genericprojectmanager/genericproject.cpp index c63ab87f00..01fb99ae39 100644 --- a/src/plugins/genericprojectmanager/genericproject.cpp +++ b/src/plugins/genericprojectmanager/genericproject.cpp @@ -34,17 +34,19 @@ #include "genericbuildconfiguration.h" #include "genericprojectconstants.h" -#include "generictarget.h" + +#include "genericmakestep.h" #include <projectexplorer/abi.h> #include <projectexplorer/buildenvironmentwidget.h> +#include <projectexplorer/buildsteplist.h> #include <projectexplorer/headerpath.h> -#include <projectexplorer/toolchainmanager.h> +#include <projectexplorer/profileinformation.h> +#include <projectexplorer/profilemanager.h> #include <projectexplorer/projectexplorerconstants.h> #include <qtsupport/customexecutablerunconfiguration.h> #include <cpptools/ModelManagerInterface.h> #include <extensionsystem/pluginmanager.h> -#include <utils/pathchooser.h> #include <utils/qtcassert.h> #include <utils/fileutils.h> #include <coreplugin/icore.h> @@ -54,7 +56,6 @@ #include <QDir> #include <QProcessEnvironment> -#include <QFormLayout> #include <QMainWindow> #include <QComboBox> @@ -62,18 +63,13 @@ using namespace GenericProjectManager; using namespace GenericProjectManager::Internal; using namespace ProjectExplorer; -namespace { -const char * const TOOLCHAIN_KEY("GenericProjectManager.GenericProject.Toolchain"); -} // end of anonymous namespace - //////////////////////////////////////////////////////////////////////////////////// // GenericProject //////////////////////////////////////////////////////////////////////////////////// GenericProject::GenericProject(Manager *manager, const QString &fileName) : m_manager(manager), - m_fileName(fileName), - m_toolChain(0) + m_fileName(fileName) { setProjectContext(Core::Context(GenericProjectManager::Constants::PROJECTCONTEXT)); setProjectLanguage(Core::Context(ProjectExplorer::Constants::LANG_CXX)); @@ -107,12 +103,6 @@ GenericProject::~GenericProject() m_manager->unregisterProject(this); delete m_rootNode; - // do not delete m_toolChain -} - -GenericTarget *GenericProject::activeTarget() const -{ - return static_cast<GenericTarget *>(Project::activeTarget()); } QString GenericProject::filesFileName() const @@ -261,11 +251,13 @@ void GenericProject::refresh(RefreshOptions options) CPlusPlus::CppModelManagerInterface::ProjectPart::Ptr part( new CPlusPlus::CppModelManagerInterface::ProjectPart); - if (m_toolChain) { - part->defines = m_toolChain->predefinedMacros(QStringList()); + ToolChain *tc = activeTarget() ? + ProjectExplorer::ToolChainProfileInformation::toolChain(activeTarget()->profile()) : 0; + if (tc) { + part->defines = tc->predefinedMacros(QStringList()); part->defines += '\n'; - foreach (const HeaderPath &headerPath, m_toolChain->systemHeaderPaths()) { + foreach (const HeaderPath &headerPath, tc->systemHeaderPaths()) { if (headerPath.kind() == HeaderPath::FrameworkHeaderPath) part->frameworkPaths.append(headerPath.path()); else @@ -389,27 +381,6 @@ QByteArray GenericProject::defines() const return m_defines; } -void GenericProject::setToolChain(ToolChain *tc) -{ - if (m_toolChain == tc) - return; - - m_toolChain = tc; - refresh(Configuration); - - foreach (Target *t, targets()) { - foreach (BuildConfiguration *bc, t->buildConfigurations()) - bc->setToolChain(tc); - } - - emit toolChainChanged(m_toolChain); -} - -ToolChain *GenericProject::toolChain() const -{ - return m_toolChain; -} - QString GenericProject::displayName() const { return m_projectName; @@ -456,18 +427,14 @@ QStringList GenericProject::buildTargets() const return targets; } -QVariantMap GenericProject::toMap() const -{ - QVariantMap map(Project::toMap()); - map.insert(QLatin1String(TOOLCHAIN_KEY), m_toolChain ? m_toolChain->id() : QString()); - return map; -} - bool GenericProject::fromMap(const QVariantMap &map) { if (!Project::fromMap(map)) return false; + if (!activeTarget()) + addTarget(createTarget(ProfileManager::instance()->defaultProfile())); + // Sanity check: We need both a buildconfiguration and a runconfiguration! QList<Target *> targetList = targets(); foreach (Target *t, targetList) { @@ -480,119 +447,16 @@ bool GenericProject::fromMap(const QVariantMap &map) t->addRunConfiguration(new QtSupport::CustomExecutableRunConfiguration(t)); } - // Add default setup: - if (targets().isEmpty()) { - GenericTargetFactory *factory = - ExtensionSystem::PluginManager::getObject<GenericTargetFactory>(); - addTarget(factory->create(this, Core::Id(GENERIC_DESKTOP_TARGET_ID))); - } - - QString id = map.value(QLatin1String(TOOLCHAIN_KEY)).toString(); - const ToolChainManager *toolChainManager = ToolChainManager::instance(); - - if (!id.isNull()) { - setToolChain(toolChainManager->findToolChain(id)); - } else { - ProjectExplorer::Abi abi = ProjectExplorer::Abi::hostAbi(); - abi = ProjectExplorer::Abi(abi.architecture(), abi.os(), ProjectExplorer::Abi::UnknownFlavor, - abi.binaryFormat(), abi.wordWidth() == 32 ? 32 : 0); - QList<ToolChain *> tcs = toolChainManager->findToolChains(abi); - if (tcs.isEmpty()) - tcs = toolChainManager->toolChains(); - if (!tcs.isEmpty()) - setToolChain(tcs.at(0)); - } - setIncludePaths(allIncludePaths()); - refresh(Everything); + evaluateBuildSystem(); return true; } -//////////////////////////////////////////////////////////////////////////////////// -// GenericBuildSettingsWidget -//////////////////////////////////////////////////////////////////////////////////// - -GenericBuildSettingsWidget::GenericBuildSettingsWidget(GenericTarget *target) - : m_target(target), m_toolChainChooser(0), m_buildConfiguration(0) -{ - QFormLayout *fl = new QFormLayout(this); - fl->setContentsMargins(0, -1, 0, -1); - fl->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow); - - // build directory - m_pathChooser = new Utils::PathChooser(this); - m_pathChooser->setEnabled(true); - m_pathChooser->setBaseDirectory(m_target->genericProject()->projectDirectory()); - fl->addRow(tr("Build directory:"), m_pathChooser); - connect(m_pathChooser, SIGNAL(changed(QString)), this, SLOT(buildDirectoryChanged())); - - // tool chain - m_toolChainChooser = new QComboBox; - m_toolChainChooser->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - updateToolChainList(); - - fl->addRow(tr("Tool chain:"), m_toolChainChooser); - connect(m_toolChainChooser, SIGNAL(activated(int)), this, SLOT(toolChainSelected(int))); - connect(m_target->genericProject(), SIGNAL(toolChainChanged(ProjectExplorer::ToolChain*)), - this, SLOT(toolChainChanged(ProjectExplorer::ToolChain*))); - connect(ProjectExplorer::ToolChainManager::instance(), SIGNAL(toolChainAdded(ProjectExplorer::ToolChain*)), - this, SLOT(updateToolChainList())); - connect(ProjectExplorer::ToolChainManager::instance(), SIGNAL(toolChainRemoved(ProjectExplorer::ToolChain*)), - this, SLOT(updateToolChainList())); -} - -GenericBuildSettingsWidget::~GenericBuildSettingsWidget() -{ } - -QString GenericBuildSettingsWidget::displayName() const -{ return tr("Generic Manager"); } - -void GenericBuildSettingsWidget::init(BuildConfiguration *bc) -{ - m_buildConfiguration = static_cast<GenericBuildConfiguration *>(bc); - m_pathChooser->setPath(m_buildConfiguration->rawBuildDirectory()); -} - -void GenericBuildSettingsWidget::buildDirectoryChanged() -{ - m_buildConfiguration->setBuildDirectory(m_pathChooser->rawPath()); -} - -void GenericBuildSettingsWidget::toolChainSelected(int index) -{ - using namespace ProjectExplorer; - - ToolChain *tc = static_cast<ToolChain *>(m_toolChainChooser->itemData(index).value<void *>()); - m_target->genericProject()->setToolChain(tc); -} - -void GenericBuildSettingsWidget::toolChainChanged(ProjectExplorer::ToolChain *tc) -{ - for (int i = 0; i < m_toolChainChooser->count(); ++i) { - ToolChain * currentTc = static_cast<ToolChain *>(m_toolChainChooser->itemData(i).value<void *>()); - if (currentTc != tc) - continue; - m_toolChainChooser->setCurrentIndex(i); - return; - } -} - -void GenericBuildSettingsWidget::updateToolChainList() +void GenericProject::evaluateBuildSystem() { - m_toolChainChooser->clear(); - - QList<ToolChain *> tcs = ToolChainManager::instance()->toolChains(); - if (!m_target->genericProject()->toolChain()) { - m_toolChainChooser->addItem(tr("<Invalid tool chain>"), qVariantFromValue(static_cast<void *>(0))); - m_toolChainChooser->setCurrentIndex(0); - } - foreach (ToolChain *tc, tcs) { - m_toolChainChooser->addItem(tc->displayName(), qVariantFromValue(static_cast<void *>(tc))); - if (m_target->genericProject()->toolChain() - && m_target->genericProject()->toolChain()->id() == tc->id()) - m_toolChainChooser->setCurrentIndex(m_toolChainChooser->count() - 1); - } + refresh(Everything); + buildSystemEvaluationFinished(true); } //////////////////////////////////////////////////////////////////////////////////// diff --git a/src/plugins/genericprojectmanager/genericproject.h b/src/plugins/genericprojectmanager/genericproject.h index a36f2323c4..17c5791677 100644 --- a/src/plugins/genericprojectmanager/genericproject.h +++ b/src/plugins/genericprojectmanager/genericproject.h @@ -35,13 +35,11 @@ #include "genericprojectmanager.h" #include "genericprojectnodes.h" -#include "generictarget.h" #include <projectexplorer/project.h> #include <projectexplorer/projectnodes.h> #include <projectexplorer/target.h> #include <projectexplorer/toolchain.h> -#include <projectexplorer/buildstep.h> #include <projectexplorer/buildconfiguration.h> #include <coreplugin/idocument.h> @@ -51,13 +49,7 @@ QT_BEGIN_NAMESPACE class QComboBox; QT_END_NAMESPACE -namespace Utils { -class PathChooser; -} - -namespace ProjectExplorer { -class ToolChain; -} +namespace ProjectExplorer { class ToolChain; } namespace GenericProjectManager { namespace Internal { @@ -84,7 +76,6 @@ public: Core::Id id() const; Core::IDocument *document() const; ProjectExplorer::IProjectManager *projectManager() const; - GenericTarget *activeTarget() const; QList<ProjectExplorer::BuildConfigWidget*> subConfigWidgets(); @@ -114,18 +105,12 @@ public: QStringList projectIncludePaths() const; QStringList files() const; QStringList generated() const; - ProjectExplorer::ToolChain *toolChain() const; - void setToolChain(ProjectExplorer::ToolChain *tc); - - QVariantMap toMap() const; - -signals: - void toolChainChanged(ProjectExplorer::ToolChain *); protected: - virtual bool fromMap(const QVariantMap &map); + bool fromMap(const QVariantMap &map); private: + void evaluateBuildSystem(); bool saveRawFileList(const QStringList &rawFileList); void parseProject(RefreshOptions options); QStringList processEntries(const QStringList &paths, @@ -150,7 +135,6 @@ private: QByteArray m_defines; GenericProjectNode *m_rootNode; - ProjectExplorer::ToolChain *m_toolChain; QFuture<void> m_codeModelFuture; }; @@ -182,31 +166,6 @@ private: GenericProject::RefreshOptions m_options; }; -class GenericBuildSettingsWidget : public ProjectExplorer::BuildConfigWidget -{ - Q_OBJECT - -public: - GenericBuildSettingsWidget(GenericTarget *target); - virtual ~GenericBuildSettingsWidget(); - - virtual QString displayName() const; - - virtual void init(ProjectExplorer::BuildConfiguration *bc); - -private Q_SLOTS: - void buildDirectoryChanged(); - void toolChainSelected(int index); - void toolChainChanged(ProjectExplorer::ToolChain *); - void updateToolChainList(); - -private: - GenericTarget *m_target; - Utils::PathChooser *m_pathChooser; - QComboBox *m_toolChainChooser; - GenericBuildConfiguration *m_buildConfiguration; -}; - } // namespace Internal } // namespace GenericProjectManager diff --git a/src/plugins/genericprojectmanager/genericprojectmanager.pro b/src/plugins/genericprojectmanager/genericprojectmanager.pro index 5c57d8a4d0..02c60f9540 100644 --- a/src/plugins/genericprojectmanager/genericprojectmanager.pro +++ b/src/plugins/genericprojectmanager/genericprojectmanager.pro @@ -4,7 +4,6 @@ include(../../qtcreatorplugin.pri) include(genericprojectmanager_dependencies.pri) HEADERS = genericproject.h \ genericprojectplugin.h \ - generictarget.h \ genericprojectmanager.h \ genericprojectconstants.h \ genericprojectnodes.h \ @@ -17,7 +16,6 @@ HEADERS = genericproject.h \ filesselectionwizardpage.h SOURCES = genericproject.cpp \ genericprojectplugin.cpp \ - generictarget.cpp \ genericprojectmanager.cpp \ genericprojectnodes.cpp \ genericprojectwizard.cpp \ diff --git a/src/plugins/genericprojectmanager/genericprojectmanager.qbs b/src/plugins/genericprojectmanager/genericprojectmanager.qbs index e4070e88e6..9b47c6767b 100644 --- a/src/plugins/genericprojectmanager/genericprojectmanager.qbs +++ b/src/plugins/genericprojectmanager/genericprojectmanager.qbs @@ -25,7 +25,6 @@ QtcPlugin { files: [ "genericproject.h", "genericprojectplugin.h", - "generictarget.h", "genericprojectmanager.h", "genericprojectconstants.h", "genericprojectnodes.h", @@ -38,7 +37,6 @@ QtcPlugin { "filesselectionwizardpage.h", "genericproject.cpp", "genericprojectplugin.cpp", - "generictarget.cpp", "genericprojectmanager.cpp", "genericprojectnodes.cpp", "genericprojectwizard.cpp", diff --git a/src/plugins/genericprojectmanager/genericprojectplugin.cpp b/src/plugins/genericprojectmanager/genericprojectplugin.cpp index da87b4e91f..bf49f107a9 100644 --- a/src/plugins/genericprojectmanager/genericprojectplugin.cpp +++ b/src/plugins/genericprojectmanager/genericprojectplugin.cpp @@ -31,12 +31,13 @@ **************************************************************************/ #include "genericprojectplugin.h" + +#include "genericbuildconfiguration.h" #include "genericprojectmanager.h" #include "genericprojectwizard.h" #include "genericprojectconstants.h" #include "genericprojectfileseditor.h" #include "genericmakestep.h" -#include "generictarget.h" #include "genericproject.h" #include "selectablefilesmodel.h" @@ -92,7 +93,7 @@ bool GenericProjectPlugin::initialize(const QStringList &, QString *errorMessage addAutoReleasedObject(manager); addAutoReleasedObject(new GenericMakeStepFactory); addAutoReleasedObject(new GenericProjectWizard); - addAutoReleasedObject(new GenericTargetFactory); + addAutoReleasedObject(new GenericBuildConfigurationFactory); const Core::Context projectContext(Constants::PROJECTCONTEXT); Core::ActionContainer *mproject = diff --git a/src/plugins/genericprojectmanager/generictarget.cpp b/src/plugins/genericprojectmanager/generictarget.cpp deleted file mode 100644 index 8255a8b5b3..0000000000 --- a/src/plugins/genericprojectmanager/generictarget.cpp +++ /dev/null @@ -1,176 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. -** -**************************************************************************/ - -#include "generictarget.h" - -#include "genericbuildconfiguration.h" -#include "genericproject.h" -#include "genericmakestep.h" - -#include <projectexplorer/buildsteplist.h> -#include <projectexplorer/deployconfiguration.h> -#include <projectexplorer/projectexplorerconstants.h> -#include <qtsupport/customexecutablerunconfiguration.h> - -#include <QApplication> -#include <QStyle> - -const char GENERIC_DESKTOP_TARGET_DISPLAY_NAME[] = "Desktop"; - -using namespace GenericProjectManager; -using namespace GenericProjectManager::Internal; - -//////////////////////////////////////////////////////////////////////////////////// -// GenericTarget -//////////////////////////////////////////////////////////////////////////////////// - -GenericTarget::GenericTarget(GenericProject *parent) : - ProjectExplorer::Target(parent, Core::Id(GENERIC_DESKTOP_TARGET_ID)), - m_buildConfigurationFactory(new GenericBuildConfigurationFactory(this)) -{ - setDefaultDisplayName(QApplication::translate("GenericProjectManager::GenericTarget", - GENERIC_DESKTOP_TARGET_DISPLAY_NAME)); - setIcon(qApp->style()->standardIcon(QStyle::SP_ComputerIcon)); -} - -ProjectExplorer::BuildConfigWidget *GenericTarget::createConfigWidget() -{ - return new GenericBuildSettingsWidget(this); -} - -GenericProject *GenericTarget::genericProject() const -{ - return static_cast<GenericProject *>(project()); -} - -GenericBuildConfigurationFactory *GenericTarget::buildConfigurationFactory() const -{ - return m_buildConfigurationFactory; -} - -GenericBuildConfiguration *GenericTarget::activeBuildConfiguration() const -{ - return static_cast<GenericBuildConfiguration *>(Target::activeBuildConfiguration()); -} - -bool GenericTarget::fromMap(const QVariantMap &map) -{ - return Target::fromMap(map); -} - -//////////////////////////////////////////////////////////////////////////////////// -// GenericTargetFactory -//////////////////////////////////////////////////////////////////////////////////// - -GenericTargetFactory::GenericTargetFactory(QObject *parent) : - ITargetFactory(parent) -{ -} - -bool GenericTargetFactory::supportsTargetId(const Core::Id id) const -{ - return id == Core::Id(GENERIC_DESKTOP_TARGET_ID); -} - -QList<Core::Id> GenericTargetFactory::supportedTargetIds() const -{ - return QList<Core::Id>() << Core::Id(GENERIC_DESKTOP_TARGET_ID); -} - -QString GenericTargetFactory::displayNameForId(const Core::Id id) const -{ - if (id == Core::Id(GENERIC_DESKTOP_TARGET_ID)) - return QCoreApplication::translate("GenericProjectManager::GenericTarget", - GENERIC_DESKTOP_TARGET_DISPLAY_NAME, - "Generic desktop target display name"); - return QString(); -} - -bool GenericTargetFactory::canCreate(ProjectExplorer::Project *parent, const Core::Id id) const -{ - if (!qobject_cast<GenericProject *>(parent)) - return false; - return id == Core::Id(GENERIC_DESKTOP_TARGET_ID); -} - -GenericTarget *GenericTargetFactory::create(ProjectExplorer::Project *parent, const Core::Id id) -{ - if (!canCreate(parent, id)) - return 0; - GenericProject *genericproject = static_cast<GenericProject *>(parent); - GenericTarget *t = new GenericTarget(genericproject); - - // Set up BuildConfiguration: - GenericBuildConfiguration *bc = new GenericBuildConfiguration(t); - bc->setDisplayName(QLatin1String("all")); - - ProjectExplorer::BuildStepList *buildSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); - ProjectExplorer::BuildStepList *cleanSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN); - - GenericMakeStep *makeStep = new GenericMakeStep(buildSteps); - buildSteps->insertStep(0, makeStep); - makeStep->setBuildTarget(QLatin1String("all"), /* on = */ true); - - GenericMakeStep *cleanMakeStep = new GenericMakeStep(cleanSteps); - cleanSteps->insertStep(0, cleanMakeStep); - cleanMakeStep->setBuildTarget(QLatin1String("clean"), /* on = */ true); - cleanMakeStep->setClean(true); - - bc->setBuildDirectory(genericproject->projectDirectory()); - - t->addBuildConfiguration(bc); - - t->addDeployConfiguration(t->createDeployConfiguration(ProjectExplorer::Constants::DEFAULT_DEPLOYCONFIGURATION_ID)); - - // Add a runconfiguration. The CustomExecutableRC one will query the user - // for its settings, so it is a good choice here. - t->addRunConfiguration(new QtSupport::CustomExecutableRunConfiguration(t)); - - return t; -} - -bool GenericTargetFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const -{ - return canCreate(parent, ProjectExplorer::idFromMap(map)); -} - -GenericTarget *GenericTargetFactory::restore(ProjectExplorer::Project *parent, const QVariantMap &map) -{ - if (!canRestore(parent, map)) - return 0; - GenericProject *genericproject = static_cast<GenericProject *>(parent); - GenericTarget *target = new GenericTarget(genericproject); - if (target->fromMap(map)) - return target; - delete target; - return 0; -} diff --git a/src/plugins/genericprojectmanager/generictarget.h b/src/plugins/genericprojectmanager/generictarget.h deleted file mode 100644 index 48eef3e9f5..0000000000 --- a/src/plugins/genericprojectmanager/generictarget.h +++ /dev/null @@ -1,100 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. -** -**************************************************************************/ - -#ifndef GENERICTARGET_H -#define GENERICTARGET_H - -#include <projectexplorer/target.h> - -#include "genericbuildconfiguration.h" - -#include <QStringList> -#include <QVariantMap> - -namespace ProjectExplorer { -class IBuildConfigurationFactory; -} // namespace ProjectExplorer - -namespace GenericProjectManager { -namespace Internal { - -const char GENERIC_DESKTOP_TARGET_ID[] = "GenericProjectManager.GenericTarget"; - -class GenericProject; -class GenericRunConfiguration; - -class GenericTargetFactory; - -class GenericTarget : public ProjectExplorer::Target -{ - Q_OBJECT - friend class GenericTargetFactory; - -public: - explicit GenericTarget(GenericProject *parent); - - ProjectExplorer::BuildConfigWidget *createConfigWidget(); - - GenericProject *genericProject() const; - - GenericBuildConfigurationFactory *buildConfigurationFactory() const; - GenericBuildConfiguration *activeBuildConfiguration() const; - -protected: - bool fromMap(const QVariantMap &map); - -private: - GenericBuildConfigurationFactory *m_buildConfigurationFactory; -}; - -class GenericTargetFactory : public ProjectExplorer::ITargetFactory -{ - Q_OBJECT - -public: - explicit GenericTargetFactory(QObject *parent = 0); - - bool supportsTargetId(const Core::Id id) const; - - QList<Core::Id> supportedTargetIds() const; - QString displayNameForId(const Core::Id id) const; - - bool canCreate(ProjectExplorer::Project *parent, const Core::Id id) const; - GenericTarget *create(ProjectExplorer::Project *parent, const Core::Id id); - bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const; - GenericTarget *restore(ProjectExplorer::Project *parent, const QVariantMap &map); -}; - -} // namespace Internal -} // namespace GenericProjectManager - -#endif // GENERICTARGET_H diff --git a/src/plugins/madde/debianmanager.cpp b/src/plugins/madde/debianmanager.cpp new file mode 100644 index 0000000000..944372fcdf --- /dev/null +++ b/src/plugins/madde/debianmanager.cpp @@ -0,0 +1,728 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. +** +**************************************************************************/ + +#include "debianmanager.h" + +#include "maddedevice.h" +#include "maemoconstants.h" +#include "maemoglobal.h" +#include "maemopackagecreationstep.h" + +#include <coreplugin/documentmanager.h> +#include <projectexplorer/project.h> +#include <projectexplorer/target.h> +#include <qt4projectmanager/qt4buildconfiguration.h> +#include <qtsupport/qtprofileinformation.h> +#include <utils/filesystemwatcher.h> +#include <utils/qtcassert.h> + +#include <QBuffer> +#include <QByteArray> +#include <QDateTime> +#include <QDir> +#include <QProcess> + +#include <QMessageBox> + +// ----------------------------------------------------------------------- +// Helpers: +// ----------------------------------------------------------------------- + +namespace { + +const QByteArray IconFieldName("XB-Maemo-Icon-26"); +const QByteArray NameFieldName("Package"); +const QByteArray ShortDescriptionFieldName("Description"); + +const QLatin1String PackagingDirName("qtc_packaging"); + +// The QDateTime API can only deliver these in localized form... +QString shortMonthName(const QDateTime &dt) +{ + switch (dt.date().month()) { + case 1: return QLatin1String("Jan"); + case 2: return QLatin1String("Feb"); + case 3: return QLatin1String("Mar"); + case 4: return QLatin1String("Apr"); + case 5: return QLatin1String("May"); + case 6: return QLatin1String("Jun"); + case 7: return QLatin1String("Jul"); + case 8: return QLatin1String("Aug"); + case 9: return QLatin1String("Sep"); + case 10: return QLatin1String("Oct"); + case 11: return QLatin1String("Nov"); + case 12: return QLatin1String("Dec"); + default: QTC_ASSERT(false, return QString()); + } +} + +QString shortDayOfWeekName(const QDateTime &dt) +{ + switch (dt.date().dayOfWeek()) { + case Qt::Monday: return QLatin1String("Mon"); + case Qt::Tuesday: return QLatin1String("Tue"); + case Qt::Wednesday: return QLatin1String("Wed"); + case Qt::Thursday: return QLatin1String("Thu"); + case Qt::Friday: return QLatin1String("Fri"); + case Qt::Saturday: return QLatin1String("Sat"); + case Qt::Sunday: return QLatin1String("Sun"); + default: QTC_ASSERT(false, return QString()); + } +} + +QByteArray packageManagerNameFieldName(Core::Id deviceType) +{ + if (deviceType == Core::Id(Madde::Internal::Maemo5OsType)) + return QByteArray("XB-Maemo-Display-Name"); + return QByteArray("XSBC-Maemo-Display-Name"); +} + +QList<QPair<QByteArray, QByteArray> > additionalFields(Core::Id deviceType, const QString &projectName) +{ + QList<QPair<QByteArray, QByteArray> > fields; + if (deviceType == Core::Id(Madde::Internal::HarmattanOsType)) + fields << qMakePair(QByteArray("XB-Maemo-Flags"), QByteArray("visible")) + << qMakePair(QByteArray("XB-MeeGo-Desktop-Entry-Filename"), + QString::fromLatin1("%1_harmattan").arg(projectName).toUtf8()) + << qMakePair(QByteArray("XB-MeeGo-Desktop-Entry"), + QString::fromLatin1("\n [Desktop Entry]\n Type=Application\n Name=%1\n Icon=/usr/share/icons/hicolor/80x80/apps/%1%2.png") + .arg(projectName).arg(80).toUtf8()); + return fields; +} + +QByteArray section(Core::Id deviceType) { + if (deviceType == Core::Id(Madde::Internal::Maemo5OsType)) + return "user/hidden"; + else if (deviceType == Core::Id(Madde::Internal::HarmattanOsType)) + return "user/other"; + return QByteArray(); +} + +void raiseError(const QString &reason) +{ + QMessageBox::critical(0, QCoreApplication::translate("Madde::DebianManager", + "Error creating debian project templates"), reason); +} + +QString defaultPackageFileName(ProjectExplorer::Project *project) +{ + QString packageName = project->displayName().toLower(); + + // We also replace dots later, because OVI store chokes on them (for the N900). + QRegExp illegalLetter(QLatin1String("[^a-z0-9+-]"), Qt::CaseSensitive, QRegExp::WildcardUnix); + + return packageName.replace(illegalLetter, QLatin1String("-")); +} + +bool adaptTagValue(QByteArray &document, const QByteArray &fieldName, + const QByteArray &newFieldValue, bool caseSensitive) +{ + QByteArray adaptedLine = fieldName + ": " + newFieldValue; + const QByteArray completeTag = fieldName + ':'; + const int lineOffset = caseSensitive ? document.indexOf(completeTag) + : document.toLower().indexOf(completeTag.toLower()); + if (lineOffset == -1) { + document.append(adaptedLine).append('\n'); + return true; + } + + int newlineOffset = document.indexOf('\n', lineOffset); + bool updated = false; + if (newlineOffset == -1) { + newlineOffset = document.length(); + adaptedLine += '\n'; + updated = true; + } + const int replaceCount = newlineOffset - lineOffset; + if (!updated && document.mid(lineOffset, replaceCount) != adaptedLine) + updated = true; + if (updated) + document.replace(lineOffset, replaceCount, adaptedLine); + return updated; +} + +QByteArray controlFileFieldValue(const Utils::FileName &control, const QString &key, bool multiLine) +{ + QByteArray value; + Utils::FileReader reader; + if (!reader.fetch(control.toString())) + return value; + const QByteArray &contents = reader.data(); + const int keyPos = contents.indexOf(key.toUtf8() + ':'); + if (keyPos == -1) + return value; + int valueStartPos = keyPos + key.length() + 1; + int valueEndPos = contents.indexOf('\n', keyPos); + if (valueEndPos == -1) + valueEndPos = contents.count(); + value = contents.mid(valueStartPos, valueEndPos - valueStartPos).trimmed(); + if (multiLine) { + Q_FOREVER { + valueStartPos = valueEndPos + 1; + if (valueStartPos >= contents.count()) + break; + const char firstChar = contents.at(valueStartPos); + if (firstChar == '#' || isspace(firstChar)) { + valueEndPos = contents.indexOf('\n', valueStartPos); + if (valueEndPos == -1) + valueEndPos = contents.count(); + if (firstChar != '#') { + value += contents.mid(valueStartPos, + valueEndPos - valueStartPos).trimmed(); + } + } else { + break; + } + } + } + return value; +} + +bool setControlFieldValue(const Utils::FileName &control, const QByteArray &fieldName, + const QByteArray &fieldValue) +{ + Utils::FileReader reader; + if (!reader.fetch(control.toString())) + return false; + QByteArray contents = reader.data(); + if (!adaptTagValue(contents, fieldName, fieldValue, true)) + return false; + Core::FileChangeBlocker update(control.toString()); + Utils::FileSaver saver(control.toString()); + saver.write(contents); + return saver.finalize(); +} + +bool adaptRulesFile(const Utils::FileName &rulesPath) +{ + Utils::FileReader reader; + if (!reader.fetch(rulesPath.toString())) { + raiseError(reader.errorString()); + return false; + } + QByteArray rulesContents = reader.data(); + const QByteArray comment("# Uncomment this line for use without Qt Creator"); + rulesContents.replace("DESTDIR", "INSTALL_ROOT"); + rulesContents.replace("dh_shlibdeps", "# dh_shlibdeps " + comment); + rulesContents.replace("# Add here commands to configure the package.", + "# qmake PREFIX=/usr" + comment); + rulesContents.replace("$(MAKE)\n", "# $(MAKE) " + comment + '\n'); + + // Would be the right solution, but does not work (on Windows), + // because dpkg-genchanges doesn't know about it (and can't be told). + // rulesContents.replace("dh_builddeb", "dh_builddeb --destdir=."); + + Utils::FileSaver saver(rulesPath.toString()); + saver.write(rulesContents); + if (!saver.finalize()) { + raiseError(saver.errorString()); + return false; + } + return true; +} + +bool adaptControlFile(const Utils::FileName &controlPath, Qt4ProjectManager::Qt4BuildConfiguration *bc, + const QByteArray §ion, const QByteArray &packageManagerNameField, + QList<QPair<QByteArray, QByteArray> > additionalFields) +{ + Utils::FileReader reader; + if (!reader.fetch(controlPath.toString())) { + raiseError(reader.errorString()); + return false; + } + QByteArray controlContents = reader.data(); + + adaptTagValue(controlContents, "Section", section, true); + adaptTagValue(controlContents, "Priority", "optional", true); + adaptTagValue(controlContents, packageManagerNameField, + bc->target()->project()->displayName().toUtf8(), true); + const int buildDependsOffset = controlContents.indexOf("Build-Depends:"); + if (buildDependsOffset == -1) { + qDebug("Unexpected: no Build-Depends field in debian control file."); + } else { + int buildDependsNewlineOffset + = controlContents.indexOf('\n', buildDependsOffset); + if (buildDependsNewlineOffset == -1) { + controlContents += '\n'; + buildDependsNewlineOffset = controlContents.length() - 1; + } + controlContents.insert(buildDependsNewlineOffset, + ", libqt4-dev"); + } + + for (int i = 0; i < additionalFields.count(); ++i) + adaptTagValue(controlContents, additionalFields.at(i).first, additionalFields.at(i).second, true); + + Utils::FileSaver saver(controlPath.toString()); + saver.write(controlContents); + if (!saver.finalize()) { + raiseError(saver.errorString()); + return false; + } + return true; +} + +} // namespace + +namespace Madde { +namespace Internal { + +// ----------------------------------------------------------------------- +// DebianManager: +// ----------------------------------------------------------------------- + +DebianManager *DebianManager::m_instance = 0; + +DebianManager::DebianManager(QObject *parent) : + QObject(parent), + m_watcher(new Utils::FileSystemWatcher(this)) +{ + m_instance = this; + + m_watcher->setObjectName("Madde::DebianManager"); + connect(m_watcher, SIGNAL(directoryChanged(QString)), + this, SLOT(directoryWasChanged(QString))); +} + +DebianManager::~DebianManager() +{ } + +DebianManager *DebianManager::instance() +{ + return m_instance; +} + +void DebianManager::monitor(const Utils::FileName &debianDir) +{ + QFileInfo fi = debianDir.toFileInfo(); + if (!fi.isDir()) + return; + + if (!m_watches.contains(debianDir)) { + m_watches.insert(debianDir, 1); + m_watcher->addDirectory(debianDir.toString(), Utils::FileSystemWatcher::WatchAllChanges); + + WatchableFile *controlFile = new WatchableFile(controlFilePath(debianDir).toString(), this); + connect(controlFile, SIGNAL(modified()), this, SLOT(controlWasChanged())); + WatchableFile *changelogFile = new WatchableFile(changelogFilePath(debianDir).toString(), this); + connect(changelogFile, SIGNAL(modified()), SLOT(changelogWasChanged())); + Core::DocumentManager::addDocuments(QList<Core::IDocument *>() << controlFile << changelogFile); + } +} + +bool DebianManager::isMonitoring(const Utils::FileName &debianDir) +{ + return m_watches.contains(debianDir); +} + +void DebianManager::ignore(const Utils::FileName &debianDir) +{ + int count = m_watches.value(debianDir, 0) - 1; + if (count < 0) + return; + if (count > 0) { + m_watches[debianDir] = 0; + } else { + m_watches.remove(debianDir); + m_watcher->removeDirectory(debianDir.toString()); + } +} + +QString DebianManager::projectVersion(const Utils::FileName &debianDir, QString *error) +{ + Utils::FileName path = changelogFilePath(debianDir); + QFile changelog(path.toString()); + if (!changelog.open(QIODevice::ReadOnly)) { + if (error) + *error = tr("Failed to open debian changelog \"%1\" file for reading.").arg(path.toUserOutput()); + return QString(); + } + + const QByteArray &firstLine = changelog.readLine(); + const int openParenPos = firstLine.indexOf('('); + if (openParenPos == -1) { + if (error) + *error = tr("Debian changelog file '%1' has unexpected format.").arg(path.toUserOutput()); + return QString(); + } + const int closeParenPos = firstLine.indexOf(')', openParenPos); + if (closeParenPos == -1) { + if (error) + *error = tr("Debian changelog file '%1' has unexpected format.").arg(path.toUserOutput()); + return QString(); + } + return QString::fromUtf8(firstLine.mid(openParenPos + 1, closeParenPos - openParenPos - 1).data()); +} + +bool DebianManager::setProjectVersion(const Utils::FileName &debianDir, const QString &version, QString *error) +{ + const Utils::FileName filePath = changelogFilePath(debianDir); + Utils::FileReader reader; + if (!reader.fetch(filePath.toString(), error)) + return false; + QString content = QString::fromUtf8(reader.data()); + if (content.contains(QLatin1Char('(') + version + QLatin1Char(')'))) { + if (error) + *error = tr("Refusing to update changelog file: Already contains version '%1'.").arg(version); + return false; + } + + int maintainerOffset = content.indexOf(QLatin1String("\n -- ")); + const int eolOffset = content.indexOf(QLatin1Char('\n'), maintainerOffset + 1); + if (maintainerOffset == -1 || eolOffset == -1) { + if (error) + *error = tr("Cannot update changelog: Invalid format (no maintainer entry found)."); + return false; + } + + ++maintainerOffset; + const QDateTime currentDateTime = QDateTime::currentDateTime(); + QDateTime utcDateTime = QDateTime(currentDateTime); + utcDateTime.setTimeSpec(Qt::UTC); + int utcOffsetSeconds = currentDateTime.secsTo(utcDateTime); + QChar sign; + if (utcOffsetSeconds < 0) { + utcOffsetSeconds = -utcOffsetSeconds; + sign = QLatin1Char('-'); + } else { + sign = QLatin1Char('+'); + } + const int utcOffsetMinutes = (utcOffsetSeconds / 60) % 60; + const int utcOffsetHours = utcOffsetSeconds / 3600; + const QString dateString = QString::fromLatin1("%1, %2 %3 %4 %5%6%7") + .arg(shortDayOfWeekName(currentDateTime)) + .arg(currentDateTime.toString(QLatin1String("dd"))) + .arg(shortMonthName(currentDateTime)) + .arg(currentDateTime.toString(QLatin1String("yyyy hh:mm:ss"))).arg(sign) + .arg(utcOffsetHours, 2, 10, QLatin1Char('0')) + .arg(utcOffsetMinutes, 2, 10, QLatin1Char('0')); + const QString maintainerLine = content.mid(maintainerOffset, eolOffset - maintainerOffset + 1) + .replace(QRegExp(QLatin1String("> [^\\n]*\n")), + QString::fromLatin1("> %1").arg(dateString)); + QString versionLine = content.left(content.indexOf(QLatin1Char('\n'))) + .replace(QRegExp(QLatin1String("\\([a-zA-Z0-9_\\.]+\\)")), + QLatin1Char('(') + version + QLatin1Char(')')); + const QString newEntry = versionLine + QLatin1String("\n * <Add change description here>\n\n") + + maintainerLine + QLatin1String("\n\n"); + content.prepend(newEntry); + Core::FileChangeBlocker update(filePath.toString()); + Utils::FileSaver saver(filePath.toString()); + saver.write(content.toUtf8()); + return saver.finalize(error); +} + +QString DebianManager::packageName(const Utils::FileName &debianDir) +{ + return QString::fromUtf8(controlFileFieldValue(controlFilePath(debianDir), NameFieldName, false)); +} + +bool DebianManager::setPackageName(const Utils::FileName &debianDir, const QString &newName) +{ + const QString oldPackageName = packageName(debianDir); + + Utils::FileName controlPath = controlFilePath(debianDir); + if (!setControlFieldValue(controlPath, NameFieldName, newName.toUtf8())) + return false; + if (!setControlFieldValue(controlPath, "Source", newName.toUtf8())) + return false; + + Utils::FileName changelogPath = changelogFilePath(debianDir); + Utils::FileReader reader; + if (!reader.fetch(changelogPath.toString())) + return false; + QString changelogContents = QString::fromUtf8(reader.data()); + QRegExp pattern(QLatin1String("[^\\s]+( \\(\\d\\.\\d\\.\\d\\))")); + changelogContents.replace(pattern, newName + QLatin1String("\\1")); + Core::FileChangeBlocker updateChangelog(changelogPath.toString()); + Utils::FileSaver saver(changelogPath.toString()); + saver.write(changelogContents.toUtf8()); + if (!saver.finalize()) + return false; + + Utils::FileName rulesPath = rulesFilePath(debianDir); + if (!reader.fetch(rulesPath.toString())) + return false; + + QByteArray rulesContents = reader.data(); + const QString oldString = QLatin1String("debian/") + oldPackageName; + const QString newString = QLatin1String("debian/") + newName; + rulesContents.replace(oldString.toUtf8(), newString.toUtf8()); + + Core::FileChangeBlocker updateRules(rulesPath.toString()); + Utils::FileSaver rulesSaver(rulesPath.toString()); + rulesSaver.write(rulesContents); + return rulesSaver.finalize(); +} + +QString DebianManager::shortDescription(const Utils::FileName &debianDir) +{ + return QString::fromUtf8(controlFileFieldValue(controlFilePath(debianDir), ShortDescriptionFieldName, false)); +} + +bool DebianManager::setShortDescription(const Utils::FileName &debianDir, const QString &description) +{ + return setControlFieldValue(controlFilePath(debianDir), ShortDescriptionFieldName, description.toUtf8()); +} + +QString DebianManager::packageManagerName(const Utils::FileName &debianDir, Core::Id deviceType) +{ + return QString::fromUtf8(controlFileFieldValue(controlFilePath(debianDir), + packageManagerNameFieldName(deviceType), false)); +} + +bool DebianManager::setPackageManagerName(const Utils::FileName &debianDir, Core::Id deviceType, const QString &name) +{ + return setControlFieldValue(controlFilePath(debianDir), packageManagerNameFieldName(deviceType), + name.toUtf8()); +} + +QIcon DebianManager::packageManagerIcon(const Utils::FileName &debianDir, QString *error) +{ + const QByteArray &base64Icon = controlFileFieldValue(debianDir, IconFieldName, true); + if (base64Icon.isEmpty()) + return QIcon(); + QPixmap pixmap; + if (!pixmap.loadFromData(QByteArray::fromBase64(base64Icon))) { + if (error) + *error = tr("Invalid icon data in Debian control file."); + return QIcon(); + } + return QIcon(pixmap); +} + +bool DebianManager::setPackageManagerIcon(const Utils::FileName &debianDir, Core::Id deviceType, + const Utils::FileName &iconPath, QString *error) +{ + const Utils::FileName filePath = controlFilePath(debianDir); + Utils::FileReader reader; + if (!reader.fetch(filePath.toString(), error)) + return false; + const QPixmap pixmap(iconPath.toString()); + if (pixmap.isNull()) { + if (error) + *error = tr("Could not read image file '%1'.").arg(iconPath.toUserOutput()); + return false; + } + + QByteArray iconAsBase64; + QBuffer buffer(&iconAsBase64); + buffer.open(QIODevice::WriteOnly); + if (!pixmap.scaled(MaddeDevice::packageManagerIconSize(deviceType)) + .save(&buffer, iconPath.toFileInfo().suffix().toAscii())) { + if (error) + *error = tr("Could not export image file '%1'.").arg(iconPath.toUserOutput()); + return false; + } + buffer.close(); + iconAsBase64 = iconAsBase64.toBase64(); + QByteArray contents = reader.data(); + const QByteArray iconFieldNameWithColon = IconFieldName + ':'; + const int iconFieldPos = contents.startsWith(iconFieldNameWithColon) + ? 0 : contents.indexOf('\n' + iconFieldNameWithColon); + if (iconFieldPos == -1) { + if (!contents.endsWith('\n')) + contents += '\n'; + contents.append(iconFieldNameWithColon).append(' ').append(iconAsBase64) + .append('\n'); + } else { + const int oldIconStartPos = (iconFieldPos != 0) + iconFieldPos + + iconFieldNameWithColon.length(); + int nextEolPos = contents.indexOf('\n', oldIconStartPos); + while (nextEolPos != -1 && nextEolPos != contents.length() - 1 + && contents.at(nextEolPos + 1) != '\n' + && (contents.at(nextEolPos + 1) == '#' + || std::isspace(contents.at(nextEolPos + 1)))) + nextEolPos = contents.indexOf('\n', nextEolPos + 1); + if (nextEolPos == -1) + nextEolPos = contents.length(); + contents.replace(oldIconStartPos, nextEolPos - oldIconStartPos, + ' ' + iconAsBase64); + } + Core::FileChangeBlocker update(filePath.toString()); + Utils::FileSaver saver(filePath.toString()); + saver.write(contents); + return saver.finalize(error); +} + +bool DebianManager::hasPackageManagerIcon(const Utils::FileName &debianDir) +{ + return !packageManagerIcon(debianDir).isNull(); +} + +Utils::FileName DebianManager::packageFileName(const Utils::FileName &debianDir) +{ + return Utils::FileName::fromString(packageName(debianDir) + + QLatin1Char('_') + projectVersion(debianDir) + + QLatin1String("_armel.deb")); +} + +DebianManager::ActionStatus DebianManager::createTemplate(Qt4ProjectManager::Qt4BuildConfiguration *bc, + const Utils::FileName &debianDir) +{ + if (debianDir.toFileInfo().exists()) + return NoActionRequired; + + Utils::FileName location = debianDir.parentDir(); + if (!location.toFileInfo().isDir()) { + if (!QDir::home().mkpath(location.toString())) { + raiseError(tr("Failed to create directory \"%1\".") + .arg(location.toUserOutput())); + return ActionFailed; + } + } + + QProcess dh_makeProc; + QString error; + AbstractMaemoPackageCreationStep::preparePackagingProcess(&dh_makeProc, bc, location.toString()); + const QString packageName = defaultPackageFileName(bc->target()->project()); + + const QStringList dh_makeArgs = + QStringList() << QLatin1String("dh_make") + << QLatin1String("-s") << QLatin1String("-n") << QLatin1String("-p") + << (packageName + QLatin1Char('_') + + AbstractMaemoPackageCreationStep::DefaultVersionNumber); + + QtSupport::BaseQtVersion *lqt = QtSupport::QtProfileInformation::qtVersion(bc->target()->profile()); + if (!lqt) { + raiseError(tr("Unable to create Debian templates: No Qt version set.")); + return ActionFailed; + } + + if (!MaemoGlobal::callMad(dh_makeProc, dh_makeArgs, lqt->qmakeCommand().toString(), true) + || !dh_makeProc.waitForStarted()) { + raiseError(tr("Unable to create Debian templates: dh_make failed (%1).") + .arg(dh_makeProc.errorString())); + return ActionFailed; + } + + dh_makeProc.write("\n"); // Needs user input. + dh_makeProc.waitForFinished(-1); + if (dh_makeProc.error() != QProcess::UnknownError + || dh_makeProc.exitCode() != 0) { + raiseError(tr("Unable to create debian templates: dh_make failed (%1).") + .arg(dh_makeProc.errorString())); + return ActionFailed; + } + + if (!QFile::rename(location.appendPath(QLatin1String("debian")).toString(), debianDir.toString())) { + raiseError(tr("Unable to move new debian directory to '%1'.").arg(debianDir.toUserOutput())); + Utils::FileUtils::removeRecursively(location.toString(), &error); + return ActionFailed; + } + + QDir debian(debianDir.toString()); + const QStringList &files = debian.entryList(QDir::Files); + foreach (const QString &fileName, files) { + if (fileName.endsWith(QLatin1String(".ex"), Qt::CaseInsensitive) + || fileName.compare(QLatin1String("README.debian"), Qt::CaseInsensitive) == 0 + || fileName.compare(QLatin1String("dirs"), Qt::CaseInsensitive) == 0 + || fileName.compare(QLatin1String("docs"), Qt::CaseInsensitive) == 0) { + debian.remove(fileName); + } + } + + setPackageName(debianDir, packageName); + + Core::Id deviceType = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(bc->target()->profile()); + + const QByteArray sec = section(deviceType); + const QByteArray nameField = packageManagerNameFieldName(deviceType); + QList<QPair<QByteArray, QByteArray> > fields + = additionalFields(deviceType, bc->target()->project()->displayName()); + + return adaptRulesFile(rulesFilePath(debianDir)) + && adaptControlFile(controlFilePath(debianDir), bc, sec, nameField, fields) + ? ActionSuccessful : ActionFailed; +} + +QStringList DebianManager::debianFiles(const Utils::FileName &debianDir) +{ + return QDir(debianDir.toString()).entryList(QDir::Files, QDir::Name | QDir::IgnoreCase); +} + +Utils::FileName DebianManager::debianDirectory(ProjectExplorer::Target *target) +{ + Utils::FileName path = Utils::FileName::fromString(target->project()->projectDirectory()); + path.appendPath(PackagingDirName); + Core::Id deviceType = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(target->profile()); + if (deviceType == Core::Id(HarmattanOsType)) + path.appendPath(QLatin1String("debian_harmattan")); + else if (deviceType == Core::Id(Maemo5OsType)) + path.appendPath(QLatin1String("debian_fremantle")); + else + path.clear(); + return path; +} + +void DebianManager::directoryWasChanged(const QString &path) +{ + Utils::FileName fn = Utils::FileName::fromString(path); + QTC_ASSERT(m_watches.contains(fn), return); + emit debianDirectoryChanged(fn); +} + +void DebianManager::controlWasChanged() +{ + WatchableFile *file = qobject_cast<WatchableFile *>(sender()); + if (!file) + return; + emit controlChanged(Utils::FileName::fromString(file->fileName())); +} + +void DebianManager::changelogWasChanged() +{ + WatchableFile *file = qobject_cast<WatchableFile *>(sender()); + if (!file) + return; + emit changelogChanged(Utils::FileName::fromString(file->fileName())); +} + +Utils::FileName DebianManager::changelogFilePath(const Utils::FileName &debianDir) +{ + Utils::FileName result = debianDir; + return result.appendPath("changelog"); +} + +Utils::FileName DebianManager::controlFilePath(const Utils::FileName &debianDir) +{ + Utils::FileName result = debianDir; + return result.appendPath("control"); +} + +Utils::FileName DebianManager::rulesFilePath(const Utils::FileName &debianDir) +{ + Utils::FileName result = debianDir; + return result.appendPath("rules"); +} + +} // namespace Internal +} // namespace Madde diff --git a/src/plugins/madde/debianmanager.h b/src/plugins/madde/debianmanager.h new file mode 100644 index 0000000000..e84f62626a --- /dev/null +++ b/src/plugins/madde/debianmanager.h @@ -0,0 +1,114 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. +** +**************************************************************************/ + +#ifndef DEBIANMANAGER_H +#define DEBIANMANAGER_H + +#include <coreplugin/id.h> +#include <utils/fileutils.h> + +#include <QObject> +#include <QHash> + +namespace Utils { class FileSystemWatcher; } +namespace ProjectExplorer { class Target; } +namespace Qt4ProjectManager { class Qt4BuildConfiguration; } + +namespace Madde { +namespace Internal { +class MaddePlugin; + +class DebianManager : public QObject +{ + Q_OBJECT +public: + ~DebianManager(); + + static DebianManager *instance(); + + // ref counted: + void monitor(const Utils::FileName &debianDir); + bool isMonitoring(const Utils::FileName &debianDir); + void ignore(const Utils::FileName &debianDir); + + static QString projectVersion(const Utils::FileName &debianDir, QString *error = 0); + static bool setProjectVersion(const Utils::FileName &debianDir, const QString &version, QString *error = 0); + static QString packageName(const Utils::FileName &debianDir); + static bool setPackageName(const Utils::FileName &debianDir, const QString &packageName); + static QString shortDescription(const Utils::FileName &debianDir); + static bool setShortDescription(const Utils::FileName &debianDir, const QString &description); + static QString packageManagerName(const Utils::FileName &debianDir, Core::Id deviceType); + static bool setPackageManagerName(const Utils::FileName &debianDir, Core::Id deviceType, const QString &name); + static QIcon packageManagerIcon(const Utils::FileName &debianDir, QString *error = 0); + static bool setPackageManagerIcon(const Utils::FileName &debianDir, Core::Id deviceType, + const Utils::FileName &iconPath, QString *error = 0); + static bool hasPackageManagerIcon(const Utils::FileName &debianDir); + + static Utils::FileName packageFileName(const Utils::FileName &debianDir); + + enum ActionStatus { NoActionRequired, ActionSuccessful, ActionFailed }; + // will not start to monitor this new dir! + static ActionStatus createTemplate(Qt4ProjectManager::Qt4BuildConfiguration *bc, + const Utils::FileName &debianDir); + + static QStringList debianFiles(const Utils::FileName &debianDir); + + static Utils::FileName debianDirectory(ProjectExplorer::Target *target); + +signals: + void debianDirectoryChanged(const Utils::FileName &dir); + void changelogChanged(const Utils::FileName &dir); + void controlChanged(const Utils::FileName &dir); + +private slots: + void directoryWasChanged(const QString &path); + void controlWasChanged(); + void changelogWasChanged(); + +private: + explicit DebianManager(QObject *parent = 0); + + static Utils::FileName changelogFilePath(const Utils::FileName &debianDir); + static Utils::FileName controlFilePath(const Utils::FileName &debianDir); + static Utils::FileName rulesFilePath(const Utils::FileName &debianDir); + + Utils::FileSystemWatcher *m_watcher; + QHash<Utils::FileName, int> m_watches; + static DebianManager *m_instance; + + friend class MaddePlugin; +}; + +} // namespace Internal +} // namespace Madde + +#endif // DEBIANMANAGER_H diff --git a/src/plugins/madde/madde.pro b/src/plugins/madde/madde.pro index 7e1d9cd8b5..f545b98ac9 100644 --- a/src/plugins/madde/madde.pro +++ b/src/plugins/madde/madde.pro @@ -8,12 +8,12 @@ include(madde_dependencies.pri) HEADERS += \ madde_exports.h \ maddeplugin.h \ + debianmanager.h \ maemoconstants.h \ maemorunconfigurationwidget.h \ maemoruncontrol.h \ maemorunfactories.h \ maemosettingspages.h \ - maemotoolchain.h \ maemopackagecreationstep.h \ maemopackagecreationfactory.h \ maemopackagecreationwidget.h \ @@ -37,8 +37,6 @@ HEADERS += \ maemoqemuruntimeparser.h \ maemoqemusettingswidget.h \ maemoqemusettings.h \ - qt4maemotargetfactory.h \ - qt4maemotarget.h \ qt4maemodeployconfiguration.h \ maemodeviceconfigwizard.h \ maemodeployconfigurationwidget.h \ @@ -53,15 +51,16 @@ HEADERS += \ maemodeploybymountsteps.h \ maddedevicetester.h \ maddedeviceconfigurationfactory.h \ - maddedevice.h + maddedevice.h \ + rpmmanager.h SOURCES += \ maddeplugin.cpp \ + debianmanager.cpp \ maemorunconfigurationwidget.cpp \ maemoruncontrol.cpp \ maemorunfactories.cpp \ maemosettingspages.cpp \ - maemotoolchain.cpp \ maemopackagecreationstep.cpp \ maemopackagecreationfactory.cpp \ maemopackagecreationwidget.cpp \ @@ -84,8 +83,6 @@ SOURCES += \ maemoqemuruntimeparser.cpp \ maemoqemusettingswidget.cpp \ maemoqemusettings.cpp \ - qt4maemotargetfactory.cpp \ - qt4maemotarget.cpp \ qt4maemodeployconfiguration.cpp \ maemodeviceconfigwizard.cpp \ maemodeployconfigurationwidget.cpp \ @@ -100,7 +97,8 @@ SOURCES += \ maemodeploybymountsteps.cpp \ maddedevicetester.cpp \ maemorunconfiguration.cpp \ - maddedevice.cpp + maddedevice.cpp \ + rpmmanager.cpp FORMS += \ maemopackagecreationwidget.ui \ diff --git a/src/plugins/madde/madde.qbs b/src/plugins/madde/madde.qbs index 6d69c3e7de..4bf5ad8c0d 100644 --- a/src/plugins/madde/madde.qbs +++ b/src/plugins/madde/madde.qbs @@ -116,17 +116,14 @@ QtcPlugin { "maemosettingspages.h", "maemosshrunner.cpp", "maemosshrunner.h", - "maemotoolchain.cpp", - "maemotoolchain.h", "qt-maemo.qrc", "qt4maemodeployconfiguration.cpp", "qt4maemodeployconfiguration.h", - "qt4maemotarget.cpp", - "qt4maemotarget.h", - "qt4maemotargetfactory.cpp", - "qt4maemotargetfactory.h", "maddedevice.cpp", - "maddedevice.h" + "maddedevice.h", + "debianmanager.h", + "debianmanager.cpp", + "rpmmanager.h", + "rpmmanager.cpp" ] } - diff --git a/src/plugins/madde/maddedevice.cpp b/src/plugins/madde/maddedevice.cpp index 3bc04cf924..80e4a07468 100644 --- a/src/plugins/madde/maddedevice.cpp +++ b/src/plugins/madde/maddedevice.cpp @@ -129,5 +129,34 @@ QString MaddeDevice::maddeDisplayType(Core::Id type) return tr("Other MeeGo OS"); } +bool MaddeDevice::allowsRemoteMounts(Core::Id type) +{ + return type == Core::Id(Maemo5OsType); +} + +bool MaddeDevice::allowsPackagingDisabling(Core::Id type) +{ + return type == Core::Id(Maemo5OsType); +} + +bool MaddeDevice::allowsQmlDebugging(Core::Id type) +{ + return type == Core::Id(HarmattanOsType); +} + +bool MaddeDevice::isDebianBased(Core::Id type) +{ + return type != Core::Id(MeeGoOsType); +} + +QSize MaddeDevice::packageManagerIconSize(Core::Id type) +{ + if (type == Core::Id(Maemo5OsType)) + return QSize(48, 48); + if (type == Core::Id(HarmattanOsType)) + return QSize(64, 64); + return QSize(); +} + } // namespace Internal } // namespace Madde diff --git a/src/plugins/madde/maddedevice.h b/src/plugins/madde/maddedevice.h index c508cc641d..eb8a418a49 100644 --- a/src/plugins/madde/maddedevice.h +++ b/src/plugins/madde/maddedevice.h @@ -57,6 +57,13 @@ public: ProjectExplorer::IDevice::Ptr clone() const; static QString maddeDisplayType(Core::Id type); + static bool allowsRemoteMounts(Core::Id type); + static bool allowsPackagingDisabling(Core::Id type); + static bool allowsQmlDebugging(Core::Id type); + + static bool isDebianBased(Core::Id type); + static QSize packageManagerIconSize(Core::Id type); + private: MaddeDevice(); MaddeDevice(const QString &name, Core::Id type, MachineType machineType, diff --git a/src/plugins/madde/maddeplugin.cpp b/src/plugins/madde/maddeplugin.cpp index 6e5713486e..e1505f6f4e 100644 --- a/src/plugins/madde/maddeplugin.cpp +++ b/src/plugins/madde/maddeplugin.cpp @@ -32,6 +32,7 @@ #include "maddeplugin.h" +#include "debianmanager.h" #include "maddedeviceconfigurationfactory.h" #include "maemoconstants.h" #include "maemodeploystepfactory.h" @@ -40,10 +41,9 @@ #include "maemoqemumanager.h" #include "maemorunfactories.h" #include "maemosettingspages.h" -#include "maemotoolchain.h" #include "qt4maemodeployconfiguration.h" +#include "rpmmanager.h" #include "maemoqtversionfactory.h" -#include "qt4maemotargetfactory.h" #include <QtPlugin> @@ -67,16 +67,17 @@ bool MaddePlugin::initialize(const QStringList &arguments, QString *error_messag addAutoReleasedObject(new MaemoRunControlFactory); addAutoReleasedObject(new MaemoRunConfigurationFactory); - addAutoReleasedObject(new MaemoToolChainFactory); addAutoReleasedObject(new Qt4MaemoDeployConfigurationFactory); addAutoReleasedObject(new MaemoPackageCreationFactory); addAutoReleasedObject(new MaemoDeployStepFactory); addAutoReleasedObject(new MaemoQemuSettingsPage); addAutoReleasedObject(new MaemoPublishingWizardFactoryFremantleFree); - addAutoReleasedObject(new Qt4MaemoTargetFactory); addAutoReleasedObject(new MaemoQtVersionFactory); addAutoReleasedObject(new MaddeDeviceConfigurationFactory); + new DebianManager(this); + new RpmManager(this); + return true; } diff --git a/src/plugins/madde/maddeuploadandinstallpackagesteps.cpp b/src/plugins/madde/maddeuploadandinstallpackagesteps.cpp index 348fb58f31..3832fd4efd 100644 --- a/src/plugins/madde/maddeuploadandinstallpackagesteps.cpp +++ b/src/plugins/madde/maddeuploadandinstallpackagesteps.cpp @@ -36,10 +36,11 @@ #include "maemopackageinstaller.h" #include "maemoqemumanager.h" #include "qt4maemodeployconfiguration.h" -#include "qt4maemotarget.h" +#include <projectexplorer/target.h> #include <qt4projectmanager/qt4buildconfiguration.h> #include <qtsupport/baseqtversion.h> +#include <qtsupport/qtprofileinformation.h> #include <remotelinux/abstractuploadandinstallpackageservice.h> #include <remotelinux/linuxdeviceconfiguration.h> #include <ssh/sshconnection.h> @@ -72,8 +73,8 @@ protected: } MaemoQemuRuntime rt; - const int qtId = qt4BuildConfiguration() && qt4BuildConfiguration()->qtVersion() - ? qt4BuildConfiguration()->qtVersion()->uniqueId() : -1; + const int qtId = qt4BuildConfiguration() + ? QtSupport::QtProfileInformation::qtVersionId(qt4BuildConfiguration()->target()->profile()) : -1; if (MaemoQemuManager::instance().runtimeForQtVersion(qtId, &rt)) { MaemoQemuManager::instance().startRuntime(); emit errorMessage(tr("Cannot deploy: Qemu was not running. " @@ -164,7 +165,8 @@ MaemoUploadAndInstallPackageStep::MaemoUploadAndInstallPackageStep(ProjectExplor void MaemoUploadAndInstallPackageStep::ctor() { setDefaultDisplayName(displayName()); - if (qobject_cast<Qt4HarmattanTarget *>(target())) + Core::Id deviceType = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(target()->profile()); + if (deviceType == Core::Id(HarmattanOsType)) m_deployService = new HarmattanUploadAndInstallPackageAction(this); else m_deployService = new MaemoUploadAndInstallPackageAction(this); diff --git a/src/plugins/madde/maemoconstants.h b/src/plugins/madde/maemoconstants.h index ea27711b13..32a7edc78e 100644 --- a/src/plugins/madde/maemoconstants.h +++ b/src/plugins/madde/maemoconstants.h @@ -49,7 +49,6 @@ const char MeeGoOsType[] = "MeeGoOsType"; #define EXEC_SUFFIX "" #endif -static const char MAEMO_RC_ID[] = PREFIX; static const char MAEMO_RC_ID_PREFIX[] = PREFIX "."; static const QLatin1String LastDeployedHostsKey(PREFIX ".LastDeployedHosts"); diff --git a/src/plugins/madde/maemodeploybymountsteps.cpp b/src/plugins/madde/maemodeploybymountsteps.cpp index 35469614ad..b41cd9e5fd 100644 --- a/src/plugins/madde/maemodeploybymountsteps.cpp +++ b/src/plugins/madde/maemodeploybymountsteps.cpp @@ -43,6 +43,7 @@ #include <projectexplorer/target.h> #include <qt4projectmanager/qt4buildconfiguration.h> #include <qtsupport/baseqtversion.h> +#include <qtsupport/qtprofileinformation.h> #include <remotelinux/abstractremotelinuxdeployservice.h> #include <remotelinux/deployablefile.h> #include <remotelinux/deploymentinfo.h> @@ -168,8 +169,8 @@ void AbstractMaemoDeployByMountService::doDeviceSetup() } MaemoQemuRuntime rt; - const int qtId = qt4BuildConfiguration() && qt4BuildConfiguration()->qtVersion() - ? qt4BuildConfiguration()->qtVersion()->uniqueId() : -1; + const int qtId = qt4BuildConfiguration() + ? QtSupport::QtProfileInformation::qtVersionId(qt4BuildConfiguration()->target()->profile()) : -1; if (MaemoQemuManager::instance().runtimeForQtVersion(qtId, &rt)) { MaemoQemuManager::instance().startRuntime(); emit errorMessage(tr("Cannot deploy: Qemu was not running. " diff --git a/src/plugins/madde/maemodeployconfigurationwidget.cpp b/src/plugins/madde/maemodeployconfigurationwidget.cpp index fc73329d1a..09564a2c42 100644 --- a/src/plugins/madde/maemodeployconfigurationwidget.cpp +++ b/src/plugins/madde/maemodeployconfigurationwidget.cpp @@ -33,9 +33,11 @@ #include "ui_maemodeployconfigurationwidget.h" #include "maemoglobal.h" +#include "maemoconstants.h" #include "qt4maemodeployconfiguration.h" -#include "qt4maemotarget.h" +#include <projectexplorer/profileinformation.h> +#include <projectexplorer/target.h> #include <qt4projectmanager/qt4nodes.h> #include <remotelinux/deployablefile.h> #include <remotelinux/deployablefilesperprofile.h> @@ -129,13 +131,14 @@ void MaemoDeployConfigurationWidget::addDesktopFile() DeployableFile d; d.remoteDir = QLatin1String("/usr/share/applications"); - if (qobject_cast<Qt4Maemo5Target *>(deployConfiguration()->target())) + Core::Id deviceType + = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(deployConfiguration()->target()->profile()); + if (deviceType == Core::Id(Maemo5OsType)) d.remoteDir += QLatin1String("/hildon"); d.localFilePath = desktopFilePath; - const AbstractQt4MaemoTarget * const target - = qobject_cast<AbstractQt4MaemoTarget *>(deployConfiguration()->target()); - if (!target->deploymentSettingsAssistant()->addDeployableToProFile(proFileInfo, - QLatin1String("desktopfile"), d)) { + if (!deployConfiguration()->deploymentSettingsAssistant() + ->addDeployableToProFile(deployConfiguration()->qmakeScope(), proFileInfo, + QLatin1String("desktopfile"), d)) { QMessageBox::critical(this, tr("Project File Update Failed"), tr("Could not update the project file.")); } else { @@ -171,10 +174,9 @@ void MaemoDeployConfigurationWidget::addIcon() return; } - const AbstractQt4MaemoTarget * const target - = qobject_cast<AbstractQt4MaemoTarget *>(deployConfiguration()->target()); - if (!target->deploymentSettingsAssistant()->addDeployableToProFile(proFileInfo, - QLatin1String("icon"), DeployableFile(newFilePath, remoteIconDir()))) { + if (!deployConfiguration()->deploymentSettingsAssistant() + ->addDeployableToProFile(deployConfiguration()->qmakeScope(), proFileInfo, + QLatin1String("icon"), DeployableFile(newFilePath, remoteIconDir()))) { QMessageBox::critical(this, tr("Project File Update Failed"), tr("Could not update the project file.")); } else { diff --git a/src/plugins/madde/maemodeploymentmounter.cpp b/src/plugins/madde/maemodeploymentmounter.cpp index 139bac76bc..8a3263aaf1 100644 --- a/src/plugins/madde/maemodeploymentmounter.cpp +++ b/src/plugins/madde/maemodeploymentmounter.cpp @@ -35,7 +35,9 @@ #include "maemoglobal.h" #include "maemoremotemounter.h" +#include <projectexplorer/target.h> #include <qt4projectmanager/qt4buildconfiguration.h> +#include <qtsupport/qtprofileinformation.h> #include <remotelinux/linuxdeviceconfiguration.h> #include <remotelinux/remotelinuxusedportsgatherer.h> #include <utils/qtcassert.h> @@ -173,7 +175,7 @@ void MaemoDeploymentMounter::handlePortListReady() return; setState(Mounting); - m_freePorts = MaemoGlobal::freePorts(m_devConf, m_buildConfig->qtVersion()); + m_freePorts = MaemoGlobal::freePorts(m_devConf, QtSupport::QtProfileInformation::qtVersion(m_buildConfig->target()->profile())); m_mounter->mount(&m_freePorts, m_portsGatherer); } diff --git a/src/plugins/madde/maemodeploystepfactory.cpp b/src/plugins/madde/maemodeploystepfactory.cpp index 420532b5bb..6b068ece5a 100644 --- a/src/plugins/madde/maemodeploystepfactory.cpp +++ b/src/plugins/madde/maemodeploystepfactory.cpp @@ -32,16 +32,18 @@ #include "maemodeploystepfactory.h" +#include "maemoconstants.h" #include "maddeuploadandinstallpackagesteps.h" #include "maemodeploybymountsteps.h" #include "maemoinstalltosysrootstep.h" -#include "qt4maemotarget.h" #include "qt4maemodeployconfiguration.h" #include <projectexplorer/buildconfiguration.h> #include <projectexplorer/buildsteplist.h> #include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/target.h> +#include <qtsupport/qtprofileinformation.h> +#include <qtsupport/qtsupportconstants.h> #include <remotelinux/genericdirectuploadstep.h> #include <remotelinux/remotelinuxcheckforfreediskspacestep.h> #include <remotelinux/uploadandinstalltarpackagestep.h> @@ -68,23 +70,27 @@ QList<Core::Id> MaemoDeployStepFactory::availableCreationIds(BuildStepList *pare if (!qobject_cast<Qt4MaemoDeployConfiguration *>(parent->parent())) return ids; - AbstractQt4MaemoTarget * const maemoTarget - = qobject_cast<AbstractQt4MaemoTarget *>(parent->target()); - if (maemoTarget) - ids << MaemoMakeInstallToSysrootStep::Id; - if (qobject_cast<AbstractDebBasedQt4MaemoTarget *>(parent->target())) { - ids << MaemoInstallDebianPackageToSysrootStep::Id; - ids << MaemoUploadAndInstallPackageStep::stepId(); - } else if (qobject_cast<AbstractRpmBasedQt4MaemoTarget *>(parent->target())) { - ids << MaemoInstallRpmPackageToSysrootStep::Id; - ids << MeegoUploadAndInstallPackageStep::stepId(); + QString platform; + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(parent->target()->profile()); + if (version) + platform = version->platformName(); + + if (platform == QtSupport::Constants::MAEMO_FREMANTLE_PLATFORM) { + ids << Core::Id(MaemoMakeInstallToSysrootStep::Id) + << Core::Id(MaemoInstallDebianPackageToSysrootStep::Id) + << Core::Id(MaemoUploadAndInstallPackageStep::stepId()) + << Core::Id(MaemoInstallPackageViaMountStep::stepId()) + << Core::Id(MaemoCopyFilesViaMountStep::stepId()); + } else if (platform == QtSupport::Constants::MEEGO_HARMATTAN_PLATFORM) { + ids << Core::Id(MaemoMakeInstallToSysrootStep::Id) + << Core::Id(MaemoInstallDebianPackageToSysrootStep::Id) + << Core::Id(MaemoUploadAndInstallPackageStep::stepId()) + << Core::Id(GenericDirectUploadStep::stepId()); + } else if (platform == QtSupport::Constants::MEEGO_PLATFORM) { + ids << Core::Id(MaemoMakeInstallToSysrootStep::Id) + << Core::Id(MaemoInstallRpmPackageToSysrootStep::Id) + << Core::Id(MeegoUploadAndInstallPackageStep::stepId()); } - if (qobject_cast<Qt4HarmattanTarget *>(parent->target())) - ids << GenericDirectUploadStep::stepId(); - if (qobject_cast<Qt4Maemo5Target *>(parent->target())) - ids << MaemoInstallPackageViaMountStep::stepId() - << MaemoCopyFilesViaMountStep::stepId(); - ids << RemoteLinuxCheckForFreeDiskSpaceStep::stepId(); return ids; } @@ -121,7 +127,8 @@ bool MaemoDeployStepFactory::canCreate(BuildStepList *parent, const Core::Id id) BuildStep *MaemoDeployStepFactory::create(BuildStepList *parent, const Core::Id id) { - const Target * const t = parent->target(); + Core::Id deviceType + = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(parent->target()->profile()); if (id == MaemoInstallDebianPackageToSysrootStep::Id) { return new MaemoInstallDebianPackageToSysrootStep(parent); @@ -132,15 +139,15 @@ BuildStep *MaemoDeployStepFactory::create(BuildStepList *parent, const Core::Id } else if (id == MaemoMakeInstallToSysrootStep::Id) { return new MaemoMakeInstallToSysrootStep(parent); } else if (id == MaemoInstallPackageViaMountStep::stepId() - || (id == Core::Id(OldMaemoDeployStepId) && qobject_cast< const Qt4Maemo5Target *>(t))) { + || (id == Core::Id(OldMaemoDeployStepId) && deviceType == Core::Id(Maemo5OsType))) { return new MaemoInstallPackageViaMountStep(parent); } else if (id == MaemoCopyFilesViaMountStep::stepId()) { return new MaemoCopyFilesViaMountStep(parent); } else if (id == MaemoUploadAndInstallPackageStep::stepId() - || (id == Core::Id(OldMaemoDeployStepId) && (qobject_cast<const Qt4HarmattanTarget *>(t)))) { + || (id == Core::Id(OldMaemoDeployStepId) && deviceType == Core::Id(HarmattanOsType))) { return new MaemoUploadAndInstallPackageStep(parent); } else if (id == MeegoUploadAndInstallPackageStep::stepId() - || (id == Core::Id(OldMaemoDeployStepId) && (qobject_cast<const Qt4MeegoTarget *>(t)))) { + || (id == Core::Id(OldMaemoDeployStepId) && deviceType == Core::Id(MeeGoOsType))) { return new MeegoUploadAndInstallPackageStep(parent); } else if (id == GenericDirectUploadStep::stepId()) { return new GenericDirectUploadStep(parent, id); diff --git a/src/plugins/madde/maemoglobal.cpp b/src/plugins/madde/maemoglobal.cpp index ae1f73f34f..c5f281f801 100644 --- a/src/plugins/madde/maemoglobal.cpp +++ b/src/plugins/madde/maemoglobal.cpp @@ -33,8 +33,9 @@ #include "maemoconstants.h" #include "maemoqemumanager.h" -#include "qt4maemotarget.h" +#include <projectexplorer/profileinformation.h> +#include <projectexplorer/target.h> #include <qt4projectmanager/qt4projectmanagerconstants.h> #include <qtsupport/baseqtversion.h> #include <remotelinux/linuxdeviceconfiguration.h> @@ -55,27 +56,24 @@ namespace Madde { namespace Internal { namespace { static const QLatin1String binQmake("/bin/qmake" EXEC_SUFFIX); -} - -bool MaemoGlobal::isMaemoTargetId(const Core::Id id) -{ - return isFremantleTargetId(id) || isHarmattanTargetId(id) - || isMeegoTargetId(id); -} +} // namespace -bool MaemoGlobal::isFremantleTargetId(const Core::Id id) +bool MaemoGlobal::hasMaemoDevice(const ProjectExplorer::Profile *p) { - return id == Core::Id(MAEMO5_DEVICE_TARGET_ID); -} + ProjectExplorer::IDevice::ConstPtr dev = ProjectExplorer::DeviceProfileInformation::device(p); + if (dev.isNull()) + return false; -bool MaemoGlobal::isHarmattanTargetId(const Core::Id id) -{ - return id == Core::Id(HARMATTAN_DEVICE_TARGET_ID); + const Core::Id type = dev->type(); + return type == Core::Id(Maemo5OsType) || type == Core::Id(HarmattanOsType) + || type == Core::Id(MeeGoOsType); } -bool MaemoGlobal::isMeegoTargetId(const Core::Id id) +bool MaemoGlobal::supportsMaemoDevice(const ProjectExplorer::Profile *p) { - return id == Core::Id(MEEGO_DEVICE_TARGET_ID); + const Core::Id type = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(p); + return type == Core::Id(Maemo5OsType) || type == Core::Id(HarmattanOsType) + || type == Core::Id(MeeGoOsType); } bool MaemoGlobal::isValidMaemo5QtVersion(const QString &qmakePath) @@ -130,7 +128,8 @@ QString MaemoGlobal::devrootshPath() int MaemoGlobal::applicationIconSize(const ProjectExplorer::Target *target) { - return qobject_cast<const Qt4HarmattanTarget *>(target) ? 80 : 64; + Core::Id deviceType = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(target->profile()); + return deviceType == Core::Id(HarmattanOsType) ? 80 : 64; } QString MaemoGlobal::remoteSudo(Core::Id deviceType, const QString &uname) diff --git a/src/plugins/madde/maemoglobal.h b/src/plugins/madde/maemoglobal.h index 2e519b54f6..c83dc2881f 100644 --- a/src/plugins/madde/maemoglobal.h +++ b/src/plugins/madde/maemoglobal.h @@ -48,7 +48,10 @@ QT_END_NAMESPACE namespace QtSupport { class BaseQtVersion; } namespace RemoteLinux { class LinuxDeviceConfiguration; } -namespace ProjectExplorer { class Target; } +namespace ProjectExplorer { +class Profile; +class Target; +} // namespace ProjectExplorer namespace Madde { namespace Internal { @@ -84,10 +87,8 @@ class MaemoGlobal public: enum PackagingSystem { Dpkg, Rpm, Tar }; - static bool isMaemoTargetId(const Core::Id id); - static bool isFremantleTargetId(const Core::Id id); - static bool isHarmattanTargetId(const Core::Id id); - static bool isMeegoTargetId(const Core::Id id); + static bool hasMaemoDevice(const ProjectExplorer::Profile *p); + static bool supportsMaemoDevice(const ProjectExplorer::Profile *p); static bool isValidMaemo5QtVersion(const QString &qmakePath); static bool isValidHarmattanQtVersion(const QString &qmakePath); static bool isValidMeegoQtVersion(const QString &qmakePath); diff --git a/src/plugins/madde/maemoinstalltosysrootstep.cpp b/src/plugins/madde/maemoinstalltosysrootstep.cpp index 381e057196..45cc4b5d4b 100644 --- a/src/plugins/madde/maemoinstalltosysrootstep.cpp +++ b/src/plugins/madde/maemoinstalltosysrootstep.cpp @@ -33,15 +33,15 @@ #include "maemoinstalltosysrootstep.h" #include "maemoglobal.h" +#include "maemoconstants.h" #include "maemopackagecreationstep.h" #include "maemoqtversion.h" -#include "qt4maemotarget.h" #include <utils/fileutils.h> - +#include <projectexplorer/target.h> #include <qt4projectmanager/qt4buildconfiguration.h> -#include <qt4projectmanager/qt4target.h> #include <qtsupport/baseqtversion.h> +#include <qtsupport/qtprofileinformation.h> #include <remotelinux/deploymentinfo.h> #include <remotelinux/remotelinuxdeployconfiguration.h> @@ -160,14 +160,6 @@ RemoteLinuxDeployConfiguration *AbstractMaemoInstallPackageToSysrootStep::deploy bool AbstractMaemoInstallPackageToSysrootStep::init() { - const Qt4BuildConfiguration * const bc - = qobject_cast<Qt4BaseTarget *>(target())->activeQt4BuildConfiguration(); - if (!bc) { - addOutput(tr("Cannot install to sysroot without build configuration."), - ErrorMessageOutput); - return false; - } - const AbstractMaemoPackageCreationStep * const pStep = deployConfiguration()->earlierBuildStep<AbstractMaemoPackageCreationStep>(this); if (!pStep) { @@ -176,13 +168,14 @@ bool AbstractMaemoInstallPackageToSysrootStep::init() return false; } - if (!bc->qtVersion()) { + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(target()->profile()); + if (!version) { addOutput(tr("Cannot install package to sysroot without a Qt version."), ErrorMessageOutput); return false; } - m_qmakeCommand = bc->qtVersion()->qmakeCommand().toString(); + m_qmakeCommand = version->qmakeCommand().toString(); m_packageFilePath = pStep->packageFilePath(); return true; } @@ -253,7 +246,8 @@ QStringList MaemoInstallDebianPackageToSysrootStep::madArguments() const { QStringList args; args << QLatin1String("xdpkg"); - if (qobject_cast<Qt4HarmattanTarget *>(target())) + Core::Id deviceType = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(target()->profile()); + if (deviceType == Core::Id(HarmattanOsType)) args << QLatin1String("--no-force-downgrade"); args << QLatin1String("-i"); return args; @@ -314,20 +308,21 @@ MaemoCopyToSysrootStep::MaemoCopyToSysrootStep(BuildStepList *bsl, bool MaemoCopyToSysrootStep::init() { const Qt4BuildConfiguration * const bc - = qobject_cast<Qt4BaseTarget *>(target())->activeQt4BuildConfiguration(); + = qobject_cast<Qt4BuildConfiguration *>(target()->activeBuildConfiguration()); if (!bc) { addOutput(tr("Cannot copy to sysroot without build configuration."), ErrorMessageOutput); return false; } - const MaemoQtVersion * const qtVersion = dynamic_cast<MaemoQtVersion *>(bc->qtVersion()); + const MaemoQtVersion *const qtVersion + = dynamic_cast<MaemoQtVersion *>(QtSupport::QtProfileInformation::qtVersion(target()->profile())); if (!qtVersion) { addOutput(tr("Cannot copy to sysroot without valid Qt version."), ErrorMessageOutput); return false; } - m_systemRoot = qtVersion->systemRoot(); + m_systemRoot = ProjectExplorer::SysRootProfileInformation::sysRoot(target()->profile()).toString(); const DeploymentInfo * const deploymentInfo = static_cast<RemoteLinuxDeployConfiguration *>(deployConfiguration())->deploymentInfo(); @@ -398,7 +393,8 @@ bool MaemoMakeInstallToSysrootStep::init() ErrorMessageOutput); return false; } - const QtSupport::BaseQtVersion * const qtVersion = bc->qtVersion(); + const QtSupport::BaseQtVersion *const qtVersion + = QtSupport::QtProfileInformation::qtVersion(target()->profile()); if (!qtVersion) { addOutput("Cannot deploy: Unusable build configuration.", ErrorMessageOutput); @@ -408,9 +404,12 @@ bool MaemoMakeInstallToSysrootStep::init() Utils::Environment env = bc->environment(); MaemoGlobal::addMaddeEnvironment(env, qtVersion->qmakeCommand().toString()); QString command = MaemoGlobal::madCommand(qtVersion->qmakeCommand().toString()); + QString systemRoot; + if (ProjectExplorer::SysRootProfileInformation::hasSysRoot(target()->profile())) + systemRoot = ProjectExplorer::SysRootProfileInformation::sysRoot(target()->profile()).toString(); QStringList args = QStringList() << QLatin1String("-t") << MaemoGlobal::targetName(qtVersion->qmakeCommand().toString()) << QLatin1String("make") - << QLatin1String("install") << (QLatin1String("INSTALL_ROOT=") + qtVersion->systemRoot()); + << QLatin1String("install") << (QLatin1String("INSTALL_ROOT=") + systemRoot); MaemoGlobal::transformMaddeCall(command, args, qtVersion->qmakeCommand().toString()); processParameters()->setCommand(command); processParameters()->setArguments(args.join(QLatin1String(" "))); diff --git a/src/plugins/madde/maemopackagecreationfactory.cpp b/src/plugins/madde/maemopackagecreationfactory.cpp index 59e8274b44..3f0061270b 100644 --- a/src/plugins/madde/maemopackagecreationfactory.cpp +++ b/src/plugins/madde/maemopackagecreationfactory.cpp @@ -32,12 +32,13 @@ #include "maemopackagecreationfactory.h" #include "maemopackagecreationstep.h" -#include "qt4maemotarget.h" +#include "maddedevice.h" #include "qt4maemodeployconfiguration.h" #include <projectexplorer/buildconfiguration.h> #include <projectexplorer/buildsteplist.h> #include <projectexplorer/deployconfiguration.h> +#include <projectexplorer/profileinformation.h> #include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/target.h> @@ -62,13 +63,13 @@ QList<Core::Id> MaemoPackageCreationFactory::availableCreationIds(ProjectExplore QList<Core::Id> ids; if (!qobject_cast<Qt4MaemoDeployConfiguration *>(parent->parent())) return ids; - if (qobject_cast<AbstractDebBasedQt4MaemoTarget *>(parent->target()) - && !parent->contains(MaemoDebianPackageCreationStep::CreatePackageId)) { + Core::Id deviceType = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(parent->target()->profile()); + if (MaddeDevice::isDebianBased(deviceType) + && !parent->contains(MaemoDebianPackageCreationStep::CreatePackageId)) ids << MaemoDebianPackageCreationStep::CreatePackageId; - } else if (qobject_cast<AbstractRpmBasedQt4MaemoTarget *>(parent->target()) - && !parent->contains(MaemoRpmPackageCreationStep::CreatePackageId)) { + else if (!MaddeDevice::isDebianBased(deviceType) + && !parent->contains(MaemoRpmPackageCreationStep::CreatePackageId)) ids << MaemoRpmPackageCreationStep::CreatePackageId; - } return ids; } @@ -111,14 +112,16 @@ BuildStep *MaemoPackageCreationFactory::restore(ProjectExplorer::BuildStepList * { Q_ASSERT(canRestore(parent, map)); BuildStep * step = 0; + Core::Id deviceType + = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(parent->target()->profile()); const Core::Id id = ProjectExplorer::idFromMap(map); if (id == MaemoDebianPackageCreationStep::CreatePackageId || (id == Core::Id(OldCreatePackageId) - && qobject_cast<AbstractDebBasedQt4MaemoTarget *>(parent->target()))) { + && MaddeDevice::isDebianBased(deviceType))) { step = new MaemoDebianPackageCreationStep(parent); } else if (id == MaemoRpmPackageCreationStep::CreatePackageId || (id == Core::Id(OldCreatePackageId) - && qobject_cast<AbstractRpmBasedQt4MaemoTarget *>(parent->target()))) { + && !MaddeDevice::isDebianBased(deviceType))) { step = new MaemoRpmPackageCreationStep(parent); } Q_ASSERT(step); diff --git a/src/plugins/madde/maemopackagecreationstep.cpp b/src/plugins/madde/maemopackagecreationstep.cpp index 89b3a4e770..397ff696e6 100644 --- a/src/plugins/madde/maemopackagecreationstep.cpp +++ b/src/plugins/madde/maemopackagecreationstep.cpp @@ -33,24 +33,27 @@ #include "maemoconstants.h" #include "maemoglobal.h" +#include "debianmanager.h" +#include "rpmmanager.h" #include "maemopackagecreationwidget.h" -#include "qt4maemotarget.h" #include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/target.h> #include <qt4projectmanager/qt4buildconfiguration.h> #include <qt4projectmanager/qt4project.h> -#include <qt4projectmanager/qt4target.h> #include <qt4projectmanager/qt4buildconfiguration.h> +#include <qtsupport/qtprofileinformation.h> #include <utils/environment.h> #include <utils/fileutils.h> +#include <utils/qtcassert.h> #include <QDateTime> #include <QProcess> #include <QRegExp> namespace { - const QLatin1String MagicFileName(".qtcreator"); -} +const QLatin1String MagicFileName(".qtcreator"); +} // namespace using namespace ProjectExplorer::Constants; using ProjectExplorer::BuildStepList; @@ -96,12 +99,13 @@ bool AbstractMaemoPackageCreationStep::init() QLatin1String("nostrip"), QLatin1String(" ")); } - if (!qt4BuildConfiguration()->qtVersion()) { + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(target()->profile()); + if (!version) { raiseError(tr("Packaging failed: No Qt version.")); return false; } - m_qmakeCommand = qt4BuildConfiguration()->qtVersion()->qmakeCommand().toString(); + m_qmakeCommand = version->qmakeCommand().toString(); return true; } @@ -159,21 +163,6 @@ const Qt4BuildConfiguration *AbstractMaemoPackageCreationStep::qt4BuildConfigura return static_cast<Qt4BuildConfiguration *>(target()->activeBuildConfiguration()); } -AbstractQt4MaemoTarget *AbstractMaemoPackageCreationStep::maemoTarget() const -{ - return qobject_cast<AbstractQt4MaemoTarget *>(target()); -} - -AbstractDebBasedQt4MaemoTarget *AbstractMaemoPackageCreationStep::debBasedMaemoTarget() const -{ - return qobject_cast<AbstractDebBasedQt4MaemoTarget*>(target()); -} - -AbstractRpmBasedQt4MaemoTarget *AbstractMaemoPackageCreationStep::rpmBasedMaemoTarget() const -{ - return qobject_cast<AbstractRpmBasedQt4MaemoTarget*>(target()); -} - bool AbstractMaemoPackageCreationStep::isPackagingNeeded() const { if (AbstractPackagingStep::isPackagingNeeded()) @@ -187,29 +176,24 @@ QString AbstractMaemoPackageCreationStep::packageFileName() const const QString &version = versionString(&error); if (version.isEmpty()) return QString(); - QFileInfo fi(maemoTarget()->packageFileName()); + QFileInfo fi = DebianManager::packageFileName(DebianManager::debianDirectory(target())).toFileInfo(); const QString baseName = replaceDots(fi.completeBaseName()); return baseName + QLatin1Char('.') + fi.suffix(); } QString AbstractMaemoPackageCreationStep::versionString(QString *error) const { - return maemoTarget()->projectVersion(error); + return DebianManager::projectVersion(DebianManager::debianDirectory(target()), error); } bool AbstractMaemoPackageCreationStep::setVersionString(const QString &version, QString *error) { - const bool success = maemoTarget()->setProjectVersion(version, error); + const bool success = DebianManager::setProjectVersion(DebianManager::debianDirectory(target()), version, error); if (success) emit packageFilePathChanged(); return success; } -QString AbstractMaemoPackageCreationStep::nativePath(const QFile &file) -{ - return QDir::toNativeSeparators(QFileInfo(file).filePath()); -} - bool AbstractMaemoPackageCreationStep::callPackagingCommand(QProcess *proc, const QStringList &arguments) { @@ -255,8 +239,9 @@ void AbstractMaemoPackageCreationStep::preparePackagingProcess(QProcess *proc, QString AbstractMaemoPackageCreationStep::replaceDots(const QString &name) const { + Core::Id deviceType = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(target()->profile()); // Idiotic OVI store requirement for N900 (but not allowed for N9 ...). - if (qobject_cast<Qt4Maemo5Target *>(target())) { + if (deviceType == Core::Id(Maemo5OsType)) { QString adaptedName = name; return adaptedName.replace(QLatin1Char('.'), QLatin1Char('_')); } @@ -292,11 +277,12 @@ bool MaemoDebianPackageCreationStep::init() { if (!AbstractMaemoPackageCreationStep::init()) return false; - m_maddeRoot = MaemoGlobal::maddeRoot(qt4BuildConfiguration()->qtVersion()->qmakeCommand().toString()); + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(target()->profile()); + m_maddeRoot = MaemoGlobal::maddeRoot(version->qmakeCommand().toString()); m_projectDirectory = project()->projectDirectory(); - m_pkgFileName = maemoTarget()->packageFileName(); - m_packageName = maemoTarget()->packageName(); - m_templatesDirPath = debBasedMaemoTarget()->debianDirPath(); + m_pkgFileName = DebianManager::packageFileName(DebianManager::debianDirectory(target())).toString(); + m_packageName = DebianManager::packageName(DebianManager::debianDirectory(target())); + m_templatesDirPath = DebianManager::debianDirectory(target()).toString(); m_debugBuild = qt4BuildConfiguration()->qmakeBuildConfiguration() & QtSupport::BaseQtVersion::DebugBuild; checkProjectName(); return true; @@ -346,13 +332,14 @@ bool MaemoDebianPackageCreationStep::createPackage(QProcess *buildProc, bool MaemoDebianPackageCreationStep::isMetaDataNewerThan(const QDateTime &packageDate) const { - const QString debianPath = debBasedMaemoTarget()->debianDirPath(); - if (packageDate <= QFileInfo(debianPath).lastModified()) + const Utils::FileName debianPath = DebianManager::debianDirectory(target()); + if (packageDate <= debianPath.toFileInfo().lastModified()) return true; - const QStringList debianFiles = debBasedMaemoTarget()->debianFiles(); + const QStringList debianFiles = DebianManager::debianFiles(debianPath); foreach (const QString &debianFile, debianFiles) { - const QString absFilePath = debianPath + QLatin1Char('/') + debianFile; - if (packageDate <= QFileInfo(absFilePath).lastModified()) + Utils::FileName absFilePath = debianPath; + absFilePath.appendPath(debianFile); + if (packageDate <= absFilePath.toFileInfo().lastModified()) return true; } return false; @@ -401,7 +388,7 @@ bool MaemoDebianPackageCreationStep::copyDebianFiles(bool inSourceBuild) foreach (const QString &fileName, files) { const QString srcFile = m_templatesDirPath + QLatin1Char('/') + fileName; QString newFileName = fileName; - if (newFileName == Qt4HarmattanTarget::aegisManifestFileName()) + if (newFileName == QLatin1String("manifest.aegis")) newFileName = m_packageName + QLatin1String(".aegis"); const QString destFile = debianDirPath + QLatin1Char('/') + newFileName; @@ -411,7 +398,7 @@ bool MaemoDebianPackageCreationStep::copyDebianFiles(bool inSourceBuild) continue; } - if (newFileName == maemoTarget()->packageName() + QLatin1String(".aegis")) { + if (newFileName == DebianManager::packageName(DebianManager::debianDirectory(target())) + QLatin1String(".aegis")) { Utils::FileReader reader; if (!reader.fetch(srcFile)) { raiseError(tr("Could not read manifest file '%1': %2.") @@ -518,8 +505,8 @@ void MaemoRpmPackageCreationStep::ctor() bool MaemoRpmPackageCreationStep::init() { - m_specFile = rpmBasedMaemoTarget()->specFilePath(); - m_packageFileName = rpmBasedMaemoTarget()->packageFileName(); + m_specFile = RpmManager::specFile(target()); + m_packageFileName = RpmManager::packageFileName(m_specFile, target()); return AbstractMaemoPackageCreationStep::init(); } @@ -528,12 +515,12 @@ bool MaemoRpmPackageCreationStep::createPackage(QProcess *buildProc, { Q_UNUSED(fi); const QStringList args = QStringList() << QLatin1String("rrpmbuild") - << QLatin1String("-bb") << m_specFile; + << QLatin1String("-bb") << m_specFile.toUserOutput(); if (!callPackagingCommand(buildProc, args)) return false; QFile::remove(cachedPackageFilePath()); const QString packageSourceFilePath = rpmBuildDir() + QLatin1Char('/') - + m_packageFileName; + + m_packageFileName.toUserOutput(); if (!QFile::rename(packageSourceFilePath, cachedPackageFilePath())) { raiseError(tr("Packaging failed: Could not move package file from %1 to %2.") .arg(packageSourceFilePath, cachedPackageFilePath())); @@ -545,8 +532,8 @@ bool MaemoRpmPackageCreationStep::createPackage(QProcess *buildProc, bool MaemoRpmPackageCreationStep::isMetaDataNewerThan(const QDateTime &packageDate) const { - const QDateTime specFileChangeDate - = QFileInfo(rpmBasedMaemoTarget()->specFilePath()).lastModified(); + QTC_ASSERT(!m_specFile.isEmpty(), return false); + const QDateTime specFileChangeDate = m_specFile.toFileInfo().lastModified(); return packageDate <= specFileChangeDate; } diff --git a/src/plugins/madde/maemopackagecreationstep.h b/src/plugins/madde/maemopackagecreationstep.h index bf8e9eaf5e..26b6d4158b 100644 --- a/src/plugins/madde/maemopackagecreationstep.h +++ b/src/plugins/madde/maemopackagecreationstep.h @@ -34,6 +34,7 @@ #include <remotelinux/abstractpackagingstep.h> #include <utils/environment.h> +#include <utils/fileutils.h> QT_BEGIN_NAMESPACE class QDateTime; @@ -42,10 +43,7 @@ class QProcess; QT_END_NAMESPACE namespace Qt4ProjectManager { class Qt4BuildConfiguration; } - -namespace RemoteLinux { -class RemoteLinuxDeployConfiguration; -} +namespace RemoteLinux { class RemoteLinuxDeployConfiguration; } namespace Madde { namespace Internal { @@ -67,9 +65,6 @@ public: const QString &workingDir); const Qt4ProjectManager::Qt4BuildConfiguration *qt4BuildConfiguration() const; - AbstractQt4MaemoTarget *maemoTarget() const; - AbstractDebBasedQt4MaemoTarget *debBasedMaemoTarget() const; - AbstractRpmBasedQt4MaemoTarget *rpmBasedMaemoTarget() const; static const QLatin1String DefaultVersionNumber; @@ -95,7 +90,6 @@ private: virtual bool createPackage(QProcess *buildProc, const QFutureInterface<bool> &fi) = 0; virtual bool isMetaDataNewerThan(const QDateTime &packageDate) const = 0; - static QString nativePath(const QFile &file); bool isPackagingNeeded() const; const Qt4ProjectManager::Qt4BuildConfiguration *m_lastBuildConfig; @@ -156,8 +150,8 @@ private: void ctor(); QString rpmBuildDir() const; - QString m_specFile; - QString m_packageFileName; + Utils::FileName m_specFile; + Utils::FileName m_packageFileName; static const Core::Id CreatePackageId; }; diff --git a/src/plugins/madde/maemopackagecreationwidget.cpp b/src/plugins/madde/maemopackagecreationwidget.cpp index 4cdc563cb0..26150869ed 100644 --- a/src/plugins/madde/maemopackagecreationwidget.cpp +++ b/src/plugins/madde/maemopackagecreationwidget.cpp @@ -32,11 +32,14 @@ #include "maemopackagecreationwidget.h" #include "ui_maemopackagecreationwidget.h" +#include "debianmanager.h" +#include "maddedevice.h" #include "maemoglobal.h" #include "maemopackagecreationstep.h" -#include "qt4maemotarget.h" +#include "rpmmanager.h" #include <coreplugin/editormanager/editormanager.h> +#include <projectexplorer/profileinformation.h> #include <projectexplorer/project.h> #include <projectexplorer/target.h> #include <qt4projectmanager/qt4buildconfiguration.h> @@ -72,25 +75,27 @@ void MaemoPackageCreationWidget::initGui() { m_ui->shortDescriptionLineEdit->setMaxLength(60); updateVersionInfo(); - const AbstractDebBasedQt4MaemoTarget * const debBasedMaemoTarget - = m_step->debBasedMaemoTarget(); - if (debBasedMaemoTarget) { - const QSize iconSize = debBasedMaemoTarget->packageManagerIconSize(); + Core::Id deviceType = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(m_step->target()->profile()); + if (MaddeDevice::isDebianBased(deviceType)) { + const Utils::FileName path = DebianManager::debianDirectory(m_step->target()); + const QSize iconSize = MaddeDevice::packageManagerIconSize(deviceType); m_ui->packageManagerIconButton->setFixedSize(iconSize); m_ui->packageManagerIconButton->setToolTip(tr("Size should be %1x%2 pixels") .arg(iconSize.width()).arg(iconSize.height())); m_ui->editSpecFileButton->setVisible(false); - updateDebianFileList(); - handleControlFileUpdate(); + updateDebianFileList(path); + handleControlFileUpdate(path); + DebianManager *dm = DebianManager::instance(); connect(m_ui->packageManagerNameLineEdit, SIGNAL(editingFinished()), SLOT(setPackageManagerName())); - connect(debBasedMaemoTarget, SIGNAL(debianDirContentsChanged()), - SLOT(updateDebianFileList())); - connect(debBasedMaemoTarget, SIGNAL(changeLogChanged()), + connect(dm, SIGNAL(debianDirectoryChanged(Utils::FileName)), + SLOT(updateDebianFileList(Utils::FileName))); + connect(dm, SIGNAL(changelogChanged(Utils::FileName)), SLOT(updateVersionInfo())); - connect(debBasedMaemoTarget, SIGNAL(controlChanged()), - SLOT(handleControlFileUpdate())); + connect(dm, SIGNAL(controlChanged(Utils::FileName)), + SLOT(handleControlFileUpdate(Utils::FileName))); } else { + const Utils::FileName path = RpmManager::specFile(m_step->target()); m_ui->packageManagerNameLabel->hide(); m_ui->packageManagerNameLineEdit->hide(); m_ui->packageManagerIconLabel->hide(); @@ -106,9 +111,9 @@ void MaemoPackageCreationWidget::initGui() m_ui->formLayout->removeItem(m_ui->formLayout->itemAt(5, QFormLayout::FieldRole)); m_ui->formLayout->removeItem(m_ui->formLayout->itemAt(6, QFormLayout::LabelRole)); m_ui->formLayout->removeItem(m_ui->formLayout->itemAt(6, QFormLayout::FieldRole)); - handleSpecFileUpdate(); - connect(m_step->rpmBasedMaemoTarget(), SIGNAL(specFileChanged()), - SLOT(handleSpecFileUpdate())); + handleSpecFileUpdate(path); + connect(RpmManager::instance(), SIGNAL(specFileChanged(Utils::FileName)), + SLOT(handleSpecFileUpdate(Utils::FileName))); connect(m_ui->editSpecFileButton, SIGNAL(clicked()), SLOT(editSpecFile())); } @@ -120,10 +125,13 @@ void MaemoPackageCreationWidget::initGui() SLOT(setShortDescription())); } -void MaemoPackageCreationWidget::updateDebianFileList() +void MaemoPackageCreationWidget::updateDebianFileList(const Utils::FileName &debianDir) { + if (debianDir != DebianManager::debianDirectory(m_step->target())) + return; + m_ui->debianFilesComboBox->clear(); - const QStringList &debianFiles = m_step->debBasedMaemoTarget()->debianFiles(); + const QStringList &debianFiles = DebianManager::debianFiles(debianDir); foreach (const QString &fileName, debianFiles) { if (fileName != QLatin1String("compat") && !fileName.endsWith(QLatin1Char('~'))) @@ -154,8 +162,11 @@ void MaemoPackageCreationWidget::updateVersionInfo() updateSummary(); } -void MaemoPackageCreationWidget::handleControlFileUpdate() +void MaemoPackageCreationWidget::handleControlFileUpdate(const Utils::FileName &debianDir) { + if (debianDir != DebianManager::debianDirectory(m_step->target())) + return; + updatePackageName(); updateShortDescription(); updatePackageManagerName(); @@ -163,8 +174,11 @@ void MaemoPackageCreationWidget::handleControlFileUpdate() updateSummary(); } -void MaemoPackageCreationWidget::handleSpecFileUpdate() +void MaemoPackageCreationWidget::handleSpecFileUpdate(const Utils::FileName &spec) { + if (spec != RpmManager::specFile(m_step->target())) + return; + updatePackageName(); updateShortDescription(); updateVersionInfo(); @@ -173,8 +187,9 @@ void MaemoPackageCreationWidget::handleSpecFileUpdate() void MaemoPackageCreationWidget::updatePackageManagerIcon() { + const Utils::FileName path = DebianManager::debianDirectory(m_step->target()); QString error; - const QIcon &icon = m_step->debBasedMaemoTarget()->packageManagerIcon(&error); + const QIcon &icon = DebianManager::packageManagerIcon(path, &error); if (!error.isEmpty()) { QMessageBox::critical(this, tr("Could not read icon"), error); } else { @@ -185,40 +200,50 @@ void MaemoPackageCreationWidget::updatePackageManagerIcon() void MaemoPackageCreationWidget::updatePackageName() { - m_ui->packageNameLineEdit->setText(m_step->maemoTarget()->packageName()); + const Utils::FileName path = DebianManager::debianDirectory(m_step->target()); + m_ui->packageNameLineEdit->setText(DebianManager::packageName(path)); } void MaemoPackageCreationWidget::updatePackageManagerName() { - m_ui->packageManagerNameLineEdit->setText(m_step->debBasedMaemoTarget()->packageManagerName()); + const Utils::FileName path = DebianManager::debianDirectory(m_step->target()); + Core::Id deviceType + = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(m_step->target()->profile()); + m_ui->packageManagerNameLineEdit->setText(DebianManager::packageManagerName(path, deviceType)); } void MaemoPackageCreationWidget::updateShortDescription() { - m_ui->shortDescriptionLineEdit->setText(m_step->maemoTarget()->shortDescription()); + const Utils::FileName path = DebianManager::debianDirectory(m_step->target()); + m_ui->shortDescriptionLineEdit->setText(DebianManager::shortDescription(path)); } void MaemoPackageCreationWidget::setPackageManagerIcon() { + const Utils::FileName path = DebianManager::debianDirectory(m_step->target()); + Core::Id deviceType + = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(m_step->target()->profile()); QString imageFilter = tr("Images") + QLatin1String("( "); const QList<QByteArray> &imageTypes = QImageReader::supportedImageFormats(); foreach (const QByteArray &imageType, imageTypes) imageFilter += "*." + QString::fromAscii(imageType) + QLatin1Char(' '); imageFilter += QLatin1Char(')'); - const QSize iconSize = m_step->debBasedMaemoTarget()->packageManagerIconSize(); + const QSize iconSize = MaddeDevice::packageManagerIconSize(deviceType); const QString iconFileName = QFileDialog::getOpenFileName(this, tr("Choose Image (will be scaled to %1x%2 pixels if necessary)") .arg(iconSize.width()).arg(iconSize.height()), QString(), imageFilter); if (!iconFileName.isEmpty()) { QString error; - if (!m_step->debBasedMaemoTarget()->setPackageManagerIcon(iconFileName, &error)) + if (!DebianManager::setPackageManagerIcon(path, deviceType, + Utils::FileName::fromString(iconFileName), &error)) QMessageBox::critical(this, tr("Could Not Set New Icon"), error); } } void MaemoPackageCreationWidget::setPackageName() { - if (!m_step->maemoTarget()->setPackageName(m_ui->packageNameLineEdit->text())) { + const Utils::FileName path = DebianManager::debianDirectory(m_step->target()); + if (!DebianManager::setPackageName(path, m_ui->packageNameLineEdit->text())) { QMessageBox::critical(this, tr("File Error"), tr("Could not set project name.")); } @@ -226,7 +251,10 @@ void MaemoPackageCreationWidget::setPackageName() void MaemoPackageCreationWidget::setPackageManagerName() { - if (!m_step->debBasedMaemoTarget()->setPackageManagerName(m_ui->packageManagerNameLineEdit->text())) { + const Utils::FileName path = DebianManager::debianDirectory(m_step->target()); + Core::Id deviceType + = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(m_step->target()->profile()); + if (!DebianManager::setPackageManagerName(path, deviceType, m_ui->packageManagerNameLineEdit->text())) { QMessageBox::critical(this, tr("File Error"), tr("Could not set package name for project manager.")); } @@ -234,7 +262,8 @@ void MaemoPackageCreationWidget::setPackageManagerName() void MaemoPackageCreationWidget::setShortDescription() { - if (!m_step->maemoTarget()->setShortDescription(m_ui->shortDescriptionLineEdit->text())) { + const Utils::FileName path = DebianManager::debianDirectory(m_step->target()); + if (!DebianManager::setShortDescription(path, m_ui->shortDescriptionLineEdit->text())) { QMessageBox::critical(this, tr("File Error"), tr("Could not set project description.")); } @@ -265,13 +294,14 @@ void MaemoPackageCreationWidget::versionInfoChanged() void MaemoPackageCreationWidget::editDebianFile() { - editFile(m_step->debBasedMaemoTarget()->debianDirPath() - + QLatin1Char('/') + m_ui->debianFilesComboBox->currentText()); + Utils::FileName path = DebianManager::debianDirectory(m_step->target()); + path.appendPath(m_ui->debianFilesComboBox->currentText()); + editFile(path.toString()); } void MaemoPackageCreationWidget::editSpecFile() { - editFile(m_step->rpmBasedMaemoTarget()->specFilePath()); + editFile(RpmManager::specFile(m_step->target()).toString()); } void MaemoPackageCreationWidget::editFile(const QString &filePath) diff --git a/src/plugins/madde/maemopackagecreationwidget.h b/src/plugins/madde/maemopackagecreationwidget.h index 80a75ae750..b986646f22 100644 --- a/src/plugins/madde/maemopackagecreationwidget.h +++ b/src/plugins/madde/maemopackagecreationwidget.h @@ -33,6 +33,7 @@ #define MAEMOPACKAGECREATIONWIDGET_H #include <projectexplorer/buildstep.h> +#include <utils/fileutils.h> namespace Madde { namespace Internal { @@ -56,10 +57,10 @@ private slots: void editSpecFile(); void versionInfoChanged(); void initGui(); - void updateDebianFileList(); + void updateDebianFileList(const Utils::FileName &debianDir); void updateVersionInfo(); - void handleControlFileUpdate(); - void handleSpecFileUpdate(); + void handleControlFileUpdate(const Utils::FileName &debianDir); + void handleSpecFileUpdate(const Utils::FileName &spec); void setPackageManagerIcon(); void setPackageManagerName(); void setPackageName(); diff --git a/src/plugins/madde/maemopublisherfremantlefree.cpp b/src/plugins/madde/maemopublisherfremantlefree.cpp index dfab66adb9..eefab25bd9 100644 --- a/src/plugins/madde/maemopublisherfremantlefree.cpp +++ b/src/plugins/madde/maemopublisherfremantlefree.cpp @@ -32,10 +32,11 @@ #include "maemopublisherfremantlefree.h" #include "maemoglobal.h" +#include "maemoconstants.h" +#include "debianmanager.h" #include "maemopackagecreationstep.h" #include "maemopublishingfileselectiondialog.h" #include "qt4maemodeployconfiguration.h" -#include "qt4maemotarget.h" #include <coreplugin/idocument.h> #include <projectexplorer/project.h> @@ -43,6 +44,7 @@ #include <qt4projectmanager/qmakestep.h> #include <qt4projectmanager/qt4buildconfiguration.h> #include <qtsupport/baseqtversion.h> +#include <qtsupport/qtprofileinformation.h> #include <remotelinux/deployablefilesperprofile.h> #include <remotelinux/deploymentinfo.h> #include <utils/fileutils.h> @@ -309,8 +311,12 @@ void MaemoPublisherFremantleFree::handleProcessFinished(bool failedToStart) runDpkgBuildPackage(); } else { setState(RunningMakeDistclean); - m_process->start(m_buildConfig->makeCommand(), - QStringList() << QLatin1String("distclean")); + // Toolchain might be null! (yes because this sucks) + ProjectExplorer::ToolChain *tc + = ProjectExplorer::ToolChainProfileInformation::toolChain(m_buildConfig->target()->profile()); + if (!tc) + finishWithFailure(QString(), tr("Make distclean failed. No toolchain in profile.")); + m_process->start(tc->makeCommand(), QStringList() << QLatin1String("distclean")); } break; case RunningMakeDistclean: @@ -374,7 +380,7 @@ void MaemoPublisherFremantleFree::runDpkgBuildPackage() } } - QtSupport::BaseQtVersion *lqt = m_buildConfig->qtVersion(); + QtSupport::BaseQtVersion *lqt = QtSupport::QtProfileInformation::qtVersion(m_buildConfig->target()->profile()); if (!lqt) finishWithFailure(QString(), tr("No Qt version set.")); @@ -541,7 +547,8 @@ bool MaemoPublisherFremantleFree::updateDesktopFiles(QString *error) const bool success = true; const Qt4MaemoDeployConfiguration * const deployConfig = qobject_cast<Qt4MaemoDeployConfiguration *>(m_buildConfig->target()->activeDeployConfiguration()); - const DeploymentInfo * const deploymentInfo = deployConfig->deploymentInfo(); + QTC_ASSERT(deployConfig, return false); + const DeploymentInfo *const deploymentInfo = deployConfig->deploymentInfo(); for (int i = 0; i < deploymentInfo->modelCount(); ++i) { const DeployableFilesPerProFile * const model = deploymentInfo->modelAt(i); QString desktopFilePath = deployConfig->localDesktopFilePath(model); @@ -597,9 +604,13 @@ bool MaemoPublisherFremantleFree::addOrReplaceDesktopFileValue(QByteArray &fileC QStringList MaemoPublisherFremantleFree::findProblems() const { QStringList problems; - const Qt4Maemo5Target * const target - = qobject_cast<Qt4Maemo5Target *>(m_buildConfig->target()); - const QString &description = target->shortDescription(); + ProjectExplorer::Target *target = m_buildConfig->target(); + Core::Id deviceType + = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(target->profile()); + if (deviceType != Core::Id(Maemo5OsType)) + return QStringList(); + + const QString &description = DebianManager::shortDescription(DebianManager::debianDirectory(target)); if (description.trimmed().isEmpty()) { problems << tr("The package description is empty. You must set one " "in Projects -> Run -> Create Package -> Details."); @@ -608,8 +619,9 @@ QStringList MaemoPublisherFremantleFree::findProblems() const "not what you want. Please change it in " "Projects -> Run -> Create Package -> Details.").arg(description); } + QString dummy; - if (target->packageManagerIcon(&dummy).isNull()) + if (DebianManager::packageManagerIcon(DebianManager::debianDirectory(target), &dummy).isNull()) problems << tr("You have not set an icon for the package manager. " "The icon must be set in Projects -> Run -> Create Package -> Details."); return problems; diff --git a/src/plugins/madde/maemopublishingbuildsettingspagefremantlefree.cpp b/src/plugins/madde/maemopublishingbuildsettingspagefremantlefree.cpp index 5c04ae126e..61160b409a 100644 --- a/src/plugins/madde/maemopublishingbuildsettingspagefremantlefree.cpp +++ b/src/plugins/madde/maemopublishingbuildsettingspagefremantlefree.cpp @@ -41,6 +41,8 @@ #include <qt4projectmanager/qt4buildconfiguration.h> #include <qt4projectmanager/qt4projectmanagerconstants.h> #include <qtsupport/baseqtversion.h> +#include <qtsupport/qtprofileinformation.h> +#include <qtsupport/qtsupportconstants.h> #include <utils/qtcassert.h> using namespace ProjectExplorer; @@ -56,11 +58,13 @@ MaemoPublishingBuildSettingsPageFremantleFree::MaemoPublishingBuildSettingsPageF ui(new Ui::MaemoPublishingWizardPageFremantleFree) { ui->setupUi(this); + collectBuildConfigurations(project); QTC_ASSERT(!m_buildConfigs.isEmpty(), return); - foreach (const Qt4BuildConfiguration * const bc, m_buildConfigs) { + + foreach (const Qt4BuildConfiguration *const bc, m_buildConfigs) ui->buildConfigComboBox->addItem(bc->displayName()); - } + ui->buildConfigComboBox->setSizeAdjustPolicy(QComboBox::AdjustToContentsOnFirstShow); ui->buildConfigComboBox->setCurrentIndex(0); connect(ui->skipUploadCheckBox, SIGNAL(toggled(bool)), @@ -74,22 +78,17 @@ MaemoPublishingBuildSettingsPageFremantleFree::~MaemoPublishingBuildSettingsPage void MaemoPublishingBuildSettingsPageFremantleFree::collectBuildConfigurations(const Project *project) { + m_buildConfigs.clear(); + foreach (const Target *const target, project->targets()) { - if (target->id() != Core::Id(Constants::MAEMO5_DEVICE_TARGET_ID)) + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(target->profile()); + if (!version || version->platformName() != QLatin1String(QtSupport::Constants::MAEMO_FREMANTLE_PLATFORM)) continue; - foreach (BuildConfiguration * const bc, target->buildConfigurations()) { - Qt4BuildConfiguration * const qt4Bc - = qobject_cast<Qt4BuildConfiguration *>(bc); - if (!qt4Bc) - continue; - - QtSupport::BaseQtVersion *lqt = qt4Bc->qtVersion(); - if (!lqt) - continue; - if (MaemoGlobal::deviceType(lqt->qmakeCommand().toString()) == Core::Id(Maemo5OsType)) + foreach (BuildConfiguration *const bc, target->buildConfigurations()) { + Qt4BuildConfiguration *const qt4Bc = qobject_cast<Qt4BuildConfiguration *>(bc); + if (qt4Bc) m_buildConfigs << qt4Bc; } - break; } } diff --git a/src/plugins/madde/maemopublishingbuildsettingspagefremantlefree.h b/src/plugins/madde/maemopublishingbuildsettingspagefremantlefree.h index 28a433b32f..ce84c9e22a 100644 --- a/src/plugins/madde/maemopublishingbuildsettingspagefremantlefree.h +++ b/src/plugins/madde/maemopublishingbuildsettingspagefremantlefree.h @@ -51,7 +51,8 @@ class MaemoPublishingBuildSettingsPageFremantleFree : public QWizardPage public: explicit MaemoPublishingBuildSettingsPageFremantleFree(const ProjectExplorer::Project *project, - MaemoPublisherFremantleFree *publisher, QWidget *parent = 0); + MaemoPublisherFremantleFree *publisher, + QWidget *parent = 0); ~MaemoPublishingBuildSettingsPageFremantleFree(); private: diff --git a/src/plugins/madde/maemopublishinguploadsettingspagefremantlefree.h b/src/plugins/madde/maemopublishinguploadsettingspagefremantlefree.h index 154a085bab..f8b3dc064a 100644 --- a/src/plugins/madde/maemopublishinguploadsettingspagefremantlefree.h +++ b/src/plugins/madde/maemopublishinguploadsettingspagefremantlefree.h @@ -51,9 +51,9 @@ public: ~MaemoPublishingUploadSettingsPageFremantleFree(); private: - virtual void initializePage(); - virtual bool isComplete() const; - virtual bool validatePage(); + void initializePage(); + bool isComplete() const; + bool validatePage(); QString garageAccountName() const; QString privateKeyFilePath() const; diff --git a/src/plugins/madde/maemopublishingwizardfactories.cpp b/src/plugins/madde/maemopublishingwizardfactories.cpp index 5749314963..5e1eee6be1 100644 --- a/src/plugins/madde/maemopublishingwizardfactories.cpp +++ b/src/plugins/madde/maemopublishingwizardfactories.cpp @@ -41,6 +41,8 @@ #include <qt4projectmanager/qt4projectmanagerconstants.h> #include <qt4projectmanager/qt4buildconfiguration.h> #include <qtsupport/baseqtversion.h> +#include <qtsupport/qtprofileinformation.h> +#include <qtsupport/qtsupportconstants.h> using namespace ProjectExplorer; using namespace Qt4ProjectManager; @@ -73,21 +75,10 @@ bool MaemoPublishingWizardFactoryFremantleFree::canCreateWizard(const Project *p if (!qobject_cast<const Qt4Project *>(project)) return false; foreach (const Target *const target, project->targets()) { - if (target->id() != Core::Id(Constants::MAEMO5_DEVICE_TARGET_ID)) - continue; - foreach (const BuildConfiguration *const bc, target->buildConfigurations()) { - const Qt4BuildConfiguration *const qt4Bc - = qobject_cast<const Qt4BuildConfiguration *>(bc); - if (!qt4Bc) - continue; - - QtSupport::BaseQtVersion *qt = qt4Bc->qtVersion(); - if (!qt) - continue; - if (MaemoGlobal::deviceType(qt->qmakeCommand().toString()) == Core::Id(Maemo5OsType)) - return true; - } - break; + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(target->profile()); + const QString &platform = version ? version->platformName() : QString(); + if (platform == QLatin1String(QtSupport::Constants::MAEMO_FREMANTLE_PLATFORM)) + return true; } return false; } diff --git a/src/plugins/madde/maemopublishingwizardfactories.h b/src/plugins/madde/maemopublishingwizardfactories.h index fa0eb33f5c..208bfa9095 100644 --- a/src/plugins/madde/maemopublishingwizardfactories.h +++ b/src/plugins/madde/maemopublishingwizardfactories.h @@ -48,10 +48,10 @@ class MaemoPublishingWizardFactoryFremantleFree public: explicit MaemoPublishingWizardFactoryFremantleFree(QObject *parent =0); private: - virtual QString displayName() const; - virtual QString description() const; - virtual bool canCreateWizard(const ProjectExplorer::Project *project) const; - virtual QWizard *createWizard(const ProjectExplorer::Project *project) const; + QString displayName() const; + QString description() const; + bool canCreateWizard(const ProjectExplorer::Project *project) const; + QWizard *createWizard(const ProjectExplorer::Project *project) const; }; } // namespace Internal diff --git a/src/plugins/madde/maemopublishingwizardfremantlefree.cpp b/src/plugins/madde/maemopublishingwizardfremantlefree.cpp index b17caf960b..000d055a01 100644 --- a/src/plugins/madde/maemopublishingwizardfremantlefree.cpp +++ b/src/plugins/madde/maemopublishingwizardfremantlefree.cpp @@ -53,13 +53,11 @@ MaemoPublishingWizardFremantleFree::MaemoPublishingWizardFremantleFree(const Pro setOption(NoCancelButton, false); setWindowTitle(tr("Publishing to Fremantle's \"Extras-devel free\" Repository")); - m_buildSettingsPage - = new MaemoPublishingBuildSettingsPageFremantleFree(project, m_publisher); + m_buildSettingsPage = new MaemoPublishingBuildSettingsPageFremantleFree(project, m_publisher); m_buildSettingsPage->setTitle(tr("Build Settings")); setPage(BuildSettingsPageId, m_buildSettingsPage); - m_uploadSettingsPage - = new MaemoPublishingUploadSettingsPageFremantleFree(m_publisher); + m_uploadSettingsPage = new MaemoPublishingUploadSettingsPageFremantleFree(m_publisher); m_uploadSettingsPage->setTitle(tr("Upload Settings")); m_uploadSettingsPage->setCommitPage(true); setPage(UploadSettingsPageId, m_uploadSettingsPage); diff --git a/src/plugins/madde/maemoqemumanager.cpp b/src/plugins/madde/maemoqemumanager.cpp index 4911de3c60..48893a2ea7 100644 --- a/src/plugins/madde/maemoqemumanager.cpp +++ b/src/plugins/madde/maemoqemumanager.cpp @@ -35,7 +35,6 @@ #include "maemoglobal.h" #include "maemoqemuruntimeparser.h" #include "maemosettingspages.h" -#include "qt4maemotarget.h" #include "maemoqtversion.h" #include <coreplugin/actionmanager/actionmanager.h> @@ -46,10 +45,12 @@ #include <coreplugin/icontext.h> #include <coreplugin/modemanager.h> +#include <projectexplorer/buildconfiguration.h> #include <projectexplorer/projectexplorer.h> #include <projectexplorer/project.h> #include <projectexplorer/session.h> -#include <projectexplorer/buildconfiguration.h> +#include <projectexplorer/target.h> +#include <qtsupport/qtprofileinformation.h> #include <qtsupport/qtversionmanager.h> #include <qt4projectmanager/qt4buildconfiguration.h> #include <remotelinux/linuxdeviceconfiguration.h> @@ -250,56 +251,24 @@ void MaemoQemuManager::projectChanged(ProjectExplorer::Project *project) void MaemoQemuManager::targetAdded(ProjectExplorer::Target *target) { - if (!target || !MaemoGlobal::isMaemoTargetId(target->id())) + if (!target || !MaemoGlobal::hasMaemoDevice(target->profile())) return; - // handle all run configuration changes, add, remove, etc... - connect(target, SIGNAL(addedRunConfiguration(ProjectExplorer::RunConfiguration*)), - this, SLOT(runConfigurationAdded(ProjectExplorer::RunConfiguration*))); - connect(target, SIGNAL(removedRunConfiguration(ProjectExplorer::RunConfiguration*)), - this, SLOT(runConfigurationRemoved(ProjectExplorer::RunConfiguration*))); - connect(target, SIGNAL(activeRunConfigurationChanged(ProjectExplorer::RunConfiguration*)), - this, SLOT(runConfigurationChanged(ProjectExplorer::RunConfiguration*))); - - // handle all build configuration changes, add, remove, etc... - connect(target, SIGNAL(removedBuildConfiguration(ProjectExplorer::BuildConfiguration*)), - this, SLOT(buildConfigurationAdded(ProjectExplorer::BuildConfiguration*))); - connect(target, SIGNAL(removedBuildConfiguration(ProjectExplorer::BuildConfiguration*)), - this, SLOT(buildConfigurationRemoved(ProjectExplorer::BuildConfiguration*))); - connect(target, SIGNAL(activeBuildConfigurationChanged(ProjectExplorer::BuildConfiguration*)), - this, SLOT(buildConfigurationChanged(ProjectExplorer::BuildConfiguration*))); - // handle the qt version changes the build configuration uses connect(target, SIGNAL(environmentChanged()), this, SLOT(environmentChanged())); + connect(target, SIGNAL(profileChanged()), this, SLOT(systemChanged())); - foreach (RunConfiguration *rc, target->runConfigurations()) - toggleDeviceConnections(qobject_cast<RemoteLinuxRunConfiguration*> (rc), true); toggleStarterButton(target); } void MaemoQemuManager::targetRemoved(ProjectExplorer::Target *target) { - if (!target || !MaemoGlobal::isMaemoTargetId(target->id())) + if (!target || !MaemoGlobal::hasMaemoDevice(target->profile())) return; - disconnect(target, SIGNAL(addedRunConfiguration(ProjectExplorer::RunConfiguration*)), - this, SLOT(runConfigurationAdded(ProjectExplorer::RunConfiguration*))); - disconnect(target, SIGNAL(removedRunConfiguration(ProjectExplorer::RunConfiguration*)), - this, SLOT(runConfigurationRemoved(ProjectExplorer::RunConfiguration*))); - disconnect(target, SIGNAL(activeRunConfigurationChanged(ProjectExplorer::RunConfiguration*)), - this, SLOT(runConfigurationChanged(ProjectExplorer::RunConfiguration*))); - - disconnect(target, SIGNAL(removedBuildConfiguration(ProjectExplorer::BuildConfiguration*)), - this, SLOT(buildConfigurationAdded(ProjectExplorer::BuildConfiguration*))); - disconnect(target, SIGNAL(removedBuildConfiguration(ProjectExplorer::BuildConfiguration*)), - this, SLOT(buildConfigurationRemoved(ProjectExplorer::BuildConfiguration*))); - disconnect(target, SIGNAL(activeBuildConfigurationChanged(ProjectExplorer::BuildConfiguration*)), - this, SLOT(buildConfigurationChanged(ProjectExplorer::BuildConfiguration*))); - disconnect(target, SIGNAL(environmentChanged()), this, SLOT(environmentChanged())); + disconnect(target, SIGNAL(profileChanged()), this, SLOT(systemChanged())); - foreach (RunConfiguration *rc, target->runConfigurations()) - toggleDeviceConnections(qobject_cast<RemoteLinuxRunConfiguration*> (rc), false); showOrHideQemuButton(); } @@ -311,46 +280,10 @@ void MaemoQemuManager::targetChanged(ProjectExplorer::Target *target) } } -void MaemoQemuManager::runConfigurationAdded(ProjectExplorer::RunConfiguration *rc) -{ - if (!rc || !MaemoGlobal::isMaemoTargetId(rc->target()->id())) - return; - toggleDeviceConnections(qobject_cast<RemoteLinuxRunConfiguration*> (rc), true); -} - -void MaemoQemuManager::runConfigurationRemoved(ProjectExplorer::RunConfiguration *rc) -{ - if (!rc || !MaemoGlobal::isMaemoTargetId(rc->target()->id())) - return; - toggleDeviceConnections(qobject_cast<RemoteLinuxRunConfiguration*> (rc), false); -} - -void MaemoQemuManager::runConfigurationChanged(ProjectExplorer::RunConfiguration *rc) -{ - if (rc) - m_qemuAction->setEnabled(targetUsesMatchingRuntimeConfig(rc->target())); -} - -void MaemoQemuManager::buildConfigurationAdded(ProjectExplorer::BuildConfiguration *bc) -{ - if (!bc || !MaemoGlobal::isMaemoTargetId(bc->target()->id())) - return; - - connect(bc, SIGNAL(environmentChanged()), this, SLOT(environmentChanged())); -} - -void MaemoQemuManager::buildConfigurationRemoved(ProjectExplorer::BuildConfiguration *bc) -{ - if (!bc || !MaemoGlobal::isMaemoTargetId(bc->target()->id())) - return; - - disconnect(bc, SIGNAL(environmentChanged()), this, SLOT(environmentChanged())); -} - -void MaemoQemuManager::buildConfigurationChanged(ProjectExplorer::BuildConfiguration *bc) +void MaemoQemuManager::systemChanged() { - if (bc) - toggleStarterButton(bc->target()); + Target *t = qobject_cast<Target *>(sender()); + targetChanged(t); } void MaemoQemuManager::environmentChanged() @@ -531,12 +464,9 @@ void MaemoQemuManager::toggleStarterButton(Target *target) { int uniqueId = -1; if (target) { - if (AbstractQt4MaemoTarget *qt4Target = qobject_cast<AbstractQt4MaemoTarget*>(target)) { - if (Qt4BuildConfiguration *bc = qt4Target->activeQt4BuildConfiguration()) { - if (QtSupport::BaseQtVersion *version = bc->qtVersion()) - uniqueId = version->uniqueId(); - } - } + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(target->profile()); + if (version) + uniqueId = version->uniqueId(); } if (uniqueId >= 0 && (m_runtimes.isEmpty() || !m_runtimes.contains(uniqueId))) @@ -549,7 +479,7 @@ void MaemoQemuManager::toggleStarterButton(Target *target) const Project * const p = ProjectExplorerPlugin::instance()->session()->startupProject(); const bool qemuButtonEnabled - = p && p->activeTarget() && MaemoGlobal::isMaemoTargetId(p->activeTarget()->id()) + = p && p->activeTarget() && MaemoGlobal::hasMaemoDevice(target->profile()) && m_runtimes.value(uniqueId, MaemoQemuRuntime()).isValid() && targetUsesMatchingRuntimeConfig(target) && !isRunning; m_qemuAction->setEnabled(qemuButtonEnabled); @@ -562,7 +492,7 @@ bool MaemoQemuManager::sessionHasMaemoTarget() const const QList<Project*> &projects = explorer->session()->projects(); foreach (const Project *p, projects) { foreach (const Target * const target, p->targets()) { - if (MaemoGlobal::isMaemoTargetId(target->id())) + if (MaemoGlobal::hasMaemoDevice(target->profile())) return true; } } @@ -581,18 +511,17 @@ bool MaemoQemuManager::targetUsesMatchingRuntimeConfig(Target *target, qobject_cast<RemoteLinuxRunConfiguration *> (target->activeRunConfiguration()); if (!mrc) return false; - Qt4BuildConfiguration *bc - = qobject_cast<Qt4BuildConfiguration *>(target->activeBuildConfiguration()); - if (!bc) - return false; - QtSupport::BaseQtVersion *version = bc->qtVersion(); + + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(target->profile()); if (!version || !m_runtimes.value(version->uniqueId(), MaemoQemuRuntime()).isValid()) return false; if (qtVersion) *qtVersion = version; - const LinuxDeviceConfiguration::ConstPtr &config = mrc->deviceConfig(); - return config && config->machineType() == LinuxDeviceConfiguration::Emulator; + const LinuxDeviceConfiguration::ConstPtr &config + = ProjectExplorer::DeviceProfileInformation::device(target->profile()) + .dynamicCast<const LinuxDeviceConfiguration>(); + return !config.isNull() && config->machineType() == LinuxDeviceConfiguration::Emulator; } void MaemoQemuManager::notify(const QList<int> uniqueIds) @@ -601,21 +530,6 @@ void MaemoQemuManager::notify(const QList<int> uniqueIds) environmentChanged(); // to toggle the start button } -void MaemoQemuManager::toggleDeviceConnections(RemoteLinuxRunConfiguration *mrc, - bool _connect) -{ - if (!mrc) - return; - - if (_connect) { // handle device configuration changes - connect(mrc, SIGNAL(deviceConfigurationChanged(ProjectExplorer::Target*)), - this, SLOT(deviceConfigurationChanged(ProjectExplorer::Target*))); - } else { - disconnect(mrc, SIGNAL(deviceConfigurationChanged(ProjectExplorer::Target*)), - this, SLOT(deviceConfigurationChanged(ProjectExplorer::Target*))); - } -} - void MaemoQemuManager::showOrHideQemuButton() { const bool showButton = !m_runtimes.isEmpty() && sessionHasMaemoTarget(); diff --git a/src/plugins/madde/maemoqemumanager.h b/src/plugins/madde/maemoqemumanager.h index 1c6c635a79..9f99a31445 100644 --- a/src/plugins/madde/maemoqemumanager.h +++ b/src/plugins/madde/maemoqemumanager.h @@ -83,14 +83,7 @@ private slots: void targetAdded(ProjectExplorer::Target *target); void targetRemoved(ProjectExplorer::Target *target); void targetChanged(ProjectExplorer::Target *target); - - void runConfigurationAdded(ProjectExplorer::RunConfiguration *rc); - void runConfigurationRemoved(ProjectExplorer::RunConfiguration *rc); - void runConfigurationChanged(ProjectExplorer::RunConfiguration *rc); - - void buildConfigurationAdded(ProjectExplorer::BuildConfiguration *bc); - void buildConfigurationRemoved(ProjectExplorer::BuildConfiguration *bc); - void buildConfigurationChanged(ProjectExplorer::BuildConfiguration *bc); + void systemChanged(); void environmentChanged(); // needed to check for qt version void deviceConfigurationChanged(ProjectExplorer::Target *target); @@ -117,7 +110,6 @@ private: QtSupport::BaseQtVersion **qtVersion = 0); void notify(const QList<int> uniqueIds); - void toggleDeviceConnections(RemoteLinux::RemoteLinuxRunConfiguration *mrc, bool connect); void showOrHideQemuButton(); private: diff --git a/src/plugins/madde/maemoqtversion.cpp b/src/plugins/madde/maemoqtversion.cpp index 074dfac6fb..255bee8911 100644 --- a/src/plugins/madde/maemoqtversion.cpp +++ b/src/plugins/madde/maemoqtversion.cpp @@ -34,6 +34,7 @@ #include "maemoconstants.h" #include "maemoglobal.h" +#include <projectexplorer/profileinformation.h> #include <qt4projectmanager/qt4projectmanagerconstants.h> #include <qtsupport/qtsupportconstants.h> @@ -97,28 +98,6 @@ MaemoQtVersion *MaemoQtVersion::clone() const return new MaemoQtVersion(*this); } -QString MaemoQtVersion::systemRoot() const -{ - if (m_systemRoot.isNull()) { - QFile file(QDir::cleanPath(MaemoGlobal::targetRoot(qmakeCommand().toString())) - + QLatin1String("/information")); - if (file.exists() && file.open(QIODevice::ReadOnly | QIODevice::Text)) { - QTextStream stream(&file); - while (!stream.atEnd()) { - const QString &line = stream.readLine().trimmed(); - const QStringList &list = line.split(QLatin1Char(' ')); - if (list.count() <= 1) - continue; - if (list.at(0) == QLatin1String("sysroot")) { - m_systemRoot = MaemoGlobal::maddeRoot(qmakeCommand().toString()) - + QLatin1String("/sysroots/") + list.at(1); - } - } - } - } - return m_systemRoot; -} - QList<ProjectExplorer::Abi> MaemoQtVersion::detectQtAbis() const { QList<ProjectExplorer::Abi> result; @@ -141,26 +120,6 @@ QList<ProjectExplorer::Abi> MaemoQtVersion::detectQtAbis() const return result; } -bool MaemoQtVersion::supportsTargetId(const Core::Id id) const -{ - return supportedTargetIds().contains(id); -} - -QSet<Core::Id> MaemoQtVersion::supportedTargetIds() const -{ - QSet<Core::Id> result; - if (!isValid()) - return result; - if (m_deviceType == Core::Id(Maemo5OsType)) { - result.insert(Core::Id(Constants::MAEMO5_DEVICE_TARGET_ID)); - } else if (m_deviceType == Core::Id(HarmattanOsType)) { - result.insert(Core::Id(Constants::HARMATTAN_DEVICE_TARGET_ID)); - } else if (m_deviceType == Core::Id(MeeGoOsType)) { - result.insert(Core::Id(Constants::MEEGO_DEVICE_TARGET_ID)); - } - return result; -} - QString MaemoQtVersion::description() const { if (m_deviceType == Core::Id(Maemo5OsType)) @@ -200,20 +159,30 @@ Core::FeatureSet MaemoQtVersion::availableFeatures() const QString MaemoQtVersion::platformName() const { + if (m_deviceType == Maemo5OsType) + return QLatin1String(QtSupport::Constants::MAEMO_FREMANTLE_PLATFORM); + if (m_deviceType == MeeGoOsType) + return QLatin1String(QtSupport::Constants::MEEGO_PLATFORM); return QLatin1String(QtSupport::Constants::MEEGO_HARMATTAN_PLATFORM); } QString MaemoQtVersion::platformDisplayName() const { + if (m_deviceType == Maemo5OsType) + return QLatin1String(QtSupport::Constants::MAEMO_FREMANTLE_PLATFORM_TR); + if (m_deviceType == MeeGoOsType) + return QLatin1String(QtSupport::Constants::MEEGO_PLATFORM_TR); return QLatin1String(QtSupport::Constants::MEEGO_HARMATTAN_PLATFORM_TR); } -void MaemoQtVersion::addToEnvironment(Utils::Environment &env) const +void MaemoQtVersion::addToEnvironment(const ProjectExplorer::Profile *p, Utils::Environment &env) const { + Q_UNUSED(p); const QString maddeRoot = MaemoGlobal::maddeRoot(qmakeCommand().toString()); // Needed to make pkg-config stuff work. - env.prependOrSet(QLatin1String("SYSROOT_DIR"), QDir::toNativeSeparators(systemRoot())); + Utils::FileName sysRoot = ProjectExplorer::SysRootProfileInformation::sysRoot(p); + env.prependOrSet(QLatin1String("SYSROOT_DIR"), sysRoot.toUserOutput()); env.prependOrSetPath(QDir::toNativeSeparators(QString("%1/madbin") .arg(maddeRoot))); env.prependOrSetPath(QDir::toNativeSeparators(QString("%1/madlib") @@ -224,6 +193,14 @@ void MaemoQtVersion::addToEnvironment(Utils::Environment &env) const env.prependOrSetPath(QDir::toNativeSeparators(QString("%1/bin").arg(maddeRoot))); env.prependOrSetPath(QDir::toNativeSeparators(QString("%1/bin") .arg(MaemoGlobal::targetRoot(qmakeCommand().toString())))); + + // Actually this is tool chain related, but since we no longer have a tool chain... + const QString manglePathsKey = QLatin1String("GCCWRAPPER_PATHMANGLE"); + if (!env.hasKey(manglePathsKey)) { + const QStringList pathsToMangle = QStringList() << QLatin1String("/lib") + << QLatin1String("/opt") << QLatin1String("/usr"); + env.set(manglePathsKey, pathsToMangle.join(QLatin1String(":"))); + } } } // namespace Internal diff --git a/src/plugins/madde/maemoqtversion.h b/src/plugins/madde/maemoqtversion.h index 6dca217891..d78b47114e 100644 --- a/src/plugins/madde/maemoqtversion.h +++ b/src/plugins/madde/maemoqtversion.h @@ -49,12 +49,9 @@ public: QString type() const; bool isValid() const; - QString systemRoot() const; - QList<ProjectExplorer::Abi> detectQtAbis() const; - void addToEnvironment(Utils::Environment &env) const; - bool supportsTargetId(const Core::Id id) const; - QSet<Core::Id> supportedTargetIds() const; + QList<ProjectExplorer::Abi> detectQtAbis() const; + void addToEnvironment(const ProjectExplorer::Profile *p, Utils::Environment &env) const; QString description() const; diff --git a/src/plugins/madde/maemoremotemounter.cpp b/src/plugins/madde/maemoremotemounter.cpp index acc313a046..9aa09fc7c9 100644 --- a/src/plugins/madde/maemoremotemounter.cpp +++ b/src/plugins/madde/maemoremotemounter.cpp @@ -33,8 +33,10 @@ #include "maemoremotemounter.h" #include "maemoglobal.h" -#include "qt4maemotarget.h" +#include "maddedevice.h" +#include <projectexplorer/profileinformation.h> +#include <projectexplorer/target.h> #include <ssh/sshconnection.h> #include <ssh/sshremoteprocess.h> #include <qt4projectmanager/qt4buildconfiguration.h> @@ -79,11 +81,9 @@ void MaemoRemoteMounter::setBuildConfiguration(const Qt4BuildConfiguration *bc) { QTC_ASSERT(m_state == Inactive, return); - const QtSupport::BaseQtVersion * const qtVersion = bc->qtVersion(); - const AbstractQt4MaemoTarget * const maemoTarget - = qobject_cast<AbstractQt4MaemoTarget *>(bc->target()); - m_remoteMountsAllowed = maemoTarget && maemoTarget->allowsRemoteMounts(); - m_maddeRoot = qtVersion ? MaemoGlobal::maddeRoot(qtVersion->qmakeCommand().toString()) : QString(); + Core::Id typeId = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(bc->target()->profile()); + m_remoteMountsAllowed = MaddeDevice::allowsRemoteMounts(typeId); + m_maddeRoot = ProjectExplorer::SysRootProfileInformation::sysRoot(bc->target()->profile()); } void MaemoRemoteMounter::addMountSpecification(const MaemoMountSpecification &mountSpec, @@ -297,7 +297,7 @@ void MaemoRemoteMounter::startUtfsServers() connect(utfsServerProc.data(), SIGNAL(readyReadStandardError()), this, SLOT(handleUtfsServerStderr())); m_utfsServers << utfsServerProc; - utfsServerProc->start(utfsServer(), utfsServerArgs); + utfsServerProc->start(utfsServer().toString(), utfsServerArgs); } setState(UtfsServersStarted); @@ -342,9 +342,10 @@ QString MaemoRemoteMounter::utfsClientOnDevice() const return QLatin1String("/usr/lib/mad-developer/utfs-client"); } -QString MaemoRemoteMounter::utfsServer() const +Utils::FileName MaemoRemoteMounter::utfsServer() const { - return m_maddeRoot + QLatin1String("/madlib/utfs-server"); + Utils::FileName result = m_maddeRoot; + return result.appendPath(QLatin1String("madlib/utfs-server")); } void MaemoRemoteMounter::killAllUtfsServers() diff --git a/src/plugins/madde/maemoremotemounter.h b/src/plugins/madde/maemoremotemounter.h index 111e1fb60c..2f5524d3ef 100644 --- a/src/plugins/madde/maemoremotemounter.h +++ b/src/plugins/madde/maemoremotemounter.h @@ -35,6 +35,8 @@ #include "maemomountspecification.h" +#include <utils/fileutils.h> + #include <QList> #include <QObject> #include <QProcess> @@ -111,7 +113,7 @@ private: void killUtfsServer(QProcess *proc); void killAllUtfsServers(); QString utfsClientOnDevice() const; - QString utfsServer() const; + Utils::FileName utfsServer() const; QTimer * const m_utfsServerTimer; @@ -135,7 +137,7 @@ private: Utils::PortList *m_freePorts; const RemoteLinux::RemoteLinuxUsedPortsGatherer *m_portsGatherer; bool m_remoteMountsAllowed; - QString m_maddeRoot; + Utils::FileName m_maddeRoot; State m_state; }; diff --git a/src/plugins/madde/maemorunconfiguration.cpp b/src/plugins/madde/maemorunconfiguration.cpp index d548b49735..a90df58b61 100644 --- a/src/plugins/madde/maemorunconfiguration.cpp +++ b/src/plugins/madde/maemorunconfiguration.cpp @@ -30,7 +30,7 @@ **************************************************************************/ #include "maemorunconfiguration.h" -#include "qt4maemotarget.h" +#include "maddedevice.h" #include "maemoconstants.h" #include "maemoglobal.h" #include "maemoremotemountsmodel.h" @@ -40,7 +40,9 @@ #include <debugger/debuggerconstants.h> #include <projectexplorer/project.h> #include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/target.h> #include <qt4projectmanager/qt4buildconfiguration.h> +#include <qtsupport/qtprofileinformation.h> #include <utils/portlist.h> #include <ssh/sshconnection.h> @@ -54,14 +56,14 @@ using namespace RemoteLinux; namespace Madde { namespace Internal { -MaemoRunConfiguration::MaemoRunConfiguration(AbstractQt4MaemoTarget *parent, +MaemoRunConfiguration::MaemoRunConfiguration(Target *parent, Core::Id id, const QString &proFilePath) - : RemoteLinuxRunConfiguration(parent, Id, proFilePath) + : RemoteLinuxRunConfiguration(parent, id, proFilePath) { init(); } -MaemoRunConfiguration::MaemoRunConfiguration(AbstractQt4MaemoTarget *parent, +MaemoRunConfiguration::MaemoRunConfiguration(Target *parent, MaemoRunConfiguration *source) : RemoteLinuxRunConfiguration(parent, source) { @@ -79,7 +81,7 @@ void MaemoRunConfiguration::init() SLOT(handleRemoteMountsChanged())); connect(m_remoteMounts, SIGNAL(modelReset()), SLOT(handleRemoteMountsChanged())); - if (!maemoTarget()->allowsQmlDebugging()) + if (DeviceTypeProfileInformation::deviceTypeId(target()->profile()) != Core::Id(HarmattanOsType)) debuggerAspect()->suppressQmlDebuggingOptions(); } @@ -121,11 +123,14 @@ QString MaemoRunConfiguration::environmentPreparationCommand() const QString MaemoRunConfiguration::commandPrefix() const { - if (!deviceConfig()) + LinuxDeviceConfiguration::ConstPtr dev = + ProjectExplorer::DeviceProfileInformation::device(target()->profile()) + .dynamicCast<const LinuxDeviceConfiguration>(); + if (!dev) return QString(); QString prefix = environmentPreparationCommand() + QLatin1Char(';'); - if (deviceConfig()->type() == Core::Id(MeeGoOsType)) + if (dev->type() == Core::Id(MeeGoOsType)) prefix += QLatin1String("DISPLAY=:0.0 "); return QString::fromLatin1("%1 %2").arg(prefix, userEnvironmentChangesAsString()); @@ -133,10 +138,9 @@ QString MaemoRunConfiguration::commandPrefix() const Utils::PortList MaemoRunConfiguration::freePorts() const { - const Qt4BuildConfiguration * const bc = activeQt4BuildConfiguration(); - return bc && deployConfig() - ? MaemoGlobal::freePorts(deployConfig()->deviceConfiguration(), bc->qtVersion()) - : Utils::PortList(); + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(target()->profile()); + return MaemoGlobal::freePorts(ProjectExplorer::DeviceProfileInformation::device(target()->profile()) + .staticCast<const LinuxDeviceConfiguration>(), version); } QString MaemoRunConfiguration::localDirToMountForRemoteGdb() const @@ -160,7 +164,7 @@ QString MaemoRunConfiguration::localDirToMountForRemoteGdb() const QString MaemoRunConfiguration::remoteProjectSourcesMountPoint() const { - return MaemoGlobal::homeDirOnDevice(deviceConfig()->sshParameters().userName) + return MaemoGlobal::homeDirOnDevice(ProjectExplorer::DeviceProfileInformation::device(target()->profile())->sshParameters().userName) + QLatin1String("/gdbSourcesDir_") + QFileInfo(localExecutableFilePath()).fileName(); } @@ -168,7 +172,8 @@ QString MaemoRunConfiguration::remoteProjectSourcesMountPoint() const bool MaemoRunConfiguration::hasEnoughFreePorts(RunMode mode) const { const int freePortCount = freePorts().count(); - const bool remoteMountsAllowed = maemoTarget()->allowsRemoteMounts(); + Core::Id typeId = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(target()->profile()); + const bool remoteMountsAllowed = MaddeDevice::allowsRemoteMounts(typeId); const int mountDirCount = remoteMountsAllowed ? remoteMounts()->validMountSpecificationCount() : 0; if (mode == DebugRunMode || mode == DebugRunModeWithBreakOnMain) @@ -184,15 +189,5 @@ void MaemoRunConfiguration::handleRemoteMountsChanged() updateEnabledState(); } -const AbstractQt4MaemoTarget *MaemoRunConfiguration::maemoTarget() const -{ - const AbstractQt4MaemoTarget * const maemoTarget - = qobject_cast<AbstractQt4MaemoTarget *>(target()); - Q_ASSERT(maemoTarget); - return maemoTarget; -} - -const Core::Id MaemoRunConfiguration::Id = Core::Id(MAEMO_RC_ID); - } // namespace Internal } // namespace Madde diff --git a/src/plugins/madde/maemorunconfiguration.h b/src/plugins/madde/maemorunconfiguration.h index 49da9f8a4e..7db2c80576 100644 --- a/src/plugins/madde/maemorunconfiguration.h +++ b/src/plugins/madde/maemorunconfiguration.h @@ -35,7 +35,6 @@ namespace Madde { namespace Internal { -class AbstractQt4MaemoTarget; class MaemoRemoteMountsModel; class MaemoRunConfiguration : public RemoteLinux::RemoteLinuxRunConfiguration @@ -43,8 +42,8 @@ class MaemoRunConfiguration : public RemoteLinux::RemoteLinuxRunConfiguration Q_OBJECT public: - MaemoRunConfiguration(AbstractQt4MaemoTarget *parent, const QString &proFilePath); - MaemoRunConfiguration(AbstractQt4MaemoTarget *parent, MaemoRunConfiguration *source); + MaemoRunConfiguration(ProjectExplorer::Target *parent, Core::Id id, const QString &proFilePath); + MaemoRunConfiguration(ProjectExplorer::Target *parent, MaemoRunConfiguration *source); QVariantMap toMap() const; bool fromMap(const QVariantMap &map); @@ -59,8 +58,6 @@ public: QString localDirToMountForRemoteGdb() const; QString remoteProjectSourcesMountPoint() const; - static const Core::Id Id; - signals: void remoteMountsChanged(); @@ -69,7 +66,6 @@ private slots: private: void init(); - const AbstractQt4MaemoTarget *maemoTarget() const; MaemoRemoteMountsModel *m_remoteMounts; }; diff --git a/src/plugins/madde/maemorunconfigurationwidget.cpp b/src/plugins/madde/maemorunconfigurationwidget.cpp index 137f19d479..093143451b 100644 --- a/src/plugins/madde/maemorunconfigurationwidget.cpp +++ b/src/plugins/madde/maemorunconfigurationwidget.cpp @@ -31,16 +31,17 @@ #include "maemorunconfigurationwidget.h" +#include "maddedevice.h" #include "maemoglobal.h" #include "maemoremotemountsmodel.h" #include "maemorunconfiguration.h" -#include "qt4maemotarget.h" #include <coreplugin/coreconstants.h> #include <coreplugin/icore.h> #include <projectexplorer/environmentwidget.h> +#include <projectexplorer/profileinformation.h> +#include <projectexplorer/target.h> #include <qt4projectmanager/qt4buildconfiguration.h> -#include <qt4projectmanager/qt4target.h> #include <remotelinux/remotelinuxrunconfigurationwidget.h> #include <utils/detailswidget.h> @@ -83,15 +84,13 @@ MaemoRunConfigurationWidget::MaemoRunConfigurationWidget( QVBoxLayout *subLayout = new QVBoxLayout(m_subWidget); subLayout->setMargin(0); addMountWidgets(subLayout); - connect(m_runConfiguration, SIGNAL(deviceConfigurationChanged(ProjectExplorer::Target*)), - this, SLOT(updateMountWarning())); + connect(m_runConfiguration->target(), SIGNAL(profileChanged()), this, SLOT(updateMountWarning())); connect(m_runConfiguration->debuggerAspect(), SIGNAL(debuggersChanged()), SLOT(updateMountWarning())); updateMountWarning(); - const AbstractQt4MaemoTarget * const maemoTarget - = qobject_cast<AbstractQt4MaemoTarget *>(runConfiguration->target()); - m_mountDetailsContainer->setVisible(maemoTarget->allowsRemoteMounts()); + Core::Id devId = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(runConfiguration->target()->profile()); + m_mountDetailsContainer->setVisible(MaddeDevice::allowsRemoteMounts(devId)); connect(m_runConfiguration, SIGNAL(enabledChanged()), this, SLOT(runConfigurationEnabledChange())); diff --git a/src/plugins/madde/maemorunfactories.cpp b/src/plugins/madde/maemorunfactories.cpp index d10ca6ea67..0d4ab92189 100644 --- a/src/plugins/madde/maemorunfactories.cpp +++ b/src/plugins/madde/maemorunfactories.cpp @@ -35,15 +35,17 @@ #include "maemoremotemountsmodel.h" #include "maemorunconfiguration.h" #include "maemoruncontrol.h" -#include "maemotoolchain.h" -#include "qt4maemotarget.h" #include <debugger/debuggerconstants.h> #include <debugger/debuggerstartparameters.h> #include <debugger/debuggerplugin.h> #include <debugger/debuggerrunner.h> #include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/profileinformation.h> +#include <projectexplorer/target.h> +#include <qt4projectmanager/qt4nodes.h> #include <qt4projectmanager/qt4project.h> +#include <qtsupport/customexecutablerunconfiguration.h> using namespace Debugger; using namespace ProjectExplorer; @@ -57,7 +59,7 @@ namespace { QString pathFromId(Core::Id id) { - QString idStr = QString::fromUtf8(id.name()); + QString idStr = id.toString(); const QString prefix = QLatin1String(MAEMO_RC_ID_PREFIX); if (!idStr.startsWith(prefix)) return QString(); @@ -67,9 +69,8 @@ QString pathFromId(Core::Id id) } // namespace MaemoRunConfigurationFactory::MaemoRunConfigurationFactory(QObject *parent) - : IRunConfigurationFactory(parent) -{ -} + : QmakeRunConfigurationFactory(parent) +{ setObjectName(QLatin1String("MaemoRunConfigurationFactory")); } MaemoRunConfigurationFactory::~MaemoRunConfigurationFactory() { @@ -77,35 +78,37 @@ MaemoRunConfigurationFactory::~MaemoRunConfigurationFactory() bool MaemoRunConfigurationFactory::canCreate(Target *parent, const Core::Id id) const { - return qobject_cast<Qt4BaseTarget *>(parent)->qt4Project() - ->hasApplicationProFile(pathFromId(id)); + if (!canHandle(parent)) + return false; + return static_cast<Qt4Project *>(parent->project())->hasApplicationProFile(pathFromId(id)); } bool MaemoRunConfigurationFactory::canRestore(Target *parent, const QVariantMap &map) const { - Q_UNUSED(parent); - return qobject_cast<AbstractQt4MaemoTarget *>(parent) - && QString::fromUtf8(ProjectExplorer::idFromMap(map).name()).startsWith(QLatin1String(MAEMO_RC_ID)); + return canHandle(parent) + && ProjectExplorer::idFromMap(map).toString().startsWith(QLatin1String(MAEMO_RC_ID_PREFIX)); } bool MaemoRunConfigurationFactory::canClone(Target *parent, RunConfiguration *source) const { + if (!canHandle(parent)) + return false; const RemoteLinuxRunConfiguration * const rlrc = qobject_cast<RemoteLinuxRunConfiguration *>(source); QString idStr = QString::fromLatin1(source->id().name()) + QLatin1Char('.') + rlrc->proFilePath(); - return rlrc && canCreate(parent, Core::Id(idStr.toUtf8().constData())); + return rlrc && canCreate(parent, Core::Id(idStr)); } QList<Core::Id> MaemoRunConfigurationFactory::availableCreationIds(Target *parent) const { QList<Core::Id> result; - if (AbstractQt4MaemoTarget *t = qobject_cast<AbstractQt4MaemoTarget *>(parent)) { - QStringList proFiles = t->qt4Project()->applicationProFilePathes(QLatin1String(MAEMO_RC_ID_PREFIX)); - foreach (const QString &pf, proFiles) - result << Core::Id(pf.toUtf8().constData()); - } + if (!canHandle(parent)) + return result; + QStringList proFiles = static_cast<Qt4Project *>(parent->project())->applicationProFilePathes(QLatin1String(MAEMO_RC_ID_PREFIX)); + foreach (const QString &pf, proFiles) + result << Core::Id(pf); return result; } @@ -119,8 +122,7 @@ RunConfiguration *MaemoRunConfigurationFactory::create(Target *parent, const Cor { if (!canCreate(parent, id)) return 0; - return new MaemoRunConfiguration(qobject_cast<AbstractQt4MaemoTarget *>(parent), - pathFromId(id)); + return new MaemoRunConfiguration(parent, id, pathFromId(id)); } RunConfiguration *MaemoRunConfigurationFactory::restore(Target *parent, @@ -128,8 +130,10 @@ RunConfiguration *MaemoRunConfigurationFactory::restore(Target *parent, { if (!canRestore(parent, map)) return 0; + + Core::Id id = ProjectExplorer::idFromMap(map); MaemoRunConfiguration *rc - = new MaemoRunConfiguration(qobject_cast<AbstractQt4MaemoTarget *>(parent), QString()); + = new MaemoRunConfiguration(parent, id, pathFromId(id)); if (rc->fromMap(map)) return rc; @@ -143,7 +147,28 @@ RunConfiguration *MaemoRunConfigurationFactory::clone(Target *parent, RunConfigu return 0; MaemoRunConfiguration *old = static_cast<MaemoRunConfiguration *>(source); - return new MaemoRunConfiguration(static_cast<AbstractQt4MaemoTarget *>(parent), old); + return new MaemoRunConfiguration(parent, old); +} + +bool MaemoRunConfigurationFactory::canHandle(Target *t) const +{ + if (!t->project()->supportsProfile(t->profile())) + return false; + if (!qobject_cast<Qt4Project *>(t->project())) + return false; + Core::Id devType = DeviceTypeProfileInformation::deviceTypeId(t->profile()); + return devType == Core::Id(Maemo5OsType) || devType == Core::Id(HarmattanOsType) + || devType == Core::Id(MeeGoOsType); +} + +QList<RunConfiguration *> MaemoRunConfigurationFactory::runConfigurationsForNode(Target *t, Node *n) +{ + QList<ProjectExplorer::RunConfiguration *> result; + foreach (ProjectExplorer::RunConfiguration *rc, t->runConfigurations()) + if (MaemoRunConfiguration *mrc = qobject_cast<MaemoRunConfiguration *>(rc)) + if (mrc->proFilePath() == n->path()) + result << rc; + return result; } // #pragma mark -- MaemoRunControlFactory diff --git a/src/plugins/madde/maemorunfactories.h b/src/plugins/madde/maemorunfactories.h index 797bacc6da..e6e4d0044c 100644 --- a/src/plugins/madde/maemorunfactories.h +++ b/src/plugins/madde/maemorunfactories.h @@ -32,13 +32,13 @@ #ifndef MAEMORUNFACTORIES_H #define MAEMORUNFACTORIES_H -#include <projectexplorer/runconfiguration.h> +#include <qt4projectmanager/qmakerunconfigurationfactory.h> namespace ProjectExplorer { - class RunConfiguration; - class RunControl; - class Target; -} +class RunControl; +class Target; +} // namespace ProjectExplorer + using ProjectExplorer::IRunConfigurationFactory; using ProjectExplorer::IRunControlFactory; using ProjectExplorer::RunConfiguration; @@ -49,7 +49,7 @@ using ProjectExplorer::Target; namespace Madde { namespace Internal { -class MaemoRunConfigurationFactory : public IRunConfigurationFactory +class MaemoRunConfigurationFactory : public Qt4ProjectManager::QmakeRunConfigurationFactory { Q_OBJECT @@ -68,6 +68,10 @@ public: bool canClone(Target *parent, RunConfiguration *source) const; RunConfiguration *clone(Target *parent, RunConfiguration *source); + + bool canHandle(ProjectExplorer::Target *t) const; + QList<ProjectExplorer::RunConfiguration *> runConfigurationsForNode(ProjectExplorer::Target *t, + ProjectExplorer::Node *n); }; class MaemoRunControlFactory : public IRunControlFactory diff --git a/src/plugins/madde/maemosshrunner.cpp b/src/plugins/madde/maemosshrunner.cpp index 5d29a169fb..15a35269b9 100644 --- a/src/plugins/madde/maemosshrunner.cpp +++ b/src/plugins/madde/maemosshrunner.cpp @@ -35,7 +35,9 @@ #include "maemoremotemountsmodel.h" #include "maemorunconfiguration.h" +#include <projectexplorer/target.h> #include <qt4projectmanager/qt4buildconfiguration.h> +#include <qtsupport/qtprofileinformation.h> #include <remotelinux/linuxdeviceconfiguration.h> #include <utils/qtcassert.h> #include <ssh/sshconnection.h> @@ -54,7 +56,7 @@ MaemoSshRunner::MaemoSshRunner(QObject *parent, MaemoRunConfiguration *runConfig m_mountState(InactiveMountState) { const Qt4BuildConfiguration * const bc = runConfig->activeQt4BuildConfiguration(); - m_qtId = bc && bc->qtVersion() ? bc->qtVersion()->uniqueId() : -1; + m_qtId = bc ? QtSupport::QtProfileInformation::qtVersionId(bc->target()->profile()) : -1; m_mounter->setBuildConfiguration(bc); connect(m_mounter, SIGNAL(mounted()), this, SLOT(handleMounted())); connect(m_mounter, SIGNAL(unmounted()), this, SLOT(handleUnmounted())); diff --git a/src/plugins/madde/maemotoolchain.cpp b/src/plugins/madde/maemotoolchain.cpp deleted file mode 100644 index 848198199f..0000000000 --- a/src/plugins/madde/maemotoolchain.cpp +++ /dev/null @@ -1,323 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. -** -**************************************************************************/ - -#include "maemotoolchain.h" - -#include "maemoglobal.h" -#include "maemoqtversion.h" - -#include <projectexplorer/gccparser.h> -#include <projectexplorer/headerpath.h> -#include <projectexplorer/toolchainmanager.h> -#include <qt4projectmanager/qt4projectmanagerconstants.h> -#include <utils/environment.h> -#include <qtsupport/qtversionmanager.h> - -#include <QDir> -#include <QFileInfo> -#include <QLabel> -#include <QVBoxLayout> - -using namespace Qt4ProjectManager; - -namespace Madde { -namespace Internal { - -static const char *const MAEMO_QT_VERSION_KEY = "Qt4ProjectManager.Maemo.QtVersion"; - -// -------------------------------------------------------------------------- -// MaemoToolChain -// -------------------------------------------------------------------------- - -MaemoToolChain::MaemoToolChain(bool autodetected) : - ProjectExplorer::GccToolChain(QLatin1String(Constants::MAEMO_TOOLCHAIN_ID), autodetected), - m_qtVersionId(-1) -{ - setQtVersionId(-1); -} - -MaemoToolChain::MaemoToolChain(const MaemoToolChain &tc) : - ProjectExplorer::GccToolChain(tc) -{ - setQtVersionId(tc.m_qtVersionId); -} - -MaemoToolChain::~MaemoToolChain() -{ } - -QString MaemoToolChain::type() const -{ - return QLatin1String("maemogcc"); -} - -QString MaemoToolChain::typeDisplayName() const -{ - return MaemoToolChainFactory::tr("Maemo GCC"); -} - -bool MaemoToolChain::isValid() const -{ - return GccToolChain::isValid() && m_qtVersionId >= 0 && targetAbi().isValid(); -} - -bool MaemoToolChain::canClone() const -{ - return false; -} - -void MaemoToolChain::addToEnvironment(Utils::Environment &env) const -{ - const QString manglePathsKey = QLatin1String("GCCWRAPPER_PATHMANGLE"); - if (!env.hasKey(manglePathsKey)) { - const QStringList pathsToMangle = QStringList() << QLatin1String("/lib") - << QLatin1String("/opt") << QLatin1String("/usr"); - env.set(manglePathsKey, QString()); - foreach (const QString &path, pathsToMangle) - env.appendOrSet(manglePathsKey, path, QLatin1String(":")); - } -} - -bool MaemoToolChain::operator ==(const ProjectExplorer::ToolChain &tc) const -{ - if (!ToolChain::operator ==(tc)) - return false; - - const MaemoToolChain *tcPtr = static_cast<const MaemoToolChain *>(&tc); - return m_qtVersionId == tcPtr->m_qtVersionId; -} - -ProjectExplorer::ToolChainConfigWidget *MaemoToolChain::configurationWidget() -{ - return new MaemoToolChainConfigWidget(this); -} - -QVariantMap MaemoToolChain::toMap() const -{ - QVariantMap result = GccToolChain::toMap(); - result.insert(QLatin1String(MAEMO_QT_VERSION_KEY), m_qtVersionId); - return result; -} - -bool MaemoToolChain::fromMap(const QVariantMap &data) -{ - if (!GccToolChain::fromMap(data)) - return false; - - m_qtVersionId = data.value(QLatin1String(MAEMO_QT_VERSION_KEY), -1).toInt(); - - return isValid(); -} - -void MaemoToolChain::setQtVersionId(int id) -{ - if (id < 0) { - setTargetAbi(ProjectExplorer::Abi()); - m_qtVersionId = -1; - toolChainUpdated(); - return; - } - - MaemoQtVersion *version = dynamic_cast<MaemoQtVersion *>(QtSupport::QtVersionManager::instance()->version(id)); - Q_ASSERT(version); - if (!version->isValid()) - return; - Q_ASSERT(version->qtAbis().count() == 1); - - m_qtVersionId = id; - setTargetAbi(version->qtAbis().at(0)); - - toolChainUpdated(); - - setDisplayName(MaemoToolChainFactory::tr("Maemo GCC for %1").arg(version->displayName())); -} - -int MaemoToolChain::qtVersionId() const -{ - return m_qtVersionId; -} - -QString MaemoToolChain::legacyId() const -{ - return QString::fromLatin1("%1:%2.%3").arg(Constants::MAEMO_TOOLCHAIN_ID) - .arg(m_qtVersionId) - .arg(debuggerCommand().toString()); -} - -QList<ProjectExplorer::Abi> MaemoToolChain::detectSupportedAbis() const -{ - if (m_qtVersionId < 0) - return QList<ProjectExplorer::Abi>(); - - MaemoQtVersion *mqv = dynamic_cast<MaemoQtVersion *>(QtSupport::QtVersionManager::instance()->version(m_qtVersionId)); - if (!mqv) - return QList<ProjectExplorer::Abi>(); - - return mqv->qtAbis(); -} - -// -------------------------------------------------------------------------- -// MaemoToolChainConfigWidget -// -------------------------------------------------------------------------- - -MaemoToolChainConfigWidget::MaemoToolChainConfigWidget(MaemoToolChain *tc) : - ProjectExplorer::ToolChainConfigWidget(tc) -{ - QVBoxLayout *layout = new QVBoxLayout(this); - QLabel *label = new QLabel; - QtSupport::BaseQtVersion *v = QtSupport::QtVersionManager::instance()->version(tc->qtVersionId()); - Q_ASSERT(v); - label->setText(tr("<html><head/><body><table>" - "<tr><td>Path to MADDE:</td><td>%1</td></tr>" - "<tr><td>Path to MADDE target:</td><td>%2</td></tr>" - "<tr><td>Debugger:</td/><td>%3</td></tr></body></html>") - .arg(QDir::toNativeSeparators(MaemoGlobal::maddeRoot(v->qmakeCommand().toString())), - QDir::toNativeSeparators(MaemoGlobal::targetRoot(v->qmakeCommand().toString())), - tc->debuggerCommand().toUserOutput())); - layout->addWidget(label); -} - -void MaemoToolChainConfigWidget::apply() -{ - // nothing to do! -} - -void MaemoToolChainConfigWidget::discard() -{ - // nothing to do! -} - -bool MaemoToolChainConfigWidget::isDirty() const -{ - return false; -} - -// -------------------------------------------------------------------------- -// MaemoToolChainFactory -// -------------------------------------------------------------------------- - -MaemoToolChainFactory::MaemoToolChainFactory() : - ProjectExplorer::ToolChainFactory() -{ } - -QString MaemoToolChainFactory::displayName() const -{ - return tr("Maemo GCC"); -} - -QString MaemoToolChainFactory::id() const -{ - return QLatin1String(Constants::MAEMO_TOOLCHAIN_ID); -} - -QList<ProjectExplorer::ToolChain *> MaemoToolChainFactory::autoDetect() -{ - QtSupport::QtVersionManager *vm = QtSupport::QtVersionManager::instance(); - connect(vm, SIGNAL(qtVersionsChanged(QList<int>,QList<int>,QList<int>)), - this, SLOT(handleQtVersionChanges(QList<int>,QList<int>,QList<int>))); - - QList<int> versionList; - foreach (QtSupport::BaseQtVersion *v, vm->versions()) - versionList.append(v->uniqueId()); - - return createToolChainList(versionList); -} - -bool MaemoToolChainFactory::canRestore(const QVariantMap &data) -{ - return idFromMap(data).startsWith(QLatin1String(Constants::MAEMO_TOOLCHAIN_ID) + QLatin1Char(':')); -} - -ProjectExplorer::ToolChain *MaemoToolChainFactory::restore(const QVariantMap &data) -{ - MaemoToolChain *tc = new MaemoToolChain(false); - if (tc->fromMap(data)) - return tc; - - delete tc; - return 0; -} - -void MaemoToolChainFactory::handleQtVersionChanges(const QList<int> &added, const QList<int> &removed, const QList<int> &changed) -{ - QList<int> changes; - changes << added << removed << changed; - ProjectExplorer::ToolChainManager *tcm = ProjectExplorer::ToolChainManager::instance(); - QList<ProjectExplorer::ToolChain *> tcList = createToolChainList(changes); - foreach (ProjectExplorer::ToolChain *tc, tcList) - tcm->registerToolChain(tc); -} - -QList<ProjectExplorer::ToolChain *> MaemoToolChainFactory::createToolChainList(const QList<int> &changes) -{ - ProjectExplorer::ToolChainManager *tcm = ProjectExplorer::ToolChainManager::instance(); - QtSupport::QtVersionManager *vm = QtSupport::QtVersionManager::instance(); - QList<ProjectExplorer::ToolChain *> result; - - foreach (int i, changes) { - QtSupport::BaseQtVersion *v = vm->version(i); - // remove tool chain (on removal, change or addition: - QList<ProjectExplorer::ToolChain *> toRemove; - foreach (ProjectExplorer::ToolChain *tc, tcm->toolChains()) { - if (!tc->id().startsWith(QLatin1String(Constants::MAEMO_TOOLCHAIN_ID))) - continue; - MaemoToolChain *mTc = static_cast<MaemoToolChain *>(tc); - if (mTc->qtVersionId() == i) - toRemove.append(mTc); - } - foreach (ProjectExplorer::ToolChain *tc, toRemove) - tcm->deregisterToolChain(tc); - - const MaemoQtVersion * const mqv = dynamic_cast<MaemoQtVersion *>(v); - if (!mqv || !mqv->isValid() || mqv->qtAbis().isEmpty()) - continue; - - // (Re-)add toolchain: - // add tool chain: - MaemoToolChain *mTc = new MaemoToolChain(true); - mTc->setQtVersionId(i); - QString target = "Maemo 5"; - if (v->supportsTargetId(Constants::HARMATTAN_DEVICE_TARGET_ID)) - target = "Maemo 6"; - else if (v->supportsTargetId(Constants::MEEGO_DEVICE_TARGET_ID)) - target = "Meego"; - mTc->setDisplayName(tr("%1 GCC (%2)").arg(target).arg(MaemoGlobal::maddeRoot(mqv->qmakeCommand().toString()))); - mTc->setCompilerCommand(Utils::FileName::fromString(MaemoGlobal::targetRoot(mqv->qmakeCommand().toString()) + QLatin1String("/bin/gcc"))); - mTc->setDebuggerCommand(ProjectExplorer::ToolChainManager::instance()->defaultDebugger(mqv->qtAbis().at(0))); - if (mTc->debuggerCommand().isEmpty()) - mTc->setDebuggerCommand(Utils::FileName::fromString(MaemoGlobal::targetRoot(mqv->qmakeCommand().toString()) + QLatin1String("/bin/gdb"))); - result.append(mTc); - } - return result; -} - -} // namespace Internal -} // namespace Madde diff --git a/src/plugins/madde/maemotoolchain.h b/src/plugins/madde/maemotoolchain.h deleted file mode 100644 index 845f124294..0000000000 --- a/src/plugins/madde/maemotoolchain.h +++ /dev/null @@ -1,127 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. -** -**************************************************************************/ - -#ifndef MAEMOTOOLCHAIN_H -#define MAEMOTOOLCHAIN_H - -#include <projectexplorer/gcctoolchain.h> -#include <projectexplorer/toolchainconfigwidget.h> - -namespace Madde { -namespace Internal { - -// -------------------------------------------------------------------------- -// MaemoToolChain -// -------------------------------------------------------------------------- - -class MaemoToolChain : public ProjectExplorer::GccToolChain -{ -public: - ~MaemoToolChain(); - - QString type() const; - QString typeDisplayName() const; - - bool isValid() const; - bool canClone() const; - - void addToEnvironment(Utils::Environment &env) const; - - bool operator ==(const ProjectExplorer::ToolChain &) const; - - ProjectExplorer::ToolChainConfigWidget *configurationWidget(); - - QVariantMap toMap() const; - bool fromMap(const QVariantMap &data); - - void setQtVersionId(int); - int qtVersionId() const; - - QString legacyId() const; - -protected: - QList<ProjectExplorer::Abi> detectSupportedAbis() const; - -private: - explicit MaemoToolChain(bool); - MaemoToolChain(const MaemoToolChain &); - - int m_qtVersionId; - mutable QString m_sysroot; - - friend class MaemoToolChainFactory; -}; - -// -------------------------------------------------------------------------- -// MaemoToolChainConfigWidget -// -------------------------------------------------------------------------- - -class MaemoToolChainConfigWidget : public ProjectExplorer::ToolChainConfigWidget -{ - Q_OBJECT - -public: - MaemoToolChainConfigWidget(MaemoToolChain *); - - void apply(); - void discard(); - bool isDirty() const; -}; - -// -------------------------------------------------------------------------- -// MaemoToolChainFactory -// -------------------------------------------------------------------------- - -class MaemoToolChainFactory : public ProjectExplorer::ToolChainFactory -{ - Q_OBJECT - -public: - MaemoToolChainFactory(); - - QString displayName() const; - QString id() const; - - QList<ProjectExplorer::ToolChain *> autoDetect(); - - bool canRestore(const QVariantMap &data); - ProjectExplorer::ToolChain *restore(const QVariantMap &data); - -private slots: - void handleQtVersionChanges(const QList<int> &added, const QList<int> &removed, const QList<int> &changed); - QList<ProjectExplorer::ToolChain *> createToolChainList(const QList<int> &changes); -}; - -} // namespace Internal -} // namespace Madde - -#endif // MAEMOTOOLCHAIN_H diff --git a/src/plugins/madde/qt4maemodeployconfiguration.cpp b/src/plugins/madde/qt4maemodeployconfiguration.cpp index cbc8f367c0..053b1bc9d5 100644 --- a/src/plugins/madde/qt4maemodeployconfiguration.cpp +++ b/src/plugins/madde/qt4maemodeployconfiguration.cpp @@ -31,16 +31,24 @@ **************************************************************************/ #include "qt4maemodeployconfiguration.h" +#include "debianmanager.h" #include "maddeuploadandinstallpackagesteps.h" #include "maemoconstants.h" #include "maemodeploybymountsteps.h" #include "maemodeployconfigurationwidget.h" +#include "maemoglobal.h" #include "maemoinstalltosysrootstep.h" #include "maemopackagecreationstep.h" -#include "qt4maemotarget.h" +#include "rpmmanager.h" +#include <coreplugin/icore.h> #include <projectexplorer/buildsteplist.h> -#include <qt4projectmanager/qt4target.h> +#include <projectexplorer/target.h> +#include <projectexplorer/projectexplorer.h> +#include <qt4projectmanager/qt4buildconfiguration.h> +#include <qt4projectmanager/qt4project.h> +#include <qtsupport/qtprofileinformation.h> +#include <qtsupport/qtsupportconstants.h> #include <remotelinux/deployablefile.h> #include <remotelinux/deployablefilesperprofile.h> #include <remotelinux/deploymentinfo.h> @@ -50,27 +58,30 @@ #include <QFileInfo> #include <QString> +#include <QMainWindow> +#include <QMessageBox> + using namespace ProjectExplorer; using namespace Qt4ProjectManager; using namespace RemoteLinux; -namespace Madde { -namespace Internal { namespace { const QString OldDeployConfigId = QLatin1String("2.2MaemoDeployConfig"); +const char DEPLOYMENT_ASSISTANT_SETTING[] = "RemoteLinux.DeploymentAssistant"; } // namespace +namespace Madde { +namespace Internal { + Qt4MaemoDeployConfiguration::Qt4MaemoDeployConfiguration(ProjectExplorer::Target *target, const Core::Id id, const QString &displayName) : RemoteLinuxDeployConfiguration(target, id, displayName) -{ -} +{ init(); } Qt4MaemoDeployConfiguration::Qt4MaemoDeployConfiguration(ProjectExplorer::Target *target, Qt4MaemoDeployConfiguration *source) : RemoteLinuxDeployConfiguration(target, source) -{ -} +{ init(); } QString Qt4MaemoDeployConfiguration::localDesktopFilePath(const DeployableFilesPerProFile *proFileInfo) const { @@ -112,21 +123,176 @@ Core::Id Qt4MaemoDeployConfiguration::meegoId() return Core::Id("DeployToMeego"); } +DeploymentSettingsAssistant *Qt4MaemoDeployConfiguration::deploymentSettingsAssistant() +{ + return static_cast<DeploymentSettingsAssistant *>(target()->project()->namedSettings(QLatin1String(DEPLOYMENT_ASSISTANT_SETTING)).value<QObject *>()); +} + +QString Qt4MaemoDeployConfiguration::qmakeScope() const +{ + Core::Id deviceType = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(target()->profile()); + + if (deviceType == Core::Id(Maemo5OsType)) + return QLatin1String("maemo5"); + else if (deviceType == Core::Id(HarmattanOsType)) + return QLatin1String("contains(MEEGO_EDITION,harmattan)"); + else if (deviceType == Core::Id(MeeGoOsType)) + return QLatin1String("!isEmpty(MEEGO_VERSION_MAJOR):!contains(MEEGO_EDITION,harmattan)"); + return QString("unix"); +} + +QString Qt4MaemoDeployConfiguration::installPrefix() const +{ + Core::Id deviceType = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(target()->profile()); + + if (deviceType == Core::Id(Maemo5OsType)) + return QLatin1String("/opt"); + else if (deviceType == Core::Id(HarmattanOsType)) + return QLatin1String("/opt"); + else if (deviceType == Core::Id(MeeGoOsType)) + return QLatin1String("/opt"); + return QString("unix"); +} + +void Qt4MaemoDeployConfiguration::debianDirChanged(const Utils::FileName &dir) +{ + if (dir == DebianManager::debianDirectory(target())) + emit packagingChanged(); +} + +void Qt4MaemoDeployConfiguration::setupPackaging() +{ + if (target()->project()->activeTarget() != target()) + return; + + disconnect(target()->project(), SIGNAL(fileListChanged()), this, SLOT(setupPackaging())); + + if (id() == Qt4MaemoDeployConfiguration::meegoId()) + ; + else + setupDebianPackaging(); +} + +void Qt4MaemoDeployConfiguration::setupDebianPackaging() +{ + Qt4BuildConfiguration *bc = qobject_cast<Qt4BuildConfiguration *>(target()->activeBuildConfiguration()); + if (!bc || !target()->profile()) + return; + + Utils::FileName debianDir = DebianManager::debianDirectory(target()); + Core::Id deviceType = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(target()->profile()); + DebianManager *dm = DebianManager::instance(); + QString projectName = target()->project()->displayName(); + + DebianManager::ActionStatus status = DebianManager::createTemplate(bc, debianDir); + + if (status == DebianManager::NoActionRequired || + status == DebianManager::ActionFailed) + return; + + if (!DebianManager::hasPackageManagerIcon(debianDir)) { + // Such a file is created by the mobile wizards. + Utils::FileName iconPath = Utils::FileName::fromString(target()->project()->projectDirectory()); + iconPath.appendPath(projectName + QLatin1String("64.png")); + if (iconPath.toFileInfo().exists()) + dm->setPackageManagerIcon(debianDir, deviceType, iconPath); + } + + + + dm->monitor(debianDir); + connect(dm, SIGNAL(debianDirectoryChanged(Utils::FileName)), this, SLOT(debianDirChanged(Utils::FileName))); + + // Set up aegis manifest on harmattan: + if (deviceType == Core::Id(HarmattanOsType)) { + Utils::FileName manifest = debianDir; + const QString manifestName = QLatin1String("manifest.aegis"); + manifest.appendPath(manifestName); + const QFile aegisFile(manifest.toString()); + if (!aegisFile.exists()) { + Utils::FileReader reader; + if (!reader.fetch(Core::ICore::resourcePath() + + QLatin1String("/templates/shared/") + manifestName)) { + qDebug("Reading manifest template failed."); + return; + } + QString content = QString::fromUtf8(reader.data()); + content.replace(QLatin1String("%%PROJECTNAME%%"), projectName); + Utils::FileSaver writer(aegisFile.fileName(), QIODevice::WriteOnly); + writer.write(content.toUtf8()); + if (!writer.finalize()) { + qDebug("Failure writing manifest file."); + return; + } + } + } + + emit packagingChanged(); + + // fix path: + QStringList files = DebianManager::debianFiles(debianDir); + Utils::FileName path = Utils::FileName::fromString(QDir(target()->project()->projectDirectory()) + .relativeFilePath(debianDir.toString())); + QStringList relativeFiles; + foreach (const QString &f, files) { + Utils::FileName fn = path; + fn.appendPath(f); + relativeFiles << fn.toString(); + } + + addFilesToProject(relativeFiles); +} + +void Qt4MaemoDeployConfiguration::addFilesToProject(const QStringList &files) +{ + if (files.isEmpty()) + return; + + const QString list = QLatin1String("<ul><li>") + files.join(QLatin1String("</li><li>")) + + QLatin1String("</li></ul>"); + QMessageBox::StandardButton button = + QMessageBox::question(Core::ICore::mainWindow(), + tr("Add Packaging Files to Project"), + tr("<html>Qt Creator has set up the following files to enable " + "packaging:\n %1\nDo you want to add them to the project?</html>") + .arg(list), QMessageBox::Yes | QMessageBox::No); + if (button == QMessageBox::Yes) + ProjectExplorer::ProjectExplorerPlugin::instance() + ->addExistingFiles(target()->project()->rootProjectNode(), files); +} + +void Qt4MaemoDeployConfiguration::init() +{ + // Make sure we have deploymentInfo, but create it only once: + DeploymentSettingsAssistant *assistant + = qobject_cast<DeploymentSettingsAssistant *>(target()->project()->namedSettings(QLatin1String(DEPLOYMENT_ASSISTANT_SETTING)).value<QObject *>()); + if (!assistant) { + assistant = new DeploymentSettingsAssistant(deploymentInfo(), static_cast<Qt4ProjectManager::Qt4Project *>(target()->project())); + QVariant data = QVariant::fromValue(static_cast<QObject *>(assistant)); + target()->project()->setNamedSettings(QLatin1String(DEPLOYMENT_ASSISTANT_SETTING), data); + } + + connect(target()->project(), SIGNAL(fileListChanged()), this, SLOT(setupPackaging())); +} + Qt4MaemoDeployConfigurationFactory::Qt4MaemoDeployConfigurationFactory(QObject *parent) : DeployConfigurationFactory(parent) -{ } +{ setObjectName(QLatin1String("Qt4MaemoDeployConfigurationFactory")); } QList<Core::Id> Qt4MaemoDeployConfigurationFactory::availableCreationIds(Target *parent) const { QList<Core::Id> ids; - if (qobject_cast<Qt4Maemo5Target *>(parent)) { + if (!qobject_cast<Qt4ProjectManager::Qt4Project *>(parent->project())) + return ids; + + Core::Id deviceType = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(parent->profile()); + if (deviceType == Core::Id(Maemo5OsType)) ids << Qt4MaemoDeployConfiguration::fremantleWithPackagingId() << Qt4MaemoDeployConfiguration::fremantleWithoutPackagingId(); - } else if (qobject_cast<Qt4HarmattanTarget *>(parent)) { + else if (deviceType == Core::Id(HarmattanOsType)) ids << Qt4MaemoDeployConfiguration::harmattanId(); - } else if (qobject_cast<Qt4MeegoTarget *>(parent)) { + else if (deviceType == Core::Id(MeeGoOsType)) ids << Qt4MaemoDeployConfiguration::meegoId(); - } return ids; } @@ -180,26 +346,25 @@ DeployConfiguration *Qt4MaemoDeployConfigurationFactory::create(Target *parent, return dc; } -bool Qt4MaemoDeployConfigurationFactory::canRestore(Target *parent, - const QVariantMap &map) const +bool Qt4MaemoDeployConfigurationFactory::canRestore(Target *parent, const QVariantMap &map) const { return canCreate(parent, idFromMap(map)) || (idFromMap(map) == Core::Id(OldDeployConfigId) - && qobject_cast<AbstractQt4MaemoTarget *>(parent)); + && MaemoGlobal::supportsMaemoDevice(parent->profile())); } -DeployConfiguration *Qt4MaemoDeployConfigurationFactory::restore(Target *parent, - const QVariantMap &map) +DeployConfiguration *Qt4MaemoDeployConfigurationFactory::restore(Target *parent, const QVariantMap &map) { if (!canRestore(parent, map)) return 0; Core::Id id = idFromMap(map); + Core::Id deviceType = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(parent->profile()); if (id == Core::Id(OldDeployConfigId)) { - if (qobject_cast<Qt4Maemo5Target *>(parent)) + if (deviceType == Core::Id(Maemo5OsType)) id = Qt4MaemoDeployConfiguration::fremantleWithPackagingId(); - else if (qobject_cast<Qt4HarmattanTarget *>(parent)) + else if (deviceType == Core::Id(HarmattanOsType)) id = Qt4MaemoDeployConfiguration::harmattanId(); - else if (qobject_cast<Qt4MeegoTarget *>(parent)) + else if (deviceType == Core::Id(MeeGoOsType)) id = Qt4MaemoDeployConfiguration::meegoId(); } Qt4MaemoDeployConfiguration * const dc diff --git a/src/plugins/madde/qt4maemodeployconfiguration.h b/src/plugins/madde/qt4maemodeployconfiguration.h index 299552bd84..4a809f06fc 100644 --- a/src/plugins/madde/qt4maemodeployconfiguration.h +++ b/src/plugins/madde/qt4maemodeployconfiguration.h @@ -33,12 +33,14 @@ #ifndef QT4PROJECTMANAGER_QT4DEPLOYCONFIGURATION_H #define QT4PROJECTMANAGER_QT4DEPLOYCONFIGURATION_H +#include <remotelinux/deploymentsettingsassistant.h> #include <remotelinux/remotelinuxdeployconfiguration.h> +#include <utils/fileutils.h> namespace RemoteLinux { class DeployableFilesPerProFile; class DeploymentSettingsAssistant; -} +} // namespace RemoteLinux namespace Madde { namespace Internal { @@ -78,7 +80,20 @@ public: static Core::Id harmattanId(); static Core::Id meegoId(); + RemoteLinux::DeploymentSettingsAssistant *deploymentSettingsAssistant(); + + QString qmakeScope() const; + QString installPrefix() const; + +private slots: + void debianDirChanged(const Utils::FileName &dir); + void setupPackaging(); + private: + void init(); + void setupDebianPackaging(); + void addFilesToProject(const QStringList &files); + friend class Internal::Qt4MaemoDeployConfigurationFactory; Qt4MaemoDeployConfiguration(ProjectExplorer::Target *target, const Core::Id id, diff --git a/src/plugins/madde/qt4maemotarget.cpp b/src/plugins/madde/qt4maemotarget.cpp deleted file mode 100644 index 6c5326a790..0000000000 --- a/src/plugins/madde/qt4maemotarget.cpp +++ /dev/null @@ -1,1271 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. -** -**************************************************************************/ - -#include "qt4maemotarget.h" - -#include "maemoconstants.h" -#include "maemoglobal.h" -#include "maemopackagecreationstep.h" -#include "maemorunconfiguration.h" -#include "maemotoolchain.h" -#include "qt4maemodeployconfiguration.h" - -#include <coreplugin/documentmanager.h> -#include <coreplugin/icore.h> -#include <coreplugin/iversioncontrol.h> -#include <coreplugin/vcsmanager.h> -#include <projectexplorer/abi.h> -#include <projectexplorer/projectexplorer.h> -#include <projectexplorer/projectnodes.h> -#include <projectexplorer/toolchain.h> -#include <qt4projectmanager/qt4project.h> -#include <qt4projectmanager/qt4buildconfiguration.h> -#include <qt4projectmanager/qt4nodes.h> -#include <qtsupport/baseqtversion.h> -#include <qtsupport/customexecutablerunconfiguration.h> -#include <remotelinux/deploymentsettingsassistant.h> -#include <utils/fileutils.h> -#include <utils/filesystemwatcher.h> -#include <utils/qtcassert.h> - -#include <QApplication> -#include <QMainWindow> -#include <QBuffer> -#include <QDateTime> -#include <QLocale> -#include <QRegExp> -#include <QDir> -#include <QFile> -#include <QFileInfo> -#include <QProcess> -#include <QStringList> -#include <QIcon> -#include <QMessageBox> - -#include <cctype> - -using namespace Qt4ProjectManager; -using namespace RemoteLinux; - -namespace Madde { -namespace Internal { - -namespace { -const QByteArray NameFieldName("Package"); -const QByteArray IconFieldName("XB-Maemo-Icon-26"); -const QByteArray ShortDescriptionFieldName("Description"); -const QByteArray PackageFieldName("Package"); -const QLatin1String PackagingDirName("qtc_packaging"); -const QByteArray NameTag("Name"); -const QByteArray SummaryTag("Summary"); -const QByteArray VersionTag("Version"); -const QByteArray ReleaseTag("Release"); - -bool adaptTagValue(QByteArray &document, const QByteArray &fieldName, - const QByteArray &newFieldValue, bool caseSensitive) -{ - QByteArray adaptedLine = fieldName + ": " + newFieldValue; - const QByteArray completeTag = fieldName + ':'; - const int lineOffset = caseSensitive ? document.indexOf(completeTag) - : document.toLower().indexOf(completeTag.toLower()); - if (lineOffset == -1) { - document.append(adaptedLine).append('\n'); - return true; - } - - int newlineOffset = document.indexOf('\n', lineOffset); - bool updated = false; - if (newlineOffset == -1) { - newlineOffset = document.length(); - adaptedLine += '\n'; - updated = true; - } - const int replaceCount = newlineOffset - lineOffset; - if (!updated && document.mid(lineOffset, replaceCount) != adaptedLine) - updated = true; - if (updated) - document.replace(lineOffset, replaceCount, adaptedLine); - return updated; -} - - -} // anonymous namespace - - -AbstractQt4MaemoTarget::AbstractQt4MaemoTarget(Qt4Project *parent, const Core::Id id, - const QString &qmakeScope) : - AbstractEmbeddedLinuxTarget(parent, id), - m_filesWatcher(new Utils::FileSystemWatcher(this)), - m_deploymentSettingsAssistant(new DeploymentSettingsAssistant(qmakeScope, - QLatin1String("/opt"), deploymentInfo())), - m_isInitialized(false) -{ - m_filesWatcher->setObjectName(QLatin1String("Qt4MaemoTarget")); - setIcon(QIcon(":/projectexplorer/images/MaemoDevice.png")); - connect(parent, SIGNAL(addedTarget(ProjectExplorer::Target*)), - this, SLOT(handleTargetAdded(ProjectExplorer::Target*))); - connect(parent, SIGNAL(fromMapFinished()), - this, SLOT(handleFromMapFinished())); -} - -AbstractQt4MaemoTarget::~AbstractQt4MaemoTarget() -{ } - -QList<ProjectExplorer::ToolChain *> AbstractQt4MaemoTarget::possibleToolChains(ProjectExplorer::BuildConfiguration *bc) const -{ - QList<ProjectExplorer::ToolChain *> result; - - Qt4BuildConfiguration *qt4Bc = qobject_cast<Qt4BuildConfiguration *>(bc); - if (!qt4Bc) - return result; - - QList<ProjectExplorer::ToolChain *> candidates = Qt4BaseTarget::possibleToolChains(bc); - foreach (ProjectExplorer::ToolChain *i, candidates) { - MaemoToolChain *tc = dynamic_cast<MaemoToolChain *>(i); - if (!tc || !qt4Bc->qtVersion()) - continue; - if (tc->qtVersionId() == qt4Bc->qtVersion()->uniqueId()) - result.append(tc); - } - - return result; -} - -void AbstractQt4MaemoTarget::createApplicationProFiles(bool reparse) -{ - if (!reparse) - removeUnconfiguredCustomExectutableRunConfigurations(); - - QList<Qt4ProFileNode *> profiles = qt4Project()->applicationProFiles(); - QSet<QString> paths; - foreach (Qt4ProFileNode *pro, profiles) - paths << pro->path(); - - foreach (ProjectExplorer::RunConfiguration *rc, runConfigurations()) - if (MaemoRunConfiguration *qt4rc = qobject_cast<MaemoRunConfiguration *>(rc)) - paths.remove(qt4rc->proFilePath()); - - // Only add new runconfigurations if there are none. - foreach (const QString &path, paths) - addRunConfiguration(new MaemoRunConfiguration(this, path)); - - // Oh still none? Add a custom executable runconfiguration - if (runConfigurations().isEmpty()) { - addRunConfiguration(new QtSupport::CustomExecutableRunConfiguration(this)); - } -} - -QList<ProjectExplorer::RunConfiguration *> AbstractQt4MaemoTarget::runConfigurationsForNode(ProjectExplorer::Node *n) -{ - QList<ProjectExplorer::RunConfiguration *> result; - foreach (ProjectExplorer::RunConfiguration *rc, runConfigurations()) - if (MaemoRunConfiguration *mrc = qobject_cast<MaemoRunConfiguration *>(rc)) - if (mrc->proFilePath() == n->path()) - result << rc; - return result; -} - -bool AbstractQt4MaemoTarget::setProjectVersion(const QString &version, - QString *error) -{ - bool success = true; - foreach (Target * const target, project()->targets()) { - AbstractQt4MaemoTarget * const maemoTarget - = qobject_cast<AbstractQt4MaemoTarget *>(target); - if (maemoTarget) { - if (!maemoTarget->setProjectVersionInternal(version, error)) - success = false; - } - } - return success; -} - -bool AbstractQt4MaemoTarget::setPackageName(const QString &name) -{ - bool success = true; - foreach (Target * const target, project()->targets()) { - AbstractQt4MaemoTarget * const maemoTarget - = qobject_cast<AbstractQt4MaemoTarget *>(target); - if (maemoTarget) { - if (!maemoTarget->setPackageNameInternal(name)) - success = false; - } - } - return success; -} - -bool AbstractQt4MaemoTarget::setShortDescription(const QString &description) -{ - bool success = true; - foreach (Target * const target, project()->targets()) { - AbstractQt4MaemoTarget * const maemoTarget - = qobject_cast<AbstractQt4MaemoTarget *>(target); - if (maemoTarget) { - if (!maemoTarget->setShortDescriptionInternal(description)) - success = false; - } - } - return success; -} - -QSharedPointer<QFile> AbstractQt4MaemoTarget::openFile(const QString &filePath, - QIODevice::OpenMode mode, QString *error) const -{ - const QString nativePath = QDir::toNativeSeparators(filePath); - QSharedPointer<QFile> file(new QFile(filePath)); - if (!file->open(mode)) { - if (error) { - *error = tr("Cannot open file '%1': %2") - .arg(nativePath, file->errorString()); - } - file.clear(); - } - return file; -} - -void AbstractQt4MaemoTarget::handleFromMapFinished() -{ - handleTargetAdded(this); -} - -void AbstractQt4MaemoTarget::handleTargetAdded(ProjectExplorer::Target *target) -{ - if (target != this) - return; - - if (!project()->rootProjectNode()) { - // Project is not fully setup yet, happens on new project - // we wait for the fromMapFinished that comes afterwards - return; - } - - disconnect(project(), SIGNAL(fromMapFinished()), - this, SLOT(handleFromMapFinished())); - disconnect(project(), SIGNAL(addedTarget(ProjectExplorer::Target*)), - this, SLOT(handleTargetAdded(ProjectExplorer::Target*))); - connect(project(), SIGNAL(aboutToRemoveTarget(ProjectExplorer::Target*)), - SLOT(handleTargetToBeRemoved(ProjectExplorer::Target*))); - const ActionStatus status = createTemplates(); - if (status == ActionFailed) - return; - if (status == ActionSuccessful) // Don't do this when the packaging data already exists. - initPackagingSettingsFromOtherTarget(); - handleTargetAddedSpecial(); - if (status == ActionSuccessful) { - const QStringList &files = packagingFilePaths(); - if (!files.isEmpty()) { - const QString list = QLatin1String("<ul><li>") + files.join(QLatin1String("</li><li>")) - + QLatin1String("</li></ul>"); - QMessageBox::StandardButton button = QMessageBox::question(Core::ICore::mainWindow(), - tr("Add Packaging Files to Project"), - tr("<html>Qt Creator has set up the following files to enable " - "packaging:\n %1\nDo you want to add them to the project?</html>") - .arg(list), QMessageBox::Yes | QMessageBox::No); - if (button == QMessageBox::Yes) { - ProjectExplorer::ProjectExplorerPlugin::instance() - ->addExistingFiles(project()->rootProjectNode(), files); - } - } - } - - m_isInitialized = true; -} - -void AbstractQt4MaemoTarget::handleTargetToBeRemoved(ProjectExplorer::Target *target) -{ - if (target != this) - return; - if (!targetCanBeRemoved()) - return; - - const int answer = QMessageBox::warning(Core::ICore::mainWindow(), - tr("Qt Creator"), tr("Do you want to remove the packaging files " - "associated with the target '%1'?").arg(displayName()), - QMessageBox::Yes | QMessageBox::No, QMessageBox::No); - if (answer == QMessageBox::No) - return; - const QStringList pkgFilePaths = packagingFilePaths(); - if (!pkgFilePaths.isEmpty()) { - project()->rootProjectNode()->removeFiles(ProjectExplorer::UnknownFileType, - pkgFilePaths); - Core::IVersionControl * const vcs = Core::ICore::vcsManager() - ->findVersionControlForDirectory(QFileInfo(pkgFilePaths.first()).dir().path()); - if (vcs && vcs->supportsOperation(Core::IVersionControl::DeleteOperation)) { - foreach (const QString &filePath, pkgFilePaths) - vcs->vcsDelete(filePath); - } - } - delete m_filesWatcher; - removeTarget(); - QString error; - const QString packagingPath = project()->projectDirectory() - + QLatin1Char('/') + PackagingDirName; - const QStringList otherContents = QDir(packagingPath).entryList(QDir::Dirs - | QDir::Files | QDir::Hidden | QDir::NoDotAndDotDot); - if (otherContents.isEmpty()) { - if (!Utils::FileUtils::removeRecursively(packagingPath, &error)) - qDebug("%s", qPrintable(error)); - } -} - -AbstractQt4MaemoTarget::ActionStatus AbstractQt4MaemoTarget::createTemplates() -{ - QDir projectDir(project()->projectDirectory()); - if (!projectDir.exists(PackagingDirName) - && !projectDir.mkdir(PackagingDirName)) { - raiseError(tr("Error creating packaging directory '%1'.") - .arg(PackagingDirName)); - return ActionFailed; - } - - return createSpecialTemplates(); -} - -bool AbstractQt4MaemoTarget::initPackagingSettingsFromOtherTarget() -{ - bool success = true; - foreach (const Target * const target, project()->targets()) { - const AbstractQt4MaemoTarget * const maemoTarget - = qobject_cast<const AbstractQt4MaemoTarget *>(target); - if (maemoTarget && maemoTarget != this && maemoTarget->m_isInitialized) { - if (!setProjectVersionInternal(maemoTarget->projectVersion())) - success = false; - if (!setPackageNameInternal(maemoTarget->packageName())) - success = false; - if (!setShortDescriptionInternal(maemoTarget->shortDescription())) - success = false; - break; - } - } - return initAdditionalPackagingSettingsFromOtherTarget() && success; -} - -void AbstractQt4MaemoTarget::raiseError(const QString &reason) -{ - QMessageBox::critical(0, tr("Error creating MeeGo templates"), reason); -} - -AbstractDebBasedQt4MaemoTarget::AbstractDebBasedQt4MaemoTarget(Qt4Project *parent, - const Core::Id id, - const QString &qmakeScope) : - AbstractQt4MaemoTarget(parent, id, qmakeScope) -{ -} - -AbstractDebBasedQt4MaemoTarget::~AbstractDebBasedQt4MaemoTarget() {} - -QString AbstractDebBasedQt4MaemoTarget::projectVersion(QString *error) const -{ - QSharedPointer<QFile> changeLog = openFile(changeLogFilePath(), - QIODevice::ReadOnly, error); - if (!changeLog) - return QString(); - const QByteArray &firstLine = changeLog->readLine(); - const int openParenPos = firstLine.indexOf('('); - if (openParenPos == -1) { - if (error) { - *error = tr("Debian changelog file '%1' has unexpected format.") - .arg(QDir::toNativeSeparators(changeLog->fileName())); - } - return QString(); - } - const int closeParenPos = firstLine.indexOf(')', openParenPos); - if (closeParenPos == -1) { - if (error) { - *error = tr("Debian changelog file '%1' has unexpected format.") - .arg(QDir::toNativeSeparators(changeLog->fileName())); - } - return QString(); - } - return QString::fromUtf8(firstLine.mid(openParenPos + 1, - closeParenPos - openParenPos - 1).data()); -} - -bool AbstractDebBasedQt4MaemoTarget::setProjectVersionInternal(const QString &version, - QString *error) -{ - const QString filePath = changeLogFilePath(); - Utils::FileReader reader; - if (!reader.fetch(filePath, error)) - return false; - QString content = QString::fromUtf8(reader.data()); - if (content.contains(QLatin1Char('(') + version + QLatin1Char(')'))) { - if (error) { - *error = tr("Refusing to update changelog file: Already contains version '%1'.") - .arg(version); - } - return false; - } - - int maintainerOffset = content.indexOf(QLatin1String("\n -- ")); - const int eolOffset = content.indexOf(QLatin1Char('\n'), maintainerOffset+1); - if (maintainerOffset == -1 || eolOffset == -1) { - if (error) { - *error = tr("Cannot update changelog: Invalid format (no maintainer entry found)."); - } - return false; - } - - ++maintainerOffset; - const QDateTime currentDateTime = QDateTime::currentDateTime(); - QDateTime utcDateTime = QDateTime(currentDateTime); - utcDateTime.setTimeSpec(Qt::UTC); - int utcOffsetSeconds = currentDateTime.secsTo(utcDateTime); - QChar sign; - if (utcOffsetSeconds < 0) { - utcOffsetSeconds = -utcOffsetSeconds; - sign = QLatin1Char('-'); - } else { - sign = QLatin1Char('+'); - } - const int utcOffsetMinutes = (utcOffsetSeconds / 60) % 60; - const int utcOffsetHours = utcOffsetSeconds / 3600; - const QString dateString = QString::fromLatin1("%1, %2 %3 %4 %5%6%7") - .arg(shortDayOfWeekName(currentDateTime)) - .arg(currentDateTime.toString(QLatin1String("dd"))) - .arg(shortMonthName(currentDateTime)) - .arg(currentDateTime.toString(QLatin1String("yyyy hh:mm:ss"))).arg(sign) - .arg(utcOffsetHours, 2, 10, QLatin1Char('0')) - .arg(utcOffsetMinutes, 2, 10, QLatin1Char('0')); - const QString maintainerLine = content.mid(maintainerOffset, eolOffset - maintainerOffset + 1) - .replace(QRegExp(QLatin1String("> [^\\n]*\n")), - QString::fromLatin1("> %1").arg(dateString)); - QString versionLine = content.left(content.indexOf(QLatin1Char('\n'))) - .replace(QRegExp(QLatin1String("\\([a-zA-Z0-9_\\.]+\\)")), - QLatin1Char('(') + version + QLatin1Char(')')); - const QString newEntry = versionLine + QLatin1String("\n * <Add change description here>\n\n") - + maintainerLine + QLatin1String("\n\n"); - content.prepend(newEntry); - Core::FileChangeBlocker update(filePath); - Utils::FileSaver saver(filePath); - saver.write(content.toUtf8()); - return saver.finalize(error); -} - -QIcon AbstractDebBasedQt4MaemoTarget::packageManagerIcon(QString *error) const -{ - const QByteArray &base64Icon = controlFileFieldValue(IconFieldName, true); - if (base64Icon.isEmpty()) - return QIcon(); - QPixmap pixmap; - if (!pixmap.loadFromData(QByteArray::fromBase64(base64Icon))) { - if (error) - *error = tr("Invalid icon data in Debian control file."); - return QIcon(); - } - return QIcon(pixmap); -} - -bool AbstractDebBasedQt4MaemoTarget::setPackageManagerIconInternal(const QString &iconFilePath, - QString *error) -{ - const QString filePath = controlFilePath(); - Utils::FileReader reader; - if (!reader.fetch(filePath, error)) - return false; - const QPixmap pixmap(iconFilePath); - if (pixmap.isNull()) { - if (error) - *error = tr("Could not read image file '%1'.").arg(iconFilePath); - return false; - } - - QByteArray iconAsBase64; - QBuffer buffer(&iconAsBase64); - buffer.open(QIODevice::WriteOnly); - if (!pixmap.scaled(packageManagerIconSize()).save(&buffer, - QFileInfo(iconFilePath).suffix().toAscii())) { - if (error) - *error = tr("Could not export image file '%1'.").arg(iconFilePath); - return false; - } - buffer.close(); - iconAsBase64 = iconAsBase64.toBase64(); - QByteArray contents = reader.data(); - const QByteArray iconFieldNameWithColon = IconFieldName + ':'; - const int iconFieldPos = contents.startsWith(iconFieldNameWithColon) - ? 0 : contents.indexOf('\n' + iconFieldNameWithColon); - if (iconFieldPos == -1) { - if (!contents.endsWith('\n')) - contents += '\n'; - contents.append(iconFieldNameWithColon).append(' ').append(iconAsBase64) - .append('\n'); - } else { - const int oldIconStartPos = (iconFieldPos != 0) + iconFieldPos - + iconFieldNameWithColon.length(); - int nextEolPos = contents.indexOf('\n', oldIconStartPos); - while (nextEolPos != -1 && nextEolPos != contents.length() - 1 - && contents.at(nextEolPos + 1) != '\n' - && (contents.at(nextEolPos + 1) == '#' - || std::isspace(contents.at(nextEolPos + 1)))) - nextEolPos = contents.indexOf('\n', nextEolPos + 1); - if (nextEolPos == -1) - nextEolPos = contents.length(); - contents.replace(oldIconStartPos, nextEolPos - oldIconStartPos, - ' ' + iconAsBase64); - } - Core::FileChangeBlocker update(filePath); - Utils::FileSaver saver(filePath); - saver.write(contents); - return saver.finalize(error); -} - -QString AbstractDebBasedQt4MaemoTarget::packageName() const -{ - return QString::fromUtf8(controlFileFieldValue(NameFieldName, false)); -} - -bool AbstractDebBasedQt4MaemoTarget::setPackageNameInternal(const QString &packageName) -{ - const QString oldPackageName = this->packageName(); - - if (!setControlFieldValue(NameFieldName, packageName.toUtf8())) - return false; - if (!setControlFieldValue("Source", packageName.toUtf8())) - return false; - - Utils::FileReader reader; - if (!reader.fetch(changeLogFilePath())) - return false; - QString changelogContents = QString::fromUtf8(reader.data()); - QRegExp pattern(QLatin1String("[^\\s]+( \\(\\d\\.\\d\\.\\d\\))")); - changelogContents.replace(pattern, packageName + QLatin1String("\\1")); - Utils::FileSaver saver(changeLogFilePath()); - saver.write(changelogContents.toUtf8()); - if (!saver.finalize()) - return false; - - if (!reader.fetch(rulesFilePath())) - return false; - QByteArray rulesContents = reader.data(); - const QString oldString = QLatin1String("debian/") + oldPackageName; - const QString newString = QLatin1String("debian/") + packageName; - rulesContents.replace(oldString.toUtf8(), newString.toUtf8()); - Utils::FileSaver rulesSaver(rulesFilePath()); - rulesSaver.write(rulesContents); - return rulesSaver.finalize(); -} - -QString AbstractDebBasedQt4MaemoTarget::packageManagerName() const -{ - return QString::fromUtf8(controlFileFieldValue(packageManagerNameFieldName(), false)); -} - -bool AbstractDebBasedQt4MaemoTarget::setPackageManagerName(const QString &name, - QString *error) -{ - bool success = true; - foreach (Target * const t, project()->targets()) { - AbstractDebBasedQt4MaemoTarget * const target - = qobject_cast<AbstractDebBasedQt4MaemoTarget *>(t); - if (target) { - if (!target->setPackageManagerNameInternal(name, error)) - success = false; - } - } - return success; -} - -bool AbstractDebBasedQt4MaemoTarget::setPackageManagerNameInternal(const QString &name, - QString *error) -{ - Q_UNUSED(error); - return setControlFieldValue(packageManagerNameFieldName(), name.toUtf8()); -} - -QString AbstractDebBasedQt4MaemoTarget::shortDescription() const -{ - return QString::fromUtf8(controlFileFieldValue(ShortDescriptionFieldName, false)); -} - -QString AbstractDebBasedQt4MaemoTarget::packageFileName() const -{ - return QString::fromUtf8(controlFileFieldValue(PackageFieldName, false)) - + QLatin1Char('_') + projectVersion() + QLatin1String("_armel.deb"); -} - -bool AbstractDebBasedQt4MaemoTarget::setShortDescriptionInternal(const QString &description) -{ - return setControlFieldValue(ShortDescriptionFieldName, description.toUtf8()); -} - -QString AbstractDebBasedQt4MaemoTarget::debianDirPath() const -{ - return project()->projectDirectory() + QLatin1Char('/') + PackagingDirName - + QLatin1Char('/') + debianDirName(); -} - -QStringList AbstractDebBasedQt4MaemoTarget::debianFiles() const -{ - return QDir(debianDirPath()) - .entryList(QDir::Files, QDir::Name | QDir::IgnoreCase); -} - -QString AbstractDebBasedQt4MaemoTarget::changeLogFilePath() const -{ - return debianDirPath() + QLatin1String("/changelog"); -} - -QString AbstractDebBasedQt4MaemoTarget::controlFilePath() const -{ - return debianDirPath() + QLatin1String("/control"); -} - -QString AbstractDebBasedQt4MaemoTarget::rulesFilePath() const -{ - return debianDirPath() + QLatin1String("/rules"); -} - -QByteArray AbstractDebBasedQt4MaemoTarget::controlFileFieldValue(const QString &key, - bool multiLine) const -{ - QByteArray value; - Utils::FileReader reader; - if (!reader.fetch(controlFilePath())) - return value; - const QByteArray &contents = reader.data(); - const int keyPos = contents.indexOf(key.toUtf8() + ':'); - if (keyPos == -1) - return value; - int valueStartPos = keyPos + key.length() + 1; - int valueEndPos = contents.indexOf('\n', keyPos); - if (valueEndPos == -1) - valueEndPos = contents.count(); - value = contents.mid(valueStartPos, valueEndPos - valueStartPos).trimmed(); - if (multiLine) { - Q_FOREVER { - valueStartPos = valueEndPos + 1; - if (valueStartPos >= contents.count()) - break; - const char firstChar = contents.at(valueStartPos); - if (firstChar == '#' || isspace(firstChar)) { - valueEndPos = contents.indexOf('\n', valueStartPos); - if (valueEndPos == -1) - valueEndPos = contents.count(); - if (firstChar != '#') { - value += contents.mid(valueStartPos, - valueEndPos - valueStartPos).trimmed(); - } - } else { - break; - } - } - } - return value; -} - -bool AbstractDebBasedQt4MaemoTarget::setControlFieldValue(const QByteArray &fieldName, - const QByteArray &fieldValue) -{ - Utils::FileReader reader; - if (!reader.fetch(controlFilePath())) - return false; - QByteArray contents = reader.data(); - if (adaptControlFileField(contents, fieldName, fieldValue)) { - Core::FileChangeBlocker update(controlFilePath()); - Utils::FileSaver saver(controlFilePath()); - saver.write(contents); - return saver.finalize(); - } - return true; -} - -bool AbstractDebBasedQt4MaemoTarget::adaptControlFileField(QByteArray &document, - const QByteArray &fieldName, const QByteArray &newFieldValue) -{ - return adaptTagValue(document, fieldName, newFieldValue, true); -} - -void AbstractDebBasedQt4MaemoTarget::handleTargetAddedSpecial() -{ - if (controlFileFieldValue(IconFieldName, true).isEmpty()) { - // Such a file is created by the mobile wizards. - const QString iconPath = project()->projectDirectory() - + QLatin1Char('/') + project()->displayName() - + QLatin1String("64.png"); - if (QFileInfo(iconPath).exists()) - setPackageManagerIcon(iconPath); - } - - m_filesWatcher->addDirectory(debianDirPath(), Utils::FileSystemWatcher::WatchAllChanges); - m_controlFile = new WatchableFile(controlFilePath(), this); - connect(m_controlFile, SIGNAL(modified()), SIGNAL(controlChanged())); - m_changeLogFile = new WatchableFile(changeLogFilePath(), this); - connect(m_changeLogFile, SIGNAL(modified()), SIGNAL(changeLogChanged())); - Core::DocumentManager::addDocuments(QList<Core::IDocument *>() - << m_controlFile << m_changeLogFile); - connect(m_filesWatcher, SIGNAL(directoryChanged(QString)), this, - SLOT(handleDebianDirContentsChanged())); - handleDebianDirContentsChanged(); - emit controlChanged(); - emit changeLogChanged(); -} - -bool AbstractDebBasedQt4MaemoTarget::targetCanBeRemoved() const -{ - return QFileInfo(debianDirPath()).exists(); -} - -void AbstractDebBasedQt4MaemoTarget::removeTarget() -{ - QString error; - if (!Utils::FileUtils::removeRecursively(debianDirPath(), &error)) - qDebug("%s", qPrintable(error)); -} - -void AbstractDebBasedQt4MaemoTarget::handleDebianDirContentsChanged() -{ - emit debianDirContentsChanged(); -} - -AbstractQt4MaemoTarget::ActionStatus AbstractDebBasedQt4MaemoTarget::createSpecialTemplates() -{ - if (QFileInfo(debianDirPath()).exists()) - return NoActionRequired; - QDir projectDir(project()->projectDirectory()); - QProcess dh_makeProc; - QString error; - const Qt4BuildConfiguration * const bc = qobject_cast<Qt4BuildConfiguration * >(activeBuildConfiguration()); - AbstractMaemoPackageCreationStep::preparePackagingProcess(&dh_makeProc, bc, - projectDir.path() + QLatin1Char('/') + PackagingDirName); - const QString dhMakeDebianDir = projectDir.path() + QLatin1Char('/') - + PackagingDirName + QLatin1String("/debian"); - Utils::FileUtils::removeRecursively(dhMakeDebianDir, &error); - const QStringList dh_makeArgs = QStringList() << QLatin1String("dh_make") - << QLatin1String("-s") << QLatin1String("-n") << QLatin1String("-p") - << (defaultPackageFileName() + QLatin1Char('_') - + AbstractMaemoPackageCreationStep::DefaultVersionNumber); - QtSupport::BaseQtVersion *lqt = activeQt4BuildConfiguration()->qtVersion(); - if (!lqt) { - raiseError(tr("Unable to create Debian templates: No Qt version set.")); - return ActionFailed; - } - if (!MaemoGlobal::callMad(dh_makeProc, dh_makeArgs, lqt->qmakeCommand().toString(), true) - || !dh_makeProc.waitForStarted()) { - raiseError(tr("Unable to create Debian templates: dh_make failed (%1).") - .arg(dh_makeProc.errorString())); - return ActionFailed; - } - dh_makeProc.write("\n"); // Needs user input. - dh_makeProc.waitForFinished(-1); - if (dh_makeProc.error() != QProcess::UnknownError - || dh_makeProc.exitCode() != 0) { - raiseError(tr("Unable to create debian templates: dh_make failed (%1).") - .arg(dh_makeProc.errorString())); - return ActionFailed; - } - - if (!QFile::rename(dhMakeDebianDir, debianDirPath())) { - raiseError(tr("Unable to move new debian directory to '%1'.") - .arg(QDir::toNativeSeparators(debianDirPath()))); - Utils::FileUtils::removeRecursively(dhMakeDebianDir, &error); - return ActionFailed; - } - - QDir debianDir(debianDirPath()); - const QStringList &files = debianDir.entryList(QDir::Files); - foreach (const QString &fileName, files) { - if (fileName.endsWith(QLatin1String(".ex"), Qt::CaseInsensitive) - || fileName.compare(QLatin1String("README.debian"), Qt::CaseInsensitive) == 0 - || fileName.compare(QLatin1String("dirs"), Qt::CaseInsensitive) == 0 - || fileName.compare(QLatin1String("docs"), Qt::CaseInsensitive) == 0) { - debianDir.remove(fileName); - } - } - - return adaptRulesFile() && adaptControlFile() - ? ActionSuccessful : ActionFailed; -} - -bool AbstractDebBasedQt4MaemoTarget::adaptRulesFile() -{ - Utils::FileReader reader; - if (!reader.fetch(rulesFilePath())) { - raiseError(reader.errorString()); - return false; - } - QByteArray rulesContents = reader.data(); - const QByteArray comment("# Uncomment this line for use without Qt Creator"); - rulesContents.replace("DESTDIR", "INSTALL_ROOT"); - rulesContents.replace("dh_shlibdeps", "# dh_shlibdeps " + comment); - rulesContents.replace("# Add here commands to configure the package.", - "# qmake PREFIX=/usr" + comment); - rulesContents.replace("$(MAKE)\n", "# $(MAKE) " + comment + '\n'); - - // Would be the right solution, but does not work (on Windows), - // because dpkg-genchanges doesn't know about it (and can't be told). - // rulesContents.replace("dh_builddeb", "dh_builddeb --destdir=."); - - Utils::FileSaver saver(rulesFilePath()); - saver.write(rulesContents); - if (!saver.finalize()) { - raiseError(saver.errorString()); - return false; - } - return true; -} - -bool AbstractDebBasedQt4MaemoTarget::adaptControlFile() -{ - Utils::FileReader reader; - if (!reader.fetch(controlFilePath())) { - raiseError(reader.errorString()); - return false; - } - QByteArray controlContents = reader.data(); - - adaptControlFileField(controlContents, "Section", defaultSection()); - adaptControlFileField(controlContents, "Priority", "optional"); - adaptControlFileField(controlContents, packageManagerNameFieldName(), - project()->displayName().toUtf8()); - const int buildDependsOffset = controlContents.indexOf("Build-Depends:"); - if (buildDependsOffset == -1) { - qDebug("Unexpected: no Build-Depends field in debian control file."); - } else { - int buildDependsNewlineOffset - = controlContents.indexOf('\n', buildDependsOffset); - if (buildDependsNewlineOffset == -1) { - controlContents += '\n'; - buildDependsNewlineOffset = controlContents.length() - 1; - } - controlContents.insert(buildDependsNewlineOffset, - ", libqt4-dev"); - } - - addAdditionalControlFileFields(controlContents); - Utils::FileSaver saver(controlFilePath()); - saver.write(controlContents); - if (!saver.finalize()) { - raiseError(saver.errorString()); - return false; - } - return true; -} - -bool AbstractDebBasedQt4MaemoTarget::initAdditionalPackagingSettingsFromOtherTarget() -{ - foreach (const Target * const t, project()->targets()) { - const AbstractDebBasedQt4MaemoTarget *target - = qobject_cast<const AbstractDebBasedQt4MaemoTarget *>(t); - if (target && target != this) { - return setControlFieldValue(IconFieldName, - target->controlFileFieldValue(IconFieldName, true)); - } - } - return true; -} - -QStringList AbstractDebBasedQt4MaemoTarget::packagingFilePaths() const -{ - QStringList filePaths; - const QString parentDir = debianDirPath(); - foreach (const QString &fileName, debianFiles()) - filePaths << parentDir + QLatin1Char('/') + fileName; - return filePaths; -} - -QString AbstractDebBasedQt4MaemoTarget::defaultPackageFileName() const -{ - QString packageName = project()->displayName().toLower(); - - // We also replace dots, because OVI store chokes on them. - QRegExp legalLetter(QLatin1String("[a-z0-9+-]"), Qt::CaseSensitive, QRegExp::WildcardUnix); - - for (int i = 0; i < packageName.length(); ++i) { - if (!legalLetter.exactMatch(packageName.mid(i, 1))) - packageName[i] = QLatin1Char('-'); - } - return packageName; -} - -bool AbstractDebBasedQt4MaemoTarget::setPackageManagerIcon(const QString &iconFilePath, - QString *error) -{ - bool success = true; - foreach (Target * const target, project()->targets()) { - AbstractDebBasedQt4MaemoTarget* const maemoTarget - = qobject_cast<AbstractDebBasedQt4MaemoTarget*>(target); - if (maemoTarget) { - if (!maemoTarget->setPackageManagerIconInternal(iconFilePath, error)) - success = false; - } - } - return success; -} - -// The QDateTime API can only deliver these in localized form... -QString AbstractDebBasedQt4MaemoTarget::shortMonthName(const QDateTime &dt) const -{ - switch (dt.date().month()) { - case 1: return QLatin1String("Jan"); - case 2: return QLatin1String("Feb"); - case 3: return QLatin1String("Mar"); - case 4: return QLatin1String("Apr"); - case 5: return QLatin1String("May"); - case 6: return QLatin1String("Jun"); - case 7: return QLatin1String("Jul"); - case 8: return QLatin1String("Aug"); - case 9: return QLatin1String("Sep"); - case 10: return QLatin1String("Oct"); - case 11: return QLatin1String("Nov"); - case 12: return QLatin1String("Dec"); - default: QTC_ASSERT(false, return QString()); - } -} - -QString AbstractDebBasedQt4MaemoTarget::shortDayOfWeekName(const QDateTime &dt) const -{ - switch (dt.date().dayOfWeek()) { - case Qt::Monday: return QLatin1String("Mon"); - case Qt::Tuesday: return QLatin1String("Tue"); - case Qt::Wednesday: return QLatin1String("Wed"); - case Qt::Thursday: return QLatin1String("Thu"); - case Qt::Friday: return QLatin1String("Fri"); - case Qt::Saturday: return QLatin1String("Sat"); - case Qt::Sunday: return QLatin1String("Sun"); - default: QTC_ASSERT(false, return QString()); - } -} - - -AbstractRpmBasedQt4MaemoTarget::AbstractRpmBasedQt4MaemoTarget(Qt4Project *parent, - const Core::Id id, const QString &qmakeScope) : - AbstractQt4MaemoTarget(parent, id, qmakeScope) -{ -} - -AbstractRpmBasedQt4MaemoTarget::~AbstractRpmBasedQt4MaemoTarget() -{ -} - -QString AbstractRpmBasedQt4MaemoTarget::specFilePath() const -{ - const QLatin1Char sep('/'); - return project()->projectDirectory() + sep + PackagingDirName + sep - + specFileName(); -} - -QString AbstractRpmBasedQt4MaemoTarget::projectVersion(QString *error) const -{ - return QString::fromUtf8(getValueForTag(VersionTag, error)); -} - -bool AbstractRpmBasedQt4MaemoTarget::setProjectVersionInternal(const QString &version, - QString *error) -{ - return setValueForTag(VersionTag, version.toUtf8(), error); -} - -QString AbstractRpmBasedQt4MaemoTarget::packageName() const -{ - return QString::fromUtf8(getValueForTag(NameTag, 0)); -} - -bool AbstractRpmBasedQt4MaemoTarget::setPackageNameInternal(const QString &name) -{ - return setValueForTag(NameTag, name.toUtf8(), 0); -} - -QString AbstractRpmBasedQt4MaemoTarget::shortDescription() const -{ - return QString::fromUtf8(getValueForTag(SummaryTag, 0)); -} - -QString AbstractRpmBasedQt4MaemoTarget::packageFileName() const -{ - QtSupport::BaseQtVersion *lqt = activeQt4BuildConfiguration()->qtVersion(); - if (!lqt) - return QString(); - return packageName() + QLatin1Char('-') + projectVersion() + QLatin1Char('-') - + QString::fromUtf8(getValueForTag(ReleaseTag, 0)) + QLatin1Char('.') - + MaemoGlobal::architecture(lqt->qmakeCommand().toString()) - + QLatin1String(".rpm"); -} - -bool AbstractRpmBasedQt4MaemoTarget::setShortDescriptionInternal(const QString &description) -{ - return setValueForTag(SummaryTag, description.toUtf8(), 0); -} - -AbstractQt4MaemoTarget::ActionStatus AbstractRpmBasedQt4MaemoTarget::createSpecialTemplates() -{ - if (QFileInfo(specFilePath()).exists()) - return NoActionRequired; - QByteArray initialContent( - "Name: %%name%%\n" - "Summary: <insert short description here>\n" - "Version: 0.0.1\n" - "Release: 1\n" - "License: <Enter your application's license here>\n" - "Group: <Set your application's group here>\n" - "%description\n" - "<Insert longer, multi-line description\n" - "here.>\n" - "\n" - "%prep\n" - "%setup -q\n" - "\n" - "%build\n" - "# You can leave this empty for use with Qt Creator." - "\n" - "%install\n" - "rm -rf %{buildroot}\n" - "make INSTALL_ROOT=%{buildroot} install\n" - "\n" - "%clean\n" - "rm -rf %{buildroot}\n" - "\n" - "BuildRequires: \n" - "# %define _unpackaged_files_terminate_build 0\n" - "%files\n" - "%defattr(-,root,root,-)" - "/usr\n" - "/opt\n" - "# Add additional files to be included in the package here.\n" - "%pre\n" - "# Add pre-install scripts here." - "%post\n" - "/sbin/ldconfig # For shared libraries\n" - "%preun\n" - "# Add pre-uninstall scripts here." - "%postun\n" - "# Add post-uninstall scripts here." - ); - initialContent.replace("%%name%%", project()->displayName().toUtf8()); - Utils::FileSaver saver(specFilePath()); - saver.write(initialContent); - return saver.finalize() ? ActionSuccessful : ActionFailed; -} - -void AbstractRpmBasedQt4MaemoTarget::handleTargetAddedSpecial() -{ - m_specFile = new WatchableFile(specFilePath(), this); - connect(m_specFile, SIGNAL(modified()), SIGNAL(specFileChanged())); - Core::DocumentManager::addDocument(m_specFile); - emit specFileChanged(); -} - -bool AbstractRpmBasedQt4MaemoTarget::targetCanBeRemoved() const -{ - return QFileInfo(specFilePath()).exists(); -} - -void AbstractRpmBasedQt4MaemoTarget::removeTarget() -{ - QFile::remove(specFilePath()); -} - -bool AbstractRpmBasedQt4MaemoTarget::initAdditionalPackagingSettingsFromOtherTarget() -{ - // Nothing to do here for now. - return true; -} - -QByteArray AbstractRpmBasedQt4MaemoTarget::getValueForTag(const QByteArray &tag, - QString *error) const -{ - Utils::FileReader reader; - if (!reader.fetch(specFilePath(), error)) - return QByteArray(); - const QByteArray &content = reader.data(); - const QByteArray completeTag = tag.toLower() + ':'; - int index = content.toLower().indexOf(completeTag); - if (index == -1) - return QByteArray(); - index += completeTag.count(); - int endIndex = content.indexOf('\n', index); - if (endIndex == -1) - endIndex = content.count(); - return content.mid(index, endIndex - index).trimmed(); -} - -bool AbstractRpmBasedQt4MaemoTarget::setValueForTag(const QByteArray &tag, - const QByteArray &value, QString *error) -{ - Utils::FileReader reader; - if (!reader.fetch(specFilePath(), error)) - return false; - QByteArray content = reader.data(); - if (adaptTagValue(content, tag, value, false)) { - Utils::FileSaver saver(specFilePath()); - saver.write(content); - return saver.finalize(error); - } - return true; -} - -Qt4Maemo5Target::Qt4Maemo5Target(Qt4Project *parent, const Core::Id id) - : AbstractDebBasedQt4MaemoTarget(parent, id, QLatin1String("maemo5")) -{ - setDisplayName(defaultDisplayName()); -} - -Qt4Maemo5Target::~Qt4Maemo5Target() {} - -bool Qt4Maemo5Target::supportsDevice(const ProjectExplorer::IDevice::ConstPtr &device) const -{ - return device->type() == Core::Id(Maemo5OsType); -} - -QString Qt4Maemo5Target::defaultDisplayName() -{ - return QApplication::translate("Qt4ProjectManager::Qt4Target", "Maemo5", - "Qt4 Maemo5 target display name"); -} - -void Qt4Maemo5Target::addAdditionalControlFileFields(QByteArray &controlContents) -{ - Q_UNUSED(controlContents); -} - -QString Qt4Maemo5Target::debianDirName() const -{ - return QLatin1String("debian_fremantle"); -} - -QByteArray Qt4Maemo5Target::packageManagerNameFieldName() const -{ - return "XB-Maemo-Display-Name"; -} - -QSize Qt4Maemo5Target::packageManagerIconSize() const -{ - return QSize(48, 48); -} - -QByteArray Qt4Maemo5Target::defaultSection() const -{ - return "user/hidden"; -} - -Qt4HarmattanTarget::Qt4HarmattanTarget(Qt4Project *parent, const Core::Id id) : - AbstractDebBasedQt4MaemoTarget(parent, id, QLatin1String("contains(MEEGO_EDITION,harmattan)")) -{ - setDisplayName(defaultDisplayName()); -} - -Qt4HarmattanTarget::~Qt4HarmattanTarget() {} - -bool Qt4HarmattanTarget::supportsDevice(const ProjectExplorer::IDevice::ConstPtr &device) const -{ - return device->type() == Core::Id(HarmattanOsType); -} - -QString Qt4HarmattanTarget::defaultDisplayName() -{ - return QApplication::translate("Qt4ProjectManager::Qt4Target", "Harmattan", - "Qt4 Harmattan target display name"); -} - -QString Qt4HarmattanTarget::aegisManifestFileName() -{ - return QLatin1String("manifest.aegis"); -} - -void Qt4HarmattanTarget::handleTargetAddedSpecial() -{ - AbstractDebBasedQt4MaemoTarget::handleTargetAddedSpecial(); - const QFile aegisFile(debianDirPath() + QLatin1Char('/') + aegisManifestFileName()); - if (aegisFile.exists()) - return; - - Utils::FileReader reader; - if (!reader.fetch(Core::ICore::resourcePath() - + QLatin1String("/templates/shared/") + aegisManifestFileName())) { - qDebug("Reading manifest template failed."); - return; - } - QString content = QString::fromUtf8(reader.data()); - content.replace(QLatin1String("%%PROJECTNAME%%"), project()->displayName()); - Utils::FileSaver writer(aegisFile.fileName(), QIODevice::WriteOnly); - writer.write(content.toUtf8()); - if (!writer.finalize()) { - qDebug("Failure writing manifest file."); - return; - } -} - -void Qt4HarmattanTarget::addAdditionalControlFileFields(QByteArray &controlContents) -{ - adaptControlFileField(controlContents, "XB-Maemo-Flags", "visible"); - adaptControlFileField(controlContents, "XB-MeeGo-Desktop-Entry-Filename", QString::fromLatin1("%1_harmattan").arg(project()->displayName()).toUtf8()); - adaptControlFileField(controlContents, "XB-MeeGo-Desktop-Entry", QString::fromLatin1("\n [Desktop Entry]\n Type=Application\n Name=%1\n Icon=/usr/share/icons/hicolor/80x80/apps/%1%2.png").arg(project()->displayName()).arg(80).toUtf8()); -} - -QString Qt4HarmattanTarget::debianDirName() const -{ - return QLatin1String("debian_harmattan"); -} - -QByteArray Qt4HarmattanTarget::packageManagerNameFieldName() const -{ - return "XSBC-Maemo-Display-Name"; -} - -QSize Qt4HarmattanTarget::packageManagerIconSize() const -{ - return QSize(64, 64); -} - -QByteArray Qt4HarmattanTarget::defaultSection() const -{ - return "user/other"; -} - - -Qt4MeegoTarget::Qt4MeegoTarget(Qt4Project *parent, const Core::Id id) : - AbstractRpmBasedQt4MaemoTarget(parent, id, - QLatin1String("!isEmpty(MEEGO_VERSION_MAJOR):!contains(MEEGO_EDITION,harmattan)")) -{ - setDisplayName(defaultDisplayName()); -} - -Qt4MeegoTarget::~Qt4MeegoTarget() {} - -bool Qt4MeegoTarget::supportsDevice(const ProjectExplorer::IDevice::ConstPtr &device) const -{ - return device->type() == Core::Id(MeeGoOsType); -} - -QString Qt4MeegoTarget::defaultDisplayName() -{ - return QApplication::translate("Qt4ProjectManager::Qt4Target", - "MeeGo", "Qt4 MeeGo target display name"); -} - -QString Qt4MeegoTarget::specFileName() const -{ - return QLatin1String("meego.spec"); -} - -} // namespace Internal -} // namespace Madde diff --git a/src/plugins/madde/qt4maemotarget.h b/src/plugins/madde/qt4maemotarget.h deleted file mode 100644 index da80854815..0000000000 --- a/src/plugins/madde/qt4maemotarget.h +++ /dev/null @@ -1,302 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. -** -**************************************************************************/ - -#ifndef QT4MAEMOTARGET_H -#define QT4MAEMOTARGET_H - -#include <remotelinux/abstractembeddedlinuxtarget.h> - -#include <QIODevice> -#include <QSharedPointer> -#include <QIcon> - -QT_FORWARD_DECLARE_CLASS(QDateTime) -QT_FORWARD_DECLARE_CLASS(QFile) - -namespace Qt4ProjectManager { class Qt4Project; } -namespace RemoteLinux { class DeploymentSettingsAssistant; } -namespace Utils { class FileSystemWatcher; } - -namespace Madde { -namespace Internal { -class Qt4MaemoDeployConfigurationFactory; -class WatchableFile; - -class AbstractQt4MaemoTarget : public RemoteLinux::AbstractEmbeddedLinuxTarget -{ - friend class Qt4MaemoTargetFactory; - Q_OBJECT -public: - AbstractQt4MaemoTarget(Qt4ProjectManager::Qt4Project *parent, const Core::Id id, - const QString &qmakeScope); - virtual ~AbstractQt4MaemoTarget(); - - void createApplicationProFiles(bool reparse); - QList<ProjectExplorer::RunConfiguration *> runConfigurationsForNode(ProjectExplorer::Node *n); - QList<ProjectExplorer::ToolChain *> possibleToolChains(ProjectExplorer::BuildConfiguration *bc) const; - - virtual bool allowsRemoteMounts() const = 0; - virtual bool allowsPackagingDisabling() const = 0; - virtual bool allowsQmlDebugging() const = 0; - - virtual QString projectVersion(QString *error = 0) const = 0; - virtual QString packageName() const = 0; - virtual QString shortDescription() const = 0; - virtual QString packageFileName() const = 0; - - bool setProjectVersion(const QString &version, QString *error = 0); - bool setPackageName(const QString &packageName); - bool setShortDescription(const QString &description); - - RemoteLinux::DeploymentSettingsAssistant *deploymentSettingsAssistant() const { - return m_deploymentSettingsAssistant; - } - -protected: - enum ActionStatus { NoActionRequired, ActionSuccessful, ActionFailed }; - - void raiseError(const QString &reason); - QSharedPointer<QFile> openFile(const QString &filePath, - QIODevice::OpenMode mode, QString *error) const; - - Utils::FileSystemWatcher* const m_filesWatcher; - -private slots: - void handleTargetAdded(ProjectExplorer::Target *target); - void handleFromMapFinished(); - void handleTargetToBeRemoved(ProjectExplorer::Target *target); - -private: - virtual bool setProjectVersionInternal(const QString &version, - QString *error = 0) = 0; - virtual bool setPackageNameInternal(const QString &packageName) = 0; - virtual bool setShortDescriptionInternal(const QString &description) = 0; - virtual ActionStatus createSpecialTemplates() = 0; - virtual void handleTargetAddedSpecial() = 0; - virtual bool targetCanBeRemoved() const = 0; - virtual void removeTarget() = 0; - virtual QStringList packagingFilePaths() const = 0; - - ActionStatus createTemplates(); - bool initPackagingSettingsFromOtherTarget(); - virtual bool initAdditionalPackagingSettingsFromOtherTarget() = 0; - - RemoteLinux::DeploymentSettingsAssistant * const m_deploymentSettingsAssistant; - bool m_isInitialized; -}; - - -class AbstractDebBasedQt4MaemoTarget : public AbstractQt4MaemoTarget -{ - Q_OBJECT -public: - AbstractDebBasedQt4MaemoTarget(Qt4ProjectManager::Qt4Project *parent, const Core::Id id, - const QString &qmakeScope); - ~AbstractDebBasedQt4MaemoTarget(); - - QString debianDirPath() const; - QStringList debianFiles() const; - - virtual QString debianDirName() const = 0; - virtual QString projectVersion(QString *error = 0) const; - virtual QString packageName() const; - virtual QString shortDescription() const; - virtual QString packageFileName() const; - - bool setPackageManagerIcon(const QString &iconFilePath, QString *error = 0); - QIcon packageManagerIcon(QString *error = 0) const; - bool setPackageManagerName(const QString &name, QString *error = 0); - QString packageManagerName() const; - - virtual QSize packageManagerIconSize() const = 0; - -signals: - void debianDirContentsChanged(); - void changeLogChanged(); - void controlChanged(); - -protected: - virtual void handleTargetAddedSpecial(); - bool adaptControlFileField(QByteArray &document, const QByteArray &fieldName, - const QByteArray &newFieldValue); - -private slots: - void handleDebianDirContentsChanged(); - -private: - virtual bool setProjectVersionInternal(const QString &version, - QString *error = 0); - virtual bool setPackageNameInternal(const QString &packageName); - virtual bool setShortDescriptionInternal(const QString &description); - - virtual ActionStatus createSpecialTemplates(); - virtual bool targetCanBeRemoved() const; - virtual void removeTarget(); - virtual bool initAdditionalPackagingSettingsFromOtherTarget(); - virtual QStringList packagingFilePaths() const; - - virtual void addAdditionalControlFileFields(QByteArray &controlContents) = 0; - virtual QByteArray packageManagerNameFieldName() const = 0; - virtual QByteArray defaultSection() const = 0; - - QString changeLogFilePath() const; - QString controlFilePath() const; - QString rulesFilePath() const; - QByteArray controlFileFieldValue(const QString &key, bool multiLine) const; - bool setControlFieldValue(const QByteArray &fieldName, - const QByteArray &fieldValue); - bool adaptRulesFile(); - bool adaptControlFile(); - bool setPackageManagerIconInternal(const QString &iconFilePath, - QString *error = 0); - QString defaultPackageFileName() const; - bool setPackageManagerNameInternal(const QString &name, QString *error = 0); - QString shortMonthName(const QDateTime &dt) const; - QString shortDayOfWeekName(const QDateTime &dt) const; - - WatchableFile *m_controlFile; - WatchableFile *m_changeLogFile; -}; - - -class AbstractRpmBasedQt4MaemoTarget : public AbstractQt4MaemoTarget -{ - Q_OBJECT -public: - AbstractRpmBasedQt4MaemoTarget(Qt4ProjectManager::Qt4Project *parent, const Core::Id id, - const QString &qmakeScope); - ~AbstractRpmBasedQt4MaemoTarget(); - - virtual bool allowsRemoteMounts() const { return false; } - virtual bool allowsPackagingDisabling() const { return false; } - virtual bool allowsQmlDebugging() const { return false; } - - virtual QString projectVersion(QString *error = 0) const; - virtual QString packageName() const; - virtual QString shortDescription() const; - virtual QString packageFileName() const; - - QString specFilePath() const; - -signals: - void specFileChanged(); - -private: - virtual bool setProjectVersionInternal(const QString &version, - QString *error = 0); - virtual bool setPackageNameInternal(const QString &packageName); - virtual bool setShortDescriptionInternal(const QString &description); - virtual ActionStatus createSpecialTemplates(); - virtual void handleTargetAddedSpecial(); - virtual bool targetCanBeRemoved() const; - virtual void removeTarget(); - virtual bool initAdditionalPackagingSettingsFromOtherTarget(); - virtual QStringList packagingFilePaths() const { return QStringList(specFilePath()); } - - virtual QString specFileName() const = 0; - - QByteArray getValueForTag(const QByteArray &tag, QString *error) const; - bool setValueForTag(const QByteArray &tag, const QByteArray &value, - QString *error); - - WatchableFile *m_specFile; -}; - - -class Qt4Maemo5Target : public AbstractDebBasedQt4MaemoTarget -{ - Q_OBJECT -public: - Qt4Maemo5Target(Qt4ProjectManager::Qt4Project *parent, const Core::Id id); - virtual ~Qt4Maemo5Target(); - - virtual bool supportsDevice(const QSharedPointer<const ProjectExplorer::IDevice> &device) const; - - virtual bool allowsRemoteMounts() const { return true; } - virtual bool allowsPackagingDisabling() const { return true; } - virtual bool allowsQmlDebugging() const { return false; } - - virtual QSize packageManagerIconSize() const; - - static QString defaultDisplayName(); - -private: - virtual void addAdditionalControlFileFields(QByteArray &controlContents); - virtual QString debianDirName() const; - virtual QByteArray packageManagerNameFieldName() const; - virtual QByteArray defaultSection() const; -}; - - -class Qt4HarmattanTarget : public AbstractDebBasedQt4MaemoTarget -{ - Q_OBJECT -public: - Qt4HarmattanTarget(Qt4ProjectManager::Qt4Project *parent, const Core::Id id); - virtual ~Qt4HarmattanTarget(); - - virtual bool supportsDevice(const QSharedPointer<const ProjectExplorer::IDevice> &device) const; - - virtual bool allowsRemoteMounts() const { return false; } - virtual bool allowsPackagingDisabling() const { return false; } - virtual bool allowsQmlDebugging() const { return true; } - - virtual QSize packageManagerIconSize() const; - - static QString defaultDisplayName(); - static QString aegisManifestFileName(); - -private: - void handleTargetAddedSpecial(); - virtual void addAdditionalControlFileFields(QByteArray &controlContents); - virtual QString debianDirName() const; - virtual QByteArray packageManagerNameFieldName() const; - virtual QByteArray defaultSection() const; -}; - - -class Qt4MeegoTarget : public AbstractRpmBasedQt4MaemoTarget -{ - Q_OBJECT -public: - Qt4MeegoTarget(Qt4ProjectManager::Qt4Project *parent, const Core::Id id); - virtual ~Qt4MeegoTarget(); - virtual bool supportsDevice(const QSharedPointer<const ProjectExplorer::IDevice> &device) const; - static QString defaultDisplayName(); -private: - virtual QString specFileName() const; -}; - -} // namespace Internal -} // namespace Madde - -#endif // QT4MAEMOTARGET_H diff --git a/src/plugins/madde/qt4maemotargetfactory.cpp b/src/plugins/madde/qt4maemotargetfactory.cpp deleted file mode 100644 index 9ca58d8e10..0000000000 --- a/src/plugins/madde/qt4maemotargetfactory.cpp +++ /dev/null @@ -1,225 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. -** -**************************************************************************/ - -#include "qt4maemotargetfactory.h" -#include "maemoglobal.h" -#include "maemopackagecreationstep.h" -#include "qt4maemodeployconfiguration.h" -#include "qt4maemotarget.h" - -#include <projectexplorer/deployconfiguration.h> -#include <projectexplorer/projectexplorerconstants.h> -#include <qt4projectmanager/buildconfigurationinfo.h> -#include <qt4projectmanager/qt4project.h> -#include <qt4projectmanager/qt4projectmanagerconstants.h> -#include <qtsupport/customexecutablerunconfiguration.h> -#include <qtsupport/qtversionmanager.h> -#include <utils/qtcassert.h> - -using namespace Qt4ProjectManager; -using namespace Qt4ProjectManager::Constants; -using ProjectExplorer::idFromMap; - -namespace Madde { -namespace Internal { - -// ------------------------------------------------------------------------- -// Qt4MaemoTargetFactory -// ------------------------------------------------------------------------- -Qt4MaemoTargetFactory::Qt4MaemoTargetFactory(QObject *parent) : - Qt4BaseTargetFactory(parent) -{ - connect(QtSupport::QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>,QList<int>,QList<int>)), - this, SIGNAL(canCreateTargetIdsChanged())); -} - -Qt4MaemoTargetFactory::~Qt4MaemoTargetFactory() -{ -} - -bool Qt4MaemoTargetFactory::supportsTargetId(const Core::Id id) const -{ - return MaemoGlobal::isMaemoTargetId(id); -} - -QList<Core::Id> Qt4MaemoTargetFactory::supportedTargetIds() const -{ - QList<Core::Id> targetIds; - targetIds << Core::Id(MAEMO5_DEVICE_TARGET_ID) - << Core::Id(HARMATTAN_DEVICE_TARGET_ID) - << Core::Id(MEEGO_DEVICE_TARGET_ID); - return targetIds; -} - -QString Qt4MaemoTargetFactory::displayNameForId(const Core::Id id) const -{ - if (id == Core::Id(MAEMO5_DEVICE_TARGET_ID)) - return Qt4Maemo5Target::defaultDisplayName(); - else if (id == Core::Id(HARMATTAN_DEVICE_TARGET_ID)) - return Qt4HarmattanTarget::defaultDisplayName(); - else if (id == Core::Id(MEEGO_DEVICE_TARGET_ID)) - return Qt4MeegoTarget::defaultDisplayName(); - return QString(); -} - -QIcon Qt4MaemoTargetFactory::iconForId(const Core::Id id) const -{ - Q_UNUSED(id) - return QIcon(":/projectexplorer/images/MaemoDevice.png"); -} - -bool Qt4MaemoTargetFactory::canCreate(ProjectExplorer::Project *parent, const Core::Id id) const -{ - if (!qobject_cast<Qt4Project *>(parent)) - return false; - if (!supportsTargetId(id)) - return false; - - return !QtSupport::QtVersionManager::instance()->versionsForTargetId(id).isEmpty(); -} - -bool Qt4MaemoTargetFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const -{ - return qobject_cast<Qt4Project *>(parent) && supportsTargetId(idFromMap(map)); -} - -ProjectExplorer::Target *Qt4MaemoTargetFactory::restore(ProjectExplorer::Project *parent, const QVariantMap &map) -{ - if (!canRestore(parent, map)) - return 0; - - const Core::Id id = idFromMap(map); - AbstractQt4MaemoTarget *target = 0; - Qt4Project *qt4project = static_cast<Qt4Project *>(parent); - if (id == Core::Id(MAEMO5_DEVICE_TARGET_ID)) - target = new Qt4Maemo5Target(qt4project, id); - else if (id == Core::Id(HARMATTAN_DEVICE_TARGET_ID)) - target = new Qt4HarmattanTarget(qt4project, id); - else if (id == Core::Id(MEEGO_DEVICE_TARGET_ID)) - target = new Qt4MeegoTarget(qt4project, id); - if (target->fromMap(map)) - return target; - delete target; - return 0; -} - -QString Qt4MaemoTargetFactory::buildNameForId(const Core::Id id) const -{ - if (id == Core::Id(MAEMO5_DEVICE_TARGET_ID)) - return QLatin1String("maemo"); - else if (id == Core::Id(HARMATTAN_DEVICE_TARGET_ID)) - return QLatin1String("harmattan"); - else if (id == Core::Id(MEEGO_DEVICE_TARGET_ID)) - return QLatin1String("meego"); - else - return QString(); -} - -QString Qt4MaemoTargetFactory::shadowBuildDirectory(const QString &profilePath, const Core::Id id, const QString &suffix) -{ -#if defined(Q_OS_WIN) - // No shadowbuilding for windows! - Q_UNUSED(id); - Q_UNUSED(suffix); - return QFileInfo(profilePath).absolutePath(); -#else - return Qt4BaseTargetFactory::shadowBuildDirectory(profilePath, id, suffix); -#endif -} - -QSet<QString> Qt4MaemoTargetFactory::targetFeatures(const Core::Id id) const -{ - Q_UNUSED(id); - QSet<QString> features; - features << Qt4ProjectManager::Constants::MOBILE_TARGETFEATURE_ID; -#ifndef Q_OS_WIN - features << Qt4ProjectManager::Constants::SHADOWBUILD_TARGETFEATURE_ID; -#endif - return features; -} - -ProjectExplorer::Target *Qt4MaemoTargetFactory::create(ProjectExplorer::Project *parent, const Core::Id id) -{ - if (!canCreate(parent, id)) - return 0; - - QList<QtSupport::BaseQtVersion *> knownVersions = QtSupport::QtVersionManager::instance()->versionsForTargetId(id); - if (knownVersions.isEmpty()) - return 0; - - QtSupport::BaseQtVersion *qtVersion = knownVersions.first(); - QtSupport::BaseQtVersion::QmakeBuildConfigs config = qtVersion->defaultBuildConfig(); - - QList<BuildConfigurationInfo> infos; - infos.append(BuildConfigurationInfo(qtVersion->uniqueId(), config, QString(), QString())); - infos.append(BuildConfigurationInfo(qtVersion->uniqueId(), config ^ QtSupport::BaseQtVersion::DebugBuild, QString(), QString())); - - return create(parent, id, infos); -} - -ProjectExplorer::Target *Qt4MaemoTargetFactory::create(ProjectExplorer::Project *parent, - const Core::Id id, const QList<BuildConfigurationInfo> &infos) -{ - if (!canCreate(parent, id)) - return 0; - - AbstractQt4MaemoTarget *target = 0; - QList<Core::Id> deployConfigIds; - if (id == Core::Id(MAEMO5_DEVICE_TARGET_ID)) { - target = new Qt4Maemo5Target(static_cast<Qt4Project *>(parent), id); - deployConfigIds << Qt4MaemoDeployConfiguration::fremantleWithPackagingId() - << Qt4MaemoDeployConfiguration::fremantleWithoutPackagingId(); - } else if (id == Core::Id(HARMATTAN_DEVICE_TARGET_ID)) { - target = new Qt4HarmattanTarget(static_cast<Qt4Project *>(parent), id); - deployConfigIds << Qt4MaemoDeployConfiguration::harmattanId(); - } else if (id == Core::Id(MEEGO_DEVICE_TARGET_ID)) { - target = new Qt4MeegoTarget(static_cast<Qt4Project *>(parent), id); - deployConfigIds << Qt4MaemoDeployConfiguration::meegoId(); - } - Q_ASSERT(target); - - foreach (const BuildConfigurationInfo &info, infos) - target->addQt4BuildConfiguration(msgBuildConfigurationName(info), QString(), - info.version(), info.buildConfig, - info.additionalArguments, info.directory, info.importing); - - foreach (const Core::Id &deployConfigId, deployConfigIds) { - target->addDeployConfiguration(target->createDeployConfiguration(deployConfigId)); - } - target->createApplicationProFiles(false); - if (target->runConfigurations().isEmpty()) - target->addRunConfiguration(new QtSupport::CustomExecutableRunConfiguration(target)); - return target; -} - -} // namespace Internal -} // namespace Madde diff --git a/src/plugins/madde/qt4maemotargetfactory.h b/src/plugins/madde/qt4maemotargetfactory.h deleted file mode 100644 index db858de1a2..0000000000 --- a/src/plugins/madde/qt4maemotargetfactory.h +++ /dev/null @@ -1,71 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. -** -**************************************************************************/ - -#ifndef QT4MAEMOTARGETFACTORY_H -#define QT4MAEMOTARGETFACTORY_H - -#include <qt4projectmanager/qt4basetargetfactory.h> - -namespace Madde { -namespace Internal { - -class Qt4MaemoTargetFactory : public Qt4ProjectManager::Qt4BaseTargetFactory -{ - Q_OBJECT -public: - Qt4MaemoTargetFactory(QObject *parent = 0); - ~Qt4MaemoTargetFactory(); - - QList<Core::Id> supportedTargetIds() const; - QString displayNameForId(const Core::Id id) const; - QIcon iconForId(const Core::Id id) const; - - bool canCreate(ProjectExplorer::Project *parent, const Core::Id id) const; - bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const; - ProjectExplorer::Target *restore(ProjectExplorer::Project *parent, const QVariantMap &map); - - QString shadowBuildDirectory(const QString &profilePath, const Core::Id id, const QString &suffix); - QString buildNameForId(const Core::Id id) const; - - bool supportsTargetId(const Core::Id id) const; - - ProjectExplorer::Target *create(ProjectExplorer::Project *parent, const Core::Id id); - ProjectExplorer::Target *create(ProjectExplorer::Project *parent, const Core::Id id, - const QList<Qt4ProjectManager::BuildConfigurationInfo> &infos); - - QSet<QString> targetFeatures(const Core::Id id) const; -}; - -} // namespace Internal -} // namespace Madde - -#endif // QT4MAEMOTARGETFACTORY_H diff --git a/src/plugins/madde/rpmmanager.cpp b/src/plugins/madde/rpmmanager.cpp new file mode 100644 index 0000000000..ece1ec24c9 --- /dev/null +++ b/src/plugins/madde/rpmmanager.cpp @@ -0,0 +1,243 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. +** +**************************************************************************/ + +#include "rpmmanager.h" + +#include "maddedevice.h" +#include "maemoconstants.h" +#include "maemoglobal.h" +#include "maemopackagecreationstep.h" + +#include <coreplugin/documentmanager.h> +#include <projectexplorer/project.h> +#include <projectexplorer/target.h> +#include <qt4projectmanager/qt4buildconfiguration.h> +#include <qtsupport/qtprofileinformation.h> +#include <utils/filesystemwatcher.h> +#include <utils/qtcassert.h> + +#include <QBuffer> +#include <QByteArray> +#include <QDateTime> +#include <QDir> +#include <QProcess> + +#include <QMessageBox> + +// ----------------------------------------------------------------------- +// Helpers: +// ----------------------------------------------------------------------- + +namespace { + +const QLatin1String PackagingDirName("qtc_packaging"); +const QByteArray NameTag("Name"); +const QByteArray SummaryTag("Summary"); +const QByteArray VersionTag("Version"); +const QByteArray ReleaseTag("Release"); + +bool adaptTagValue(QByteArray &document, const QByteArray &fieldName, + const QByteArray &newFieldValue, bool caseSensitive) +{ + QByteArray adaptedLine = fieldName + ": " + newFieldValue; + const QByteArray completeTag = fieldName + ':'; + const int lineOffset = caseSensitive ? document.indexOf(completeTag) + : document.toLower().indexOf(completeTag.toLower()); + if (lineOffset == -1) { + document.append(adaptedLine).append('\n'); + return true; + } + + int newlineOffset = document.indexOf('\n', lineOffset); + bool updated = false; + if (newlineOffset == -1) { + newlineOffset = document.length(); + adaptedLine += '\n'; + updated = true; + } + const int replaceCount = newlineOffset - lineOffset; + if (!updated && document.mid(lineOffset, replaceCount) != adaptedLine) + updated = true; + if (updated) + document.replace(lineOffset, replaceCount, adaptedLine); + return updated; +} + +QByteArray valueForTag(const Utils::FileName &spec, const QByteArray &tag, QString *error) +{ + Utils::FileReader reader; + if (!reader.fetch(spec.toString(), error)) + return QByteArray(); + const QByteArray &content = reader.data(); + const QByteArray completeTag = tag.toLower() + ':'; + int index = content.toLower().indexOf(completeTag); + if (index == -1) + return QByteArray(); + index += completeTag.count(); + int endIndex = content.indexOf('\n', index); + if (endIndex == -1) + endIndex = content.count(); + return content.mid(index, endIndex - index).trimmed(); +} + +bool setValueForTag(const Utils::FileName &spec, const QByteArray &tag, const QByteArray &value, QString *error) +{ + Utils::FileReader reader; + if (!reader.fetch(spec.toString(), error)) + return false; + QByteArray content = reader.data(); + if (adaptTagValue(content, tag, value, false)) { + Utils::FileSaver saver(spec.toString()); + saver.write(content); + return saver.finalize(error); + } + return true; +} + +} // namespace + +namespace Madde { +namespace Internal { + +// ----------------------------------------------------------------------- +// RpmManager: +// ----------------------------------------------------------------------- + +RpmManager *RpmManager::m_instance = 0; + +RpmManager::RpmManager(QObject *parent) : + QObject(parent), + m_watcher(new Utils::FileSystemWatcher(this)) +{ + m_instance = this; + + m_watcher->setObjectName("Madde::RpmManager"); + connect(m_watcher, SIGNAL(fileChanged(QString)), + this, SLOT(specFileWasChanged(QString))); +} + +RpmManager::~RpmManager() +{ } + +RpmManager *RpmManager::instance() +{ + return m_instance; +} + +void RpmManager::monitor(const Utils::FileName &spec) +{ + QFileInfo fi = spec.toFileInfo(); + if (!fi.isFile()) + return; + + if (!m_watches.contains(spec)) { + m_watches.insert(spec, 1); + m_watcher->addFile(spec.toString(), Utils::FileSystemWatcher::WatchAllChanges); + } +} + +void RpmManager::ignore(const Utils::FileName &spec) +{ + int count = m_watches.value(spec, 0) - 1; + if (count < 0) + return; + if (count > 0) { + m_watches[spec] = 0; + } else { + m_watches.remove(spec); + m_watcher->removeFile(spec.toString()); + } +} + +QString RpmManager::projectVersion(const Utils::FileName &spec, QString *error) +{ + return QString::fromUtf8(valueForTag(spec, VersionTag, error)); +} + +bool RpmManager::setProjectVersion(const Utils::FileName &spec, const QString &version, QString *error) +{ + return setValueForTag(spec, VersionTag, version.toUtf8(), error); +} + +QString RpmManager::packageName(const Utils::FileName &spec) +{ + return QString::fromUtf8(valueForTag(spec, NameTag, 0)); +} + +bool RpmManager::setPackageName(const Utils::FileName &spec, const QString &packageName) +{ + return setValueForTag(spec, NameTag, packageName.toUtf8(), 0); +} + +QString RpmManager::shortDescription(const Utils::FileName &spec) +{ + return QString::fromUtf8(valueForTag(spec, SummaryTag, 0)); +} + +bool RpmManager::setShortDescription(const Utils::FileName &spec, const QString &description) +{ + return setValueForTag(spec, SummaryTag, description.toUtf8(), 0); +} + +Utils::FileName RpmManager::packageFileName(const Utils::FileName &spec, ProjectExplorer::Target *t) +{ + QtSupport::BaseQtVersion *lqt = QtSupport::QtProfileInformation::qtVersion(t->profile()); + if (!lqt) + return Utils::FileName(); + return Utils::FileName::fromString(packageName(spec) + + QLatin1Char('-') + projectVersion(spec) + + QLatin1Char('-') + QString::fromUtf8(valueForTag(spec, ReleaseTag, 0)) + + QLatin1Char('.') + MaemoGlobal::architecture(lqt->qmakeCommand().toString()) + + QLatin1String(".rpm")); +} + +Utils::FileName RpmManager::specFile(ProjectExplorer::Target *target) +{ + Utils::FileName path = Utils::FileName::fromString(target->project()->projectDirectory()); + path.appendPath(PackagingDirName); + Core::Id deviceType = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(target->profile()); + if (deviceType == Core::Id(MeeGoOsType)) + path.appendPath(QLatin1String("meego.spec")); + else + path.clear(); + return path; +} + +void RpmManager::specFileWasChanged(const QString &path) +{ + Utils::FileName fn = Utils::FileName::fromString(path); + QTC_ASSERT(m_watches.contains(fn), return); + emit specFileChanged(fn); +} + +} // namespace Internal +} // namespace Madde diff --git a/src/plugins/madde/rpmmanager.h b/src/plugins/madde/rpmmanager.h new file mode 100644 index 0000000000..5a4a2f7ed8 --- /dev/null +++ b/src/plugins/madde/rpmmanager.h @@ -0,0 +1,92 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. +** +**************************************************************************/ + +#ifndef RPMMANAGER_H +#define RPMMANAGER_H + +#include <coreplugin/id.h> +#include <utils/fileutils.h> + +#include <QObject> +#include <QHash> + +namespace Utils { class FileSystemWatcher; } +namespace ProjectExplorer { class Target; } +namespace Qt4ProjectManager { class Qt4BuildConfiguration; } + +namespace Madde { +namespace Internal { +class MaddePlugin; + +class RpmManager : public QObject +{ + Q_OBJECT +public: + ~RpmManager(); + + static RpmManager *instance(); + + // ref counted: + void monitor(const Utils::FileName &specFile); + void ignore(const Utils::FileName &specFile); + + static QString projectVersion(const Utils::FileName &spec, QString *error = 0); + static bool setProjectVersion(const Utils::FileName &spec, const QString &version, QString *error = 0); + static QString packageName(const Utils::FileName &spec); + static bool setPackageName(const Utils::FileName &spec, const QString &packageName); + static QString shortDescription(const Utils::FileName &spec); + static bool setShortDescription(const Utils::FileName &spec, const QString &description); + + static Utils::FileName packageFileName(const Utils::FileName &spec, ProjectExplorer::Target *t); + + static Utils::FileName specFile(ProjectExplorer::Target *target); + +signals: + void specFileChanged(const Utils::FileName &spec); + +private slots: + void specFileWasChanged(const QString &path); + +private: + explicit RpmManager(QObject *parent = 0); + + Utils::FileSystemWatcher *m_watcher; + QHash<Utils::FileName, int> m_watches; + static RpmManager *m_instance; + + friend class MaddePlugin; +}; + +} // namespace Internal +} // namespace Madde + +#endif // DEBIANMANAGER_H diff --git a/src/plugins/projectexplorer/abstractmsvctoolchain.cpp b/src/plugins/projectexplorer/abstractmsvctoolchain.cpp index 4bb17b044e..0017243a5a 100644 --- a/src/plugins/projectexplorer/abstractmsvctoolchain.cpp +++ b/src/plugins/projectexplorer/abstractmsvctoolchain.cpp @@ -132,14 +132,6 @@ QString AbstractMsvcToolChain::makeCommand() const return QLatin1String("nmake.exe"); } -void AbstractMsvcToolChain::setDebuggerCommand(const Utils::FileName &d) -{ - if (m_debuggerCommand == d) - return; - m_debuggerCommand = d; - toolChainUpdated(); -} - Utils::FileName AbstractMsvcToolChain::compilerCommand() const { Utils::Environment env; @@ -147,12 +139,6 @@ Utils::FileName AbstractMsvcToolChain::compilerCommand() const return Utils::FileName::fromString(env.searchInPath("cl.exe")); } -Utils::FileName AbstractMsvcToolChain::debuggerCommand() const -{ - return m_debuggerCommand; -} - - IOutputParser *AbstractMsvcToolChain::outputParser() const { return new MsvcParser; @@ -296,7 +282,6 @@ bool AbstractMsvcToolChain::operator ==(const ToolChain &other) const const AbstractMsvcToolChain *msvcTc = static_cast<const AbstractMsvcToolChain *>(&other); return targetAbi() == msvcTc->targetAbi() - && m_debuggerCommand == msvcTc->m_debuggerCommand && m_vcvarsBat == msvcTc->m_vcvarsBat; } diff --git a/src/plugins/projectexplorer/abstractmsvctoolchain.h b/src/plugins/projectexplorer/abstractmsvctoolchain.h index 519785880c..ef26aa401c 100644 --- a/src/plugins/projectexplorer/abstractmsvctoolchain.h +++ b/src/plugins/projectexplorer/abstractmsvctoolchain.h @@ -57,10 +57,7 @@ public: void addToEnvironment(Utils::Environment &env) const; QString makeCommand() const; - void setDebuggerCommand(const Utils::FileName &d); - Utils::FileName compilerCommand() const; - Utils::FileName debuggerCommand() const; IOutputParser *outputParser() const; bool canClone() const; diff --git a/src/plugins/projectexplorer/buildconfiguration.cpp b/src/plugins/projectexplorer/buildconfiguration.cpp index df9561db06..e97134952c 100644 --- a/src/plugins/projectexplorer/buildconfiguration.cpp +++ b/src/plugins/projectexplorer/buildconfiguration.cpp @@ -32,16 +32,16 @@ #include "buildconfiguration.h" -#include "toolchain.h" #include "buildmanager.h" #include "buildsteplist.h" #include "projectexplorer.h" #include "projectexplorerconstants.h" +#include "profilemanager.h" #include "target.h" -#include "toolchainmanager.h" #include "project.h" #include <coreplugin/variablemanager.h> +#include <extensionsystem/pluginmanager.h> #include <utils/qtcassert.h> #include <utils/stringutils.h> @@ -52,7 +52,6 @@ static const char BUILD_STEP_LIST_COUNT[] = "ProjectExplorer.BuildConfiguration. static const char BUILD_STEP_LIST_PREFIX[] = "ProjectExplorer.BuildConfiguration.BuildStepList."; static const char CLEAR_SYSTEM_ENVIRONMENT_KEY[] = "ProjectExplorer.BuildConfiguration.ClearSystemEnvironment"; static const char USER_ENVIRONMENT_CHANGES_KEY[] = "ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"; -static const char TOOLCHAIN_KEY[] = "ProjectExplorer.BuildCOnfiguration.ToolChain"; namespace ProjectExplorer { namespace Internal { @@ -83,7 +82,6 @@ bool BuildConfigMacroExpander::resolveMacro(const QString &name, QString *ret) BuildConfiguration::BuildConfiguration(Target *target, const Core::Id id) : ProjectConfiguration(target, id), m_clearSystemEnvironment(false), - m_toolChain(0), m_macroExpander(0) { Q_ASSERT(target); @@ -96,19 +94,14 @@ BuildConfiguration::BuildConfiguration(Target *target, const Core::Id id) : bsl->setDefaultDisplayName(tr("Clean")); m_stepLists.append(bsl); - connect(ToolChainManager::instance(), SIGNAL(toolChainRemoved(ProjectExplorer::ToolChain*)), - this, SLOT(handleToolChainRemovals(ProjectExplorer::ToolChain*))); - connect(ToolChainManager::instance(), SIGNAL(toolChainAdded(ProjectExplorer::ToolChain*)), - this, SLOT(handleToolChainAddition(ProjectExplorer::ToolChain*))); - connect(ToolChainManager::instance(), SIGNAL(toolChainUpdated(ProjectExplorer::ToolChain*)), - this, SLOT(handleToolChainUpdates(ProjectExplorer::ToolChain*))); + connect(ProfileManager::instance(), SIGNAL(profileUpdated(ProjectExplorer::Profile*)), + this, SLOT(handleProfileUpdate(ProjectExplorer::Profile*))); } BuildConfiguration::BuildConfiguration(Target *target, BuildConfiguration *source) : ProjectConfiguration(target, source), m_clearSystemEnvironment(source->m_clearSystemEnvironment), m_userEnvironmentChanges(source->m_userEnvironmentChanges), - m_toolChain(source->m_toolChain), m_macroExpander(0) { Q_ASSERT(target); @@ -116,12 +109,8 @@ BuildConfiguration::BuildConfiguration(Target *target, BuildConfiguration *sourc // otherwise BuildStepFactories might reject to set up a BuildStep for us // since we are not yet the derived class! - connect(ToolChainManager::instance(), SIGNAL(toolChainRemoved(ProjectExplorer::ToolChain*)), - this, SLOT(handleToolChainRemovals(ProjectExplorer::ToolChain*))); - connect(ToolChainManager::instance(), SIGNAL(toolChainAdded(ProjectExplorer::ToolChain*)), - this, SLOT(handleToolChainAddition(ProjectExplorer::ToolChain*))); - connect(ToolChainManager::instance(), SIGNAL(toolChainUpdated(ProjectExplorer::ToolChain*)), - this, SLOT(handleToolChainUpdates(ProjectExplorer::ToolChain*))); + connect(ProfileManager::instance(), SIGNAL(profileUpdated(ProjectExplorer::Profile*)), + this, SLOT(handleProfileUpdate(ProjectExplorer::Profile*))); } BuildConfiguration::~BuildConfiguration() @@ -162,8 +151,6 @@ QVariantMap BuildConfiguration::toMap() const for (int i = 0; i < m_stepLists.count(); ++i) map.insert(QLatin1String(BUILD_STEP_LIST_PREFIX) + QString::number(i), m_stepLists.at(i)->toMap()); - map.insert(QLatin1String(TOOLCHAIN_KEY), m_toolChain ? m_toolChain->id() : QLatin1String("INVALID")); - return map; } @@ -195,10 +182,6 @@ bool BuildConfiguration::fromMap(const QVariantMap &map) m_stepLists.append(list); } - const QString id = map.value(QLatin1String(TOOLCHAIN_KEY)).toString(); - setToolChain(ToolChainManager::instance()->findToolChain(id)); // Do not validate the tool chain as - // the BC is not completely set up yet! - // We currently assume there to be at least a clean and build list! QTC_CHECK(knownStepLists().contains(Core::Id(ProjectExplorer::Constants::BUILDSTEPS_BUILD))); QTC_CHECK(knownStepLists().contains(Core::Id(ProjectExplorer::Constants::BUILDSTEPS_CLEAN))); @@ -206,52 +189,18 @@ bool BuildConfiguration::fromMap(const QVariantMap &map) return ProjectConfiguration::fromMap(map); } -void BuildConfiguration::handleToolChainRemovals(ProjectExplorer::ToolChain *tc) -{ - if (m_toolChain != tc) - return; - setToolChain(target()->preferredToolChain(this)); -} - -void BuildConfiguration::handleToolChainAddition(ProjectExplorer::ToolChain *tc) -{ - Q_UNUSED(tc); - if (m_toolChain != 0) - return; - setToolChain(target()->preferredToolChain(this)); -} - -void BuildConfiguration::handleToolChainUpdates(ProjectExplorer::ToolChain *tc) +void BuildConfiguration::handleProfileUpdate(ProjectExplorer::Profile *p) { - if (tc != m_toolChain) + if (p != target()->profile()) return; - QList<ToolChain *> candidates = target()->possibleToolChains(this); - if (!candidates.contains(m_toolChain)) - setToolChain(target()->preferredToolChain(this)); - else - emit toolChainChanged(); + emit environmentChanged(); } - Target *BuildConfiguration::target() const { return static_cast<Target *>(parent()); } -ProjectExplorer::ToolChain *BuildConfiguration::toolChain() const -{ - return m_toolChain; -} - -void BuildConfiguration::setToolChain(ProjectExplorer::ToolChain *tc) -{ - if (m_toolChain == tc) - return; - m_toolChain = tc; - emit toolChainChanged(); - emit environmentChanged(); -} - Utils::Environment BuildConfiguration::baseEnvironment() const { Utils::Environment result; @@ -333,4 +282,26 @@ IBuildConfigurationFactory::IBuildConfigurationFactory(QObject *parent) : IBuildConfigurationFactory::~IBuildConfigurationFactory() { } +IBuildConfigurationFactory *IBuildConfigurationFactory::find(Target *parent, const QVariantMap &map) +{ + QList<IBuildConfigurationFactory *> factories + = ExtensionSystem::PluginManager::instance()->getObjects<IBuildConfigurationFactory>(); + foreach (IBuildConfigurationFactory *factory, factories) { + if (factory->canRestore(parent, map)) + return factory; + } + return 0; +} + +IBuildConfigurationFactory * IBuildConfigurationFactory::find(Target *parent) +{ + QList<IBuildConfigurationFactory *> factories + = ExtensionSystem::PluginManager::instance()->getObjects<IBuildConfigurationFactory>(); + foreach (IBuildConfigurationFactory *factory, factories) { + if (!factory->availableCreationIds(parent).isEmpty()) + return factory; + } + return 0; +} + } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/buildconfiguration.h b/src/plugins/projectexplorer/buildconfiguration.h index e2057f4ef4..958692f900 100644 --- a/src/plugins/projectexplorer/buildconfiguration.h +++ b/src/plugins/projectexplorer/buildconfiguration.h @@ -47,9 +47,10 @@ class AbstractMacroExpander; namespace ProjectExplorer { class BuildConfiguration; +class BuildConfigWidget; class BuildStepList; +class Profile; class Target; -class ToolChain; class IOutputParser; class PROJECTEXPLORER_EXPORT BuildConfiguration : public ProjectConfiguration @@ -62,6 +63,8 @@ public: virtual QString buildDirectory() const = 0; + virtual BuildConfigWidget *createConfigWidget() = 0; + // Maybe the BuildConfiguration is not the best place for the environment virtual Utils::Environment baseEnvironment() const; QString baseEnvironmentText() const; @@ -90,9 +93,6 @@ public: Utils::AbstractMacroExpander *macroExpander(); - virtual ProjectExplorer::ToolChain *toolChain() const; - virtual void setToolChain(ProjectExplorer::ToolChain *tc); - enum BuildType { Unknown, Debug, @@ -104,7 +104,10 @@ signals: void environmentChanged(); void buildDirectoryChanged(); void enabledChanged(); - void toolChainChanged(); + /// Emitted whenever the build system needs to be (re-) evaluated + void requestBuildSystemEvaluation(); + /// Emitter whenever the build directory was successfully initialized (configured). + void buildDirectoryInitialized(); protected: BuildConfiguration(Target *target, const Core::Id id); @@ -115,15 +118,12 @@ protected: virtual bool fromMap(const QVariantMap &map); private slots: - void handleToolChainRemovals(ProjectExplorer::ToolChain *tc); - void handleToolChainAddition(ProjectExplorer::ToolChain *tc); - void handleToolChainUpdates(ProjectExplorer::ToolChain*); + void handleProfileUpdate(ProjectExplorer::Profile *p); private: bool m_clearSystemEnvironment; QList<Utils::EnvironmentItem> m_userEnvironmentChanges; QList<BuildStepList *> m_stepLists; - ToolChain *m_toolChain; Utils::AbstractMacroExpander *m_macroExpander; }; @@ -137,18 +137,21 @@ public: virtual ~IBuildConfigurationFactory(); // used to show the list of possible additons to a target, returns a list of types - virtual QList<Core::Id> availableCreationIds(Target *parent) const = 0; + virtual QList<Core::Id> availableCreationIds(const Target *parent) const = 0; // used to translate the types to names to display to the user virtual QString displayNameForId(const Core::Id id) const = 0; - virtual bool canCreate(Target *parent, const Core::Id id) const = 0; - virtual BuildConfiguration *create(Target *parent, const Core::Id id) = 0; + virtual bool canCreate(const Target *parent, const Core::Id id) const = 0; + virtual BuildConfiguration *create(Target *parent, const Core::Id id, const QString &name = QString()) = 0; // used to recreate the runConfigurations when restoring settings - virtual bool canRestore(Target *parent, const QVariantMap &map) const = 0; + virtual bool canRestore(const Target *parent, const QVariantMap &map) const = 0; virtual BuildConfiguration *restore(Target *parent, const QVariantMap &map) = 0; - virtual bool canClone(Target *parent, BuildConfiguration *product) const = 0; + virtual bool canClone(const Target *parent, BuildConfiguration *product) const = 0; virtual BuildConfiguration *clone(Target *parent, BuildConfiguration *product) = 0; + static IBuildConfigurationFactory *find(Target *parent, const QVariantMap &map); + static IBuildConfigurationFactory *find(Target *parent); + signals: void availableCreationIdsChanged(); }; diff --git a/src/plugins/projectexplorer/buildenvironmentwidget.cpp b/src/plugins/projectexplorer/buildenvironmentwidget.cpp index acafb1eb38..6ce515fb6f 100644 --- a/src/plugins/projectexplorer/buildenvironmentwidget.cpp +++ b/src/plugins/projectexplorer/buildenvironmentwidget.cpp @@ -35,6 +35,7 @@ #include "buildconfiguration.h" #include "environmentwidget.h" +#include <projectexplorer/target.h> #include <utils/qtcassert.h> #include <QVBoxLayout> @@ -69,17 +70,13 @@ void BuildEnvironmentWidget::init(BuildConfiguration *bc) Q_ASSERT(bc); if (m_buildConfiguration) { - disconnect(m_buildConfiguration, SIGNAL(environmentChanged()), - this, SLOT(environmentChanged())); - disconnect(m_buildConfiguration, SIGNAL(toolChainChanged()), + disconnect(m_buildConfiguration->target(), SIGNAL(environmentChanged()), this, SLOT(environmentChanged())); } m_buildConfiguration = bc; - connect(m_buildConfiguration, SIGNAL(environmentChanged()), - this, SLOT(environmentChanged())); - connect(m_buildConfiguration, SIGNAL(toolChainChanged()), + connect(m_buildConfiguration->target(), SIGNAL(environmentChanged()), this, SLOT(environmentChanged())); m_clearSystemEnvironmentCheckBox->setChecked(!m_buildConfiguration->useSystemEnvironment()); diff --git a/src/plugins/projectexplorer/buildsettingspropertiespage.cpp b/src/plugins/projectexplorer/buildsettingspropertiespage.cpp index 986f52de15..91a693a561 100644 --- a/src/plugins/projectexplorer/buildsettingspropertiespage.cpp +++ b/src/plugins/projectexplorer/buildsettingspropertiespage.cpp @@ -80,7 +80,7 @@ int BuildSettingsPanelFactory::priority() const bool BuildSettingsPanelFactory::supports(Target *target) { - return target->buildConfigurationFactory(); + return IBuildConfigurationFactory::find(target); } PropertiesPanel *BuildSettingsPanelFactory::createPanel(Target *target) @@ -120,7 +120,7 @@ void BuildSettingsWidget::setupUi() QVBoxLayout *vbox = new QVBoxLayout(this); vbox->setContentsMargins(0, 0, 0, 0); - if (!m_target->buildConfigurationFactory()) { + if (!IBuildConfigurationFactory::find(m_target)) { QLabel *noSettingsLabel = new QLabel(this); noSettingsLabel->setText(tr("No build settings available")); QFont f = noSettingsLabel->font(); @@ -179,9 +179,7 @@ void BuildSettingsWidget::setupUi() connect(m_target, SIGNAL(activeBuildConfigurationChanged(ProjectExplorer::BuildConfiguration*)), this, SLOT(updateActiveConfiguration())); - if (m_target->buildConfigurationFactory()) - connect(m_target->buildConfigurationFactory(), SIGNAL(availableCreationIdsChanged()), - SLOT(updateAddButtonMenu())); + connect(m_target, SIGNAL(profileChanged()), this, SLOT(updateAddButtonMenu())); } void BuildSettingsWidget::addSubWidget(BuildConfigWidget *widget) @@ -227,12 +225,10 @@ void BuildSettingsWidget::updateAddButtonMenu() m_addButtonMenu->addAction(tr("&Clone Selected"), this, SLOT(cloneConfiguration())); } - IBuildConfigurationFactory *factory = m_target->buildConfigurationFactory(); - if (factory) { - foreach (Core::Id id, factory->availableCreationIds(m_target)) { - QAction *action = m_addButtonMenu->addAction(factory->displayNameForId(id), this, SLOT(createConfiguration())); - action->setData(QVariant::fromValue(id)); - } + IBuildConfigurationFactory * factory = IBuildConfigurationFactory::find(m_target); + foreach (Core::Id id, factory->availableCreationIds(m_target)) { + QAction *action = m_addButtonMenu->addAction(factory->displayNameForId(id), this, SLOT(createConfiguration())); + action->setData(QVariant::fromValue(id)); } } } @@ -245,7 +241,7 @@ void BuildSettingsWidget::updateBuildSettings() m_removeButton->setEnabled(m_target->buildConfigurations().size() > 1); // Add pages - BuildConfigWidget *generalConfigWidget = m_target->createConfigWidget(); + BuildConfigWidget *generalConfigWidget = m_buildConfiguration->createConfigWidget(); addSubWidget(generalConfigWidget); addSubWidget(new BuildStepsPage(m_target, Core::Id(Constants::BUILDSTEPS_BUILD))); @@ -285,16 +281,22 @@ void BuildSettingsWidget::updateActiveConfiguration() void BuildSettingsWidget::createConfiguration() { - if (!m_target->buildConfigurationFactory()) - return; - QAction *action = qobject_cast<QAction *>(sender()); Core::Id id = action->data().value<Core::Id>(); - BuildConfiguration *bc = m_target->buildConfigurationFactory()->create(m_target, id); - if (bc) { - m_target->setActiveBuildConfiguration(bc); - updateBuildSettings(); - } + + IBuildConfigurationFactory *factory = IBuildConfigurationFactory::find(m_target); + if (!factory) + return; + + BuildConfiguration *bc = factory->create(m_target, id); + if (!bc) + return; + + m_target->addBuildConfiguration(bc); + + QTC_CHECK(bc->id() == id); + m_target->setActiveBuildConfiguration(bc); + updateBuildSettings(); } void BuildSettingsWidget::cloneConfiguration() @@ -343,8 +345,10 @@ void BuildSettingsWidget::renameConfiguration() void BuildSettingsWidget::cloneConfiguration(BuildConfiguration *sourceConfiguration) { - if (!sourceConfiguration || - !m_target->buildConfigurationFactory()) + if (!sourceConfiguration) + return; + IBuildConfigurationFactory *factory = IBuildConfigurationFactory::find(m_target); + if (!factory) return; //: Title of a the cloned BuildConfiguration window, text of the window @@ -352,7 +356,7 @@ void BuildSettingsWidget::cloneConfiguration(BuildConfiguration *sourceConfigura if (name.isEmpty()) return; - BuildConfiguration * bc(m_target->buildConfigurationFactory()->clone(m_target, sourceConfiguration)); + BuildConfiguration *bc = factory->clone(m_target, sourceConfiguration); if (!bc) return; diff --git a/src/plugins/projectexplorer/buildsteplist.cpp b/src/plugins/projectexplorer/buildsteplist.cpp index 2349035d70..666e148f94 100644 --- a/src/plugins/projectexplorer/buildsteplist.cpp +++ b/src/plugins/projectexplorer/buildsteplist.cpp @@ -159,7 +159,7 @@ bool BuildStepList::fromMap(const QVariantMap &map) qWarning() << "No step data found for" << i << "(continuing)."; continue; } - IBuildStepFactory *factory(findRestoreFactory(this, bsData)); + IBuildStepFactory *factory = findRestoreFactory(this, bsData); if (!factory) { qWarning() << "No factory for step" << i << "found (continuing)."; continue; diff --git a/src/plugins/projectexplorer/buildstepspage.cpp b/src/plugins/projectexplorer/buildstepspage.cpp index 5c292429d9..44e9070487 100644 --- a/src/plugins/projectexplorer/buildstepspage.cpp +++ b/src/plugins/projectexplorer/buildstepspage.cpp @@ -65,7 +65,7 @@ ToolWidget::ToolWidget(QWidget *parent) layout->setMargin(4); layout->setSpacing(4); setLayout(layout); - m_firstWidget = new FadingWidget(this); + m_firstWidget = new Utils::FadingWidget(this); m_firstWidget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); QHBoxLayout *hbox = new QHBoxLayout(); hbox->setContentsMargins(0, 0, 0, 0); @@ -86,7 +86,7 @@ ToolWidget::ToolWidget(QWidget *parent) hbox->addWidget(m_disableButton); layout->addWidget(m_firstWidget); - m_secondWidget = new FadingWidget(this); + m_secondWidget = new Utils::FadingWidget(this); m_secondWidget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); hbox = new QHBoxLayout(); hbox->setMargin(0); @@ -182,39 +182,6 @@ void ToolWidget::setDownVisible(bool b) m_downButton->setVisible(b); } -FadingWidget::FadingWidget(QWidget *parent) : - QWidget(parent), - m_opacityEffect(new QGraphicsOpacityEffect) -{ - m_opacityEffect->setOpacity(0); - setGraphicsEffect(m_opacityEffect); - - // Workaround for issue with QGraphicsEffect. GraphicsEffect - // currently clears with Window color. Remove if flickering - // no longer occurs on fade-in - QPalette pal; - pal.setBrush(QPalette::All, QPalette::Window, Qt::transparent); - setPalette(pal); -} - -void FadingWidget::setOpacity(qreal value) -{ - m_opacityEffect->setOpacity(value); -} - -void FadingWidget::fadeTo(qreal value) -{ - QPropertyAnimation *animation = new QPropertyAnimation(m_opacityEffect, "opacity"); - animation->setDuration(200); - animation->setEndValue(value); - animation->start(QAbstractAnimation::DeleteWhenStopped); -} - -qreal FadingWidget::opacity() -{ - return m_opacityEffect->opacity(); -} - BuildStepsWidgetData::BuildStepsWidgetData(BuildStep *s) : step(s), widget(0), detailsWidget(0) { @@ -395,6 +362,7 @@ void BuildStepListWidget::triggerAddBuildStep() if (QAction *action = qobject_cast<QAction *>(sender())) { QPair<Core::Id, IBuildStepFactory *> pair = m_addBuildStepHash.value(action); BuildStep *newStep = pair.second->create(m_buildStepList, pair.first); + QTC_ASSERT(newStep, return); int pos = m_buildStepList->count(); m_buildStepList->insertStep(pos, newStep); } diff --git a/src/plugins/projectexplorer/buildstepspage.h b/src/plugins/projectexplorer/buildstepspage.h index 32f6520379..10fe1edb08 100644 --- a/src/plugins/projectexplorer/buildstepspage.h +++ b/src/plugins/projectexplorer/buildstepspage.h @@ -57,17 +57,6 @@ class Target; class BuildConfiguration; namespace Internal { -class FadingWidget : public QWidget -{ - Q_OBJECT -public: - FadingWidget(QWidget *parent = 0); - void fadeTo(qreal value); - qreal opacity(); - void setOpacity(qreal value); -protected: - QGraphicsOpacityEffect *m_opacityEffect; -}; class ToolWidget : public Utils::FadingPanel { @@ -97,8 +86,8 @@ private: QToolButton *m_removeButton; bool m_buildStepEnabled; - FadingWidget *m_firstWidget; - FadingWidget *m_secondWidget; + Utils::FadingWidget *m_firstWidget; + Utils::FadingWidget *m_secondWidget; qreal m_targetOpacity; }; diff --git a/src/plugins/projectexplorer/deployconfiguration.cpp b/src/plugins/projectexplorer/deployconfiguration.cpp index f7f0469a41..f5b87e3cd5 100644 --- a/src/plugins/projectexplorer/deployconfiguration.cpp +++ b/src/plugins/projectexplorer/deployconfiguration.cpp @@ -35,10 +35,14 @@ #include "buildmanager.h" #include "buildsteplist.h" #include "buildstepspage.h" +#include "profileinformation.h" +#include "project.h" #include "projectexplorer.h" #include "projectexplorerconstants.h" #include "target.h" +#include <extensionsystem/pluginmanager.h> + #include <QStringList> using namespace ProjectExplorer; @@ -59,7 +63,7 @@ DeployConfiguration::DeployConfiguration(Target *target, const Core::Id id) : //: Display name of the deploy build step list. Used as part of the labels in the project window. m_stepList->setDefaultDisplayName(tr("Deploy")); //: Default DeployConfiguration display name - setDefaultDisplayName(tr("No deployment")); + setDefaultDisplayName(tr("Deploy locally")); } DeployConfiguration::DeployConfiguration(Target *target, DeployConfiguration *source) : @@ -153,14 +157,15 @@ void DeployConfiguration::cloneSteps(DeployConfiguration *source) DeployConfigurationFactory::DeployConfigurationFactory(QObject *parent) : QObject(parent) -{ } +{ setObjectName(QLatin1String("DeployConfigurationFactory")); } DeployConfigurationFactory::~DeployConfigurationFactory() { } QList<Core::Id> DeployConfigurationFactory::availableCreationIds(Target *parent) const { - Q_UNUSED(parent); + if (!canHandle(parent)) + return QList<Core::Id>(); return QList<Core::Id>() << Core::Id(Constants::DEFAULT_DEPLOYCONFIGURATION_ID); } @@ -174,7 +179,8 @@ QString DeployConfigurationFactory::displayNameForId(const Core::Id id) const bool DeployConfigurationFactory::canCreate(Target *parent, const Core::Id id) const { - Q_UNUSED(parent); + if (!canHandle(parent)) + return false; return id == Core::Id(Constants::DEFAULT_DEPLOYCONFIGURATION_ID); } @@ -214,6 +220,35 @@ DeployConfiguration *DeployConfigurationFactory::clone(Target *parent, DeployCon return new DeployConfiguration(parent, product); } +DeployConfigurationFactory *DeployConfigurationFactory::find(Target *parent, const QVariantMap &map) +{ + QList<DeployConfigurationFactory *> factories + = ExtensionSystem::PluginManager::instance()->getObjects<DeployConfigurationFactory>(); + foreach (DeployConfigurationFactory *factory, factories) { + if (factory->canRestore(parent, map)) + return factory; + } + return 0; +} + +DeployConfigurationFactory *DeployConfigurationFactory::find(Target *parent) +{ + QList<DeployConfigurationFactory *> factories + = ExtensionSystem::PluginManager::instance()->getObjects<DeployConfigurationFactory>(); + foreach (DeployConfigurationFactory *factory, factories) { + if (!factory->availableCreationIds(parent).isEmpty()) + return factory; + } + return 0; +} + +bool DeployConfigurationFactory::canHandle(Target *parent) const +{ + if (!parent->project()->supportsProfile(parent->profile())) + return false; + return DeviceTypeProfileInformation::deviceTypeId(parent->profile()) == Core::Id(Constants::DESKTOP_DEVICE_TYPE); +} + /// // DeployConfigurationWidget /// diff --git a/src/plugins/projectexplorer/deployconfiguration.h b/src/plugins/projectexplorer/deployconfiguration.h index 878578aece..af30b665db 100644 --- a/src/plugins/projectexplorer/deployconfiguration.h +++ b/src/plugins/projectexplorer/deployconfiguration.h @@ -70,6 +70,7 @@ public: signals: void enabledChanged(); + void requestBuildSystemEvaluation(); protected: DeployConfiguration(Target *target, const Core::Id id); @@ -77,7 +78,7 @@ protected: void cloneSteps(DeployConfiguration *source); - virtual bool fromMap(const QVariantMap &map); + bool fromMap(const QVariantMap &map); private: friend class DeployConfigurationFactory; @@ -107,8 +108,14 @@ public: virtual bool canClone(Target *parent, DeployConfiguration *product) const; virtual DeployConfiguration *clone(Target *parent, DeployConfiguration *product); + static DeployConfigurationFactory *find(Target *parent, const QVariantMap &map); + static DeployConfigurationFactory *find(Target *parent); + signals: void availableCreationIdsChanged(); + +private: + bool canHandle(Target *parent) const; }; class PROJECTEXPLORER_EXPORT DeployConfigurationWidget : public NamedWidget diff --git a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp index 6a2086f6ab..2e41051be9 100644 --- a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp @@ -139,13 +139,16 @@ void DeviceManager::save() { Utils::PersistentSettingsWriter writer; writer.saveValue(QLatin1String(DeviceManagerKey), toMap()); - writer.save(settingsFilePath(), QLatin1String("QtCreatorDevices"), Core::ICore::mainWindow()); + writer.save(settingsFilePath(QLatin1String("/qtcreator/devices.xml")), + QLatin1String("QtCreatorDevices"), Core::ICore::mainWindow()); } void DeviceManager::load() { Utils::PersistentSettingsReader reader; - if (reader.load(settingsFilePath())) + if (reader.load(settingsFilePath(QLatin1String("/qtcreator/devices.xml")))) + fromMap(reader.restoreValues().value(QLatin1String(DeviceManagerKey)).toMap()); + else if (reader.load(settingsFilePath(QLatin1String("/devices.xml")))) fromMap(reader.restoreValues().value(QLatin1String(DeviceManagerKey)).toMap()); else loadPre2_6(); @@ -220,9 +223,10 @@ QVariantMap DeviceManager::toMap() const return map; } -QString DeviceManager::settingsFilePath() +QString DeviceManager::settingsFilePath(const QString &extension) { - return QFileInfo(ExtensionSystem::PluginManager::settings()->fileName()).absolutePath() + QLatin1String("/devices.xml"); + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + return QFileInfo(pm->settings()->fileName()).absolutePath() + extension; } void DeviceManager::addDevice(const IDevice::Ptr &_device) diff --git a/src/plugins/projectexplorer/devicesupport/devicemanager.h b/src/plugins/projectexplorer/devicesupport/devicemanager.h index e9a913ef31..8dc3615816 100644 --- a/src/plugins/projectexplorer/devicesupport/devicemanager.h +++ b/src/plugins/projectexplorer/devicesupport/devicemanager.h @@ -101,7 +101,7 @@ private: IDevice::Ptr fromRawPointer(IDevice *device) const; IDevice::ConstPtr fromRawPointer(const IDevice *device) const; - static QString settingsFilePath(); + static QString settingsFilePath(const QString &extension); static void copy(const DeviceManager *source, DeviceManager *target, bool deep); Internal::DeviceManagerPrivate * const d; diff --git a/src/plugins/projectexplorer/devicesupport/devicemanagermodel.cpp b/src/plugins/projectexplorer/devicesupport/devicemanagermodel.cpp index 352b4d58e6..bee3fb5929 100644 --- a/src/plugins/projectexplorer/devicesupport/devicemanagermodel.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicemanagermodel.cpp @@ -46,6 +46,7 @@ class DeviceManagerModelPrivate public: const DeviceManager *deviceManager; QList<IDevice::ConstPtr> devices; + QList<Core::Id> filter; }; } // namespace Internal @@ -65,6 +66,12 @@ DeviceManagerModel::~DeviceManagerModel() delete d; } +void DeviceManagerModel::setFilter(const QList<Core::Id> filter) +{ + d->filter = filter; + handleDeviceListChanged(); +} + void DeviceManagerModel::updateDevice(Core::Id id) { handleDeviceUpdated(id); @@ -87,6 +94,9 @@ Core::Id DeviceManagerModel::deviceId(int pos) const int DeviceManagerModel::indexOf(IDevice::ConstPtr dev) const { + if (dev.isNull()) + return -1; + for (int i = 0; i < d->devices.count(); ++i) { IDevice::ConstPtr current = d->devices.at(i); if (current->id() == dev->id()) @@ -127,7 +137,7 @@ void DeviceManagerModel::handleDeviceListChanged() for (int i = 0; i < d->deviceManager->deviceCount(); ++i) { IDevice::ConstPtr dev = d->deviceManager->deviceAt(i); - if (dev->id() == Core::Id(Constants::DESKTOP_DEVICE_ID)) + if (d->filter.contains(dev->id())) continue; d->devices << dev; } diff --git a/src/plugins/projectexplorer/devicesupport/devicemanagermodel.h b/src/plugins/projectexplorer/devicesupport/devicemanagermodel.h index bc4eeb827d..32eaa5052d 100644 --- a/src/plugins/projectexplorer/devicesupport/devicemanagermodel.h +++ b/src/plugins/projectexplorer/devicesupport/devicemanagermodel.h @@ -51,7 +51,7 @@ public: explicit DeviceManagerModel(const DeviceManager *deviceManager, QObject *parent = 0); ~DeviceManagerModel(); - void updateDevice(Core::Id id); + void setFilter(const QList<Core::Id> filter); IDevice::ConstPtr device(int pos) const; Core::Id deviceId(int pos) const; @@ -59,6 +59,8 @@ public: int indexForId(Core::Id id) const; int rowCount(const QModelIndex &parent = QModelIndex()) const; + void updateDevice(Core::Id id); + private slots: void handleDeviceAdded(Core::Id id); void handleDeviceRemoved(Core::Id id); diff --git a/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp b/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp index 4df175bacc..dae2671d36 100644 --- a/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp @@ -31,12 +31,14 @@ #include "devicesettingswidget.h" #include "ui_devicesettingswidget.h" +#include "projectexplorerconstants.h" #include "devicefactoryselectiondialog.h" #include "devicemanager.h" #include "devicemanagermodel.h" #include "idevice.h" #include "idevicefactory.h" #include "idevicewidget.h" +#include "projectexplorerconstants.h" #include <coreplugin/icore.h> #include <coreplugin/id.h> @@ -94,7 +96,6 @@ private: const DeviceManager * const m_deviceManager; }; - DeviceSettingsWidget::DeviceSettingsWidget(QWidget *parent) : QWidget(parent), m_ui(new Ui::DeviceSettingsWidget), @@ -105,6 +106,7 @@ DeviceSettingsWidget::DeviceSettingsWidget(QWidget *parent) m_additionalActionsMapper(new QSignalMapper(this)), m_configWidget(0) { + m_deviceManagerModel->setFilter(QList<Core::Id>() << Core::Id(Constants::DESKTOP_DEVICE_ID)); initGui(); connect(m_additionalActionsMapper, SIGNAL(mapped(int)), SLOT(handleAdditionalActionRequest(int))); diff --git a/src/plugins/projectexplorer/gcctoolchain.cpp b/src/plugins/projectexplorer/gcctoolchain.cpp index a6b1d6942e..51fee9020c 100644 --- a/src/plugins/projectexplorer/gcctoolchain.cpp +++ b/src/plugins/projectexplorer/gcctoolchain.cpp @@ -62,7 +62,6 @@ namespace ProjectExplorer { static const char compilerCommandKeyC[] = "ProjectExplorer.GccToolChain.Path"; static const char targetAbiKeyC[] = "ProjectExplorer.GccToolChain.TargetAbi"; static const char supportedAbisKeyC[] = "ProjectExplorer.GccToolChain.SupportedAbis"; -static const char debuggerCommandKeyC[] = "ProjectExplorer.GccToolChain.Debugger"; static QByteArray runGcc(const Utils::FileName &gcc, const QStringList &arguments, const QStringList &env) { @@ -325,7 +324,6 @@ GccToolChain::GccToolChain(const GccToolChain &tc) : ToolChain(tc), m_predefinedMacros(tc.predefinedMacros(QStringList())), m_compilerCommand(tc.compilerCommand()), - m_debuggerCommand(tc.debuggerCommand()), m_targetAbi(tc.m_targetAbi), m_supportedAbis(tc.m_supportedAbis), m_headerPaths(tc.m_headerPaths), @@ -341,15 +339,6 @@ QString GccToolChain::defaultDisplayName() const ProjectExplorer::Abi::toString(m_targetAbi.wordWidth())); } -QString GccToolChain::legacyId() const -{ - QString i = id(); - i = i.left(i.indexOf(QLatin1Char(':'))); - return QString::fromLatin1("%1:%2.%3.%4") - .arg(i).arg(m_compilerCommand.toString()) - .arg(m_targetAbi.toString()).arg(m_debuggerCommand.toString()); -} - QString GccToolChain::type() const { return QLatin1String("gcc"); @@ -428,19 +417,6 @@ void GccToolChain::addToEnvironment(Utils::Environment &env) const } } -void GccToolChain::setDebuggerCommand(const Utils::FileName &d) -{ - if (m_debuggerCommand == d) - return; - m_debuggerCommand = d; - toolChainUpdated(); -} - -Utils::FileName GccToolChain::debuggerCommand() const -{ - return m_debuggerCommand; -} - QList<Utils::FileName> GccToolChain::suggestedMkspecList() const { Abi abi = targetAbi(); @@ -531,7 +507,6 @@ QVariantMap GccToolChain::toMap() const foreach (const ProjectExplorer::Abi &a, m_supportedAbis) abiList.append(a.toString()); data.insert(QLatin1String(supportedAbisKeyC), abiList); - data.insert(QLatin1String(debuggerCommandKeyC), m_debuggerCommand.toString()); return data; } @@ -550,7 +525,6 @@ bool GccToolChain::fromMap(const QVariantMap &data) continue; m_supportedAbis.append(abi); } - m_debuggerCommand = Utils::FileName::fromString(data.value(QLatin1String(debuggerCommandKeyC)).toString()); return true; } @@ -560,8 +534,7 @@ bool GccToolChain::operator ==(const ToolChain &other) const return false; const GccToolChain *gccTc = static_cast<const GccToolChain *>(&other); - return m_compilerCommand == gccTc->m_compilerCommand && m_targetAbi == gccTc->m_targetAbi - && m_debuggerCommand == gccTc->m_debuggerCommand; + return m_compilerCommand == gccTc->m_compilerCommand && m_targetAbi == gccTc->m_targetAbi; } ToolChainConfigWidget *GccToolChain::configurationWidget() @@ -615,16 +588,13 @@ ToolChain *Internal::GccToolChainFactory::create() QList<ToolChain *> Internal::GccToolChainFactory::autoDetect() { - QStringList debuggers; + QList<ToolChain *> tcs; #ifdef Q_OS_MAC - // Fixme Prefer lldb once it is implemented: debuggers.push_back(QLatin1String("lldb")); -#endif - debuggers.push_back(QLatin1String("gdb")); - QList<ToolChain *> tcs = autoDetectToolchains(QLatin1String("g++"), debuggers, Abi::hostAbi()); - // Old mac compilers needed to support macx-gccXY mkspecs: - tcs.append(autoDetectToolchains(QLatin1String("g++-4.0"), debuggers, Abi::hostAbi())); - tcs.append(autoDetectToolchains(QLatin1String("g++-4.2"), debuggers, Abi::hostAbi())); + tcs.append(autoDetectToolchains(QLatin1String("g++-4.0"), Abi::hostAbi())); + tcs.append(autoDetectToolchains(QLatin1String("g++-4.2"), Abi::hostAbi())); +#endif + tcs.append(autoDetectToolchains(QLatin1String("g++"), Abi::hostAbi())); return tcs; } @@ -651,7 +621,6 @@ GccToolChain *Internal::GccToolChainFactory::createToolChain(bool autoDetect) } QList<ToolChain *> Internal::GccToolChainFactory::autoDetectToolchains(const QString &compiler, - const QStringList &debuggers, const Abi &requiredAbi) { QList<ToolChain *> result; @@ -669,22 +638,12 @@ QList<ToolChain *> Internal::GccToolChainFactory::autoDetectToolchains(const QSt return result; } - Utils::FileName debuggerPath = ToolChainManager::instance()->defaultDebugger(requiredAbi); - if (debuggerPath.isEmpty()) { - foreach (const QString &debugger, debuggers) { - debuggerPath = Utils::FileName::fromString(systemEnvironment.searchInPath(debugger)); - if (!debuggerPath.isEmpty()) - break; - } - } - foreach (const Abi &abi, abiList) { QScopedPointer<GccToolChain> tc(createToolChain(true)); if (tc.isNull()) return result; tc->setCompilerCommand(compilerPath); - tc->setDebuggerCommand(debuggerPath); tc->setTargetAbi(abi); tc->setDisplayName(tc->defaultDisplayName()); // reset displayname @@ -715,14 +674,12 @@ Internal::GccToolChainConfigWidget::GccToolChainConfigWidget(GccToolChain *tc) : layout->addRow(tr("&ABI:"), m_abiWidget); m_abiWidget->setEnabled(false); - addDebuggerCommandControls(layout, gnuVersionArgs); - addMkspecControls(layout); addErrorLabel(layout); setFromToolchain(); connect(m_compilerCommand, SIGNAL(changed(QString)), this, SLOT(handleCompilerCommandChange())); - connect(m_abiWidget, SIGNAL(abiChanged()), this, SLOT(handleAbiChange())); + connect(m_abiWidget, SIGNAL(abiChanged()), this, SIGNAL(dirty())); } void Internal::GccToolChainConfigWidget::apply() @@ -736,9 +693,6 @@ void Internal::GccToolChainConfigWidget::apply() tc->setCompilerCommand(m_compilerCommand->fileName()); tc->setTargetAbi(m_abiWidget->currentAbi()); tc->setDisplayName(displayName); // reset display name - tc->setDebuggerCommand(debuggerCommand()); - tc->setMkspecList(mkspecList()); - m_autoDebuggerCommand = Utils::FileName::fromString(QLatin1String("<manually set>")); } void Internal::GccToolChainConfigWidget::setFromToolchain() @@ -750,8 +704,6 @@ void Internal::GccToolChainConfigWidget::setFromToolchain() m_abiWidget->setAbis(tc->supportedAbis(), tc->targetAbi()); if (!m_isReadOnly && !m_compilerCommand->path().isEmpty()) m_abiWidget->setEnabled(true); - setDebuggerCommand(tc->debuggerCommand()); - setMkspecList(tc->mkspecList()); blockSignals(blocked); } @@ -760,9 +712,7 @@ bool Internal::GccToolChainConfigWidget::isDirty() const GccToolChain *tc = static_cast<GccToolChain *>(toolChain()); Q_ASSERT(tc); return m_compilerCommand->fileName() != tc->compilerCommand() - || m_abiWidget->currentAbi() != tc->targetAbi() - || debuggerCommand() != tc->debuggerCommand() - || mkspecList() != tc->mkspecList(); + || m_abiWidget->currentAbi() != tc->targetAbi(); } void Internal::GccToolChainConfigWidget::makeReadOnly() @@ -787,16 +737,6 @@ void Internal::GccToolChainConfigWidget::handleCompilerCommandChange() m_abiWidget->setEnabled(haveCompiler); Abi currentAbi = m_abiWidget->currentAbi(); m_abiWidget->setAbis(abiList, abiList.contains(currentAbi) ? currentAbi : Abi()); - handleAbiChange(); -} - -void Internal::GccToolChainConfigWidget::handleAbiChange() -{ - if (m_autoDebuggerCommand == debuggerCommand()) { - ProjectExplorer::Abi abi = m_abiWidget->currentAbi(); - m_autoDebuggerCommand = ToolChainManager::instance()->defaultDebugger(abi); - setDebuggerCommand(m_autoDebuggerCommand); - } emit dirty(); } @@ -868,7 +808,7 @@ QString Internal::ClangToolChainFactory::id() const QList<ToolChain *> Internal::ClangToolChainFactory::autoDetect() { Abi ha = Abi::hostAbi(); - return autoDetectToolchains(QLatin1String("clang++"), QStringList(), ha); + return autoDetectToolchains(QLatin1String("clang++"), ha); } bool Internal::ClangToolChainFactory::canCreate() @@ -967,18 +907,8 @@ QString Internal::MingwToolChainFactory::id() const QList<ToolChain *> Internal::MingwToolChainFactory::autoDetect() { - // Compatibility to pre-2.2: - // All Mingw toolchains that exist so far are either installed by the SDK itself (in - // which case they most likely have debuggers set up) or were created when updating - // from a previous Qt version. Add debugger in that case. - foreach (ToolChain *tc, ToolChainManager::instance()->toolChains()) { - if (tc->debuggerCommand().isEmpty() && tc->id().startsWith(QLatin1String(Constants::MINGW_TOOLCHAIN_ID))) - static_cast<MingwToolChain *>(tc) - ->setDebuggerCommand(ToolChainManager::instance()->defaultDebugger(tc->targetAbi())); - } - Abi ha = Abi::hostAbi(); - return autoDetectToolchains(QLatin1String("g++"), QStringList(), + return autoDetectToolchains(QLatin1String("g++"), Abi(ha.architecture(), Abi::WindowsOS, Abi::WindowsMSysFlavor, Abi::PEFormat, ha.wordWidth())); } @@ -1062,9 +992,7 @@ QString Internal::LinuxIccToolChainFactory::id() const QList<ToolChain *> Internal::LinuxIccToolChainFactory::autoDetect() { - return autoDetectToolchains(QLatin1String("icpc"), - QStringList(QLatin1String("gdb")), - Abi::hostAbi()); + return autoDetectToolchains(QLatin1String("icpc"), Abi::hostAbi()); } ToolChain *Internal::LinuxIccToolChainFactory::create() diff --git a/src/plugins/projectexplorer/gcctoolchain.h b/src/plugins/projectexplorer/gcctoolchain.h index 4a77843c16..c8faf406b2 100644 --- a/src/plugins/projectexplorer/gcctoolchain.h +++ b/src/plugins/projectexplorer/gcctoolchain.h @@ -54,8 +54,6 @@ class LinuxIccToolChainFactory; class PROJECTEXPLORER_EXPORT GccToolChain : public ToolChain { public: - QString legacyId() const; - QString type() const; QString typeDisplayName() const; Abi targetAbi() const; @@ -71,8 +69,6 @@ public: QList<HeaderPath> systemHeaderPaths() const; void addToEnvironment(Utils::Environment &env) const; QString makeCommand() const; - void setDebuggerCommand(const Utils::FileName &); - Utils::FileName debuggerCommand() const; QList<Utils::FileName> suggestedMkspecList() const; IOutputParser *outputParser() const; @@ -107,7 +103,6 @@ private: void updateSupportedAbis() const; Utils::FileName m_compilerCommand; - Utils::FileName m_debuggerCommand; Abi m_targetAbi; mutable QList<Abi> m_supportedAbis; diff --git a/src/plugins/projectexplorer/gcctoolchainfactories.h b/src/plugins/projectexplorer/gcctoolchainfactories.h index aab545de74..34421d52c2 100644 --- a/src/plugins/projectexplorer/gcctoolchainfactories.h +++ b/src/plugins/projectexplorer/gcctoolchainfactories.h @@ -74,7 +74,6 @@ public: protected: virtual GccToolChain *createToolChain(bool autoDetect); QList<ToolChain *> autoDetectToolchains(const QString &compiler, - const QStringList &debuggers, const Abi &); }; @@ -95,7 +94,6 @@ public: private slots: void handleCompilerCommandChange(); - void handleAbiChange(); private: void setFromToolchain(); diff --git a/src/plugins/projectexplorer/miniprojecttargetselector.cpp b/src/plugins/projectexplorer/miniprojecttargetselector.cpp index 9fdb170f61..8cc1035dde 100644 --- a/src/plugins/projectexplorer/miniprojecttargetselector.cpp +++ b/src/plugins/projectexplorer/miniprojecttargetselector.cpp @@ -47,6 +47,7 @@ #include <projectexplorer/project.h> #include <projectexplorer/buildconfiguration.h> #include <projectexplorer/deployconfiguration.h> +#include <projectexplorer/profilemanager.h> #include <projectexplorer/projectmodels.h> #include <projectexplorer/runconfiguration.h> @@ -590,6 +591,10 @@ MiniProjectTargetSelector::MiniProjectTargetSelector(QAction *targetSelectorActi connect(m_sessionManager, SIGNAL(projectDisplayNameChanged(ProjectExplorer::Project*)), this, SLOT(updateActionAndSummary())); + // for icon changes: + connect(ProjectExplorer::ProfileManager::instance(), SIGNAL(profileUpdated(ProjectExplorer::Profile*)), + this, SLOT(profileChanged(ProjectExplorer::Profile*))); + connect(m_listWidgets[TARGET], SIGNAL(changeActiveProjectConfiguration(ProjectExplorer::ProjectConfiguration*)), this, SLOT(setActiveTarget(ProjectExplorer::ProjectConfiguration*))); connect(m_listWidgets[BUILD], SIGNAL(changeActiveProjectConfiguration(ProjectExplorer::ProjectConfiguration*)), @@ -869,6 +874,8 @@ void MiniProjectTargetSelector::activeTargetChanged(ProjectExplorer::Target *tar this, SLOT(updateActionAndSummary())); disconnect(m_target, SIGNAL(toolTipChanged()), this, SLOT(updateActionAndSummary())); + disconnect(m_target, SIGNAL(iconChanged()), + this, SLOT(updateActionAndSummary())); disconnect(m_target, SIGNAL(activeBuildConfigurationChanged(ProjectExplorer::BuildConfiguration*)), this, SLOT(activeBuildConfigurationChanged(ProjectExplorer::BuildConfiguration*))); disconnect(m_target, SIGNAL(activeDeployConfigurationChanged(ProjectExplorer::DeployConfiguration*)), @@ -925,6 +932,8 @@ void MiniProjectTargetSelector::activeTargetChanged(ProjectExplorer::Target *tar this, SLOT(updateActionAndSummary())); connect(m_target, SIGNAL(toolTipChanged()), this, SLOT(updateActionAndSummary())); + connect(m_target, SIGNAL(iconChanged()), + this, SLOT(updateActionAndSummary())); connect(m_target, SIGNAL(activeBuildConfigurationChanged(ProjectExplorer::BuildConfiguration*)), this, SLOT(activeBuildConfigurationChanged(ProjectExplorer::BuildConfiguration*))); connect(m_target, SIGNAL(activeDeployConfigurationChanged(ProjectExplorer::DeployConfiguration*)), @@ -942,6 +951,12 @@ void MiniProjectTargetSelector::activeTargetChanged(ProjectExplorer::Target *tar updateActionAndSummary(); } +void MiniProjectTargetSelector::profileChanged(Profile *profile) +{ + if (m_target && m_target->profile() == profile) + updateActionAndSummary(); +} + void MiniProjectTargetSelector::activeBuildConfigurationChanged(ProjectExplorer::BuildConfiguration *bc) { if (m_buildConfiguration) diff --git a/src/plugins/projectexplorer/miniprojecttargetselector.h b/src/plugins/projectexplorer/miniprojecttargetselector.h index 51f14622c5..f356610608 100644 --- a/src/plugins/projectexplorer/miniprojecttargetselector.h +++ b/src/plugins/projectexplorer/miniprojecttargetselector.h @@ -43,6 +43,7 @@ class QStackedWidget; QT_END_NAMESPACE namespace ProjectExplorer { +class Profile; class Project; class Target; class BuildConfiguration; @@ -134,6 +135,7 @@ private slots: void changeStartupProject(ProjectExplorer::Project *project); void activeTargetChanged(ProjectExplorer::Target *target); + void profileChanged(ProjectExplorer::Profile *profile); void activeBuildConfigurationChanged(ProjectExplorer::BuildConfiguration *bc); void activeDeployConfigurationChanged(ProjectExplorer::DeployConfiguration *dc); void activeRunConfigurationChanged(ProjectExplorer::RunConfiguration *rc); diff --git a/src/plugins/projectexplorer/msvctoolchain.cpp b/src/plugins/projectexplorer/msvctoolchain.cpp index 74e0f1ffae..8e5fa77871 100644 --- a/src/plugins/projectexplorer/msvctoolchain.cpp +++ b/src/plugins/projectexplorer/msvctoolchain.cpp @@ -53,7 +53,6 @@ #include <QDesktopServices> #define KEY_ROOT "ProjectExplorer.MsvcToolChain." -static const char debuggerCommandKeyC[] = KEY_ROOT"Debugger"; static const char varsBatKeyC[] = KEY_ROOT"VarsBat"; static const char varsBatArgKeyC[] = KEY_ROOT"VarsBatArg"; static const char supportedAbiKeyC[] = KEY_ROOT"SupportedAbi"; @@ -332,19 +331,6 @@ MsvcToolChain *MsvcToolChain::readFromMap(const QVariantMap &data) return 0; } -QString MsvcToolChain::legacyId() const -{ - const QChar colon = QLatin1Char(':'); - QString id = QLatin1String(Constants::MSVC_TOOLCHAIN_ID); - id += colon; - id += m_vcvarsBat; - id += colon; - id += m_varsBatArg; - id += colon; - id += m_debuggerCommand.toString(); - return id; -} - QString MsvcToolChain::type() const { return QLatin1String("msvc"); @@ -369,8 +355,6 @@ QList<Utils::FileName> MsvcToolChain::suggestedMkspecList() const QVariantMap MsvcToolChain::toMap() const { QVariantMap data = ToolChain::toMap(); - if (!m_debuggerCommand.isEmpty()) - data.insert(QLatin1String(debuggerCommandKeyC), m_debuggerCommand.toString()); data.insert(QLatin1String(varsBatKeyC), m_vcvarsBat); if (!m_varsBatArg.isEmpty()) data.insert(QLatin1String(varsBatArgKeyC), m_varsBatArg); @@ -384,7 +368,6 @@ bool MsvcToolChain::fromMap(const QVariantMap &data) return false; m_vcvarsBat = data.value(QLatin1String(varsBatKeyC)).toString(); m_varsBatArg = data.value(QLatin1String(varsBatArgKeyC)).toString(); - m_debuggerCommand = Utils::FileName::fromString(data.value(QLatin1String(debuggerCommandKeyC)).toString()); const QString abiString = data.value(QLatin1String(supportedAbiKeyC)).toString(); m_abi = Abi(abiString); @@ -403,42 +386,6 @@ ToolChain *MsvcToolChain::clone() const } // -------------------------------------------------------------------------- -// MsvcDebuggerConfigLabel -// -------------------------------------------------------------------------- - -static const char dgbToolsDownloadLink32C[] = "http://www.microsoft.com/whdc/devtools/debugging/installx86.Mspx"; -static const char dgbToolsDownloadLink64C[] = "http://www.microsoft.com/whdc/devtools/debugging/install64bit.Mspx"; - -QString MsvcDebuggerConfigLabel::labelText() -{ -#ifdef Q_OS_WIN - const bool is64bit = Utils::winIs64BitSystem(); -#else - const bool is64bit = false; -#endif - const QString link = is64bit ? QLatin1String(dgbToolsDownloadLink64C) : QLatin1String(dgbToolsDownloadLink32C); - //: Label text for path configuration. %2 is "x-bit version". - return tr( - "<html><body><p>Specify the path to the " - "<a href=\"%1\">Windows Console Debugger executable</a>" - " (%2) here.</p>" - "</body></html>").arg(link, (is64bit ? tr("64-bit version") - : tr("32-bit version"))); -} - -MsvcDebuggerConfigLabel::MsvcDebuggerConfigLabel(QWidget *parent) : - QLabel(labelText(), parent) -{ - connect(this, SIGNAL(linkActivated(QString)), this, SLOT(slotLinkActivated(QString))); - setTextInteractionFlags(Qt::TextBrowserInteraction); -} - -void MsvcDebuggerConfigLabel::slotLinkActivated(const QString &link) -{ - QDesktopServices::openUrl(QUrl(link)); -} - -// -------------------------------------------------------------------------- // MsvcToolChainConfigWidget // -------------------------------------------------------------------------- @@ -450,21 +397,12 @@ MsvcToolChainConfigWidget::MsvcToolChainConfigWidget(ToolChain *tc) : formLayout->addRow(new QLabel(tc->displayName())); m_varsBatDisplayLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); formLayout->addRow(tr("Initialization:"), m_varsBatDisplayLabel); - formLayout->addRow(new MsvcDebuggerConfigLabel); - addDebuggerCommandControls(formLayout, QStringList(QLatin1String("-version"))); - addDebuggerAutoDetection(this, SLOT(autoDetectDebugger())); - addMkspecControls(formLayout); addErrorLabel(formLayout); setFromToolChain(); } void MsvcToolChainConfigWidget::apply() -{ - MsvcToolChain *tc = static_cast<MsvcToolChain *>(toolChain()); - QTC_ASSERT(tc, return; ); - tc->setDebuggerCommand(debuggerCommand()); - tc->setMkspecList(mkspecList()); -} +{ } void MsvcToolChainConfigWidget::setFromToolChain() { @@ -476,45 +414,11 @@ void MsvcToolChainConfigWidget::setFromToolChain() varsBatDisplay += tc->varsBatArg(); } m_varsBatDisplayLabel->setText(varsBatDisplay); - setDebuggerCommand(tc->debuggerCommand()); - setMkspecList(tc->mkspecList()); } bool MsvcToolChainConfigWidget::isDirty() const { - MsvcToolChain *tc = static_cast<MsvcToolChain *>(toolChain()); - QTC_ASSERT(tc, return false); - return debuggerCommand() != tc->debuggerCommand() - || mkspecList() != tc->mkspecList(); -} - -void MsvcToolChainConfigWidget::autoDetectDebugger() -{ - clearErrorMessage(); - - MsvcToolChain *tc = static_cast<MsvcToolChain *>(toolChain()); - QTC_ASSERT(tc, return); - ProjectExplorer::Abi abi = tc->targetAbi(); - - const QPair<Utils::FileName, Utils::FileName> cdbExecutables = MsvcToolChain::autoDetectCdbDebugger(); - Utils::FileName debugger; - if (abi.wordWidth() == 32) { - if (cdbExecutables.first.isEmpty()) { - setErrorMessage(tr("No CDB debugger detected (neither 32bit nor 64bit).")); - return; - } - debugger = cdbExecutables.first; - } else if (abi.wordWidth() == 64) { - if (cdbExecutables.second.isEmpty()) { - setErrorMessage(tr("No 64bit CDB debugger detected.")); - return; - } - debugger = cdbExecutables.second; - } - if (debugger != debuggerCommand()) { - setDebuggerCommand(debugger); - emitDirty(); - } + return false; } // -------------------------------------------------------------------------- @@ -638,79 +542,10 @@ QList<ToolChain *> MsvcToolChainFactory::autoDetect() vcvarsIA64bat, QString(), true)); } } - if (!results.isEmpty()) { // Detect debugger - const QPair<Utils::FileName, Utils::FileName> cdbDebugger = MsvcToolChain::autoDetectCdbDebugger(); - foreach (ToolChain *tc, results) - static_cast<MsvcToolChain *>(tc)->setDebuggerCommand(tc->targetAbi().wordWidth() == 32 ? cdbDebugger.first : cdbDebugger.second); - } return results; } -// Detect CDB, return a pair of <32bit, 64bit> executables. -QPair<Utils::FileName, Utils::FileName> MsvcToolChain::autoDetectCdbDebugger() -{ - QPair<Utils::FileName, Utils::FileName> result; - QList<Utils::FileName> cdbs; - - QStringList programDirs; - programDirs.append(QString::fromLocal8Bit(qgetenv("ProgramFiles"))); - programDirs.append(QString::fromLocal8Bit(qgetenv("ProgramFiles(x86)"))); - programDirs.append(QString::fromLocal8Bit(qgetenv("ProgramW6432"))); - - foreach (const QString &dirName, programDirs) { - if (dirName.isEmpty()) - continue; - QDir dir(dirName); - // Windows SDK's starting from version 8 live in - // "ProgramDir\Windows Kits\<version>" - const QString windowsKitsFolderName = QLatin1String("Windows Kits"); - if (dir.exists(windowsKitsFolderName)) { - QDir windowKitsFolder = dir; - if (windowKitsFolder.cd(windowsKitsFolderName)) { - // Check in reverse order (latest first) - const QFileInfoList kitFolders = - windowKitsFolder.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot, - QDir::Time|QDir::Reversed); - foreach (const QFileInfo &kitFolderFi, kitFolders) { - const QString path = kitFolderFi.absoluteFilePath(); - const QFileInfo cdb32(path + QLatin1String("/Debuggers/x86/cdb.exe")); - if (cdb32.isExecutable()) - cdbs.push_back(Utils::FileName::fromString(cdb32.absoluteFilePath())); - const QFileInfo cdb64(path + QLatin1String("/Debuggers/x64/cdb.exe")); - if (cdb64.isExecutable()) - cdbs.push_back(Utils::FileName::fromString(cdb64.absoluteFilePath())); - } // for Kits - } // can cd to "Windows Kits" - } // "Windows Kits" exists - - // Pre Windows SDK 8: Check 'Debugging Tools for Windows' - foreach (const QFileInfo &fi, dir.entryInfoList(QStringList(QLatin1String("Debugging Tools for Windows*")), - QDir::Dirs | QDir::NoDotAndDotDot)) { - Utils::FileName filePath(fi); - filePath.appendPath(QLatin1String("cdb.exe")); - if (!cdbs.contains(filePath)) - cdbs.append(filePath); - } - } - - foreach (const Utils::FileName &cdb, cdbs) { - QList<ProjectExplorer::Abi> abis = ProjectExplorer::Abi::abisOfBinary(cdb); - if (abis.isEmpty()) - continue; - if (abis.first().wordWidth() == 32) - result.first = cdb; - else if (abis.first().wordWidth() == 64) - result.second = cdb; - } - - // prefer 64bit debugger, even for 32bit binaries: - if (!result.second.isEmpty()) - result.first = result.second; - - return result; -} - bool MsvcToolChain::operator ==(const ToolChain &other) const { if (!AbstractMsvcToolChain::operator ==(other)) diff --git a/src/plugins/projectexplorer/msvctoolchain.h b/src/plugins/projectexplorer/msvctoolchain.h index d7151e1ba4..ed08140641 100644 --- a/src/plugins/projectexplorer/msvctoolchain.h +++ b/src/plugins/projectexplorer/msvctoolchain.h @@ -56,7 +56,6 @@ public: MsvcToolChain(const QString &name, const Abi &abi, const QString &varsBat, const QString &varsBatArg, bool autodetect = false); - QString legacyId() const; QList<Utils::FileName> suggestedMkspecList() const; static MsvcToolChain *readFromMap(const QVariantMap &data); @@ -73,8 +72,6 @@ public: QString varsBatArg() const { return m_varsBatArg; } - static QPair<Utils::FileName, Utils::FileName> autoDetectCdbDebugger(); - bool operator == (const ToolChain &) const; protected: @@ -110,23 +107,6 @@ public: }; // -------------------------------------------------------------------------- -// MsvcDebuggerConfigLabel: Label displaying debugging tools download info. -// -------------------------------------------------------------------------- - -class MsvcDebuggerConfigLabel : public QLabel -{ - Q_OBJECT -public: - explicit MsvcDebuggerConfigLabel(QWidget *parent = 0); - -private slots: - void slotLinkActivated(const QString &l); - -private: - static QString labelText(); -}; - -// -------------------------------------------------------------------------- // MsvcToolChainConfigWidget // -------------------------------------------------------------------------- @@ -141,9 +121,6 @@ public: void discard() { setFromToolChain(); } bool isDirty() const; -private slots: - void autoDetectDebugger(); - private: void setFromToolChain(); diff --git a/src/plugins/projectexplorer/profile.cpp b/src/plugins/projectexplorer/profile.cpp new file mode 100644 index 0000000000..a183e13d16 --- /dev/null +++ b/src/plugins/projectexplorer/profile.cpp @@ -0,0 +1,307 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. +** +**************************************************************************/ + +#include "profile.h" + +#include "devicesupport/devicemanager.h" +#include "profileinformation.h" +#include "profilemanager.h" +#include "toolchainmanager.h" + +#include <QApplication> +#include <QIcon> +#include <QStyle> +#include <QTextStream> +#include <QUuid> + +namespace { + +const char ID_KEY[] = "PE.Profile.Id"; +const char DISPLAYNAME_KEY[] = "PE.Profile.Name"; +const char AUTODETECTED_KEY[] = "PE.Profile.AutoDetected"; +const char DATA_KEY[] = "PE.Profile.Data"; +const char ICON_KEY[] = "PE.Profile.Icon"; + +} // namespace + +namespace ProjectExplorer { + +// ------------------------------------------------------------------------- +// ProfilePrivate +// ------------------------------------------------------------------------- + +namespace Internal { + +class ProfilePrivate +{ +public: + ProfilePrivate() : + m_id(QUuid::createUuid().toString().toLatin1().constData()), + m_autodetected(false), + m_isValid(true) + { } + + QString m_displayName; + Core::Id m_id; + bool m_autodetected; + bool m_isValid; + QIcon m_icon; + QString m_iconPath; + + QHash<Core::Id, QVariant> m_data; +}; + +} // namespace Internal + +// ------------------------------------------------------------------------- +// Profile: +// ------------------------------------------------------------------------- + +Profile::Profile() : + d(new Internal::ProfilePrivate) +{ + ProfileManager *stm = ProfileManager::instance(); + foreach (ProfileInformation *sti, stm->profileInformation()) + d->m_data.insert(sti->dataId(), sti->defaultValue(this)); + + setDisplayName(QCoreApplication::translate("ProjectExplorer::Profile", "Unnamed")); + setIconPath(QLatin1String(":///DESKTOP///")); +} + +Profile::Profile(const Profile &other) : + d(new Internal::ProfilePrivate) +{ + d->m_displayName = QCoreApplication::translate("ProjectExplorer::Profile", "Clone of %1").arg(other.d->m_displayName); + d->m_autodetected = false; + d->m_data = other.d->m_data; + d->m_isValid = other.d->m_isValid; + d->m_icon = other.d->m_icon; + d->m_iconPath = other.d->m_iconPath; +} + +Profile::~Profile() +{ + delete d; +} + +bool Profile::isValid() const +{ + return d->m_id.isValid() && d->m_isValid; +} + +QList<Task> Profile::validate() +{ + QList<Task> result; + QList<ProfileInformation *> infoList = ProfileManager::instance()->profileInformation(); + foreach (ProfileInformation *i, infoList) + result.append(i->validate(this)); + return result; +} + +QString Profile::displayName() const +{ + return d->m_displayName; +} + +void Profile::setDisplayName(const QString &name) +{ + if (d->m_displayName == name) + return; + d->m_displayName = name; + profileUpdated(); +} + +bool Profile::isAutoDetected() const +{ + return d->m_autodetected; +} + +Core::Id Profile::id() const +{ + return d->m_id; +} + +QIcon Profile::icon() const +{ + return d->m_icon; +} + +QString Profile::iconPath() const +{ + return d->m_iconPath; +} + +void Profile::setIconPath(const QString &path) +{ + if (d->m_iconPath == path) + return; + d->m_iconPath = path; + if (path.isNull()) + d->m_icon = QIcon(); + else if (path == QLatin1String(":///DESKTOP///")) + d->m_icon = qApp->style()->standardIcon(QStyle::SP_ComputerIcon); + else + d->m_icon = QIcon(path); + profileUpdated(); +} + +QVariant Profile::value(const Core::Id &key, const QVariant &unset) const +{ + return d->m_data.value(key, unset); +} + +bool Profile::hasValue(const Core::Id &key) const +{ + return d->m_data.contains(key); +} + +void Profile::setValue(const Core::Id &key, const QVariant &value) +{ + if (d->m_data.value(key) == value) + return; + d->m_data.insert(key, value); + profileUpdated(); +} + +void Profile::removeKey(const Core::Id &key) +{ + if (!d->m_data.contains(key)) + return; + d->m_data.remove(key); + profileUpdated(); +} + +QVariantMap Profile::toMap() const +{ + QVariantMap data; + data.insert(QLatin1String(ID_KEY), QString::fromLatin1(d->m_id.name())); + data.insert(QLatin1String(DISPLAYNAME_KEY), d->m_displayName); + data.insert(QLatin1String(AUTODETECTED_KEY), d->m_autodetected); + data.insert(QLatin1String(ICON_KEY), d->m_iconPath); + + QVariantMap extra; + foreach (const Core::Id &key, d->m_data.keys()) + extra.insert(QString::fromLatin1(key.name().constData()), d->m_data.value(key)); + data.insert(QLatin1String(DATA_KEY), extra); + + return data; +} + +bool Profile::operator==(const Profile &other) const +{ + return d->m_data == other.d->m_data; +} + +void Profile::addToEnvironment(Utils::Environment &env) const +{ + QList<ProfileInformation *> infoList = ProfileManager::instance()->profileInformation(); + foreach (ProfileInformation *si, infoList) + si->addToEnvironment(this, env); +} + +QString Profile::toHtml() +{ + QString rc; + QTextStream str(&rc); + str << "<html><body>"; + str << "<h3>" << displayName() << "</h3>"; + str << "<table>"; + + if (!isValid()) { + QList<Task> issues = validate(); + str << "<p>"; + foreach (const Task &t, issues) { + str << "<b>"; + switch (t.type) { + case Task::Error: + QCoreApplication::translate("ProjectExplorer::Profile", "Error:"); + break; + case Task::Warning: + QCoreApplication::translate("ProjectExplorer::Profile", "Warning:"); + break; + case Task::Unknown: + default: + break; + } + str << "</b>" << t.description << "<br>"; + } + str << "</p>"; + } + + QList<ProfileInformation *> infoList = ProfileManager::instance()->profileInformation(); + foreach (ProfileInformation *i, infoList) { + ProfileInformation::ItemList list = i->toUserOutput(this); + foreach (const ProfileInformation::Item &j, list) + str << "<tr><td><b>" << j.first << ":</b></td><td>" << j.second << "</td></tr>"; + } + str << "</table></body></html>"; + return rc; +} + +bool Profile::fromMap(const QVariantMap &data) +{ + const QString id = data.value(QLatin1String(ID_KEY)).toString(); + if (id.isEmpty()) + return false; + d->m_id = Core::Id(id); + d->m_displayName = data.value(QLatin1String(DISPLAYNAME_KEY)).toString(); + d->m_autodetected = data.value(QLatin1String(AUTODETECTED_KEY)).toBool(); + setIconPath(data.value(QLatin1String(ICON_KEY)).toString()); + + QVariantMap extra = data.value(QLatin1String(DATA_KEY)).toMap(); + foreach (const QString &key, extra.keys()) + d->m_data.insert(Core::Id(key), extra.value(key)); + + return true; +} + +void Profile::setAutoDetected(bool detected) +{ + d->m_autodetected = detected; +} + +void Profile::setId(const Core::Id &id) +{ + d->m_id = id; +} + +void Profile::setValid(bool valid) +{ + d->m_isValid = valid; +} + +void Profile::profileUpdated() +{ + ProfileManager::instance()->notifyAboutUpdate(this); +} + +} // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/profile.h b/src/plugins/projectexplorer/profile.h new file mode 100644 index 0000000000..775100f522 --- /dev/null +++ b/src/plugins/projectexplorer/profile.h @@ -0,0 +1,109 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. +** +**************************************************************************/ + +#ifndef PROFILE_H +#define PROFILE_H + +#include "projectexplorer_export.h" +#include "task.h" + +#include <coreplugin/id.h> + +#include <QVariant> + +namespace Utils { class Environment; } + +namespace ProjectExplorer { + +namespace Internal { +class ProfileManagerPrivate; +class ProfilePrivate; +} // namespace Internal + +/** + * @brief The Profile class + * + * The profile holds a set of values defining a system targeted by the software + * under development. + */ +class PROJECTEXPLORER_EXPORT Profile +{ +public: + Profile(); + Profile(const Profile &other); + ~Profile(); + + bool isValid() const; + QList<Task> validate(); + + QString displayName() const; + void setDisplayName(const QString &name); + + bool isAutoDetected() const; + Core::Id id() const; + + QIcon icon() const; + QString iconPath() const; + void setIconPath(const QString &path); + + QVariant value(const Core::Id &key, const QVariant &unset = QVariant()) const; + bool hasValue(const Core::Id &key) const; + void setValue(const Core::Id &key, const QVariant &value); + void removeKey(const Core::Id &key); + + bool operator==(const Profile &other) const; + + void addToEnvironment(Utils::Environment &env) const; + + QString toHtml(); + +private: + void setAutoDetected(bool detected); + void setId(const Core::Id &id); + void setValid(bool valid); + + void profileUpdated(); + + QVariantMap toMap() const; + bool fromMap(const QVariantMap &value); + + Internal::ProfilePrivate *d; + + friend class ProfileManager; + friend class Internal::ProfileManagerPrivate; +}; + +} // namespace ProjectExplorer + +Q_DECLARE_METATYPE(ProjectExplorer::Profile *) + +#endif // PROFILE_H diff --git a/src/plugins/remotelinux/abstractembeddedlinuxtarget.cpp b/src/plugins/projectexplorer/profileconfigwidget.h index dd3f4c1fbb..c98f5cfbc0 100644 --- a/src/plugins/remotelinux/abstractembeddedlinuxtarget.cpp +++ b/src/plugins/projectexplorer/profileconfigwidget.h @@ -29,29 +29,39 @@ ** Nokia at qt-info@nokia.com. ** **************************************************************************/ -#include "abstractembeddedlinuxtarget.h" -#include "deploymentinfo.h" -#include "typespecificdeviceconfigurationlistmodel.h" +#ifndef PROFILECONFIGWIDGET_H +#define PROFILECONFIGWIDGET_H -#include <qt4projectmanager/qt4buildconfiguration.h> +#include "projectexplorer_export.h" -using namespace ProjectExplorer; -using namespace Qt4ProjectManager; +#include <QWidget> -namespace RemoteLinux { +namespace ProjectExplorer { -AbstractEmbeddedLinuxTarget::AbstractEmbeddedLinuxTarget(Qt4Project *parent, const Core::Id id) : - Qt4BaseTarget(parent, id), - m_buildConfigurationFactory(new Qt4BuildConfigurationFactory(this)), - m_deploymentInfo(new DeploymentInfo(this)), - m_deviceConfigModel(new Internal::TypeSpecificDeviceConfigurationListModel(this)) -{ -} +// -------------------------------------------------------------------------- +// ProfileConfigWidget +// -------------------------------------------------------------------------- -IBuildConfigurationFactory *AbstractEmbeddedLinuxTarget::buildConfigurationFactory() const +class PROJECTEXPLORER_EXPORT ProfileConfigWidget : public QWidget { - return m_buildConfigurationFactory; -} + Q_OBJECT + +public: + ProfileConfigWidget(QWidget *parent = 0) : QWidget(parent) + { } + + virtual QString displayName() const = 0; + virtual void makeReadOnly() = 0; + + virtual void apply() = 0; + virtual void discard() = 0; + virtual bool isDirty() const = 0; + +signals: + void dirty(); +}; + +} // namespace ProjectExplorer -} // namespace RemoteLinux +#endif // PROFILECONFIGWIDGET_H diff --git a/src/plugins/projectexplorer/profileinformation.cpp b/src/plugins/projectexplorer/profileinformation.cpp new file mode 100644 index 0000000000..0dd63e56d3 --- /dev/null +++ b/src/plugins/projectexplorer/profileinformation.cpp @@ -0,0 +1,355 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. +** +**************************************************************************/ + +#include "profileinformation.h" + +#include "devicesupport/desktopdevice.h" +#include "devicesupport/devicemanager.h" +#include "projectexplorerconstants.h" +#include "profile.h" +#include "profileinformationconfigwidget.h" +#include "toolchain.h" +#include "toolchainmanager.h" + +#include <extensionsystem/pluginmanager.h> +#include <projectexplorer/abi.h> +#include <utils/pathchooser.h> + +#include <QComboBox> +#include <QHBoxLayout> +#include <QLabel> +#include <QPushButton> + +namespace ProjectExplorer { + +// -------------------------------------------------------------------------- +// SysRootInformation: +// -------------------------------------------------------------------------- + +static const char SYSROOT_INFORMATION[] = "PE.Profile.SysRoot"; + +SysRootProfileInformation::SysRootProfileInformation() +{ + setObjectName(QLatin1String("SysRootInformation")); +} + +Core::Id SysRootProfileInformation::dataId() const +{ + static const Core::Id id(SYSROOT_INFORMATION); + return id; +} + +unsigned int SysRootProfileInformation::priority() const +{ + return 32000; +} + +QVariant SysRootProfileInformation::defaultValue(Profile *p) const +{ + Q_UNUSED(p) + return QString(); +} + +QList<Task> SysRootProfileInformation::validate(Profile *p) const +{ + QList<Task> result; + const Utils::FileName dir = SysRootProfileInformation::sysRoot(p); + if (!dir.toFileInfo().isDir() && SysRootProfileInformation::hasSysRoot(p)) + result << Task(Task::Error, QObject::tr("Sys Root \"%1\" is not a directory.").arg(dir.toUserOutput()), + Utils::FileName(), -1, Core::Id(Constants::TASK_CATEGORY_BUILDSYSTEM)); + return result; +} + +ProfileConfigWidget *SysRootProfileInformation::createConfigWidget(Profile *p) const +{ + Q_ASSERT(p); + return new Internal::SysRootInformationConfigWidget(p); +} + +ProfileInformation::ItemList SysRootProfileInformation::toUserOutput(Profile *p) const +{ + return ItemList() << qMakePair(tr("Sys Root"), sysRoot(p).toUserOutput()); +} + +bool SysRootProfileInformation::hasSysRoot(const Profile *p) +{ + return !p->value(Core::Id(SYSROOT_INFORMATION)).isNull(); +} + +Utils::FileName SysRootProfileInformation::sysRoot(const Profile *p) +{ + if (!p) + return Utils::FileName(); + return Utils::FileName::fromString(p->value(Core::Id(SYSROOT_INFORMATION)).toString()); +} + +void SysRootProfileInformation::setSysRoot(Profile *p, const Utils::FileName &v) +{ + p->setValue(Core::Id(SYSROOT_INFORMATION), v.toString()); +} + +// -------------------------------------------------------------------------- +// ToolChainInformation: +// -------------------------------------------------------------------------- + +static const char TOOLCHAIN_INFORMATION[] = "PE.Profile.ToolChain"; + +ToolChainProfileInformation::ToolChainProfileInformation() +{ + setObjectName(QLatin1String("ToolChainInformation")); + connect(ToolChainManager::instance(), SIGNAL(toolChainRemoved(ProjectExplorer::ToolChain*)), + this, SIGNAL(validationNeeded())); + connect(ToolChainManager::instance(), SIGNAL(toolChainUpdated(ProjectExplorer::ToolChain*)), + this, SIGNAL(validationNeeded())); +} + +Core::Id ToolChainProfileInformation::dataId() const +{ + static const Core::Id id(TOOLCHAIN_INFORMATION); + return id; +} + +unsigned int ToolChainProfileInformation::priority() const +{ + return 30000; +} + +QVariant ToolChainProfileInformation::defaultValue(Profile *p) const +{ + Q_UNUSED(p); + QList<ToolChain *> tcList = ToolChainManager::instance()->toolChains(); + if (tcList.isEmpty()) + return QString(); + + ProjectExplorer::Abi abi = ProjectExplorer::Abi::hostAbi(); + + foreach (ToolChain *tc, tcList) { + if (tc->targetAbi() == abi) + return tc->id(); + } + + return tcList.at(0)->id(); +} + +QList<Task> ToolChainProfileInformation::validate(Profile *p) const +{ + QList<Task> result; + if (!toolChain(p)) { + setToolChain(p, 0); // make sure to clear out no longer known tool chains + result << Task(Task::Error, QObject::tr("No tool chain set up."), + Utils::FileName(), -1, Core::Id(Constants::TASK_CATEGORY_BUILDSYSTEM)); + } + return result; +} + +ProfileConfigWidget *ToolChainProfileInformation::createConfigWidget(Profile *p) const +{ + Q_ASSERT(p); + return new Internal::ToolChainInformationConfigWidget(p); +} + +ProfileInformation::ItemList ToolChainProfileInformation::toUserOutput(Profile *p) const +{ + ToolChain *tc = toolChain(p); + return ItemList() << qMakePair(tr("Tool chain"), tc ? tc->displayName() : tr("None")); +} + +void ToolChainProfileInformation::addToEnvironment(const Profile *p, Utils::Environment &env) const +{ + ToolChain *tc = toolChain(p); + if (tc) + tc->addToEnvironment(env); +} + +ToolChain *ToolChainProfileInformation::toolChain(const Profile *p) +{ + if (!p) + return 0; + const QString id = p->value(Core::Id(TOOLCHAIN_INFORMATION)).toString(); + return ToolChainManager::instance()->findToolChain(id); +} + +void ToolChainProfileInformation::setToolChain(Profile *p, ToolChain *tc) +{ + p->setValue(Core::Id(TOOLCHAIN_INFORMATION), tc ? tc->id() : QString()); +} + +// -------------------------------------------------------------------------- +// DeviceTypeInformation: +// -------------------------------------------------------------------------- + +static const char DEVICETYPE_INFORMATION[] = "PE.Profile.DeviceType"; + +DeviceTypeProfileInformation::DeviceTypeProfileInformation() +{ + setObjectName(QLatin1String("DeviceTypeInformation")); +} + +Core::Id DeviceTypeProfileInformation::dataId() const +{ + static const Core::Id id(DEVICETYPE_INFORMATION); + return id; +} + +unsigned int DeviceTypeProfileInformation::priority() const +{ + return 33000; +} + +QVariant DeviceTypeProfileInformation::defaultValue(Profile *p) const +{ + Q_UNUSED(p); + return QByteArray(Constants::DESKTOP_DEVICE_TYPE); +} + +QList<Task> DeviceTypeProfileInformation::validate(Profile *p) const +{ + IDevice::ConstPtr dev = DeviceProfileInformation::device(p); + QList<Task> result; + if (!dev.isNull() && dev->type() != DeviceTypeProfileInformation::deviceTypeId(p)) + result.append(Task(Task::Error, QObject::tr("Device does not match device type."), + Utils::FileName(), -1, Core::Id(Constants::TASK_CATEGORY_BUILDSYSTEM))); + return result; +} + +ProfileConfigWidget *DeviceTypeProfileInformation::createConfigWidget(Profile *p) const +{ + Q_ASSERT(p); + return new Internal::DeviceTypeInformationConfigWidget(p); +} + +ProfileInformation::ItemList DeviceTypeProfileInformation::toUserOutput(Profile *p) const +{ + Core::Id type = deviceTypeId(p); + QString typeDisplayName = tr("Unknown device type"); + if (type.isValid()) { + QList<IDeviceFactory *> factories + = ExtensionSystem::PluginManager::instance()->getObjects<IDeviceFactory>(); + foreach (IDeviceFactory *factory, factories) { + if (factory->availableCreationIds().contains(type)) { + typeDisplayName = factory->displayNameForId(type); + break; + } + } + } + return ItemList() << qMakePair(tr("Device type"), typeDisplayName); +} + +const Core::Id DeviceTypeProfileInformation::deviceTypeId(const Profile *p) +{ + if (!p) + return Core::Id(); + return Core::Id(p->value(Core::Id(DEVICETYPE_INFORMATION)).toByteArray().constData()); +} + +void DeviceTypeProfileInformation::setDeviceTypeId(Profile *p, Core::Id type) +{ + p->setValue(Core::Id(DEVICETYPE_INFORMATION), type.name()); +} + +// -------------------------------------------------------------------------- +// DeviceInformation: +// -------------------------------------------------------------------------- + +static const char DEVICE_INFORMATION[] = "PE.Profile.Device"; + +DeviceProfileInformation::DeviceProfileInformation() +{ + setObjectName(QLatin1String("DeviceInformation")); + connect(DeviceManager::instance(), SIGNAL(deviceRemoved(Core::Id)), + this, SIGNAL(validationNeeded())); + connect(DeviceManager::instance(), SIGNAL(deviceUpdated(Core::Id)), + this, SIGNAL(validationNeeded())); +} + +Core::Id DeviceProfileInformation::dataId() const +{ + static const Core::Id id(DEVICE_INFORMATION); + return id; +} + +unsigned int DeviceProfileInformation::priority() const +{ + return 32000; +} + +QVariant DeviceProfileInformation::defaultValue(Profile *p) const +{ + Q_UNUSED(p); + return QByteArray(Constants::DESKTOP_DEVICE_ID); +} + +QList<Task> DeviceProfileInformation::validate(Profile *p) const +{ + Q_UNUSED(p); + QList<Task> result; + return result; +} + +ProfileConfigWidget *DeviceProfileInformation::createConfigWidget(Profile *p) const +{ + Q_ASSERT(p); + return new Internal::DeviceInformationConfigWidget(p); +} + +ProfileInformation::ItemList DeviceProfileInformation::toUserOutput(Profile *p) const +{ + IDevice::ConstPtr dev = device(p); + return ItemList() << qMakePair(tr("Device"), dev.isNull() ? tr("Unconfigured") : dev->displayName()); +} + +IDevice::ConstPtr DeviceProfileInformation::device(const Profile *p) +{ + DeviceManager *dm = DeviceManager::instance(); + return dm ? dm->find(deviceId(p)) : IDevice::ConstPtr(); +} + +Core::Id DeviceProfileInformation::deviceId(const Profile *p) +{ + if (p) { + QByteArray idname = p->value(Core::Id(DEVICE_INFORMATION)).toByteArray(); + return idname.isEmpty() ? IDevice::invalidId() : Core::Id(idname.constData()); + } + return IDevice::invalidId(); +} + +void DeviceProfileInformation::setDevice(Profile *p, IDevice::ConstPtr dev) +{ + setDeviceId(p, dev ? dev->id() : IDevice::invalidId()); +} + +void DeviceProfileInformation::setDeviceId(Profile *p, const Core::Id id) +{ + p->setValue(Core::Id(DEVICE_INFORMATION), id.name()); +} + +} // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/profileinformation.h b/src/plugins/projectexplorer/profileinformation.h new file mode 100644 index 0000000000..44fd0793fc --- /dev/null +++ b/src/plugins/projectexplorer/profileinformation.h @@ -0,0 +1,224 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. +** +**************************************************************************/ + +#ifndef PROFILEINFORMATION_H +#define PROFILEINFORMATION_H + +#include "profilemanager.h" +#include "profile.h" + +#include "devicesupport/idevice.h" +#include "toolchain.h" + +#include <utils/fileutils.h> + +#include <QVariant> + +namespace ProjectExplorer { + +class ProfileConfigWidget; + +// -------------------------------------------------------------------------- +// SysRootInformation: +// -------------------------------------------------------------------------- + +class PROJECTEXPLORER_EXPORT SysRootProfileInformation : public ProfileInformation +{ + Q_OBJECT + +public: + SysRootProfileInformation(); + + Core::Id dataId() const; + unsigned int priority() const; + + QVariant defaultValue(Profile *p) const; + + QList<Task> validate(Profile *p) const; + + ProfileConfigWidget *createConfigWidget(Profile *p) const; + + ItemList toUserOutput(Profile *p) const; + + static bool hasSysRoot(const Profile *p); + static Utils::FileName sysRoot(const Profile *p); + static void setSysRoot(Profile *p, const Utils::FileName &v); +}; + +class PROJECTEXPLORER_EXPORT SysRootMatcher : public ProfileMatcher +{ +public: + SysRootMatcher(const Utils::FileName &fn) : m_sysroot(fn) + { } + + bool matches(const Profile *p) const + { + return SysRootProfileInformation::sysRoot(p) == m_sysroot; + } + +private: + Utils::FileName m_sysroot; +}; + +// -------------------------------------------------------------------------- +// ToolChainInformation: +// -------------------------------------------------------------------------- + +class PROJECTEXPLORER_EXPORT ToolChainProfileInformation : public ProfileInformation +{ + Q_OBJECT + +public: + ToolChainProfileInformation(); + + Core::Id dataId() const; + unsigned int priority() const; + + QVariant defaultValue(Profile *p) const; + + QList<Task> validate(Profile *p) const; + + ProfileConfigWidget *createConfigWidget(Profile *p) const; + + ItemList toUserOutput(Profile *p) const; + + void addToEnvironment(const Profile *p, Utils::Environment &env) const; + + static ToolChain *toolChain(const Profile *p); + static void setToolChain(Profile *p, ToolChain *tc); +}; + +class PROJECTEXPLORER_EXPORT ToolChainMatcher : public ProfileMatcher +{ +public: + ToolChainMatcher(const ToolChain *tc) : m_tc(tc) + { } + + bool matches(const Profile *p) const + { + return ToolChainProfileInformation::toolChain(p) == m_tc; + } + +private: + const ToolChain *m_tc; +}; + +// -------------------------------------------------------------------------- +// DeviceTypeInformation: +// -------------------------------------------------------------------------- + +class PROJECTEXPLORER_EXPORT DeviceTypeProfileInformation : public ProfileInformation +{ + Q_OBJECT + +public: + DeviceTypeProfileInformation(); + + Core::Id dataId() const; + unsigned int priority() const; + + QVariant defaultValue(Profile *p) const; + + QList<Task> validate(Profile *p) const; + + ProfileConfigWidget *createConfigWidget(Profile *p) const; + + ItemList toUserOutput(Profile *p) const; + + static const Core::Id deviceTypeId(const Profile *p); + static void setDeviceTypeId(Profile *p, Core::Id type); +}; + +class PROJECTEXPLORER_EXPORT DeviceTypeMatcher : public ProfileMatcher +{ +public: + DeviceTypeMatcher(const Core::Id t) : m_type(t) + { } + + bool matches(const Profile *p) const + { + Core::Id deviceType = DeviceTypeProfileInformation::deviceTypeId(p); + if (!deviceType.isValid()) + return false; + return deviceType == m_type; + } + +private: + const Core::Id m_type; +}; + +// -------------------------------------------------------------------------- +// DeviceInformation: +// -------------------------------------------------------------------------- + +class PROJECTEXPLORER_EXPORT DeviceProfileInformation : public ProfileInformation +{ + Q_OBJECT + +public: + DeviceProfileInformation(); + + Core::Id dataId() const; + unsigned int priority() const; + + QVariant defaultValue(Profile *p) const; + + QList<Task> validate(Profile *p) const; + + ProfileConfigWidget *createConfigWidget(Profile *p) const; + + ItemList toUserOutput(Profile *p) const; + + static IDevice::ConstPtr device(const Profile *p); + static Core::Id deviceId(const Profile *p); + static void setDevice(Profile *p, IDevice::ConstPtr dev); + static void setDeviceId(Profile *p, const Core::Id id); +}; + +class PROJECTEXPLORER_EXPORT DeviceMatcher : public ProfileMatcher +{ +public: + DeviceMatcher(Core::Id id) : m_devId(id) + { } + + bool matches(const Profile *p) const + { + return DeviceProfileInformation::deviceId(p) == m_devId; + } + +private: + Core::Id m_devId; +}; + +} // namespace ProjectExplorer + +#endif // PROFILEINFORMATION_H diff --git a/src/plugins/projectexplorer/profileinformationconfigwidget.cpp b/src/plugins/projectexplorer/profileinformationconfigwidget.cpp new file mode 100644 index 0000000000..457bb8369c --- /dev/null +++ b/src/plugins/projectexplorer/profileinformationconfigwidget.cpp @@ -0,0 +1,353 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. +** +**************************************************************************/ + +#include "profileinformationconfigwidget.h" + +#include "devicesupport/devicemanager.h" +#include "devicesupport/devicemanagermodel.h" +#include "devicesupport/idevicefactory.h" +#include "projectexplorerconstants.h" +#include "profile.h" +#include "profileinformation.h" +#include "toolchain.h" +#include "toolchainmanager.h" + +#include <coreplugin/icore.h> +#include <extensionsystem/pluginmanager.h> +#include <utils/pathchooser.h> + +#include <QComboBox> +#include <QHBoxLayout> +#include <QLabel> +#include <QPushButton> + +namespace ProjectExplorer { +namespace Internal { + +// -------------------------------------------------------------------------- +// SysRootInformationConfigWidget: +// -------------------------------------------------------------------------- + +SysRootInformationConfigWidget::SysRootInformationConfigWidget(Profile *p, QWidget *parent) : + ProfileConfigWidget(parent), + m_profile(p) +{ + QHBoxLayout *layout = new QHBoxLayout(this); + layout->setMargin(0); + m_chooser = new Utils::PathChooser; + m_chooser->setContentsMargins(0, 0, 0, 0); + layout->addWidget(m_chooser); + m_chooser->setExpectedKind(Utils::PathChooser::ExistingDirectory); + + m_chooser->setFileName(SysRootProfileInformation::sysRoot(p)); + + connect(m_chooser, SIGNAL(changed(QString)), this, SIGNAL(dirty())); +} + +QString SysRootInformationConfigWidget::displayName() const +{ + return tr("Sysroot:"); +} + +void SysRootInformationConfigWidget::apply() +{ + SysRootProfileInformation::setSysRoot(m_profile, m_chooser->fileName()); +} + +void SysRootInformationConfigWidget::discard() +{ + m_chooser->setFileName(SysRootProfileInformation::sysRoot(m_profile)); +} + +bool SysRootInformationConfigWidget::isDirty() const +{ + return SysRootProfileInformation::sysRoot(m_profile) != m_chooser->fileName(); +} + +void SysRootInformationConfigWidget::makeReadOnly() +{ + m_chooser->setEnabled(false); +} + +// -------------------------------------------------------------------------- +// ToolChainInformationConfigWidget: +// -------------------------------------------------------------------------- + +ToolChainInformationConfigWidget::ToolChainInformationConfigWidget(Profile *p, QWidget *parent) : + ProfileConfigWidget(parent), + m_isReadOnly(false), m_profile(p), + m_comboBox(new QComboBox), m_manageButton(new QPushButton) +{ + ToolChainManager *tcm = ToolChainManager::instance(); + + QHBoxLayout *layout = new QHBoxLayout(this); + layout->setMargin(0); + m_comboBox->setContentsMargins(0, 0, 0, 0); + m_comboBox->setEnabled(false); + m_comboBox->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed); + layout->addWidget(m_comboBox); + + foreach (ToolChain *tc, tcm->toolChains()) + toolChainAdded(tc); + + updateComboBox(); + + discard(); + connect(m_comboBox, SIGNAL(currentIndexChanged(int)), this, SIGNAL(dirty())); + + m_manageButton->setContentsMargins(0, 0, 0, 0); + m_manageButton->setText(tr("Manage...")); + layout->addWidget(m_manageButton); + connect(m_manageButton, SIGNAL(clicked()), this, SLOT(manageToolChains())); + + connect(tcm, SIGNAL(toolChainAdded(ProjectExplorer::ToolChain*)), + this, SLOT(toolChainAdded(ProjectExplorer::ToolChain*))); + connect(tcm, SIGNAL(toolChainRemoved(ProjectExplorer::ToolChain*)), + this, SLOT(toolChainRemoved(ProjectExplorer::ToolChain*))); + connect(tcm, SIGNAL(toolChainUpdated(ProjectExplorer::ToolChain*)), + this, SLOT(toolChainUpdated(ProjectExplorer::ToolChain*))); +} + +QString ToolChainInformationConfigWidget::displayName() const +{ + return tr("Tool chain:"); +} + +void ToolChainInformationConfigWidget::apply() +{ + const QString id = m_comboBox->itemData(m_comboBox->currentIndex()).toString(); + ToolChain *tc = ToolChainManager::instance()->findToolChain(id); + ToolChainProfileInformation::setToolChain(m_profile, tc); +} + +void ToolChainInformationConfigWidget::discard() +{ + m_comboBox->setCurrentIndex(indexOf(ToolChainProfileInformation::toolChain(m_profile))); +} + +bool ToolChainInformationConfigWidget::isDirty() const +{ + ToolChain *tc = ToolChainProfileInformation::toolChain(m_profile); + return (m_comboBox->itemData(m_comboBox->currentIndex()).toString()) + == (tc ? tc->id() : QString()); +} + +void ToolChainInformationConfigWidget::makeReadOnly() +{ + m_comboBox->setEnabled(false); +} + +void ToolChainInformationConfigWidget::toolChainAdded(ProjectExplorer::ToolChain *tc) +{ + m_comboBox->addItem(tc->displayName(), tc->id()); + updateComboBox(); +} + +void ToolChainInformationConfigWidget::toolChainRemoved(ProjectExplorer::ToolChain *tc) +{ + const int pos = indexOf(tc); + if (pos < 0) + return; + m_comboBox->removeItem(pos); + updateComboBox(); +} +void ToolChainInformationConfigWidget::toolChainUpdated(ProjectExplorer::ToolChain *tc) +{ + const int pos = indexOf(tc); + if (pos < 0) + return; + m_comboBox->setItemText(pos, tc->displayName()); +} + +void ToolChainInformationConfigWidget::manageToolChains() +{ + Core::ICore::showOptionsDialog(QLatin1String(ProjectExplorer::Constants::PROJECTEXPLORER_SETTINGS_CATEGORY), + QLatin1String(ProjectExplorer::Constants::TOOLCHAIN_SETTINGS_PAGE_ID)); +} + +void ToolChainInformationConfigWidget::updateComboBox() +{ + // remove unavailable tool chain: + int pos = indexOf(0); + if (pos >= 0) + m_comboBox->removeItem(pos); + + if (m_comboBox->count() == 0) { + m_comboBox->addItem(tr("<No tool chain available>"), QString()); + m_comboBox->setEnabled(false); + } else { + m_comboBox->setEnabled(!m_isReadOnly); + } +} + +int ToolChainInformationConfigWidget::indexOf(const ToolChain *tc) +{ + const QString id = tc ? tc->id() : QString(); + for (int i = 0; i < m_comboBox->count(); ++i) { + if (id == m_comboBox->itemData(i).toString()) + return i; + } + return -1; +} + +// -------------------------------------------------------------------------- +// DeviceTypeInformationConfigWidget: +// -------------------------------------------------------------------------- + +DeviceTypeInformationConfigWidget::DeviceTypeInformationConfigWidget(Profile *p, QWidget *parent) : + ProfileConfigWidget(parent), + m_isReadOnly(false), m_profile(p), + m_comboBox(new QComboBox) +{ + QHBoxLayout *layout = new QHBoxLayout(this); + layout->setMargin(0); + m_comboBox->setContentsMargins(0, 0, 0, 0); + m_comboBox->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed); + layout->addWidget(m_comboBox); + + QList<IDeviceFactory *> factories + = ExtensionSystem::PluginManager::instance()->getObjects<IDeviceFactory>(); + foreach (IDeviceFactory *factory, factories) { + foreach (Core::Id id, factory->availableCreationIds()) { + m_comboBox->addItem(factory->displayNameForId(id), QVariant::fromValue(id)); + } + } + + discard(); + connect(m_comboBox, SIGNAL(currentIndexChanged(int)), this, SIGNAL(dirty())); +} + +QString DeviceTypeInformationConfigWidget::displayName() const +{ + return tr("Device Type:"); +} + +void DeviceTypeInformationConfigWidget::apply() +{ + Core::Id devType; + if (m_comboBox->currentIndex() >= 0) + devType = m_comboBox->itemData(m_comboBox->currentIndex()).value<Core::Id>(); + DeviceTypeProfileInformation::setDeviceTypeId(m_profile, devType); +} + +void DeviceTypeInformationConfigWidget::discard() +{ + Core::Id devType = DeviceTypeProfileInformation::deviceTypeId(m_profile); + if (!devType.isValid()) + m_comboBox->setCurrentIndex(-1); + for (int i = 0; i < m_comboBox->count(); ++i) { + if (m_comboBox->itemData(i).value<Core::Id>() == devType) { + m_comboBox->setCurrentIndex(i); + break; + } + } +} + +bool DeviceTypeInformationConfigWidget::isDirty() const +{ + Core::Id devType; + if (m_comboBox->currentIndex() >= 0) + devType = m_comboBox->itemData(m_comboBox->currentIndex()).value<Core::Id>(); + return DeviceTypeProfileInformation::deviceTypeId(m_profile) != devType; +} + +void DeviceTypeInformationConfigWidget::makeReadOnly() +{ + m_comboBox->setEnabled(false); +} + +// -------------------------------------------------------------------------- +// DeviceInformationConfigWidget: +// -------------------------------------------------------------------------- + +DeviceInformationConfigWidget::DeviceInformationConfigWidget(Profile *p, QWidget *parent) : + ProfileConfigWidget(parent), + m_isReadOnly(false), m_profile(p), + m_comboBox(new QComboBox), m_manageButton(new QPushButton), + m_model(new DeviceManagerModel(DeviceManager::instance())) +{ + QHBoxLayout *layout = new QHBoxLayout(this); + layout->setMargin(0); + m_comboBox->setContentsMargins(0, 0, 0, 0); + m_comboBox->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed); + layout->addWidget(m_comboBox); + + m_comboBox->setModel(m_model); + + m_manageButton->setContentsMargins(0, 0, 0, 0); + m_manageButton->setText(tr("Manage...")); + layout->addWidget(m_manageButton); + + discard(); + connect(m_comboBox, SIGNAL(currentIndexChanged(int)), this, SIGNAL(dirty())); + + connect(m_manageButton, SIGNAL(clicked()), this, SLOT(manageDevices())); +} + +QString DeviceInformationConfigWidget::displayName() const +{ + return tr("Device:"); +} + +void DeviceInformationConfigWidget::apply() +{ + int idx = m_comboBox->currentIndex(); + if (idx >= 0) + DeviceProfileInformation::setDeviceId(m_profile, m_model->deviceId(idx)); + else + DeviceProfileInformation::setDeviceId(m_profile, IDevice::invalidId()); +} + +void DeviceInformationConfigWidget::discard() +{ + m_comboBox->setCurrentIndex(m_model->indexOf(DeviceProfileInformation::device(m_profile))); +} + +bool DeviceInformationConfigWidget::isDirty() const +{ + Core::Id devId = DeviceProfileInformation::deviceId(m_profile); + return devId != m_model->deviceId(m_comboBox->currentIndex()); +} + +void DeviceInformationConfigWidget::makeReadOnly() +{ + m_comboBox->setEnabled(false); +} + +void DeviceInformationConfigWidget::manageDevices() +{ + Core::ICore::showOptionsDialog(QLatin1String(ProjectExplorer::Constants::DEVICE_SETTINGS_CATEGORY), + QLatin1String(ProjectExplorer::Constants::DEVICE_SETTINGS_PAGE_ID)); +} + +} // namespace Internal +} // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/profileinformationconfigwidget.h b/src/plugins/projectexplorer/profileinformationconfigwidget.h new file mode 100644 index 0000000000..59eafd2a4b --- /dev/null +++ b/src/plugins/projectexplorer/profileinformationconfigwidget.h @@ -0,0 +1,160 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. +** +**************************************************************************/ + +#ifndef PROFILEINFORMATIONCONFIGWIDGET_H +#define PROFILEINFORMATIONCONFIGWIDGET_H + +#include "profileconfigwidget.h" + +QT_FORWARD_DECLARE_CLASS(QComboBox) +QT_FORWARD_DECLARE_CLASS(QPushButton) + +namespace Utils { class PathChooser; } + +namespace ProjectExplorer { + +class DeviceManagerModel; +class Profile; +class ToolChain; + +namespace Internal { + +// -------------------------------------------------------------------------- +// SysRootInformationConfigWidget: +// -------------------------------------------------------------------------- + +class SysRootInformationConfigWidget : public ProfileConfigWidget +{ + Q_OBJECT + +public: + explicit SysRootInformationConfigWidget(Profile *p, QWidget *parent = 0); + + QString displayName() const; + void apply(); + void discard(); + bool isDirty() const; + void makeReadOnly(); + +private: + Profile *m_profile; + Utils::PathChooser *m_chooser; +}; + +// -------------------------------------------------------------------------- +// ToolChainInformationConfigWidget: +// -------------------------------------------------------------------------- + +class ToolChainInformationConfigWidget : public ProfileConfigWidget +{ + Q_OBJECT + +public: + explicit ToolChainInformationConfigWidget(Profile *p, QWidget *parent = 0); + + QString displayName() const; + void apply(); + void discard(); + bool isDirty() const; + void makeReadOnly(); + +private slots: + void toolChainAdded(ProjectExplorer::ToolChain *tc); + void toolChainRemoved(ProjectExplorer::ToolChain *tc); + void toolChainUpdated(ProjectExplorer::ToolChain *tc); + void manageToolChains(); + +private: + void updateComboBox(); + int indexOf(const ToolChain *tc); + + bool m_isReadOnly; + Profile *m_profile; + QComboBox *m_comboBox; + QPushButton *m_manageButton; +}; + +// -------------------------------------------------------------------------- +// DeviceTypeInformationConfigWidget: +// -------------------------------------------------------------------------- + +class DeviceTypeInformationConfigWidget : public ProfileConfigWidget +{ + Q_OBJECT + +public: + explicit DeviceTypeInformationConfigWidget(Profile *p, QWidget *parent = 0); + + QString displayName() const; + void apply(); + void discard(); + bool isDirty() const; + void makeReadOnly(); + +private: + bool m_isReadOnly; + Profile *m_profile; + QComboBox *m_comboBox; +}; + +// -------------------------------------------------------------------------- +// DeviceInformationConfigWidget: +// -------------------------------------------------------------------------- + +class DeviceInformationConfigWidget : public ProfileConfigWidget +{ + Q_OBJECT + +public: + explicit DeviceInformationConfigWidget(Profile *p, QWidget *parent = 0); + + QString displayName() const; + void apply(); + void discard(); + bool isDirty() const; + void makeReadOnly(); + +private slots: + void manageDevices(); + +private: + bool m_isReadOnly; + Profile *m_profile; + QComboBox *m_comboBox; + QPushButton *m_manageButton; + DeviceManagerModel *m_model; +}; + +} // namespace Internal +} // namespace ProjectExplorer + +#endif // PROFILEINFORMATIONCONFIGWIDGET_H diff --git a/src/plugins/projectexplorer/profilemanager.cpp b/src/plugins/projectexplorer/profilemanager.cpp new file mode 100644 index 0000000000..add233b20f --- /dev/null +++ b/src/plugins/projectexplorer/profilemanager.cpp @@ -0,0 +1,471 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. +** +**************************************************************************/ + +#include "profilemanager.h" + +#include "profile.h" +#include "profileconfigwidget.h" +#include "profilemanagerconfigwidget.h" +#include "project.h" + +#include <coreplugin/icore.h> + +#include <extensionsystem/pluginmanager.h> + +#include <utils/persistentsettings.h> +#include <utils/environment.h> + +#include <QCoreApplication> +#include <QDir> +#include <QSettings> + +#include <QFormLayout> +#include <QLabel> +#include <QMainWindow> + +static const char PROFILE_DATA_KEY[] = "Profile."; +static const char PROFILE_COUNT_KEY[] = "Profile.Count"; +static const char PROFILE_FILE_VERSION_KEY[] = "Version"; +static const char PROFILE_DEFAULT_KEY[] = "Profile.Default"; +static const char PROFILE_FILENAME[] = "/qtcreator/profiles.xml"; + +using Utils::PersistentSettingsWriter; +using Utils::PersistentSettingsReader; + +static QString settingsFileName() +{ + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + QFileInfo settingsLocation(pm->settings()->fileName()); + return settingsLocation.absolutePath() + QLatin1String(PROFILE_FILENAME); +} + +namespace ProjectExplorer { + +ProfileManager *ProfileManager::m_instance = 0; + +namespace Internal { + +// -------------------------------------------------------------------------- +// ProfileManagerPrivate: +// -------------------------------------------------------------------------- + +class ProfileManagerPrivate +{ +public: + ProfileManagerPrivate(); + ~ProfileManagerPrivate(); + QList<Task> validateProfile(Profile *p) const; + + Profile *m_defaultProfile; + bool m_initialized; + QList<ProfileInformation *> m_informationList; + QList<Profile *> m_profileList; +}; + +ProfileManagerPrivate::ProfileManagerPrivate() + : m_defaultProfile(0), m_initialized(false) +{ } + +ProfileManagerPrivate::~ProfileManagerPrivate() +{ +} + +QList<Task> ProfileManagerPrivate::validateProfile(Profile *p) const +{ + Q_ASSERT(p); + QList<Task> result; + bool hasError = false; + foreach (ProfileInformation *pi, m_informationList) { + QList<Task> tmp = pi->validate(p); + foreach (const Task &t, tmp) + if (t.type == Task::Error) + hasError = true; + result << tmp; + } + p->setValid(!hasError); + return result; +} + +} // namespace Internal + +// -------------------------------------------------------------------------- +// ProfileManager: +// -------------------------------------------------------------------------- + +ProfileManager *ProfileManager::instance() +{ + return m_instance; +} + +ProfileManager::ProfileManager(QObject *parent) : + QObject(parent), + d(new Internal::ProfileManagerPrivate()) +{ + Q_ASSERT(!m_instance); + m_instance = this; + + connect(Core::ICore::instance(), SIGNAL(saveSettingsRequested()), + this, SLOT(saveProfiles())); + + connect(this, SIGNAL(profileAdded(ProjectExplorer::Profile*)), + this, SIGNAL(profilesChanged())); + connect(this, SIGNAL(profileRemoved(ProjectExplorer::Profile*)), + this, SIGNAL(profilesChanged())); + connect(this, SIGNAL(profileUpdated(ProjectExplorer::Profile*)), + this, SIGNAL(profilesChanged())); +} + +void ProfileManager::restoreProfiles() +{ + QList<Profile *> stsToRegister; + QList<Profile *> stsToCheck; + + // read all profiles from SDK + QFileInfo systemSettingsFile(Core::ICore::settings(QSettings::SystemScope)->fileName()); + ProfileList system = restoreProfiles(systemSettingsFile.absolutePath() + QLatin1String(PROFILE_FILENAME)); + QList<Profile *> readSts = system.profiles; + // make sure we mark these as autodetected! + foreach (Profile *p, readSts) + p->setAutoDetected(true); + + stsToRegister = readSts; // SDK profiles are always considered to be up-to-date, so no need to + // recheck them. + + // read all profile chains from user file + ProfileList userProfiles = restoreProfiles(settingsFileName()); + readSts = userProfiles.profiles; + + foreach (Profile *p, readSts) { + if (p->isAutoDetected()) + stsToCheck.append(p); + else + stsToRegister.append(p); + } + readSts.clear(); + + // Then auto create profiles: + QList<Profile *> detectedSts; + Profile *defaultProfile = new Profile; // One profile using default values + defaultProfile->setDisplayName(tr("Desktop")); + defaultProfile->setAutoDetected(true); + defaultProfile->setIconPath(QLatin1String(":///DESKTOP///")); + + detectedSts << defaultProfile; + + // Find/update autodetected profiles: + Profile *toStore = 0; + foreach (Profile *currentDetected, detectedSts) { + toStore = currentDetected; + + // Check whether we had this profile stored and prefer the old one with the old id: + for (int i = 0; i < stsToCheck.count(); ++i) { + if (*(stsToCheck.at(i)) == *currentDetected) { + toStore = stsToCheck.at(i); + stsToCheck.removeAt(i); + delete currentDetected; + break; + } + } + addProfile(toStore); + } + + // Delete all loaded autodetected profiles that were not rediscovered: + qDeleteAll(stsToCheck); + + // Store manual tool chains + foreach (Profile *p, stsToRegister) + addProfile(p); + + Profile *p = find(userProfiles.defaultProfile); + if (p) + setDefaultProfile(p); +} + +ProfileManager::~ProfileManager() +{ + // Clean out profile information to avoid calling them during deregistration: + qDeleteAll(d->m_informationList); + qDeleteAll(d->m_profileList); + delete d; + m_instance = 0; +} + +void ProfileManager::saveProfiles() +{ + PersistentSettingsWriter writer; + writer.saveValue(QLatin1String(PROFILE_FILE_VERSION_KEY), 1); + + int count = 0; + foreach (Profile *p, profiles()) { + QVariantMap tmp = p->toMap(); + if (tmp.isEmpty()) + continue; + writer.saveValue(QString::fromLatin1(PROFILE_DATA_KEY) + QString::number(count), tmp); + ++count; + } + writer.saveValue(QLatin1String(PROFILE_COUNT_KEY), count); + writer.saveValue(QLatin1String(PROFILE_DEFAULT_KEY), + d->m_defaultProfile ? QString::fromLatin1(d->m_defaultProfile->id().name()) : QString()); + writer.save(settingsFileName(), QLatin1String("QtCreatorProfiles"), Core::ICore::mainWindow()); +} + +bool greaterPriority(ProfileInformation *a, ProfileInformation *b) +{ + return a->priority() > b->priority(); +} + +void ProfileManager::registerProfileInformation(ProfileInformation *pi) +{ + QList<ProfileInformation *>::iterator it + = qLowerBound(d->m_informationList.begin(), d->m_informationList.end(), pi, greaterPriority); + d->m_informationList.insert(it, pi); + + connect(pi, SIGNAL(validationNeeded()), this, SLOT(validateProfiles())); + + if (!d->m_initialized) + return; + + foreach (Profile *p, profiles()) { + if (!p->hasValue(pi->dataId())) + p->setValue(pi->dataId(), pi->defaultValue(p)); + } + + return; +} + +void ProfileManager::deregisterProfileInformation(ProfileInformation *pi) +{ + Q_ASSERT(d->m_informationList.contains(pi)); + d->m_informationList.removeAll(pi); + delete pi; +} + +ProfileManager::ProfileList ProfileManager::restoreProfiles(const QString &fileName) +{ + ProfileList result; + + PersistentSettingsReader reader; + if (!reader.load(fileName)) + return result; + QVariantMap data = reader.restoreValues(); + + // Check version: + int version = data.value(QLatin1String(PROFILE_FILE_VERSION_KEY), 0).toInt(); + if (version < 1) + return result; + + const int count = data.value(QLatin1String(PROFILE_COUNT_KEY), 0).toInt(); + for (int i = 0; i < count; ++i) { + const QString key = QString::fromLatin1(PROFILE_DATA_KEY) + QString::number(i); + if (!data.contains(key)) + break; + + const QVariantMap stMap = data.value(key).toMap(); + + Profile *p = new Profile; + if (p->fromMap(stMap)) { + result.profiles.append(p); + } else { + delete p; + qWarning("Warning: Unable to restore profiles stored in %s at position %d.", + qPrintable(QDir::toNativeSeparators(fileName)), i); + } + } + const QString defaultId = data.value(QLatin1String(PROFILE_DEFAULT_KEY)).toString(); + if (defaultId.isEmpty()) + return result; + + const Core::Id id = Core::Id(defaultId); + foreach (Profile *i, result.profiles) { + if (i->id() == id) { + result.defaultProfile = id; + break; + } + } + return result; +} + +QList<Profile *> ProfileManager::profiles(const ProfileMatcher *m) const +{ + if (!d->m_initialized) { + d->m_initialized = true; + const_cast<ProfileManager *>(this)->restoreProfiles(); + } + + QList<Profile *> result; + foreach (Profile *p, d->m_profileList) { + if (!m || m->matches(p)) + result.append(p); + } + return result; +} + +Profile *ProfileManager::find(const Core::Id &id) const +{ + if (!id.isValid()) + return 0; + + foreach (Profile *p, profiles()) { + if (p->id() == id) + return p; + } + return 0; +} + +Profile *ProfileManager::find(const ProfileMatcher *m) const +{ + QList<Profile *> matched = profiles(m); + return matched.isEmpty() ? 0 : matched.first(); +} + +Profile *ProfileManager::defaultProfile() +{ + if (!d->m_initialized) { + d->m_initialized = true; + restoreProfiles(); + } + return d->m_defaultProfile; +} + +QList<ProfileInformation *> ProfileManager::profileInformation() const +{ + return d->m_informationList; +} + +ProfileConfigWidget *ProfileManager::createConfigWidget(Profile *p) const +{ + if (!p) + return 0; + + Internal::ProfileManagerConfigWidget *result = new Internal::ProfileManagerConfigWidget(p); + foreach (ProfileInformation *pi, d->m_informationList) + result->addConfigWidget(pi->createConfigWidget(p)); + + return result; +} + +void ProfileManager::notifyAboutUpdate(ProjectExplorer::Profile *p) +{ + if (!p || !profiles().contains(p)) + return; + d->validateProfile(p); + emit profileUpdated(p); +} + +bool ProfileManager::registerProfile(ProjectExplorer::Profile *p) +{ + if (!p) + return true; + foreach (Profile *current, profiles()) { + if (p == current || *p == *current) + return false; + } + + // Make name unique: + QStringList names; + foreach (Profile *tmp, profiles()) + names << tmp->displayName(); + p->setDisplayName(Project::makeUnique(p->displayName(), names)); + + // make sure we have all the information in our profiles: + foreach (ProfileInformation *pi, d->m_informationList) { + if (!p->hasValue(pi->dataId())) + p->setValue(pi->dataId(), pi->defaultValue(p)); + } + + addProfile(p); + emit profileAdded(p); + return true; +} + +void ProfileManager::deregisterProfile(Profile *p) +{ + if (!p || !profiles().contains(p)) + return; + d->m_profileList.removeOne(p); + if (d->m_defaultProfile == p) { + QList<Profile *> stList = profiles(); + Profile *newDefault = 0; + foreach (Profile *cur, stList) { + if (cur->isValid()) { + newDefault = cur; + break; + } + } + setDefaultProfile(newDefault); + } + emit profileRemoved(p); + delete p; +} + +QList<Task> ProfileManager::validateProfile(Profile *p) +{ + QList<Task> result = d->validateProfile(p); + qSort(result); + return result; +} + +void ProfileManager::setDefaultProfile(Profile *p) +{ + if (d->m_defaultProfile == p) + return; + if (p && !profiles().contains(p)) + return; + d->m_defaultProfile = p; + emit defaultProfileChanged(); +} + +void ProfileManager::validateProfiles() +{ + foreach (Profile *p, profiles()) + d->validateProfile(p); +} + +void ProfileManager::addProfile(Profile *p) +{ + if (!p) + return; + d->validateProfile(p); + d->m_profileList.append(p); + if (!d->m_defaultProfile || + (!d->m_defaultProfile->isValid() && p->isValid())) + setDefaultProfile(p); +} + + +void ProfileInformation::addToEnvironment(const Profile *p, Utils::Environment &env) const +{ + Q_UNUSED(p); + Q_UNUSED(env); +} + +} // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/profilemanager.h b/src/plugins/projectexplorer/profilemanager.h new file mode 100644 index 0000000000..e9bac6dc4f --- /dev/null +++ b/src/plugins/projectexplorer/profilemanager.h @@ -0,0 +1,171 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. +** +**************************************************************************/ + +#ifndef PROFILEMANAGER_H +#define PROFILEMANAGER_H + +#include "projectexplorer_export.h" + +#include "task.h" + +#include <coreplugin/id.h> +#include <utils/fileutils.h> + +#include <QObject> +#include <QPair> + +namespace Utils { class Environment; } + +namespace ProjectExplorer { +class Profile; +class ProfileConfigWidget; + +namespace Internal { +class ProfileManagerPrivate; +class ProfileModel; +} // namespace Internal + +/** + * @brief The ProfileInformation class + * + * One piece of information stored in the profile. + * + * This needs to get registered with the \a ProfileManager. + */ +class PROJECTEXPLORER_EXPORT ProfileInformation : public QObject +{ + Q_OBJECT + +public: + typedef QPair<QString, QString> Item; + typedef QList<Item> ItemList; + + virtual Core::Id dataId() const = 0; + + virtual unsigned int priority() const = 0; // the higher the closer to the top. + + virtual bool visibleIn(Profile *) { return true; } + virtual QVariant defaultValue(Profile *) const = 0; + + virtual QList<Task> validate(Profile *) const = 0; + + virtual ItemList toUserOutput(Profile *p) const = 0; + + virtual ProfileConfigWidget *createConfigWidget(Profile *) const = 0; + + virtual void addToEnvironment(const Profile *p, Utils::Environment &env) const; + +signals: + void validationNeeded(); +}; + +class PROJECTEXPLORER_EXPORT ProfileMatcher +{ +public: + virtual ~ProfileMatcher() { } + virtual bool matches(const Profile *p) const = 0; +}; + +class PROJECTEXPLORER_EXPORT ProfileManager : public QObject +{ + Q_OBJECT + +public: + static ProfileManager *instance(); + ~ProfileManager(); + + QList<Profile *> profiles(const ProfileMatcher *m = 0) const; + Profile *find(const Core::Id &id) const; + Profile *find(const ProfileMatcher *m) const; + Profile *defaultProfile(); + + QList<ProfileInformation *> profileInformation() const; + + ProfileConfigWidget *createConfigWidget(Profile *p) const; + +public slots: + bool registerProfile(ProjectExplorer::Profile *p); + void deregisterProfile(ProjectExplorer::Profile *p); + QList<Task> validateProfile(ProjectExplorer::Profile *p); + void setDefaultProfile(ProjectExplorer::Profile *p); + + void saveProfiles(); + + void registerProfileInformation(ProjectExplorer::ProfileInformation *pi); + void deregisterProfileInformation(ProjectExplorer::ProfileInformation *pi); + +signals: + void profileAdded(ProjectExplorer::Profile *); + // Profile is still valid when this call happens! + void profileRemoved(ProjectExplorer::Profile *); + // Profile was updated. + void profileUpdated(ProjectExplorer::Profile *); + // Default profile was changed. + void defaultProfileChanged(); + // Something changed. + void profilesChanged(); + +private slots: + void validateProfiles(); + +private: + explicit ProfileManager(QObject *parent = 0); + + // Make sure the this is only called after all + // ProfileInformation are registered! + void restoreProfiles(); + class ProfileList + { + public: + ProfileList() + { } + Core::Id defaultProfile; + QList<Profile *> profiles; + }; + ProfileList restoreProfiles(const QString &fileName); + + void notifyAboutUpdate(ProjectExplorer::Profile *p); + void addProfile(Profile *p); + + Internal::ProfileManagerPrivate *const d; + + static ProfileManager *m_instance; + + friend class Internal::ProfileManagerPrivate; // for the restoreToolChains methods + friend class ProjectExplorerPlugin; // for constructor + friend class Profile; + friend class Internal::ProfileModel; +}; + +} // namespace ProjectExplorer + +#endif // PROFILEMANAGER_H diff --git a/src/plugins/projectexplorer/profilemanagerconfigwidget.cpp b/src/plugins/projectexplorer/profilemanagerconfigwidget.cpp new file mode 100644 index 0000000000..04aed656bf --- /dev/null +++ b/src/plugins/projectexplorer/profilemanagerconfigwidget.cpp @@ -0,0 +1,132 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. +** +**************************************************************************/ + +#include "profilemanagerconfigwidget.h" + +#include "profile.h" + +#include <QHBoxLayout> +#include <QFormLayout> +#include <QPushButton> +#include <QFileDialog> + +namespace ProjectExplorer { +namespace Internal { + +ProfileManagerConfigWidget::ProfileManagerConfigWidget(Profile *p, QWidget *parent) : + ProfileConfigWidget(parent), + m_layout(new QFormLayout), + m_iconButton(new QPushButton), + m_profile(p) +{ + m_layout->setMargin(0); + m_layout->setSpacing(6); + + m_iconButton->setMinimumSize(70, 70); + m_iconButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::QSizePolicy::Fixed); + QVBoxLayout *iconLayout = new QVBoxLayout; + iconLayout->addWidget(m_iconButton); + iconLayout->addStretch(); + + QHBoxLayout *masterLayout = new QHBoxLayout(this); + masterLayout->addLayout(iconLayout); + masterLayout->setMargin(0); + masterLayout->setSpacing(12); + masterLayout->addLayout(m_layout); + + discard(); + + connect(m_iconButton, SIGNAL(clicked()), this, SLOT(setIcon())); +} + +QString ProfileManagerConfigWidget::displayName() const +{ + return tr("Profiles"); +} + +void ProfileManagerConfigWidget::apply() +{ + foreach (ProfileConfigWidget *w, m_widgets) + w->apply(); + m_profile->setIconPath(m_iconPath); +} + +void ProfileManagerConfigWidget::discard() +{ + foreach (ProfileConfigWidget *w, m_widgets) + w->discard(); + m_iconButton->setIcon(m_profile->icon()); + m_iconPath = m_profile->iconPath(); +} + +bool ProfileManagerConfigWidget::isDirty() const +{ + foreach (ProfileConfigWidget *w, m_widgets) + if (w->isDirty()) + return true; + return m_profile->iconPath() != m_iconPath; +} + +void ProfileManagerConfigWidget::addConfigWidget(ProjectExplorer::ProfileConfigWidget *widget) +{ + Q_ASSERT(widget); + Q_ASSERT(!m_widgets.contains(widget)); + + connect(widget, SIGNAL(dirty()), this, SIGNAL(dirty())); + m_layout->addRow(widget->displayName(), widget); + m_widgets.append(widget); +} + +void ProfileManagerConfigWidget::makeReadOnly() +{ + foreach (ProfileConfigWidget *w, m_widgets) + w->makeReadOnly(); + m_iconButton->setEnabled(false); +} + +void ProfileManagerConfigWidget::setIcon() +{ + const QString path = QFileDialog::getOpenFileName(0, tr("Select Icon"), m_iconPath, tr("Images (*.png *.xpm *.jpg)")); + if (path.isEmpty()) + return; + + const QIcon icon = QIcon(path); + if (icon.isNull()) + return; + + m_iconButton->setIcon(icon); + m_iconPath = path; + emit dirty(); +} + +} // namespace Internal +} // namespace ProjectExplorer diff --git a/src/plugins/remotelinux/genericembeddedlinuxtarget.h b/src/plugins/projectexplorer/profilemanagerconfigwidget.h index fe84489b02..0bf7204a29 100644 --- a/src/plugins/remotelinux/genericembeddedlinuxtarget.h +++ b/src/plugins/projectexplorer/profilemanagerconfigwidget.h @@ -30,33 +30,49 @@ ** **************************************************************************/ -#ifndef EMBEDDEDLINUXTARGET_H -#define EMBEDDEDLINUXTARGET_H +#ifndef PROFILEMANAGERWIDGET_H +#define PROFILEMANAGERWIDGET_H -#include "abstractembeddedlinuxtarget.h" +#include "profileconfigwidget.h" -namespace RemoteLinux { -namespace Internal { +QT_BEGIN_NAMESPACE +class QHBoxLayout; +class QFormLayout; +class QPushButton; +QT_END_NAMESPACE + +namespace ProjectExplorer { +class Profile; -class EmbeddedLinuxTargetFactory; +namespace Internal { -class GenericEmbeddedLinuxTarget : public AbstractEmbeddedLinuxTarget +class ProfileManagerConfigWidget : public ProjectExplorer::ProfileConfigWidget { Q_OBJECT public: - GenericEmbeddedLinuxTarget(Qt4ProjectManager::Qt4Project *parent, const Core::Id id); + ProfileManagerConfigWidget(Profile *p, QWidget *parent = 0); + + QString displayName() const; + + void apply(); + void discard(); + bool isDirty() const; + void addConfigWidget(ProjectExplorer::ProfileConfigWidget *widget); + void makeReadOnly(); - void createApplicationProFiles(bool reparse); - QList<ProjectExplorer::RunConfiguration *> runConfigurationsForNode(ProjectExplorer::Node *n); - Utils::FileName mkspec(const Qt4ProjectManager::Qt4BuildConfiguration *bc) const; - bool supportsDevice(const QSharedPointer<const ProjectExplorer::IDevice> &device) const; +private slots: + void setIcon(); private: - friend class EmbeddedLinuxTargetFactory; + QFormLayout *m_layout; + QPushButton *m_iconButton; + QList<ProfileConfigWidget *> m_widgets; + Profile *m_profile; + QString m_iconPath; }; } // namespace Internal -} // namespace RemoteLinux +} // namespace ProjectExplorer -#endif // EMBEDDEDLINUXTARGET_H +#endif // PROFILEMANAGERCONFIGWIDGET_H diff --git a/src/plugins/projectexplorer/profilemodel.cpp b/src/plugins/projectexplorer/profilemodel.cpp new file mode 100644 index 0000000000..b4da323a81 --- /dev/null +++ b/src/plugins/projectexplorer/profilemodel.cpp @@ -0,0 +1,521 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. +** +**************************************************************************/ + +#include "profilemodel.h" + +#include "profile.h" +#include "profileconfigwidget.h" +#include "profilemanager.h" + +#include <utils/qtcassert.h> + +#include <QApplication> +#include <QLayout> +#include <QMessageBox> + +namespace ProjectExplorer { +namespace Internal { + +class ProfileNode +{ +public: + explicit ProfileNode(ProfileNode *pn, Profile *p = 0, bool c = false) : + parent(pn), profile(p), changed(c) + { + if (pn) + pn->childNodes.append(this); + widget = ProfileManager::instance()->createConfigWidget(p); + if (widget) { + if (p && p->isAutoDetected()) + widget->makeReadOnly(); + widget->setVisible(false); + } + } + + ~ProfileNode() + { + if (parent) + parent->childNodes.removeOne(this); + + // deleting a child removes it from childNodes + // so operate on a temporary list + QList<ProfileNode *> tmp = childNodes; + qDeleteAll(tmp); + Q_ASSERT(childNodes.isEmpty()); + } + + ProfileNode *parent; + QString newName; + QList<ProfileNode *> childNodes; + Profile *profile; + ProfileConfigWidget *widget; + bool changed; +}; + +// -------------------------------------------------------------------------- +// ProfileModel +// -------------------------------------------------------------------------- + +ProfileModel::ProfileModel(QBoxLayout *parentLayout, QObject *parent) : + QAbstractItemModel(parent), + m_parentLayout(parentLayout), + m_defaultNode(0) +{ + Q_ASSERT(m_parentLayout); + + connect(ProfileManager::instance(), SIGNAL(profileAdded(ProjectExplorer::Profile*)), + this, SLOT(addProfile(ProjectExplorer::Profile*))); + connect(ProfileManager::instance(), SIGNAL(profileRemoved(ProjectExplorer::Profile*)), + this, SLOT(removeProfile(ProjectExplorer::Profile*))); + connect(ProfileManager::instance(), SIGNAL(profileUpdated(ProjectExplorer::Profile*)), + this, SLOT(updateProfile(ProjectExplorer::Profile*))); + connect(ProfileManager::instance(), SIGNAL(defaultProfileChanged()), + this, SLOT(changeDefaultProfile())); + + m_root = new ProfileNode(0); + m_autoRoot = new ProfileNode(m_root); + m_manualRoot = new ProfileNode(m_root); + + foreach (Profile *p, ProfileManager::instance()->profiles()) + addProfile(p); + + changeDefaultProfile(); +} + +ProfileModel::~ProfileModel() +{ + delete m_root; +} + +QModelIndex ProfileModel::index(int row, int column, const QModelIndex &parent) const +{ + if (!parent.isValid()) { + if (row >= 0 && row < m_root->childNodes.count()) + return createIndex(row, column, m_root->childNodes.at(row)); + } + ProfileNode *node = static_cast<ProfileNode *>(parent.internalPointer()); + if (row < node->childNodes.count() && column == 0) + return createIndex(row, column, node->childNodes.at(row)); + else + return QModelIndex(); +} + +QModelIndex ProfileModel::parent(const QModelIndex &idx) const +{ + if (!idx.isValid()) + return QModelIndex(); + ProfileNode *node = static_cast<ProfileNode *>(idx.internalPointer()); + if (node->parent == m_root) + return QModelIndex(); + return index(node->parent); +} + +int ProfileModel::rowCount(const QModelIndex &parent) const +{ + if (!parent.isValid()) + return m_root->childNodes.count(); + ProfileNode *node = static_cast<ProfileNode *>(parent.internalPointer()); + return node->childNodes.count(); +} + +int ProfileModel::columnCount(const QModelIndex &parent) const +{ + Q_UNUSED(parent); + return 1; +} + +QVariant ProfileModel::data(const QModelIndex &index, int role) const +{ + static QIcon warningIcon(":/projectexplorer/images/compile_warning.png"); + + if (!index.isValid() || index.column() != 0) + return QVariant(); + + ProfileNode *node = static_cast<ProfileNode *>(index.internalPointer()); + QTC_ASSERT(node, return QVariant()); + if (node == m_autoRoot && role == Qt::DisplayRole) + return tr("Auto-detected"); + if (node == m_manualRoot && role == Qt::DisplayRole) + return tr("Manual"); + if (node->profile) { + if (role == Qt::FontRole) { + QFont f = QApplication::font(); + if (node->changed) + f.setBold(!f.bold()); + if (node == m_defaultNode) + f.setItalic(f.style() != QFont::StyleItalic); + return f; + } else if (role == Qt::DisplayRole || role == Qt::EditRole) { + QString baseName = node->newName.isEmpty() ? node->profile->displayName() : node->newName; + if (node == m_defaultNode) + //: Mark up a profile as the default one. + baseName = tr("%1 (default)").arg(baseName); + return baseName; + } else if (role == Qt::DecorationRole) { + return node->profile->isValid() ? QIcon() : warningIcon; + } else if (role == Qt::ToolTipRole) { + return node->profile->toHtml(); + } + } + return QVariant(); +} + +bool ProfileModel::setData(const QModelIndex &index, const QVariant &value, int role) +{ + if (!index.isValid()) + return false; + + ProfileNode *node = static_cast<ProfileNode *>(index.internalPointer()); + Q_ASSERT(node); + if (index.column() != 0 || !node->profile || role != Qt::EditRole) + return false; + node->newName = value.toString(); + if (!node->newName.isEmpty() && node->newName != node->profile->displayName()) + node->changed = true; + return true; +} + +Qt::ItemFlags ProfileModel::flags(const QModelIndex &index) const +{ + if (!index.isValid()) + return 0; + + ProfileNode *node = static_cast<ProfileNode *>(index.internalPointer()); + Q_ASSERT(node); + if (!node->profile) + return Qt::ItemIsEnabled; + + if (node->profile->isAutoDetected()) + return Qt::ItemIsEnabled | Qt::ItemIsSelectable; + + return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable; +} + +QVariant ProfileModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + Q_UNUSED(section); + if (orientation == Qt::Horizontal && role == Qt::DisplayRole) + return tr("Name"); + return QVariant(); +} + +Profile *ProfileModel::profile(const QModelIndex &index) +{ + if (!index.isValid()) + return 0; + ProfileNode *node = static_cast<ProfileNode *>(index.internalPointer()); + Q_ASSERT(node); + return node->profile; +} + +QModelIndex ProfileModel::indexOf(Profile *p) const +{ + ProfileNode *n = find(p); + return n ? index(n) : QModelIndex(); +} + +void ProfileModel::setDefaultProfile(const QModelIndex &index) +{ + if (!index.isValid()) + return; + ProfileNode *node = static_cast<ProfileNode *>(index.internalPointer()); + Q_ASSERT(node); + if (node->profile) + setDefaultNode(node); +} + +bool ProfileModel::isDefaultProfile(const QModelIndex &index) +{ + return m_defaultNode == static_cast<ProfileNode *>(index.internalPointer()); +} + +ProfileConfigWidget *ProfileModel::widget(const QModelIndex &index) +{ + if (!index.isValid()) + return 0; + ProfileNode *node = static_cast<ProfileNode *>(index.internalPointer()); + Q_ASSERT(node); + return node->widget; +} + +bool ProfileModel::isDirty() const +{ + foreach (ProfileNode *n, m_manualRoot->childNodes) { + if (n->changed) + return true; + } + return false; +} + +bool ProfileModel::isDirty(Profile *p) const +{ + ProfileNode *n = find(p); + return n ? !n->changed : false; +} + +void ProfileModel::setDirty() +{ + ProfileConfigWidget *w = qobject_cast<ProfileConfigWidget *>(sender()); + foreach (ProfileNode *n, m_manualRoot->childNodes) { + if (n->widget == w) { + n->changed = true; + emit dataChanged(index(n, 0), index(n, columnCount(QModelIndex()))); + } + } +} + +void ProfileModel::apply() +{ + // Remove unused profiles: + QList<ProfileNode *> nodes = m_toRemoveList; + foreach (ProfileNode *n, nodes) { + Q_ASSERT(!n->parent); + ProfileManager::instance()->deregisterProfile(n->profile); + } + Q_ASSERT(m_toRemoveList.isEmpty()); + + // Update profiles: + foreach (ProfileNode *n, m_manualRoot->childNodes) { + Q_ASSERT(n); + Q_ASSERT(n->profile); + if (n->changed) { + ProfileManager::instance()->blockSignals(true); + if (!n->newName.isEmpty()) { + n->profile->setDisplayName(n->newName); + n->newName.clear(); + } + if (n->widget) + n->widget->apply(); + n->changed = false; + + ProfileManager::instance()->blockSignals(false); + ProfileManager::instance()->notifyAboutUpdate(n->profile); + emit dataChanged(index(n, 0), index(n, columnCount(QModelIndex()))); + } + } + + // Add new (and already updated) profiles + QStringList removedSts; + nodes = m_toAddList; + foreach (ProfileNode *n, nodes) { + if (!ProfileManager::instance()->registerProfile(n->profile)) + removedSts << n->profile->displayName(); + } + + foreach (ProfileNode *n, m_toAddList) + markForRemoval(n->profile); + + if (removedSts.count() == 1) { + QMessageBox::warning(0, + tr("Duplicate profiles detected"), + tr("The following profile was already configured:<br>" + " %1<br>" + "It was not configured again.") + .arg(removedSts.at(0))); + + } else if (!removedSts.isEmpty()) { + QMessageBox::warning(0, + tr("Duplicate profile detected"), + tr("The following profiles were already configured:<br>" + " %1<br>" + "They were not configured again.") + .arg(removedSts.join(QLatin1String(",<br> ")))); + } + + // Set default profile: + if (m_defaultNode) + ProfileManager::instance()->setDefaultProfile(m_defaultNode->profile); +} + +void ProfileModel::markForRemoval(Profile *p) +{ + ProfileNode *node = find(p); + if (!node) + return; + + beginRemoveRows(index(m_manualRoot), m_manualRoot->childNodes.indexOf(node), m_manualRoot->childNodes.indexOf(node)); + m_manualRoot->childNodes.removeOne(node); + node->parent = 0; + if (m_toAddList.contains(node)) { + delete node->profile; + node->profile = 0; + m_toAddList.removeOne(node); + delete node; + } else { + m_toRemoveList.append(node); + } + endRemoveRows(); + + if (node == m_defaultNode) { + ProfileNode *newDefault = 0; + if (!m_autoRoot->childNodes.isEmpty()) + newDefault = m_autoRoot->childNodes.at(0); + else if (!m_manualRoot->childNodes.isEmpty()) + newDefault = m_manualRoot->childNodes.at(0); + setDefaultNode(newDefault); + } +} + +void ProfileModel::markForAddition(Profile *p) +{ + int pos = m_manualRoot->childNodes.size(); + beginInsertRows(index(m_manualRoot), pos, pos); + + ProfileNode *node = createNode(m_manualRoot, p, true); + m_toAddList.append(node); + + if (!m_defaultNode) + setDefaultNode(node); + + endInsertRows(); +} + +QModelIndex ProfileModel::index(ProfileNode *node, int column) const +{ + if (node->parent == 0) // is root (or was marked for deletion) + return QModelIndex(); + else if (node->parent == m_root) + return index(m_root->childNodes.indexOf(node), column, QModelIndex()); + else + return index(node->parent->childNodes.indexOf(node), column, index(node->parent)); +} + +ProfileNode *ProfileModel::find(Profile *p) const +{ + foreach (ProfileNode *n, m_autoRoot->childNodes) { + if (n->profile == p) + return n; + } + foreach (ProfileNode *n, m_manualRoot->childNodes) { + if (n->profile == p) + return n; + } + return 0; +} + +ProfileNode *ProfileModel::createNode(ProfileNode *parent, Profile *p, bool changed) +{ + ProfileNode *node = new ProfileNode(parent, p, changed); + if (node->widget) { + m_parentLayout->addWidget(node->widget); + connect(node->widget, SIGNAL(dirty()), + this, SLOT(setDirty())); + } + return node; +} + +void ProfileModel::setDefaultNode(ProfileNode *node) +{ + if (m_defaultNode) { + QModelIndex idx = index(m_defaultNode); + if (idx.isValid()) + emit dataChanged(idx, idx); + } + m_defaultNode = node; + if (m_defaultNode) { + QModelIndex idx = index(m_defaultNode); + if (idx.isValid()) + emit dataChanged(idx, idx); + } +} + +void ProfileModel::addProfile(Profile *p) +{ + QList<ProfileNode *> nodes = m_toAddList; + foreach (ProfileNode *n, nodes) { + if (n->profile == p) { + m_toAddList.removeOne(n); + // do not delete n: Still used elsewhere! + return; + } + } + + ProfileNode *parent = m_manualRoot; + if (p->isAutoDetected()) + parent = m_autoRoot; + int row = parent->childNodes.count(); + + beginInsertRows(index(parent), row, row); + createNode(parent, p, false); + endInsertRows(); + + emit profileStateChanged(); +} + +void ProfileModel::removeProfile(Profile *p) +{ + QList<ProfileNode *> nodes = m_toRemoveList; + foreach (ProfileNode *n, nodes) { + if (n->profile == p) { + m_toRemoveList.removeOne(n); + delete n; + return; + } + } + + ProfileNode *parent = m_manualRoot; + if (p->isAutoDetected()) + parent = m_autoRoot; + int row = 0; + ProfileNode *node = 0; + foreach (ProfileNode *current, parent->childNodes) { + if (current->profile == p) { + node = current; + break; + } + ++row; + } + + beginRemoveRows(index(parent), row, row); + parent->childNodes.removeAt(row); + delete node; + endRemoveRows(); + + emit profileStateChanged(); +} + +void ProfileModel::updateProfile(Profile *p) +{ + ProfileNode *n = find(p); + if (n->widget) + n->widget->discard(); + QModelIndex idx = index(n); + emit dataChanged(idx, idx); +} + +void ProfileModel::changeDefaultProfile() +{ + setDefaultNode(find(ProfileManager::instance()->defaultProfile())); +} + +} // namespace Internal +} // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/profilemodel.h b/src/plugins/projectexplorer/profilemodel.h new file mode 100644 index 0000000000..edd4af0a3b --- /dev/null +++ b/src/plugins/projectexplorer/profilemodel.h @@ -0,0 +1,124 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. +** +**************************************************************************/ + +#ifndef PROFILEMODEL_H +#define PROFILEMODEL_H + +#include "projectexplorer_export.h" + +#include <QAbstractItemModel> + +QT_BEGIN_NAMESPACE +class QTreeWidgetItem; +class QBoxLayout; +QT_END_NAMESPACE + +namespace ProjectExplorer { + +class Profile; +class ProfileConfigWidget; +class ProfileFactory; +class ProfileManager; + +namespace Internal { + +class ProfileNode; + +// -------------------------------------------------------------------------- +// ProfileModel: +// -------------------------------------------------------------------------- + +class ProfileModel : public QAbstractItemModel +{ + Q_OBJECT + +public: + explicit ProfileModel(QBoxLayout *parentLayout, QObject *parent = 0); + ~ProfileModel(); + + QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; + QModelIndex parent(const QModelIndex &index) const; + int rowCount(const QModelIndex &parent = QModelIndex()) const; + int columnCount(const QModelIndex &parent = QModelIndex()) const; + + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; + bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); + Qt::ItemFlags flags(const QModelIndex &index) const; + QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; + + Profile *profile(const QModelIndex &); + QModelIndex indexOf(Profile *p) const; + + void setDefaultProfile(const QModelIndex &index); + bool isDefaultProfile(const QModelIndex &index); + + ProfileConfigWidget *widget(const QModelIndex &); + + bool isDirty() const; + bool isDirty(Profile *p) const; + + void apply(); + + void markForRemoval(Profile *p); + void markForAddition(Profile *p); + +signals: + void profileStateChanged(); + +private slots: + void addProfile(ProjectExplorer::Profile *p); + void removeProfile(ProjectExplorer::Profile *p); + void updateProfile(ProjectExplorer::Profile *p); + void changeDefaultProfile(); + void setDirty(); + +private: + QModelIndex index(ProfileNode *, int column = 0) const; + ProfileNode *find(Profile *) const; + ProfileNode *createNode(ProfileNode *parent, Profile *p, bool changed); + void setDefaultNode(ProfileNode *node); + + ProfileNode *m_root; + ProfileNode *m_autoRoot; + ProfileNode *m_manualRoot; + + QList<ProfileNode *> m_toAddList; + QList<ProfileNode *> m_toRemoveList; + + QBoxLayout *m_parentLayout; + ProfileNode *m_defaultNode; +}; + +} // namespace Internal +} // namespace ProjectExplorer + +#endif // PROFILEMODEL_H diff --git a/src/plugins/projectexplorer/profileoptionspage.cpp b/src/plugins/projectexplorer/profileoptionspage.cpp new file mode 100644 index 0000000000..7cc7d80a89 --- /dev/null +++ b/src/plugins/projectexplorer/profileoptionspage.cpp @@ -0,0 +1,253 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. +** +**************************************************************************/ + +#include "profileoptionspage.h" + +#include "profilemodel.h" +#include "profile.h" +#include "projectexplorerconstants.h" +#include "profileconfigwidget.h" +#include "profilemanager.h" + +#include <coreplugin/icore.h> + +#include <utils/qtcassert.h> + +#include <QHBoxLayout> +#include <QHeaderView> +#include <QItemSelectionModel> +#include <QPushButton> +#include <QTreeView> +#include <QVBoxLayout> + +namespace ProjectExplorer { + +// -------------------------------------------------------------------------- +// ProfileOptionsPage: +// -------------------------------------------------------------------------- + +ProfileOptionsPage::ProfileOptionsPage() : + m_model(0), m_selectionModel(0), m_currentWidget(0), m_toShow(0) +{ + setId(Constants::PROFILE_SETTINGS_PAGE_ID); + setDisplayName(tr("Targets")); + setCategory(QLatin1String(Constants::PROJECTEXPLORER_SETTINGS_CATEGORY)); + setDisplayCategory(QCoreApplication::translate("ProjectExplorer", + Constants::PROJECTEXPLORER_SETTINGS_TR_CATEGORY)); + setCategoryIcon(QLatin1String(Constants::PROJECTEXPLORER_SETTINGS_CATEGORY_ICON)); +} + +QWidget *ProfileOptionsPage::createPage(QWidget *parent) +{ + m_configWidget = new QWidget(parent); + + m_profilesView = new QTreeView(m_configWidget); + m_profilesView->setUniformRowHeights(true); + m_profilesView->header()->setStretchLastSection(true); + + m_addButton = new QPushButton(tr("Add"), m_configWidget); + m_cloneButton = new QPushButton(tr("Clone"), m_configWidget); + m_delButton = new QPushButton(tr("Remove"), m_configWidget); + m_makeDefaultButton = new QPushButton(tr("Make Default"), m_configWidget); + + QVBoxLayout *buttonLayout = new QVBoxLayout(); + buttonLayout->setContentsMargins(0, 0, 0, 0); + buttonLayout->addWidget(m_addButton); + buttonLayout->addWidget(m_cloneButton); + buttonLayout->addWidget(m_delButton); + buttonLayout->addWidget(m_makeDefaultButton); + buttonLayout->addItem(new QSpacerItem(10, 40, QSizePolicy::Minimum, QSizePolicy::Expanding)); + + QVBoxLayout *verticalLayout = new QVBoxLayout(); + verticalLayout->addWidget(m_profilesView); + + QHBoxLayout *horizontalLayout = new QHBoxLayout(m_configWidget); + horizontalLayout->addLayout(verticalLayout); + horizontalLayout->addLayout(buttonLayout); + + Q_ASSERT(!m_model); + m_model = new Internal::ProfileModel(verticalLayout); + connect(m_model, SIGNAL(profileStateChanged()), this, SLOT(updateState())); + + m_profilesView->setModel(m_model); + m_profilesView->header()->setResizeMode(0, QHeaderView::Stretch); + m_profilesView->expandAll(); + + m_selectionModel = m_profilesView->selectionModel(); + connect(m_selectionModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)), + this, SLOT(profileSelectionChanged())); + connect(ProfileManager::instance(), SIGNAL(profileAdded(ProjectExplorer::Profile*)), + this, SLOT(profileSelectionChanged())); + connect(ProfileManager::instance(), SIGNAL(profileRemoved(ProjectExplorer::Profile*)), + this, SLOT(profileSelectionChanged())); + connect(ProfileManager::instance(), SIGNAL(profileUpdated(ProjectExplorer::Profile*)), + this, SLOT(profileSelectionChanged())); + + // Set up add menu: + connect(m_addButton, SIGNAL(clicked()), this, SLOT(addNewProfile())); + connect(m_cloneButton, SIGNAL(clicked()), this, SLOT(cloneProfile())); + connect(m_delButton, SIGNAL(clicked()), this, SLOT(removeProfile())); + connect(m_makeDefaultButton, SIGNAL(clicked()), this, SLOT(makeDefaultProfile())); + + m_searchKeywords = tr("Profiles"); + + updateState(); + + if (m_toShow) + m_selectionModel->select(m_model->indexOf(m_toShow), + QItemSelectionModel::Clear + | QItemSelectionModel::SelectCurrent + | QItemSelectionModel::Rows); + m_toShow = 0; + + return m_configWidget; +} + +void ProfileOptionsPage::apply() +{ + if (m_model) + m_model->apply(); +} + +void ProfileOptionsPage::finish() +{ + if (m_model) { + delete m_model; + m_model = 0; + } + + m_configWidget = 0; // deleted by settingsdialog + m_selectionModel = 0; // child of m_configWidget + m_profilesView = 0; // child of m_configWidget + m_currentWidget = 0; // deleted by the model + m_toShow = 0; +} + +bool ProfileOptionsPage::matches(const QString &s) const +{ + return m_searchKeywords.contains(s, Qt::CaseInsensitive); +} + +void ProfileOptionsPage::showProfile(Profile *p) +{ + m_toShow = p; +} + +void ProfileOptionsPage::profileSelectionChanged() +{ + if (m_currentWidget) + m_currentWidget->setVisible(false); + + QModelIndex current = currentIndex(); + m_currentWidget = current.isValid() ? m_model->widget(current) : 0; + + if (m_currentWidget) + m_currentWidget->setVisible(true); + updateState(); +} + +void ProfileOptionsPage::addNewProfile() +{ + Profile *p = new Profile; + m_model->markForAddition(p); + + QModelIndex newIdx = m_model->indexOf(p); + m_selectionModel->select(newIdx, + QItemSelectionModel::Clear + | QItemSelectionModel::SelectCurrent + | QItemSelectionModel::Rows); +} + +void ProfileOptionsPage::cloneProfile() +{ + Profile *clone = m_model->profile(currentIndex()); + if (!clone) + return; + + Profile *p = new Profile(*clone); + + m_model->markForAddition(p); + + QModelIndex newIdx = m_model->indexOf(p); + m_selectionModel->select(newIdx, + QItemSelectionModel::Clear + | QItemSelectionModel::SelectCurrent + | QItemSelectionModel::Rows); +} + +void ProfileOptionsPage::removeProfile() +{ + Profile *p = m_model->profile(currentIndex()); + if (!p) + return; + m_model->markForRemoval(p); +} + +void ProfileOptionsPage::makeDefaultProfile() +{ + m_model->setDefaultProfile(currentIndex()); + updateState(); +} + +void ProfileOptionsPage::updateState() +{ + if (!m_profilesView) + return; + + bool canCopy = false; + bool canDelete = false; + bool canMakeDefault = false; + QModelIndex index = currentIndex(); + Profile *p = m_model->profile(index); + if (p) { + canCopy = p->isValid(); + canDelete = !p->isAutoDetected(); + canMakeDefault = !m_model->isDefaultProfile(index); + } + + m_cloneButton->setEnabled(canCopy); + m_delButton->setEnabled(canDelete); + m_makeDefaultButton->setEnabled(canMakeDefault); +} + +QModelIndex ProfileOptionsPage::currentIndex() const +{ + if (!m_selectionModel) + return QModelIndex(); + + QModelIndexList idxs = m_selectionModel->selectedRows(); + if (idxs.count() != 1) + return QModelIndex(); + return idxs.at(0); +} + +} // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/profileoptionspage.h b/src/plugins/projectexplorer/profileoptionspage.h new file mode 100644 index 0000000000..ec60543cc4 --- /dev/null +++ b/src/plugins/projectexplorer/profileoptionspage.h @@ -0,0 +1,104 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. +** +**************************************************************************/ + +#ifndef PROFILEOPTIONSPAGE_H +#define PROFILEOPTIONSPAGE_H + +#include "projectexplorer_export.h" + +#include <coreplugin/dialogs/ioptionspage.h> + +#include <QModelIndex> + +QT_BEGIN_NAMESPACE +class QItemSelectionModel; +class QTreeView; +class QPushButton; +QT_END_NAMESPACE + +namespace ProjectExplorer { + +namespace Internal { class ProfileModel; } + +class Profile; +class ProfileConfigWidget; +class ProfileFactory; +class ProfileManager; + +// -------------------------------------------------------------------------- +// ProfileOptionsPage: +// -------------------------------------------------------------------------- + +class PROJECTEXPLORER_EXPORT ProfileOptionsPage : public Core::IOptionsPage +{ + Q_OBJECT + +public: + ProfileOptionsPage(); + + QWidget *createPage(QWidget *parent); + void apply(); + void finish(); + bool matches(const QString &) const; + + void showProfile(Profile *p); + +private slots: + void profileSelectionChanged(); + void addNewProfile(); + void cloneProfile(); + void removeProfile(); + void makeDefaultProfile(); + void updateState(); + +private: + QModelIndex currentIndex() const; + + QTreeView *m_profilesView; + QPushButton *m_addButton; + QPushButton *m_cloneButton; + QPushButton *m_delButton; + QPushButton *m_makeDefaultButton; + + QWidget *m_configWidget; + QString m_searchKeywords; + + Internal::ProfileModel *m_model; + QItemSelectionModel *m_selectionModel; + ProfileConfigWidget *m_currentWidget; + + Profile *m_toShow; +}; + +} // namespace ProjectExplorer + +#endif // PROFILEOPTIONSPAGE_H diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index 2f7641ec83..c2ef837aa4 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -32,11 +32,14 @@ #include "project.h" +#include "buildconfiguration.h" +#include "deployconfiguration.h" #include "editorconfiguration.h" #include "environment.h" #include "projectexplorer.h" #include "projectexplorerconstants.h" #include "projectnodes.h" +#include "runconfiguration.h" #include "target.h" #include "settingsaccessor.h" @@ -44,6 +47,8 @@ #include <coreplugin/icontext.h> #include <extensionsystem/pluginmanager.h> #include <projectexplorer/buildmanager.h> +#include <projectexplorer/profile.h> +#include <projectexplorer/profilemanager.h> #include <limits> #include <utils/qtcassert.h> @@ -112,7 +117,7 @@ Project::~Project() bool Project::hasActiveBuildSettings() const { - return activeTarget() && activeTarget()->buildConfigurationFactory(); + return activeTarget() && IBuildConfigurationFactory::find(activeTarget()); } QString Project::makeUnique(const QString &preferredName, const QStringList &usedNames) @@ -143,7 +148,7 @@ void Project::changeBuildConfigurationEnabled() void Project::addTarget(Target *t) { QTC_ASSERT(t && !d->m_targets.contains(t), return); - QTC_ASSERT(!target(t->id()), return); + QTC_ASSERT(!target(t->profile()), return); Q_ASSERT(t->project() == this); // Check that we don't have a configuration with the same displayName @@ -160,6 +165,10 @@ void Project::addTarget(Target *t) SLOT(changeEnvironment())); connect(t, SIGNAL(buildConfigurationEnabledChanged()), this, SLOT(changeBuildConfigurationEnabled())); + connect(t, SIGNAL(requestBuildSystemEvaluation()), + this, SLOT(triggerBuildSystemEvaluation())); + connect(t, SIGNAL(buildDirectoryChanged()), + this, SLOT(onBuildDirectoryChanged())); emit addedTarget(t); // check activeTarget: @@ -216,7 +225,7 @@ void Project::setActiveTarget(Target *target) } } -Target *Project::target(Core::Id id) const +Target *Project::target(const Core::Id id) const { foreach (Target * target, d->m_targets) { if (target->id() == id) @@ -225,6 +234,55 @@ Target *Project::target(Core::Id id) const return 0; } +Target *Project::target(Profile *p) const +{ + foreach (Target *target, d->m_targets) { + if (target->profile() == p) + return target; + } + return 0; +} + +bool Project::supportsProfile(Profile *p) const +{ + Q_UNUSED(p); + return true; +} + +Target *Project::createTarget(Profile *p) +{ + if (target(p)) + return 0; + + Target *t = new Target(this, p); + t->createDefaultSetup(); + + return t; +} + +Target *Project::restoreTarget(const QVariantMap &data) +{ + Core::Id id = idFromMap(data); + if (target(id)) { + qWarning("Warning: Duplicated target id found, not restoring second target with id '%s'. Continuing.", + qPrintable(id.toString())); + return 0; + } + + Profile *p = ProfileManager::instance()->find(id); + if (!p) { + qWarning("Warning: No profile '%s' found. Continuing.", qPrintable(id.toString())); + return 0; + } + + Target *t = new Target(this, p); + if (!t->fromMap(data)) { + delete t; + return 0; + } + return t; +} + void Project::saveSettings() { emit aboutToSaveSettings(); @@ -314,32 +372,15 @@ bool Project::fromMap(const QVariantMap &map) } QVariantMap targetMap = map.value(key).toMap(); - QList<ITargetFactory *> factories = - ExtensionSystem::PluginManager::getObjects<ITargetFactory>(); - - Target *t = 0; + Target *t = restoreTarget(targetMap); + if (!t) + continue; - Core::Id id = idFromMap(targetMap); - if (target(id)) { - qWarning("Warning: Duplicated target id found, not restoring second target with id '%s'. Continuing.", - qPrintable(id.toString())); - } else { - foreach (ITargetFactory *factory, factories) { - if (factory->canRestore(this, targetMap)) { - t = factory->restore(this, targetMap); - break; - } - } - - if (!t) { - qWarning("Warning: Unable to restore target '%s'. Continuing.", qPrintable(id.toString())); - continue; - } - addTarget(t); - if (i == active) - setActiveTarget(t); - } + addTarget(t); + if (i == active) + setActiveTarget(t); } + return true; } @@ -363,6 +404,9 @@ void Project::setProjectLanguage(Core::Context language) d->m_projectLanguage = language; } +void Project::evaluateBuildSystem() +{ buildSystemEvaluationFinished(true); } + Core::Context Project::projectContext() const { return d->m_projectContext; @@ -380,7 +424,10 @@ QVariant Project::namedSettings(const QString &name) const void Project::setNamedSettings(const QString &name, QVariant &value) { - d->m_pluginSettings.insert(name, value); + if (value.isNull()) + d->m_pluginSettings.remove(name); + else + d->m_pluginSettings.insert(name, value); } bool Project::needsConfiguration() const @@ -393,4 +440,39 @@ void Project::configureAsExampleProject(const QStringList &platforms) Q_UNUSED(platforms); } +void Project::triggerBuildSystemEvaluation() +{ + Target *target = qobject_cast<Target *>(sender()); + if (target && target != activeTarget()) + return; + + evaluateBuildSystem(); +} + +void Project::buildSystemEvaluationFinished(bool success) +{ + if (!success) + return; + + // Create new run configurations: + foreach (Target *t, targets()) + t->updateDefaultRunConfigurations(); + + emit buildSystemEvaluated(); +} + +void Project::onBuildDirectoryInitialized() +{ + Target *target = qobject_cast<Target *>(sender()); + if (target && target == activeTarget()) + emit buildDirectoryInitialized(); +} + +void Project::onBuildDirectoryChanged() +{ + Target *target = qobject_cast<Target *>(sender()); + if (target && target == activeTarget()) + emit buildDirectoryChanged(); +} + } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/project.h b/src/plugins/projectexplorer/project.h index 49d0aec07b..20a5f58038 100644 --- a/src/plugins/projectexplorer/project.h +++ b/src/plugins/projectexplorer/project.h @@ -52,6 +52,7 @@ class BuildConfigWidget; class IProjectManager; class EditorConfiguration; class ProjectNode; +class Profile; class Target; class ProjectPrivate; @@ -89,7 +90,12 @@ public: // Note: activeTarget can be 0 (if no targets are defined). Target *activeTarget() const; void setActiveTarget(Target *target); - Target *target(Core::Id id) const; + Target *target(const Core::Id id) const; + Target *target(Profile *p) const; + virtual bool supportsProfile(Profile *p) const; + + Target *createTarget(Profile *p); + Target *restoreTarget(const QVariantMap &data); void saveSettings(); bool restoreSettings(); @@ -120,6 +126,12 @@ public: virtual bool needsConfiguration() const; virtual void configureAsExampleProject(const QStringList &platforms); +public slots: + void triggerBuildSystemEvaluation(); + +protected slots: + void buildSystemEvaluationFinished(bool success); + signals: void displayNameChanged(); void fileListChanged(); @@ -133,6 +145,11 @@ signals: void environmentChanged(); void buildConfigurationEnabledChanged(); + // The build directory of the current target/build configuration was successfully + // initialized (or configured). + void buildDirectoryInitialized(); + void buildDirectoryChanged(); + void buildSystemEvaluated(); void settingsLoaded(); void aboutToSaveSettings(); @@ -143,9 +160,18 @@ protected: virtual void setProjectContext(Core::Context context); virtual void setProjectLanguage(Core::Context language); + // Implement this to (re-)evaluate the build system of the project. + // + // This method is triggered by one of its active children (active*Configuration + // of the activeTarget) whenever some settings that has influence on the build + // system parsing is changed. + virtual void evaluateBuildSystem(); + private slots: void changeEnvironment(); void changeBuildConfigurationEnabled(); + void onBuildDirectoryInitialized(); + void onBuildDirectoryChanged(); private: ProjectPrivate *d; diff --git a/src/plugins/projectexplorer/projectconfiguration.cpp b/src/plugins/projectexplorer/projectconfiguration.cpp index 78b3a05a25..bdb4718db7 100644 --- a/src/plugins/projectexplorer/projectconfiguration.cpp +++ b/src/plugins/projectexplorer/projectconfiguration.cpp @@ -41,7 +41,7 @@ const char DEFAULT_DISPLAY_NAME_KEY[] = "ProjectExplorer.ProjectConfiguration.De ProjectConfiguration::ProjectConfiguration(QObject *parent, const Core::Id &id) : QObject(parent), m_id(id) -{ } +{ setObjectName(id.toString()); } ProjectConfiguration::ProjectConfiguration(QObject *parent, const ProjectConfiguration *source) : QObject(parent), diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 8d9ed394b4..dbc0fd66cb 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -37,6 +37,8 @@ #include "gcctoolchainfactories.h" #include "project.h" #include "projectexplorersettings.h" +#include "profilemanager.h" +#include "profileoptionspage.h" #include "target.h" #include "targetsettingspanel.h" #include "toolchainmanager.h" @@ -63,6 +65,7 @@ #include "processstep.h" #include "projectexplorerconstants.h" #include "customwizard.h" +#include "profileinformation.h" #include "projectfilewizardextension.h" #include "projecttreewidget.h" #include "projectwindow.h" @@ -247,6 +250,8 @@ struct ProjectExplorerPluginPrivate { Core::IMode *m_projectsMode; TaskHub *m_taskHub; + ProfileManager *m_profileManager; + ToolChainManager *m_toolChainManager; bool m_shuttingDown; }; @@ -256,6 +261,8 @@ ProjectExplorerPluginPrivate::ProjectExplorerPluginPrivate() : m_delayedRunConfiguration(0), m_runMode(NoRunMode), m_projectsMode(0), + m_profileManager(0), + m_toolChainManager(0), m_shuttingDown(false) { } @@ -295,6 +302,10 @@ ProjectExplorerPlugin::~ProjectExplorerPlugin() removeObject(d->m_welcomePage); delete d->m_welcomePage; removeObject(this); + // Force sequence of deletion: + delete d->m_profileManager; // remove all the profile informations + delete d->m_toolChainManager; + delete d; } @@ -334,8 +345,10 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er addAutoReleasedObject(new Internal::DesktopDeviceFactory); - new ToolChainManager(this); + d->m_profileManager = new ProfileManager; // register before ToolChainManager + d->m_toolChainManager = new ToolChainManager; addAutoReleasedObject(new Internal::ToolChainOptionsPage); + addAutoReleasedObject(new ProfileOptionsPage); d->m_taskHub = new TaskHub; addAutoReleasedObject(d->m_taskHub); @@ -1095,15 +1108,17 @@ void ProjectExplorerPlugin::extensionsInitialized() addAutoReleasedObject(pf); } d->m_buildManager->extensionsInitialized(); -} -bool ProjectExplorerPlugin::delayedInitialize() -{ + // Register ProfileInformation: + // Only do this now to make sure all device factories were properly initialized. + ProfileManager::instance()->registerProfileInformation(new SysRootProfileInformation); + ProfileManager::instance()->registerProfileInformation(new DeviceProfileInformation); + ProfileManager::instance()->registerProfileInformation(new DeviceTypeProfileInformation); + ProfileManager::instance()->registerProfileInformation(new ToolChainProfileInformation); + DeviceManager *dm = DeviceManager::instance(); if (dm->find(Core::Id(Constants::DESKTOP_DEVICE_ID)).isNull()) DeviceManager::instance()->addDevice(IDevice::Ptr(new DesktopDevice)); - - return true; } void ProjectExplorerPlugin::loadCustomWizards() @@ -2623,6 +2638,9 @@ void ProjectExplorerPlugin::addExistingFiles(const QStringList &filePaths) void ProjectExplorerPlugin::addExistingFiles(ProjectNode *projectNode, const QStringList &filePaths) { + if (!projectNode) // can happen when project is not yet parsed + return; + const QString dir = directoryFor(projectNode); QStringList fileNames = filePaths; QHash<FileType, QString> fileTypeToFiles; diff --git a/src/plugins/projectexplorer/projectexplorer.h b/src/plugins/projectexplorer/projectexplorer.h index 489db72b59..2037050f8d 100644 --- a/src/plugins/projectexplorer/projectexplorer.h +++ b/src/plugins/projectexplorer/projectexplorer.h @@ -105,7 +105,6 @@ public: //PluginInterface bool initialize(const QStringList &arguments, QString *errorMessage); void extensionsInitialized(); - bool delayedInitialize(); ShutdownFlag aboutToShutdown(); void setProjectExplorerSettings(const Internal::ProjectExplorerSettings &pes); diff --git a/src/plugins/projectexplorer/projectexplorer.pro b/src/plugins/projectexplorer/projectexplorer.pro index a9b64a52b8..9f8c632f53 100644 --- a/src/plugins/projectexplorer/projectexplorer.pro +++ b/src/plugins/projectexplorer/projectexplorer.pro @@ -20,6 +20,14 @@ HEADERS += projectexplorer.h \ gcctoolchain.h \ projectexplorer_export.h \ projectwindow.h \ + profile.h \ + profileconfigwidget.h \ + profileinformation.h \ + profileinformationconfigwidget.h \ + profilemanager.h \ + profilemanagerconfigwidget.h \ + profilemodel.h \ + profileoptionspage.h \ buildmanager.h \ buildsteplist.h \ compileoutputwindow.h \ @@ -122,6 +130,13 @@ SOURCES += projectexplorer.cpp \ clangparser.cpp \ gcctoolchain.cpp \ projectwindow.cpp \ + profile.cpp \ + profileinformation.cpp \ + profileinformationconfigwidget.cpp \ + profilemanager.cpp \ + profilemanagerconfigwidget.cpp \ + profilemodel.cpp \ + profileoptionspage.cpp \ buildmanager.cpp \ buildsteplist.cpp \ compileoutputwindow.cpp \ @@ -209,7 +224,6 @@ SOURCES += projectexplorer.cpp \ devicesupport/devicesettingspage.cpp FORMS += processstep.ui \ - toolchainoptionspage.ui \ editorsettingspropertiespage.ui \ sessiondialog.ui \ projectwizardpage.ui \ diff --git a/src/plugins/projectexplorer/projectexplorer.qbs b/src/plugins/projectexplorer/projectexplorer.qbs index a59814d774..f5684dc478 100644 --- a/src/plugins/projectexplorer/projectexplorer.qbs +++ b/src/plugins/projectexplorer/projectexplorer.qbs @@ -108,6 +108,21 @@ QtcPlugin { "processparameters.h", "processstep.cpp", "processstep.h", + "profile.cpp", + "profile.h", + "profileconfigwidget.h", + "profileinformation.cpp", + "profileinformation.h", + "profileinformationconfigwidget.cpp", + "profileinformationconfigwidget.h", + "profilemanager.cpp", + "profilemanager.h", + "profilemanagerconfigwidget.cpp", + "profilemanagerconfigwidget.h", + "profilemodel.cpp", + "profilemodel.h", + "profileoptionspage.cpp", + "profileoptionspage.h", "project.cpp", "project.h", "projectconfiguration.cpp", @@ -158,7 +173,6 @@ QtcPlugin { "toolchainconfigwidget.h", "toolchainmanager.h", "toolchainoptionspage.h", - "toolchainoptionspage.ui", "vcsannotatetaskhandler.h", "environmentitemswidget.h", "abi.cpp", diff --git a/src/plugins/projectexplorer/projectexplorerconstants.h b/src/plugins/projectexplorer/projectexplorerconstants.h index 04fcd6cf17..f7d984a515 100644 --- a/src/plugins/projectexplorer/projectexplorerconstants.h +++ b/src/plugins/projectexplorer/projectexplorerconstants.h @@ -182,6 +182,7 @@ const char PROJECTEXPLORER_SETTINGS_TR_CATEGORY[] = QT_TRANSLATE_NOOP("ProjectEx const char PROJECTEXPLORER_SETTINGS_CATEGORY_ICON[] = ":/core/images/category_buildrun.png"; const char PROJECTEXPLORER_SETTINGS_ID[] = "A.ProjectExplorer.ProjectExplorer"; const char TOOLCHAIN_SETTINGS_PAGE_ID[] = "M.ProjectExplorer.ToolChainOptions"; +const char PROFILE_SETTINGS_PAGE_ID[] = "D.ProjectExplorer.ProfileOptions"; // Device settings page const char DEVICE_SETTINGS_CATEGORY[] = "X.Devices"; diff --git a/src/plugins/projectexplorer/projectwindow.cpp b/src/plugins/projectexplorer/projectwindow.cpp index 9707b49e13..1ef5d92720 100644 --- a/src/plugins/projectexplorer/projectwindow.cpp +++ b/src/plugins/projectexplorer/projectwindow.cpp @@ -34,6 +34,7 @@ #include "doubletabwidget.h" +#include "profilemanager.h" #include "project.h" #include "projectexplorer.h" #include "projectexplorerconstants.h" @@ -128,7 +129,7 @@ PanelsWidget::PanelsWidget(QWidget *parent) : // side of the screen. m_root->setFixedWidth(900); m_root->setContentsMargins(0, 0, 40, 0); - + QPalette pal = m_root->palette(); QColor background = Utils::StyleHelper::mergedColors( palette().window().color(), Qt::white, 85); @@ -262,9 +263,7 @@ ProjectWindow::~ProjectWindow() void ProjectWindow::extensionsInitialized() { - foreach (ITargetFactory *fac, ExtensionSystem::PluginManager::getObjects<ITargetFactory>()) - connect(fac, SIGNAL(canCreateTargetIdsChanged()), - this, SLOT(targetFactoriesChanged())); + connect(ProfileManager::instance(), SIGNAL(profilesChanged()), this, SLOT(handleProfilesChanges())); QList<IProjectPanelFactory *> list = ExtensionSystem::PluginManager::getObjects<IProjectPanelFactory>(); qSort(list.begin(), list.end(), &IPanelFactory::prioritySort); @@ -286,7 +285,7 @@ void ProjectWindow::projectUpdated(Project *p) m_tabWidget->setCurrentIndex(index); } -void ProjectWindow::targetFactoriesChanged() +void ProjectWindow::handleProfilesChanges() { bool changed = false; int index = m_tabWidget->currentIndex(); @@ -309,13 +308,12 @@ bool ProjectWindow::useTargetPage(ProjectExplorer::Project *project) if (project->targets().size() > 1) return true; int count = 0; - foreach (ITargetFactory *fac, ExtensionSystem::PluginManager::getObjects<ITargetFactory>()) { - foreach (Core::Id targetId, fac->supportedTargetIds()) { - if (fac->canCreate(project, targetId)) - ++count; - if (count > 1) - return true; - } + QList<Profile *> profiles = ProfileManager::instance()->profiles(); + foreach (Profile *p, profiles) { + if (project->supportsProfile(p)) + ++count; + if (count > 1) + return true; } return false; } diff --git a/src/plugins/projectexplorer/projectwindow.h b/src/plugins/projectexplorer/projectwindow.h index 1a15fad6af..5a5ec3385b 100644 --- a/src/plugins/projectexplorer/projectwindow.h +++ b/src/plugins/projectexplorer/projectwindow.h @@ -87,7 +87,7 @@ public slots: void projectUpdated(ProjectExplorer::Project *p); private slots: - void targetFactoriesChanged(); + void handleProfilesChanges(); void showProperties(int index, int subIndex); void registerProject(ProjectExplorer::Project*); void deregisterProject(ProjectExplorer::Project*); diff --git a/src/plugins/projectexplorer/runconfiguration.cpp b/src/plugins/projectexplorer/runconfiguration.cpp index d445dcb1ec..d4cada4b63 100644 --- a/src/plugins/projectexplorer/runconfiguration.cpp +++ b/src/plugins/projectexplorer/runconfiguration.cpp @@ -38,6 +38,7 @@ #include "abi.h" #include "buildconfiguration.h" #include "projectexplorerconstants.h" +#include "profileinformation.h" #include <extensionsystem/pluginmanager.h> #include <utils/qtcassert.h> @@ -66,91 +67,6 @@ const char USE_QML_DEBUGGER_AUTO_KEY[] = "RunConfiguration.UseQmlDebuggerAuto"; const char QML_DEBUG_SERVER_PORT_KEY[] = "RunConfiguration.QmlDebugServerPort"; const char USE_MULTIPROCESS_KEY[] = "RunConfiguration.UseMultiProcess"; -// Function objects: - -class RunConfigurationFactoryMatcher -{ -public: - RunConfigurationFactoryMatcher(Target * target) : m_target(target) - { } - - virtual ~RunConfigurationFactoryMatcher() { } - - virtual bool operator()(IRunConfigurationFactory *) const = 0; - - Target *target() const - { - return m_target; - } - -private: - Target *m_target; -}; - -class CreateMatcher : public RunConfigurationFactoryMatcher -{ -public: - CreateMatcher(Target *target, const Core::Id id) : - RunConfigurationFactoryMatcher(target), - m_id(id) - { } - - bool operator()(IRunConfigurationFactory *factory) const - { - return factory->canCreate(target(), m_id); - } - -private: - const Core::Id m_id; -}; - -class CloneMatcher : public RunConfigurationFactoryMatcher -{ -public: - CloneMatcher(Target *target, RunConfiguration *source) : - RunConfigurationFactoryMatcher(target), - m_source(source) - { } - - bool operator()(IRunConfigurationFactory *factory) const - { - return factory->canClone(target(), m_source); - } - -private: - RunConfiguration *m_source; -}; - -class RestoreMatcher : public RunConfigurationFactoryMatcher -{ -public: - RestoreMatcher(Target *target, const QVariantMap &map) : - RunConfigurationFactoryMatcher(target), - m_map(map) - { } - - bool operator()(IRunConfigurationFactory *factory) const - { - return factory->canRestore(target(), m_map); - } - -private: - QVariantMap m_map; -}; - -// Helper methods: - -IRunConfigurationFactory *findRunConfigurationFactory(RunConfigurationFactoryMatcher &matcher) -{ - QList<IRunConfigurationFactory *> factories - = ExtensionSystem::PluginManager::getObjects<IRunConfigurationFactory>(); - foreach (IRunConfigurationFactory *factory, factories) { - if (matcher(factory)) - return factory; - } - return 0; -} - } // namespace /*! @@ -404,6 +320,11 @@ QString RunConfiguration::disabledReason() const return QString(); } +bool RunConfiguration::isConfigured() const +{ + return true; +} + /*! \fn virtual QWidget *ProjectExplorer::RunConfiguration::createConfigurationWidget() @@ -439,7 +360,7 @@ ProjectExplorer::Abi RunConfiguration::abi() const BuildConfiguration *bc = target()->activeBuildConfiguration(); if (!bc) return Abi::hostAbi(); - ToolChain *tc = bc->toolChain(); + ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(target()->profile()); if (!tc) return Abi::hostAbi(); return tc->targetAbi(); @@ -516,22 +437,27 @@ IRunConfigurationFactory::~IRunConfigurationFactory() { } -IRunConfigurationFactory *IRunConfigurationFactory::createFactory(Target *parent, const Core::Id id) +IRunConfigurationFactory *IRunConfigurationFactory::find(Target *parent, const QVariantMap &map) { - CreateMatcher matcher(parent, id); - return findRunConfigurationFactory(matcher); -} - -IRunConfigurationFactory *IRunConfigurationFactory::cloneFactory(Target *parent, RunConfiguration *source) -{ - CloneMatcher matcher(parent, source); - return findRunConfigurationFactory(matcher); + QList<IRunConfigurationFactory *> factories + = ExtensionSystem::PluginManager::instance()->getObjects<IRunConfigurationFactory>(); + foreach (IRunConfigurationFactory *factory, factories) { + if (factory->canRestore(parent, map)) + return factory; + } + return 0; } -IRunConfigurationFactory *IRunConfigurationFactory::restoreFactory(Target *parent, const QVariantMap &map) +QList<IRunConfigurationFactory *> IRunConfigurationFactory::find(Target *parent) { - RestoreMatcher matcher(parent, map); - return findRunConfigurationFactory(matcher); + QList<IRunConfigurationFactory *> factories + = ExtensionSystem::PluginManager::instance()->getObjects<IRunConfigurationFactory>(); + QList<IRunConfigurationFactory *> result; + foreach (IRunConfigurationFactory *factory, factories) { + if (!factory->availableCreationIds(parent).isEmpty()) + result << factory; + } + return result; } /*! diff --git a/src/plugins/projectexplorer/runconfiguration.h b/src/plugins/projectexplorer/runconfiguration.h index 78a523e4b9..4d145370b7 100644 --- a/src/plugins/projectexplorer/runconfiguration.h +++ b/src/plugins/projectexplorer/runconfiguration.h @@ -147,18 +147,19 @@ class PROJECTEXPLORER_EXPORT RunConfiguration : public ProjectConfiguration Q_OBJECT public: - virtual ~RunConfiguration(); + ~RunConfiguration(); virtual bool isEnabled() const; virtual QString disabledReason() const; virtual QWidget *createConfigurationWidget() = 0; + virtual bool isConfigured() const; Target *target() const; virtual Utils::OutputFormatter *createOutputFormatter() const; - virtual bool fromMap(const QVariantMap &map); - virtual QVariantMap toMap() const; + bool fromMap(const QVariantMap &map); + QVariantMap toMap() const; DebuggerRunConfigurationAspect *debuggerAspect() const { return m_debuggerAspect; } @@ -212,9 +213,8 @@ public: virtual bool canClone(Target *parent, RunConfiguration *product) const = 0; virtual RunConfiguration *clone(Target *parent, RunConfiguration *product) = 0; - static IRunConfigurationFactory *createFactory(Target *parent, const Core::Id id); - static IRunConfigurationFactory *cloneFactory(Target *parent, RunConfiguration *source); - static IRunConfigurationFactory *restoreFactory(Target *parent, const QVariantMap &map); + static IRunConfigurationFactory *find(Target *parent, const QVariantMap &map); + static QList<IRunConfigurationFactory *> find(Target *parent); signals: void availableCreationIdsChanged(); diff --git a/src/plugins/projectexplorer/runconfigurationmodel.cpp b/src/plugins/projectexplorer/runconfigurationmodel.cpp index 66fc77ec7d..e047451d72 100644 --- a/src/plugins/projectexplorer/runconfigurationmodel.cpp +++ b/src/plugins/projectexplorer/runconfigurationmodel.cpp @@ -182,6 +182,9 @@ void RunConfigurationModel::addedRunConfiguration(ProjectExplorer::RunConfigurat void RunConfigurationModel::removedRunConfiguration(ProjectExplorer::RunConfiguration *rc) { int i = m_runConfigurations.indexOf(rc); + if (i < 0) + return; + beginRemoveRows(QModelIndex(), i, i); m_runConfigurations.removeAt(i); endRemoveRows(); diff --git a/src/plugins/projectexplorer/runsettingspropertiespage.cpp b/src/plugins/projectexplorer/runsettingspropertiespage.cpp index d0497bfcbf..b9c7b8b4c3 100644 --- a/src/plugins/projectexplorer/runsettingspropertiespage.cpp +++ b/src/plugins/projectexplorer/runsettingspropertiespage.cpp @@ -292,6 +292,7 @@ void RunSettingsWidget::addRunConfiguration() RunConfiguration *newRC = fai.factory->create(m_target, fai.id); if (!newRC) return; + QTC_CHECK(newRC->id() == fai.id); m_target->addRunConfiguration(newRC); m_target->setActiveRunConfiguration(newRC); m_removeRunToolButton->setEnabled(m_target->runConfigurations().size() > 1); @@ -370,9 +371,12 @@ void RunSettingsWidget::currentDeployConfigurationChanged(int index) void RunSettingsWidget::aboutToShowDeployMenu() { m_addDeployMenu->clear(); - QList<Core::Id> ids = m_target->availableDeployConfigurationIds(); + DeployConfigurationFactory *factory = DeployConfigurationFactory::find(m_target); + if (!factory) + return; + QList<Core::Id> ids = factory->availableCreationIds(m_target); foreach (Core::Id id, ids) { - QAction *action = m_addDeployMenu->addAction(m_target->displayNameForDeployConfigurationId(id)); + QAction *action = m_addDeployMenu->addAction(factory->displayNameForId(id)); action->setData(QVariant::fromValue(id)); connect(action, SIGNAL(triggered()), this, SLOT(addDeployConfiguration())); @@ -385,9 +389,18 @@ void RunSettingsWidget::addDeployConfiguration() if (!act) return; Core::Id id = act->data().value<Core::Id>(); - DeployConfiguration *newDc = m_target->createDeployConfiguration(id); + DeployConfigurationFactory *factory = DeployConfigurationFactory::find(m_target); + if (!factory) + return; + DeployConfiguration *newDc = 0; + foreach (Core::Id id, factory->availableCreationIds(m_target)) { + if (!factory->canCreate(m_target, id)) + continue; + newDc = factory->create(m_target, id); + } if (!newDc) return; + QTC_CHECK(!newDc || newDc->id() == id); m_target->addDeployConfiguration(newDc); m_target->setActiveDeployConfiguration(newDc); m_removeDeployToolButton->setEnabled(m_target->deployConfigurations().size() > 1); diff --git a/src/plugins/projectexplorer/settingsaccessor.cpp b/src/plugins/projectexplorer/settingsaccessor.cpp index d19eadf5f8..f3330fbdde 100644 --- a/src/plugins/projectexplorer/settingsaccessor.cpp +++ b/src/plugins/projectexplorer/settingsaccessor.cpp @@ -38,9 +38,12 @@ #include "projectexplorersettings.h" #include "projectexplorerconstants.h" #include "target.h" +#include "profile.h" +#include "profilemanager.h" #include <coreplugin/icore.h> #include <coreplugin/idocument.h> +#include <extensionsystem/pluginmanager.h> #include <utils/qtcassert.h> #include <utils/qtcprocess.h> #include <utils/persistentsettings.h> @@ -341,6 +344,52 @@ public: QVariantMap update(Project *project, const QVariantMap &map); }; +// Version 10 introduces disabling buildsteps, and handles upgrading custom process steps +class Version11Handler : public UserFileVersionHandler +{ +public: + Version11Handler(); + ~Version11Handler(); + + int userFileVersion() const + { + return 11; + } + + QString displayUserFileVersion() const + { + return QLatin1String("2.6pre1"); + } + + QVariantMap update(Project *project, const QVariantMap &map); + +private: + void addBuildConfiguration(const QString &origTarget, Profile *p, + bool targetActive, + const QVariantMap &bc, bool bcActive); + void addOtherConfiguration(const QString &origTarget, + const QList<QVariantMap> &dcs, int activeDc, + const QList<QVariantMap> &rcs, int activeRc); + + void parseQtversionFile(); + void parseToolChainFile(); + + class ToolChainExtraData { + public: + explicit ToolChainExtraData(const QString &mks = QString(), const QString &d = QString()) : + m_mkspec(mks), m_debugger(d) + { } + + QString m_mkspec; + QString m_debugger; + }; + + QHash<QString, ToolChainExtraData> m_toolChainExtras; + QHash<int, QString> m_qtVersionExtras; + + QHash<Profile *, QVariantMap> m_targets; +}; + } // namespace // @@ -429,6 +478,7 @@ SettingsAccessor::SettingsAccessor() : addVersionHandler(new Version8Handler); addVersionHandler(new Version9Handler); addVersionHandler(new Version10Handler); + addVersionHandler(new Version11Handler); } SettingsAccessor::~SettingsAccessor() @@ -2277,3 +2327,287 @@ QVariantMap Version10Handler::update(Project *project, const QVariantMap &map) QLatin1String("ProjectExplorer.BuildStep.Enabled"))); return renameKeys(changes, QVariantMap(map)); } + +Version11Handler::Version11Handler() +{ + parseQtversionFile(); + parseToolChainFile(); +} + +Version11Handler::~Version11Handler() +{ + ProfileManager *pm = ProfileManager::instance(); + if (!pm) // Can happen during teardown! + return; + QList<Profile *> knownProfiles = pm->profiles(); + foreach (Profile *p, m_targets.keys()) { + if (!knownProfiles.contains(p)) + delete p; + } + m_targets.clear(); +} + +QVariantMap Version11Handler::update(Project *project, const QVariantMap &map) +{ + Q_UNUSED(project); + QVariantMap result; + ProfileManager *pm = ProfileManager::instance(); + + foreach (Profile *p, pm->profiles()) + m_targets.insert(p, QVariantMap()); + + QMapIterator<QString, QVariant> globalIt(map); + int activeTarget = map.value(QLatin1String("ProjectExplorer.Project.ActiveTarget"), 0).toInt(); + + while (globalIt.hasNext()) { + globalIt.next(); + const QString &globalKey = globalIt.key(); + // Keep everything but targets: + if (!globalKey.startsWith(QLatin1String("ProjectExplorer.Project.Target."))) { + result.insert(globalKey, globalIt.value()); + continue; + } + + // Update Targets: + const QVariantMap &target = globalIt.value().toMap(); + int targetPos = globalKey.mid(globalKey.lastIndexOf(QLatin1Char('.'))).toInt(); + + QVariantMap extraTargetData; + QList<QVariantMap> bcs; + int activeBc = -1; + QList<QVariantMap> dcs; + int activeDc = -1; + QList<QVariantMap> rcs; + int activeRc = -1; + + // Read old target: + QMapIterator<QString, QVariant> targetIt(target); + while (targetIt.hasNext()) { + targetIt.next(); + const QString &targetKey = targetIt.key(); + QList<QVariantMap> newTargets; + // BuildConfigurations: + if (targetKey == QLatin1String("ProjectExplorer.Target.ActiveBuildConfiguration")) + activeBc = targetIt.value().toInt(); + else if (targetKey == QLatin1String("ProjectExplorer.Target.BuildConfigurationCount")) + continue; + else if (targetKey.startsWith(QLatin1String("ProjectExplorer.Target.BuildConfiguration."))) + bcs.append(targetIt.value().toMap()); + else + + // DeployConfigurations: + if (targetKey == QLatin1String("ProjectExplorer.Target.ActiveDeployConfiguration")) + activeDc = targetIt.value().toInt(); + else if (targetKey == QLatin1String("ProjectExplorer.Target.DeployConfigurationCount")) + continue; + else if (targetKey.startsWith(QLatin1String("ProjectExplorer.Target.DeployConfiguration."))) + dcs.append(targetIt.value().toMap()); + else + + // RunConfigurations: + if (targetKey == QLatin1String("ProjectExplorer.Target.ActiveRunConfiguration")) + activeRc = targetIt.value().toInt(); + else if (targetKey == QLatin1String("ProjectExplorer.Target.RunConfigurationCount")) + continue; + else if (targetKey.startsWith(QLatin1String("ProjectExplorer.Target.RunConfiguration."))) + rcs.append(targetIt.value().toMap()); + + // Rest (the target's ProjectConfiguration QList<QVariantMap> newTargets; related settings only as there is nothing else) + else + extraTargetData.insert(targetKey, targetIt.value()); + } + + const QString targetId = extraTargetData.value(QLatin1String("ProjectExplorer.ProjectConfiguration.Id")).toString(); + // Check each BCs/DCs and create profiles as needed + int bcPos = 0; + foreach (const QVariantMap &bc, bcs) { + const QString targetId = extraTargetData.value(QLatin1String("ProjectExplorer.ProjectConfiguration.Id")).toString(); + Profile *tmp = new Profile; + tmp->setDisplayName(extraTargetData.value(QLatin1String("ProjectExplorer.ProjectConfiguration.DisplayName")).toString()); + + if (targetId == QLatin1String("Qt4ProjectManager.Target.AndroidDeviceTarget")) + tmp->setIconPath(QLatin1String(":/android/images/QtAndroid.png")); + else if (targetId == QLatin1String("Qt4ProjectManager.Target.HarmattanDeviceTarget")) + tmp->setIconPath(QLatin1String(":/projectexplorer/images/MaemoDevice.png")); + else if (targetId == QLatin1String("Qt4ProjectManager.Target.MaemoDeviceTarget")) + tmp->setIconPath(QLatin1String(":/projectexplorer/images/MaemoDevice.png")); + else if (targetId == QLatin1String("Qt4ProjectManager.Target.MeegoDeviceTarget")) + tmp->setIconPath(QLatin1String(":/projectexplorer/images/MaemoDevice.png")); + else if (targetId == QLatin1String("Qt4ProjectManager.Target.S60DeviceTarget")) + tmp->setIconPath(QLatin1String(":/projectexplorer/images/SymbianDevice.png")); + else if (targetId == QLatin1String("Qt4ProjectManager.Target.QtSimulatorTarget")) + tmp->setIconPath(QLatin1String(":/projectexplorer/images/SymbianEmulator.png")); + // use default desktop icon + + // Tool chain + QString tcId = bc.value(QLatin1String("CMakeProjectManager.CMakeBuildConfiguration.ToolChain")).toString(); + if (tcId.isEmpty()) + tcId = bc.value(QLatin1String("ProjectExplorer.BuildCOnfiguration.ToolChain")).toString(); + tmp->setValue(Core::Id("PE.Profile.ToolChain"), tcId); + + // QtVersion + int qtVersionId = bc.value(QLatin1String("Qt4ProjectManager.Qt4BuildConfiguration.QtVersionId"), -1).toInt(); + tmp->setValue(Core::Id("QtSupport.QtInformation"), qtVersionId); + + // Debugger + mkspec + if (m_toolChainExtras.contains(tcId)) { + tmp->setValue(Core::Id("Debugger.Information"), m_toolChainExtras.value(tcId).m_debugger); + tmp->setValue(Core::Id("QtPM4.mkSpecInformation"), m_toolChainExtras.value(tcId).m_mkspec); + } + + // SysRoot + if (m_qtVersionExtras.contains(qtVersionId)) + tmp->setValue(Core::Id("PE.Profile.SysRoot"), m_qtVersionExtras.value(qtVersionId)); + + // Device + if (dcs.isEmpty()) { + QByteArray devId; + if (targetId == QLatin1String("Qt4ProjectManager.Target.S60DeviceTarget")) + devId = QByteArray("Symbian Device"); + else + devId = QByteArray("Desktop Device"); + + tmp->setValue(Core::Id("PE.Profile.Device"), devId); + } else { + foreach (const QVariantMap &dc, dcs) { + QByteArray devId = dc.value(QLatin1String("Qt4ProjectManager.MaemoRunConfiguration.DeviceId")).toString().toUtf8(); + if (devId.isEmpty()) + devId = QByteArray("Desktop Device"); + tmp->setValue(Core::Id("PE.Profile.Device"), devId); + } // dcs + } + + addBuildConfiguration(targetId, tmp, activeTarget == targetPos, bc, bcPos == activeBc); + + ++bcPos; + } // bcs + + addOtherConfiguration(targetId, dcs, activeDc, rcs, activeRc); + } + + int newPos = 0; + QList<Profile *> knownProfiles = pm->profiles(); + // Generate new target data: + foreach (Profile *p, m_targets.keys()) { + QVariantMap data = m_targets.value(p); + if (data.isEmpty()) + continue; + + if (!knownProfiles.contains(p)) + pm->registerProfile(p); + + data.insert(QLatin1String("ProjectExplorer.ProjectConfiguration.Id"), p->id().name()); + data.insert(QLatin1String("ProjectExplorer.Target.Profile"), p->id().name()); + data.insert(QLatin1String("ProjectExplorer.ProjectConfiguration.DisplayName"), p->displayName()); + data.insert(QLatin1String("ProjectExplorer.ProjectConfiguration.DefaultDisplayName"), p->displayName()); + + result.insert(QString::fromLatin1("ProjectExplorer.Project.Target.") + QString::number(newPos), data); + if (data.value(QLatin1String("IsActive"), false).toBool()) + result.insert(QLatin1String("ProjectExplorer.Project.ActiveTarget"), newPos); + ++newPos; + } + result.insert(QLatin1String("ProjectExplorer.Project.TargetCount"), newPos); + + return result; +} + +void Version11Handler::addBuildConfiguration(const QString &origTarget, Profile *p, bool targetActive, + const QVariantMap &bc, bool bcActive) +{ + foreach (Profile *i, m_targets.keys()) { + if (*i == *p) { + delete p; + p = i; + } + } + QVariantMap merged = m_targets.value(p); + + int bcCount = merged.value(QLatin1String("ProjectExplorer.Target.BuildConfigurationCount"), 0).toInt(); + merged.insert(QString::fromLatin1("ProjectExplorer.Target.BuildConfiguration.") + QString::number(bcCount), bc); + if (bcActive) + merged.insert(QLatin1String("ProjectExplorer.Target.ActiveBuildConfiguration"), bcCount); + merged.insert(QLatin1String("ProjectExplorer.Target.BuildConfigurationCount"), bcCount + 1); + + if (targetActive && bcActive) + merged.insert(QLatin1String("Update.IsActive"), true); + merged.insert(QLatin1String("Update.OriginalTarget"), origTarget); + + m_targets.insert(p, merged); +} + +void Version11Handler::addOtherConfiguration(const QString &origTarget, const QList<QVariantMap> &dcs, int activeDc, const QList<QVariantMap> &rcs, int activeRc) +{ + foreach (Profile *tmp, m_targets.keys()) { + QVariantMap data = m_targets.value(tmp); + if (data.isEmpty()) + continue; + const QString dataTarget = data.value(QLatin1String("Update.OriginalTarget")).toString(); + if (dataTarget != origTarget) + continue; + + int dcCount = dcs.count(); + data.insert(QLatin1String("ProjectExplorer.Target.DeployConfigurationCount"), dcCount); + for (int i = 0; i < dcCount; ++i) + data.insert(QString::fromLatin1("ProjectExplorer.Target.DeployConfiguration.") + QString::number(i), dcs.at(i)); + data.insert(QLatin1String("ProjectExplorer.Target.ActiveDeployConfiguration"), activeDc); + + int rcCount = rcs.count(); + data.insert(QLatin1String("ProjectExplorer.Target.RunConfigurationCount"), rcCount); + for (int i = 0; i < rcCount; ++i) + data.insert(QString::fromLatin1("ProjectExplorer.Target.RunConfiguration.") + QString::number(i), rcs.at(i)); + data.insert(QLatin1String("ProjectExplorer.Target.ActiveRunConfiguration"), activeRc); + + m_targets.insert(tmp, data); + } +} + +void Version11Handler::parseQtversionFile() +{ + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + QFileInfo settingsLocation(pm->settings()->fileName()); + QString fileName = settingsLocation.absolutePath() + QLatin1String("/qtversion.xml"); + Utils::PersistentSettingsReader reader; + if (!reader.load(fileName)) + return; + QVariantMap data = reader.restoreValues(); + + int count = data.value(QLatin1String("QtVersion.Count"), 0).toInt(); + for (int i = 0; i < count; ++i) { + const QString key = QString::fromLatin1("QtVersion.") + QString::number(i); + if (!data.contains(key)) + continue; + + const QVariantMap qtversionMap = data.value(key).toMap(); + QString sysRoot = qtversionMap.value(QLatin1String("SystemRoot")).toString(); + int id = qtversionMap.value(QLatin1String("Id")).toInt(); + if (id > -1 && !sysRoot.isEmpty()) + m_qtVersionExtras.insert(id, sysRoot); + } +} + +void Version11Handler::parseToolChainFile() +{ + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + QFileInfo settingsLocation(pm->settings()->fileName()); + QString fileName = settingsLocation.absolutePath() + QLatin1String("/toolChains.xml"); + Utils::PersistentSettingsReader reader; + if (!reader.load(fileName)) + return; + QVariantMap data = reader.restoreValues(); + int count = data.value(QLatin1String("ToolChain.Count"), 0).toInt(); + for (int i = 0; i < count; ++i) { + const QString key = QString::fromLatin1("ToolChain.") + QString::number(i); + if (!data.contains(key)) + continue; + + const QVariantMap tcMap = data.value(key).toMap(); + QString id = tcMap.value(QLatin1String("ProjectExplorer.ToolChain.Id")).toString(); + if (id.isEmpty()) + continue; + QString mkspec = tcMap.value(QLatin1String("ProjectExplorer.ToolChain.MkSpecOverride")).toString(); + QString debugger = tcMap.value(QLatin1String("ProjectExplorer.GccToolChain.Debugger")).toString(); + + m_toolChainExtras.insert(id, ToolChainExtraData(mkspec, debugger)); + } +} + diff --git a/src/plugins/projectexplorer/target.cpp b/src/plugins/projectexplorer/target.cpp index a3a86af7a1..a35c37aca7 100644 --- a/src/plugins/projectexplorer/target.cpp +++ b/src/plugins/projectexplorer/target.cpp @@ -32,13 +32,14 @@ #include "target.h" -#include "toolchain.h" +#include "profile.h" +#include "profileinformation.h" +#include "profilemanager.h" #include "buildconfiguration.h" #include "deployconfiguration.h" #include "project.h" #include "projectexplorerconstants.h" #include "runconfiguration.h" -#include "toolchainmanager.h" #include <limits> #include <coreplugin/coreconstants.h> @@ -48,6 +49,7 @@ #include <projectexplorer/projectexplorer.h> #include <utils/qtcassert.h> +#include <QDebug> #include <QIcon> #include <QPainter> @@ -94,6 +96,8 @@ public: QPixmap m_connectedPixmap; QPixmap m_readyToUsePixmap; QPixmap m_disconnectedPixmap; + + Profile *m_profile; }; TargetPrivate::TargetPrivate() : @@ -103,7 +107,8 @@ TargetPrivate::TargetPrivate() : m_activeRunConfiguration(0), m_connectedPixmap(QLatin1String(":/projectexplorer/images/DeviceConnected.png")), m_readyToUsePixmap(QLatin1String(":/projectexplorer/images/DeviceReadyToUse.png")), - m_disconnectedPixmap(QLatin1String(":/projectexplorer/images/DeviceDisconnected.png")) + m_disconnectedPixmap(QLatin1String(":/projectexplorer/images/DeviceDisconnected.png")), + m_profile(0) { } @@ -113,16 +118,28 @@ QList<DeployConfigurationFactory *> TargetPrivate::deployFactories() const } -Target::Target(Project *project, const Core::Id id) : - ProjectConfiguration(project, id), +Target::Target(Project *project, Profile *p) : + ProjectConfiguration(project, p->id()), d(new TargetPrivate) { connect(DeviceManager::instance(), SIGNAL(updated()), this, SLOT(updateDeviceState())); + + d->m_profile = p; + + setDisplayName(d->m_profile->displayName()); + setIcon(d->m_profile->icon()); + + ProfileManager *pm = ProfileManager::instance(); + connect(pm, SIGNAL(profileUpdated(ProjectExplorer::Profile*)), + this, SLOT(handleProfileUpdates(ProjectExplorer::Profile*))); + connect(pm, SIGNAL(profileRemoved(ProjectExplorer::Profile*)), + this, SLOT(handleProfileRemoval(ProjectExplorer::Profile*))); } Target::~Target() { qDeleteAll(d->m_buildConfigurations); + qDeleteAll(d->m_deployConfigurations); qDeleteAll(d->m_runConfigurations); delete d; } @@ -155,19 +172,47 @@ void Target::changeRunConfigurationEnabled() emit runConfigurationEnabledChanged(); } +void Target::onBuildDirectoryChanged() +{ + BuildConfiguration *bc = qobject_cast<BuildConfiguration *>(sender()); + if (bc) + emit buildDirectoryChanged(); +} + +void Target::handleProfileUpdates(Profile *p) +{ + if (p != d->m_profile) + return; + + setDisplayName(p->displayName()); + setIcon(p->icon()); + updateDefaultDeployConfigurations(); + emit profileChanged(); +} + +void Target::handleProfileRemoval(Profile *p) +{ + if (p != d->m_profile) + return; + d->m_profile = 0; + project()->removeTarget(this); +} + Project *Target::project() const { return static_cast<Project *>(parent()); } +Profile *Target::profile() const +{ + return d->m_profile; +} + void Target::addBuildConfiguration(BuildConfiguration *configuration) { QTC_ASSERT(configuration && !d->m_buildConfigurations.contains(configuration), return); Q_ASSERT(configuration->target() == this); - if (!buildConfigurationFactory()) - return; - // Check that we don't have a configuration with the same displayName QString configurationDisplayName = configuration->displayName(); QStringList displayNames; @@ -175,18 +220,12 @@ void Target::addBuildConfiguration(BuildConfiguration *configuration) displayNames << bc->displayName(); configurationDisplayName = Project::makeUnique(configurationDisplayName, displayNames); if (configurationDisplayName != configuration->displayName()) { - if (configuration->usesDefaultDisplayName()) { + if (configuration->usesDefaultDisplayName()) configuration->setDefaultDisplayName(configurationDisplayName); - } else { + else configuration->setDisplayName(configurationDisplayName); - } } - // Make sure we have a sane tool chain if at all possible - if (!configuration->toolChain() - || !possibleToolChains(configuration).contains(configuration->toolChain())) - configuration->setToolChain(preferredToolChain(configuration)); - // add it d->m_buildConfigurations.push_back(configuration); @@ -194,9 +233,11 @@ void Target::addBuildConfiguration(BuildConfiguration *configuration) connect(configuration, SIGNAL(environmentChanged()), SLOT(changeEnvironment())); - connect(configuration, SIGNAL(enabledChanged()), this, SLOT(changeBuildConfigurationEnabled())); + connect(configuration, SIGNAL(requestBuildSystemEvaluation()), + this, SLOT(onRequestBuildSystemEvaluation())); + if (!activeBuildConfiguration()) setActiveBuildConfiguration(configuration); @@ -247,6 +288,8 @@ void Target::setActiveBuildConfiguration(BuildConfiguration *configuration) emit activeBuildConfigurationChanged(d->m_activeBuildConfiguration); emit environmentChanged(); emit buildConfigurationEnabledChanged(); + emit buildDirectoryChanged(); + emit requestBuildSystemEvaluation(); } } @@ -270,6 +313,7 @@ void Target::addDeployConfiguration(DeployConfiguration *dc) d->m_deployConfigurations.push_back(dc); connect(dc, SIGNAL(enabledChanged()), this, SLOT(changeDeployConfigurationEnabled())); + connect(dc, SIGNAL(requestBuildSystemEvaluation()), this, SLOT(onRequestBuildSystemEvaluation())); emit addedDeployConfiguration(dc); @@ -322,36 +366,11 @@ void Target::setActiveDeployConfiguration(DeployConfiguration *dc) d->m_activeDeployConfiguration = dc; emit activeDeployConfigurationChanged(d->m_activeDeployConfiguration); emit deployConfigurationEnabledChanged(); + emit requestBuildSystemEvaluation(); } updateDeviceState(); } -QList<Core::Id> Target::availableDeployConfigurationIds() -{ - QList<Core::Id> ids; - foreach (const DeployConfigurationFactory * const factory, d->deployFactories()) - ids << factory->availableCreationIds(this); - return ids; -} - -QString Target::displayNameForDeployConfigurationId(Core::Id &id) -{ - foreach (const DeployConfigurationFactory * const factory, d->deployFactories()) { - if (factory->availableCreationIds(this).contains(id)) - return factory->displayNameForId(id); - } - return QString(); -} - -DeployConfiguration *Target::createDeployConfiguration(Core::Id id) -{ - foreach (DeployConfigurationFactory * const factory, d->deployFactories()) { - if (factory->canCreate(this, id)) - return factory->create(this, id); - } - return 0; -} - QList<RunConfiguration *> Target::runConfigurations() const { return d->m_runConfigurations; @@ -410,6 +429,7 @@ void Target::setActiveRunConfiguration(RunConfiguration* configuration) d->m_activeRunConfiguration = configuration; emit activeRunConfigurationChanged(d->m_activeRunConfiguration); emit runConfigurationEnabledChanged(); + emit requestBuildSystemEvaluation(); } updateDeviceState(); } @@ -452,31 +472,14 @@ void Target::setToolTip(const QString &text) emit toolTipChanged(); } -QList<ToolChain *> Target::possibleToolChains(BuildConfiguration *) const -{ - QList<ToolChain *> tcList = ToolChainManager::instance()->toolChains(); - QList<ToolChain *> result; - foreach (ToolChain *tc, tcList) { - QList<Core::Id> restricted = tc->restrictedToTargets(); - if (restricted.isEmpty() || restricted.contains(id())) - result.append(tc); - } - return result; -} - -ToolChain *Target::preferredToolChain(BuildConfiguration *bc) const -{ - QList<ToolChain *> tcs = possibleToolChains(bc); - if (tcs.isEmpty()) - return 0; - return tcs.at(0); -} - QVariantMap Target::toMap() const { - const QList<BuildConfiguration *> bcs = buildConfigurations(); + if (!d->m_profile) // Profile was deleted, target is only around to be copied. + return QVariantMap(); QVariantMap map(ProjectConfiguration::toMap()); + + const QList<BuildConfiguration *> bcs = buildConfigurations(); map.insert(QLatin1String(ACTIVE_BC_KEY), bcs.indexOf(d->m_activeBuildConfiguration)); map.insert(QLatin1String(BC_COUNT_KEY), bcs.size()); for (int i = 0; i < bcs.size(); ++i) @@ -497,6 +500,153 @@ QVariantMap Target::toMap() const return map; } +void Target::createDefaultSetup() +{ + updateDefaultBuildConfigurations(); + updateDefaultDeployConfigurations(); + updateDefaultRunConfigurations(); +} + +void Target::updateDefaultBuildConfigurations() +{ + IBuildConfigurationFactory *bcFactory = IBuildConfigurationFactory::find(this); + if (!bcFactory) { + qWarning("No build configuration factory found for target id '%s'.", qPrintable(id().toString())); + return; + } + QList<Core::Id> bcIds = bcFactory->availableCreationIds(this); + foreach (Core::Id id, bcIds) { + if (!bcFactory->canCreate(this, id)) + continue; + BuildConfiguration *bc = bcFactory->create(this, id, tr("Default build")); + if (!bc) + continue; + QTC_CHECK(bc->id() == id); + addBuildConfiguration(bc); + } +} + +void Target::updateDefaultDeployConfigurations() +{ + DeployConfigurationFactory *dcFactory = DeployConfigurationFactory::find(this); + if (!dcFactory) { + qWarning("No deployment configuration factory found for target id '%s'.", qPrintable(id().toString())); + return; + } + QList<Core::Id> dcIds = dcFactory->availableCreationIds(this); + QList<DeployConfiguration *> dcList = deployConfigurations(); + + foreach (DeployConfiguration *dc, dcList) { + if (dcIds.contains(dc->id())) + dcIds.removeOne(dc->id()); + else + removeDeployConfiguration(dc); + } + + foreach (Core::Id id, dcIds) { + if (!dcFactory->canCreate(this, id)) + continue; + DeployConfiguration *dc = dcFactory->create(this, id); + if (dc) { + QTC_CHECK(dc->id() == id); + addDeployConfiguration(dc); + } + } +} + +void Target::updateDefaultRunConfigurations() +{ + QList<IRunConfigurationFactory *> rcFactories = IRunConfigurationFactory::find(this); + if (rcFactories.isEmpty()) { + qWarning("No run configuration factory found for target id '%s'.", qPrintable(id().toString())); + return; + } + + QList<RunConfiguration *> existingConfigured; // Existing configured RCs + QList<RunConfiguration *> existingUnconfigured; // Existing unconfigured RCs + QList<RunConfiguration *> newConfigured; // NEW configured Rcs + QList<RunConfiguration *> newUnconfigured; // NEW unconfigured RCs + + + // sort existing RCs into configured/unconfigured. + foreach (RunConfiguration *rc, runConfigurations()) { + if (rc->isConfigured()) + existingConfigured << rc; + else + existingUnconfigured << rc; + } + int configuredCount = existingConfigured.count(); + + // find all RC ids that can get created: + QList<Core::Id> factoryIds; + foreach (IRunConfigurationFactory *rcFactory, rcFactories) + factoryIds.append(rcFactory->availableCreationIds(this)); + + // Put outdated RCs into toRemove, do not bother with factories + // that produce already existing RCs + QList<RunConfiguration *> toRemove; + foreach (RunConfiguration *rc, existingConfigured) { + if (factoryIds.contains(rc->id())) + factoryIds.removeOne(rc->id()); // Already there + else + toRemove << rc; + } + configuredCount -= toRemove.count(); + + // Create new RCs and put them into newConfigured/newUnconfigured + foreach (Core::Id id, factoryIds) { + IRunConfigurationFactory *factory = 0; + foreach (IRunConfigurationFactory *i, rcFactories) { + if (i->canCreate(this, id)) { + factory = i; + break; + } + } + if (!factory) + continue; + + RunConfiguration *rc = factory->create(this, id); + if (!rc) + continue; + QTC_CHECK(rc->id() == id); + if (!rc->isConfigured()) + newUnconfigured << rc; + else + newConfigured << rc; + } + configuredCount += newConfigured.count(); + + // Decide what to do with the different categories: + bool removeExistingUnconfigured = false; + if (configuredCount > 0) { + // new non-Custom Executable RCs were added + removeExistingUnconfigured = true; + qDeleteAll(newUnconfigured); + newUnconfigured.clear(); + } else { + // no new RCs, use old or new CERCs? + if (!existingUnconfigured.isEmpty()) { + qDeleteAll(newUnconfigured); + newUnconfigured.clear(); + } + } + + // Do actual changes: + foreach (RunConfiguration *rc, toRemove) + removeRunConfiguration(rc); + + if (removeExistingUnconfigured) { + foreach (RunConfiguration *rc, existingUnconfigured) + removeRunConfiguration(rc); + existingUnconfigured.clear(); + } + + foreach (RunConfiguration *rc, newConfigured) + addRunConfiguration(rc); + foreach (RunConfiguration *rc, newUnconfigured) + addRunConfiguration(rc); +} + static QString formatToolTip(const IDevice::DeviceInfo &input) { QStringList lines; @@ -507,7 +657,7 @@ static QString formatToolTip(const IDevice::DeviceInfo &input) void Target::updateDeviceState() { - IDevice::ConstPtr current = currentDevice(); + IDevice::ConstPtr current = DeviceProfileInformation::device(profile()); QPixmap overlay; if (current.isNull()) { @@ -547,11 +697,6 @@ void Target::updateDeviceState() setToolTip(current.isNull() ? QString() : formatToolTip(current->deviceInformation())); } -ProjectExplorer::IDevice::ConstPtr Target::currentDevice() const -{ - return DeviceManager::instance()->find(ProjectExplorer::Constants::DESKTOP_DEVICE_ID); -} - void Target::setEnabled(bool enabled) { if (enabled == d->m_isEnabled) @@ -566,6 +711,10 @@ bool Target::fromMap(const QVariantMap &map) if (!ProjectConfiguration::fromMap(map)) return false; + d->m_profile = ProfileManager::instance()->find(id()); + if (!d->m_profile) + return false; + bool ok; int bcCount = map.value(QLatin1String(BC_COUNT_KEY), 0).toInt(&ok); if (!ok || bcCount < 0) @@ -580,14 +729,23 @@ bool Target::fromMap(const QVariantMap &map) const QString key = QString::fromLatin1(BC_KEY_PREFIX) + QString::number(i); if (!map.contains(key)) return false; - BuildConfiguration *bc = buildConfigurationFactory()->restore(this, map.value(key).toMap()); - if (!bc) + const QVariantMap valueMap = map.value(key).toMap(); + IBuildConfigurationFactory *factory = IBuildConfigurationFactory::find(this, valueMap); + if (!factory) { + qWarning("No factory found to restore build configuration!"); + continue; + } + BuildConfiguration *bc = factory->restore(this, valueMap); + if (!bc) { + qWarning("Failed '%s' to restore build configuration!", qPrintable(factory->objectName())); continue; + } + QTC_CHECK(bc->id() == ProjectExplorer::idFromMap(valueMap)); addBuildConfiguration(bc); if (i == activeConfiguration) setActiveBuildConfiguration(bc); } - if (buildConfigurations().isEmpty() && buildConfigurationFactory()) + if (buildConfigurations().isEmpty() && IBuildConfigurationFactory::find(this)) return false; int dcCount = map.value(QLatin1String(DC_COUNT_KEY), 0).toInt(&ok); @@ -603,16 +761,18 @@ bool Target::fromMap(const QVariantMap &map) const QString key = QString::fromLatin1(DC_KEY_PREFIX) + QString::number(i); if (!map.contains(key)) return false; - DeployConfiguration *dc = 0; - foreach (DeployConfigurationFactory * const factory, d->deployFactories()) { - QVariantMap valueMap = map.value(key).toMap(); - if (factory->canRestore(this, valueMap)) { - dc = factory->restore(this, valueMap); - break; - } + QVariantMap valueMap = map.value(key).toMap(); + DeployConfigurationFactory *factory = DeployConfigurationFactory::find(this, valueMap); + if (!factory) { + qWarning("No factory found to restore deployment configuration!"); + continue; } - if (!dc) + DeployConfiguration *dc = factory->restore(this, valueMap); + if (!dc) { + qWarning("Factory '%s' failed to restore deployment configuration!", qPrintable(factory->objectName())); continue; + } + QTC_CHECK(dc->id() == ProjectExplorer::idFromMap(valueMap)); addDeployConfiguration(dc); if (i == activeConfiguration) setActiveDeployConfiguration(dc); @@ -632,32 +792,40 @@ bool Target::fromMap(const QVariantMap &map) if (!map.contains(key)) return false; + // Ignore missing RCs: We will just populate them using the default ones. QVariantMap valueMap = map.value(key).toMap(); - IRunConfigurationFactory *factory = IRunConfigurationFactory::restoreFactory(this, valueMap); - if (!factory) - continue; // Skip RCs we do not know about.) - + IRunConfigurationFactory *factory = IRunConfigurationFactory::find(this, valueMap); + if (!factory || !factory->canRestore(this, valueMap)) + continue; RunConfiguration *rc = factory->restore(this, valueMap); if (!rc) continue; + QTC_CHECK(rc->id() == ProjectExplorer::idFromMap(valueMap)); addRunConfiguration(rc); if (i == activeConfiguration) setActiveRunConfiguration(rc); } - // Ignore missing RCs: We will just populate them using the default ones. return true; } -// ------------------------------------------------------------------------- -// ITargetFactory -// ------------------------------------------------------------------------- +void Target::onRequestBuildSystemEvaluation() +{ + ProjectConfiguration *config = qobject_cast<ProjectConfiguration *>(sender()); + if (!config) + return; + if (config == static_cast<ProjectConfiguration *>(activeBuildConfiguration()) + || config == static_cast<ProjectConfiguration *>(activeDeployConfiguration())) + emit requestBuildSystemEvaluation(); +} -ITargetFactory::ITargetFactory(QObject *parent) : - QObject(parent) +void Target::onBuildDirectoryInitialized() { - connect(ToolChainManager::instance(), SIGNAL(toolChainsChanged()), - this, SIGNAL(canCreateTargetIdsChanged())); + BuildConfiguration *bc = qobject_cast<BuildConfiguration *>(sender()); + if (!bc) + return; + if (bc == activeBuildConfiguration()) + emit buildDirectoryInitialized(); } } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/target.h b/src/plugins/projectexplorer/target.h index 1b05c9c07b..69e4fb4459 100644 --- a/src/plugins/projectexplorer/target.h +++ b/src/plugins/projectexplorer/target.h @@ -43,12 +43,12 @@ namespace Utils { class Environment; } namespace ProjectExplorer { class RunConfiguration; -class ToolChain; class BuildConfiguration; class DeployConfiguration; class IBuildConfigurationFactory; class DeployConfigurationFactory; class IRunConfigurationFactory; +class Profile; class Project; class BuildConfigWidget; @@ -59,11 +59,14 @@ class PROJECTEXPLORER_EXPORT Target : public ProjectConfiguration Q_OBJECT public: - virtual ~Target(); + Target(Project *parent, Profile *p); + ~Target(); - virtual BuildConfigWidget *createConfigWidget() = 0; Project *project() const; + // Profile: + Profile *profile() const; + // Build configuration void addBuildConfiguration(BuildConfiguration *configuration); bool removeBuildConfiguration(BuildConfiguration *configuration); @@ -72,8 +75,6 @@ public: BuildConfiguration *activeBuildConfiguration() const; void setActiveBuildConfiguration(BuildConfiguration *configuration); - virtual IBuildConfigurationFactory *buildConfigurationFactory() const = 0; - // DeployConfiguration void addDeployConfiguration(DeployConfiguration *dc); bool removeDeployConfiguration(DeployConfiguration *dc); @@ -82,10 +83,6 @@ public: DeployConfiguration *activeDeployConfiguration() const; void setActiveDeployConfiguration(DeployConfiguration *configuration); - QList<Core::Id> availableDeployConfigurationIds(); - QString displayNameForDeployConfigurationId(Core::Id &id); - DeployConfiguration *createDeployConfiguration(Core::Id id); - // Running QList<RunConfiguration *> runConfigurations() const; void addRunConfiguration(RunConfiguration *runConfiguration); @@ -108,10 +105,12 @@ public: QString toolTip() const; void setToolTip(const QString &text); - virtual QList<ToolChain *> possibleToolChains(BuildConfiguration *) const; - virtual ToolChain *preferredToolChain(BuildConfiguration *) const; + QVariantMap toMap() const; - virtual QVariantMap toMap() const; + void createDefaultSetup(); + void updateDefaultBuildConfigurations(); + void updateDefaultDeployConfigurations(); + void updateDefaultRunConfigurations(); signals: void targetEnabled(bool); @@ -119,6 +118,8 @@ signals: void overlayIconChanged(); void toolTipChanged(); + void profileChanged(); + // TODO clean up signal names // might be better to also have aboutToRemove signals void removedRunConfiguration(ProjectExplorer::RunConfiguration *); @@ -143,14 +144,23 @@ signals: void deployConfigurationEnabledChanged(); void runConfigurationEnabledChanged(); -protected: - Target(Project *parent, const Core::Id id); + /// Emitted whenever the project should (re-)evaluate the build system + void requestBuildSystemEvaluation(); + /// Emitted whenever the current build configuration has finished to initialize its build directory. + void buildDirectoryInitialized(); + /// Emitted whenever the current build configuartion changed or the build directory of the current + /// build configuration was changed. + void buildDirectoryChanged(); - virtual ProjectExplorer::IDevice::ConstPtr currentDevice() const; +public slots: + void onRequestBuildSystemEvaluation(); + void onBuildDirectoryInitialized(); + void onBuildDirectoryChanged(); +protected: void setEnabled(bool); - virtual bool fromMap(const QVariantMap &map); + bool fromMap(const QVariantMap &map); protected slots: void updateDeviceState(); @@ -161,31 +171,13 @@ private slots: void changeDeployConfigurationEnabled(); void changeRunConfigurationEnabled(); + void handleProfileUpdates(ProjectExplorer::Profile *p); + void handleProfileRemoval(ProjectExplorer::Profile *p); + private: TargetPrivate *d; -}; -class PROJECTEXPLORER_EXPORT ITargetFactory : - public QObject -{ - Q_OBJECT - -public: - explicit ITargetFactory(QObject *parent = 0); - - virtual QList<Core::Id> supportedTargetIds() const = 0; - virtual bool supportsTargetId(const Core::Id id) const = 0; - - // used to translate the types to names to display to the user - virtual QString displayNameForId(const Core::Id id) const = 0; - - virtual bool canCreate(Project *parent, const Core::Id id) const = 0; - virtual Target *create(Project *parent, const Core::Id id) = 0; - virtual bool canRestore(Project *parent, const QVariantMap &map) const = 0; - virtual Target *restore(Project *parent, const QVariantMap &map) = 0; - -signals: - void canCreateTargetIdsChanged(); + friend class Project; }; } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/targetselector.cpp b/src/plugins/projectexplorer/targetselector.cpp index 707160377d..20a3023187 100644 --- a/src/plugins/projectexplorer/targetselector.cpp +++ b/src/plugins/projectexplorer/targetselector.cpp @@ -80,6 +80,12 @@ void TargetSelector::insertTarget(int index, const QString &name) update(); } +void TargetSelector::renameTarget(int index, const QString &name) +{ + m_targets[index].name = name; + update(); +} + void TargetSelector::removeTarget(int index) { QTC_ASSERT(index >= 0 && index < m_targets.count(), return); diff --git a/src/plugins/projectexplorer/targetselector.h b/src/plugins/projectexplorer/targetselector.h index 6aaadf849b..752bb1c14e 100644 --- a/src/plugins/projectexplorer/targetselector.h +++ b/src/plugins/projectexplorer/targetselector.h @@ -70,6 +70,7 @@ public: public: void insertTarget(int index, const QString &name); + void renameTarget(int index, const QString &name); void removeTarget(int index); void setCurrentIndex(int index); void setCurrentSubIndex(int subindex); diff --git a/src/plugins/projectexplorer/targetsettingspanel.cpp b/src/plugins/projectexplorer/targetsettingspanel.cpp index a94c34fde4..3646d10fa1 100644 --- a/src/plugins/projectexplorer/targetsettingspanel.cpp +++ b/src/plugins/projectexplorer/targetsettingspanel.cpp @@ -41,7 +41,10 @@ #include <extensionsystem/pluginmanager.h> #include <projectexplorer/projectexplorer.h> +#include <projectexplorer/profile.h> +#include <projectexplorer/profilemanager.h> #include <projectexplorer/buildmanager.h> +#include <utils/qtcassert.h> #include <QCoreApplication> #include <QLabel> @@ -84,13 +87,8 @@ TargetSettingsPanelWidget::TargetSettingsPanelWidget(Project *project) : connect(m_project, SIGNAL(activeTargetChanged(ProjectExplorer::Target*)), this, SLOT(activeTargetChanged(ProjectExplorer::Target*))); - QList<ITargetFactory *> factories = - ExtensionSystem::PluginManager::getObjects<ITargetFactory>(); - - foreach (ITargetFactory *fac, factories) { - connect(fac, SIGNAL(canCreateTargetIdsChanged()), - this, SLOT(updateTargetAddAndRemoveButtons())); - } + connect(ProfileManager::instance(), SIGNAL(profilesChanged()), + this, SLOT(updateTargetAddAndRemoveButtons())); } TargetSettingsPanelWidget::~TargetSettingsPanelWidget() @@ -213,19 +211,10 @@ void TargetSettingsPanelWidget::currentTargetChanged(int targetIndex, int subInd void TargetSettingsPanelWidget::addTarget(QAction *action) { - Core::Id id = action->data().value<Core::Id>(); - Q_ASSERT(!m_project->target(id)); - QList<ITargetFactory *> factories = - ExtensionSystem::PluginManager::getObjects<ITargetFactory>(); - - Target *target = 0; - foreach (ITargetFactory *fac, factories) { - if (fac->canCreate(m_project, id)) { - target = fac->create(m_project, id); - break; - } - } + Profile *p = ProfileManager::instance()->find(action->data().value<Core::Id>()); + QTC_ASSERT(!m_project->target(p), return); + Target *target = m_project->createTarget(p); if (!target) return; m_project->addTarget(target); @@ -278,6 +267,7 @@ void TargetSettingsPanelWidget::targetAdded(ProjectExplorer::Target *target) } } + connect(target, SIGNAL(displayNameChanged()), this, SLOT(renameTarget())); updateTargetAddAndRemoveButtons(); } @@ -312,35 +302,42 @@ void TargetSettingsPanelWidget::updateTargetAddAndRemoveButtons() m_addMenu->clear(); - QList<ITargetFactory *> factories = - ExtensionSystem::PluginManager::getObjects<ITargetFactory>(); - - foreach (ITargetFactory *fac, factories) { - foreach (Core::Id id, fac->supportedTargetIds()) { - if (m_project->target(id)) - continue; - if (!fac->canCreate(m_project, id)) - continue; - QString displayName = fac->displayNameForId(id); - QAction *action = new QAction(displayName, m_addMenu); - action->setData(QVariant::fromValue(id)); - bool added = false; - foreach (QAction *existing, m_addMenu->actions()) { - if (existing->text() > action->text()) { - m_addMenu->insertAction(existing, action); - added = true; - } - } + foreach (Profile *p, ProfileManager::instance()->profiles()) { + if (m_project->target(p)) + continue; + if (!m_project->supportsProfile(p)) + continue; - if (!added) - m_addMenu->addAction(action); + QAction *action = new QAction(p->displayName(), m_addMenu); + action->setData(QVariant::fromValue(p->id())); + + bool inserted = false; + foreach (QAction *existing, m_addMenu->actions()) { + if (existing->text() > action->text()) { + m_addMenu->insertAction(existing, action); + inserted = true; + break; + } } + if (!inserted) + m_addMenu->addAction(action); } m_selector->setAddButtonEnabled(!m_addMenu->actions().isEmpty()); m_selector->setRemoveButtonEnabled(m_project->targets().count() > 1); } +void TargetSettingsPanelWidget::renameTarget() +{ + Target *t = qobject_cast<Target *>(sender()); + if (!t) + return; + const int pos = m_targets.indexOf(t); + if (pos < 0) + return; + m_selector->renameTarget(pos, t->displayName()); +} + int TargetSettingsPanelWidget::currentSubIndex() const { return m_selector->currentSubIndex(); diff --git a/src/plugins/projectexplorer/targetsettingspanel.h b/src/plugins/projectexplorer/targetsettingspanel.h index d95c358d1b..5f84c6fe22 100644 --- a/src/plugins/projectexplorer/targetsettingspanel.h +++ b/src/plugins/projectexplorer/targetsettingspanel.h @@ -71,6 +71,7 @@ private slots: void removedTarget(ProjectExplorer::Target *target); void activeTargetChanged(ProjectExplorer::Target *target); void updateTargetAddAndRemoveButtons(); + void renameTarget(); private: Target *m_currentTarget; diff --git a/src/plugins/projectexplorer/targetsettingswidget.cpp b/src/plugins/projectexplorer/targetsettingswidget.cpp index 18d9e06561..f8f8b3c835 100644 --- a/src/plugins/projectexplorer/targetsettingswidget.cpp +++ b/src/plugins/projectexplorer/targetsettingswidget.cpp @@ -78,6 +78,12 @@ void TargetSettingsWidget::insertTarget(int index, const QString &name) updateTargetSelector(); } +void TargetSettingsWidget::renameTarget(int index, const QString &name) +{ + m_targetSelector->renameTarget(index, name); + // geometry won't change, so no need to updateTargetSelector() +} + void TargetSettingsWidget::removeTarget(int index) { m_targetSelector->removeTarget(index); diff --git a/src/plugins/projectexplorer/targetsettingswidget.h b/src/plugins/projectexplorer/targetsettingswidget.h index dedede723f..ebc3c48dd7 100644 --- a/src/plugins/projectexplorer/targetsettingswidget.h +++ b/src/plugins/projectexplorer/targetsettingswidget.h @@ -65,6 +65,7 @@ public: public: void insertTarget(int index, const QString &name); + void renameTarget(int index, const QString &name); void removeTarget(int index); void setCurrentIndex(int index); void setCurrentSubIndex(int index); diff --git a/src/plugins/projectexplorer/toolchain.cpp b/src/plugins/projectexplorer/toolchain.cpp index 75eeb0baea..1c92f3c77b 100644 --- a/src/plugins/projectexplorer/toolchain.cpp +++ b/src/plugins/projectexplorer/toolchain.cpp @@ -32,6 +32,7 @@ #include "toolchain.h" +#include "abi.h" #include "toolchainmanager.h" #include <extensionsystem/pluginmanager.h> @@ -43,30 +44,6 @@ static const char ID_KEY[] = "ProjectExplorer.ToolChain.Id"; static const char DISPLAY_NAME_KEY[] = "ProjectExplorer.ToolChain.DisplayName"; static const char AUTODETECT_KEY[] = "ProjectExplorer.ToolChain.Autodetect"; -static const char MKSPEC_KEY[] = "ProjectExplorer.ToolChain.MkSpecOverride"; - -namespace { - -QString mkspecListToString(const QList<Utils::FileName> &specList) -{ - QStringList result; - foreach (const Utils::FileName &spec, specList) - result.append(spec.toString()); - return result.join(QChar::fromLatin1(';')); -} - -QList<Utils::FileName> mkspecListFromString(const QString &string) -{ - QList<Utils::FileName> result; - QStringList partList; - if (!string.isEmpty()) - partList = string.split(QLatin1Char(';')); - foreach (const QString &part, partList) - result.append(Utils::FileName::fromString(part)); - return result; -} - -} // namespace namespace ProjectExplorer { namespace Internal { @@ -94,7 +71,6 @@ public: QString m_id; bool m_autodetect; mutable QString m_displayName; - QList<Utils::FileName> m_mkspecList; }; } // namespace Internal @@ -150,31 +126,9 @@ QString ToolChain::id() const return d->m_id; } -/*! - \brief Returns a list of target ids that this tool chain is restricted to. - - An empty list is shows that the toolchain is compatible with all targets. -*/ - -QList<Core::Id> ToolChain::restrictedToTargets() const -{ - return QList<Core::Id>(); -} - -QList<Utils::FileName> ToolChain::mkspecList() const +Utils::FileName ToolChain::suggestedDebugger() { - if (d->m_mkspecList.isEmpty()) - return suggestedMkspecList(); - return d->m_mkspecList; -} - -void ToolChain::setMkspecList(const QList<Utils::FileName> &specList) -{ - QList<Utils::FileName> oldSpecList = mkspecList(); - d->m_mkspecList = specList; - - if (oldSpecList != mkspecList()) - toolChainUpdated(); + return ToolChainManager::instance()->defaultDebugger(targetAbi()); } bool ToolChain::canClone() const @@ -211,7 +165,6 @@ QVariantMap ToolChain::toMap() const result.insert(QLatin1String(ID_KEY), id()); result.insert(QLatin1String(DISPLAY_NAME_KEY), displayName()); result.insert(QLatin1String(AUTODETECT_KEY), isAutoDetected()); - result.insert(QLatin1String(MKSPEC_KEY), mkspecListToString(d->m_mkspecList)); return result; } @@ -241,7 +194,6 @@ bool ToolChain::fromMap(const QVariantMap &data) // make sure we have new style ids: d->m_id = data.value(QLatin1String(ID_KEY)).toString(); d->m_autodetect = data.value(QLatin1String(AUTODETECT_KEY), false).toBool(); - d->m_mkspecList = mkspecListFromString(data.value(QLatin1String(MKSPEC_KEY)).toString()); return true; } diff --git a/src/plugins/projectexplorer/toolchain.h b/src/plugins/projectexplorer/toolchain.h index 31211acc7d..1ce975d2c6 100644 --- a/src/plugins/projectexplorer/toolchain.h +++ b/src/plugins/projectexplorer/toolchain.h @@ -73,8 +73,9 @@ public: bool isAutoDetected() const; QString id() const; - // No need to implement this for new tool chains: - virtual QString legacyId() const { return QString(); } + + virtual QList<Utils::FileName> suggestedMkspecList() const { return QList<Utils::FileName>(); } + Utils::FileName suggestedDebugger(); virtual QString type() const = 0; virtual QString typeDisplayName() const = 0; @@ -82,8 +83,6 @@ public: virtual bool isValid() const = 0; - virtual QList<Core::Id> restrictedToTargets() const; - virtual QByteArray predefinedMacros(const QStringList &cxxflags) const = 0; enum CompilerFlags { @@ -95,12 +94,7 @@ public: virtual void addToEnvironment(Utils::Environment &env) const = 0; virtual QString makeCommand() const = 0; - QList<Utils::FileName> mkspecList() const; - void setMkspecList(const QList<Utils::FileName> &specList); - virtual QList<Utils::FileName> suggestedMkspecList() const { return QList<Utils::FileName>(); } - virtual Utils::FileName compilerCommand() const = 0; - virtual Utils::FileName debuggerCommand() const = 0; virtual QString defaultMakeTarget() const; virtual IOutputParser *outputParser() const = 0; diff --git a/src/plugins/projectexplorer/toolchainconfigwidget.cpp b/src/plugins/projectexplorer/toolchainconfigwidget.cpp index 3ad7e4da4c..93ad2f5d49 100644 --- a/src/plugins/projectexplorer/toolchainconfigwidget.cpp +++ b/src/plugins/projectexplorer/toolchainconfigwidget.cpp @@ -44,46 +44,6 @@ #include <QLabel> #include <QPushButton> -namespace { - -const char DEFAULT_MKSPEC[] = "default"; - -QString mkspecListToString(const QList<Utils::FileName> &specList) -{ - QStringList specStrings; - foreach (const Utils::FileName &spec, specList) { - if (spec.isEmpty()) - specStrings.append(QLatin1String(DEFAULT_MKSPEC)); - else - specStrings.append(spec.toUserOutput()); - } - QString specString = specStrings.join(QChar::fromAscii(';')); - if (specString.isEmpty()) - return QLatin1String(DEFAULT_MKSPEC); - return specString; -} - -QList<Utils::FileName> mkspecListFromString(const QString &specString) -{ - QStringList specList = specString.split(QLatin1Char(';')); - QList<Utils::FileName> result; - foreach (const QString &spec, specList) { - QString trimmed = spec.trimmed(); - if (trimmed == QLatin1String(DEFAULT_MKSPEC)) - result.append(Utils::FileName()); - else - result.append(Utils::FileName::fromUserInput(trimmed)); - } - - if (result.size() == 1 && result.at(0).isEmpty()) - return QList<Utils::FileName>(); - - return result; -} - - -} // namespace - namespace ProjectExplorer { namespace Internal { @@ -95,21 +55,13 @@ class ToolChainConfigWidgetPrivate { public: ToolChainConfigWidgetPrivate(ToolChain *tc) : - m_toolChain(tc), m_debuggerPathChooser(0), - m_mkspecLayout(0), m_mkspecEdit(0), m_mkspecResetButton(0), m_mkspecEdited(false), - m_errorLabel(0) + m_toolChain(tc), m_errorLabel(0) { QTC_CHECK(tc); } ToolChain *m_toolChain; - Utils::PathChooser *m_debuggerPathChooser; - QHBoxLayout *m_mkspecLayout; - QLineEdit *m_mkspecEdit; - QPushButton *m_mkspecResetButton; - bool m_mkspecEdited; QLabel *m_errorLabel; - QList<Utils::FileName> m_suggestedMkspec; }; } // namespace Internal @@ -134,132 +86,7 @@ ToolChain *ToolChainConfigWidget::toolChain() const } void ToolChainConfigWidget::makeReadOnly() -{ - if (d->m_debuggerPathChooser) - d->m_debuggerPathChooser->setEnabled(false); - if (d->m_mkspecEdit) - d->m_mkspecEdit->setEnabled(false); - if (d->m_mkspecResetButton) - d->m_mkspecResetButton->setEnabled(false); -} - -void ToolChainConfigWidget::emitDirty() -{ - if (d->m_mkspecEdit) - d->m_mkspecEdited = (mkspecListFromString(d->m_mkspecEdit->text()) != d->m_suggestedMkspec); - if (d->m_mkspecResetButton) - d->m_mkspecResetButton->setEnabled(d->m_mkspecEdited); - emit dirty(); -} - -void ToolChainConfigWidget::resetMkspecList() -{ - if (!d->m_mkspecEdit || !d->m_mkspecEdited) - return; - d->m_mkspecEdit->setText(mkspecListToString(d->m_suggestedMkspec)); - d->m_mkspecEdited = false; -} - -void ToolChainConfigWidget::addDebuggerCommandControls(QFormLayout *lt, - const QStringList &versionArguments) -{ - ensureDebuggerPathChooser(versionArguments); - lt->addRow(tr("&Debugger:"), d->m_debuggerPathChooser); -} - -void ToolChainConfigWidget::addDebuggerCommandControls(QGridLayout *lt, - int row, int column, - const QStringList &versionArguments) -{ - ensureDebuggerPathChooser(versionArguments); - QLabel *label = new QLabel(tr("&Debugger:")); - label->setBuddy(d->m_debuggerPathChooser); - lt->addWidget(label, row, column); - lt->addWidget(d->m_debuggerPathChooser, row, column + 1); -} - -void ToolChainConfigWidget::ensureDebuggerPathChooser(const QStringList &versionArguments) -{ - if (d->m_debuggerPathChooser) - return; - d->m_debuggerPathChooser = new Utils::PathChooser; - d->m_debuggerPathChooser->setExpectedKind(Utils::PathChooser::ExistingCommand); - d->m_debuggerPathChooser->setCommandVersionArguments(versionArguments); - connect(d->m_debuggerPathChooser, SIGNAL(changed(QString)), this, SLOT(emitDirty())); -} - -void ToolChainConfigWidget::addDebuggerAutoDetection(QObject *receiver, const char *autoDetectSlot) -{ - QTC_ASSERT(d->m_debuggerPathChooser, return); - d->m_debuggerPathChooser->addButton(tr("Autodetect"), receiver, autoDetectSlot); -} - -Utils::FileName ToolChainConfigWidget::debuggerCommand() const -{ - QTC_ASSERT(d->m_debuggerPathChooser, return Utils::FileName()); - return d->m_debuggerPathChooser->fileName(); -} - -void ToolChainConfigWidget::setDebuggerCommand(const Utils::FileName &debugger) -{ - QTC_ASSERT(d->m_debuggerPathChooser, return); - d->m_debuggerPathChooser->setFileName(debugger); -} - -void ToolChainConfigWidget::addMkspecControls(QFormLayout *lt) -{ - ensureMkspecEdit(); - lt->addRow(tr("mkspec:"), d->m_mkspecLayout); -} - -void ToolChainConfigWidget::addMkspecControls(QGridLayout *lt, int row, int column) -{ - ensureMkspecEdit(); - QLabel *label = new QLabel(tr("mkspec:")); - label->setBuddy(d->m_mkspecEdit); - lt->addWidget(label, row, column); - lt->addLayout(d->m_mkspecLayout, row, column + 1); -} - -void ToolChainConfigWidget::ensureMkspecEdit() -{ - if (d->m_mkspecEdit) - return; - - QTC_CHECK(!d->m_mkspecLayout); - QTC_CHECK(!d->m_mkspecResetButton); - - d->m_suggestedMkspec = d->m_toolChain->suggestedMkspecList(); - - d->m_mkspecLayout = new QHBoxLayout; - d->m_mkspecLayout->setMargin(0); - - d->m_mkspecEdit = new QLineEdit; - d->m_mkspecEdit->setWhatsThis(tr("All possible mkspecs separated by a semicolon (';').")); - d->m_mkspecResetButton = new QPushButton(tr("Reset")); - d->m_mkspecResetButton->setEnabled(d->m_mkspecEdited); - d->m_mkspecLayout->addWidget(d->m_mkspecEdit); - d->m_mkspecLayout->addWidget(d->m_mkspecResetButton); - - connect(d->m_mkspecEdit, SIGNAL(textChanged(QString)), this, SLOT(emitDirty())); - connect(d->m_mkspecResetButton, SIGNAL(clicked()), this, SLOT(resetMkspecList())); -} - -QList<Utils::FileName> ToolChainConfigWidget::mkspecList() const -{ - QTC_ASSERT(d->m_mkspecEdit, return QList<Utils::FileName>()); - - return mkspecListFromString(d->m_mkspecEdit->text()); -} - -void ToolChainConfigWidget::setMkspecList(const QList<Utils::FileName> &specList) -{ - QTC_ASSERT(d->m_mkspecEdit, return); - - d->m_mkspecEdit->setText(mkspecListToString(specList)); - - emitDirty(); -} +{ } void ToolChainConfigWidget::addErrorLabel(QFormLayout *lt) { diff --git a/src/plugins/projectexplorer/toolchainconfigwidget.h b/src/plugins/projectexplorer/toolchainconfigwidget.h index 1bc25b6661..2314df576c 100644 --- a/src/plugins/projectexplorer/toolchainconfigwidget.h +++ b/src/plugins/projectexplorer/toolchainconfigwidget.h @@ -74,33 +74,14 @@ signals: void dirty(); protected slots: - void emitDirty(); - void resetMkspecList(); void setErrorMessage(const QString &); void clearErrorMessage(); protected: - void addDebuggerCommandControls(QFormLayout *lt, - const QStringList &versionArguments = QStringList()); - void addDebuggerCommandControls(QGridLayout *lt, - int row = 0, int column = 0, - const QStringList &versionArguments = QStringList()); - void addDebuggerAutoDetection(QObject *receiver, const char *autoDetectSlot); - void addMkspecControls(QFormLayout *lt); - void addMkspecControls(QGridLayout *lt, int row = 0, int column = 0); void addErrorLabel(QFormLayout *lt); void addErrorLabel(QGridLayout *lt, int row = 0, int column = 0, int colSpan = 1); - Utils::FileName debuggerCommand() const; - void setDebuggerCommand(const Utils::FileName &debugger); - - QList<Utils::FileName> mkspecList() const; - void setMkspecList(const QList<Utils::FileName> &specList); - private: - void ensureDebuggerPathChooser(const QStringList &versionArguments); - void ensureMkspecEdit(); - Internal::ToolChainConfigWidgetPrivate *d; }; diff --git a/src/plugins/projectexplorer/toolchainmanager.cpp b/src/plugins/projectexplorer/toolchainmanager.cpp index b87a38f8da..5b76d3f9ca 100644 --- a/src/plugins/projectexplorer/toolchainmanager.cpp +++ b/src/plugins/projectexplorer/toolchainmanager.cpp @@ -31,7 +31,9 @@ **************************************************************************/ #include "toolchainmanager.h" + #include "abi.h" +#include "profileinformation.h" #include "toolchain.h" #include <coreplugin/icore.h> @@ -51,15 +53,17 @@ static const char TOOLCHAIN_FILE_VERSION_KEY[] = "Version"; static const char DEFAULT_DEBUGGER_COUNT_KEY[] = "DefaultDebugger.Count"; static const char DEFAULT_DEBUGGER_ABI_KEY[] = "DefaultDebugger.Abi."; static const char DEFAULT_DEBUGGER_PATH_KEY[] = "DefaultDebugger.Path."; -static const char TOOLCHAIN_FILENAME[] = "/toolChains.xml"; +static const char TOOLCHAIN_FILENAME[] = "/qtcreator/toolchains.xml"; +static const char LEGACY_TOOLCHAIN_FILENAME[] = "/toolChains.xml"; using Utils::PersistentSettingsWriter; using Utils::PersistentSettingsReader; -static QString settingsFileName() +static QString settingsFileName(const QString &path) { - QFileInfo settingsLocation(ExtensionSystem::PluginManager::settings()->fileName()); - return settingsLocation.absolutePath() + QLatin1String(TOOLCHAIN_FILENAME); + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + QFileInfo settingsLocation(pm->settings()->fileName()); + return settingsLocation.absolutePath() + path; } namespace ProjectExplorer { @@ -89,8 +93,7 @@ private: ToolChainManagerPrivate::ToolChainManagerPrivate(ToolChainManager *parent) : q(parent), m_initialized(false) -{ -} +{ } QList<ToolChain *> &ToolChainManagerPrivate::toolChains() { @@ -109,7 +112,6 @@ QList<ToolChain *> &ToolChainManagerPrivate::toolChains() ToolChainManager *ToolChainManager::instance() { - Q_ASSERT(m_instance); return m_instance; } @@ -119,6 +121,7 @@ ToolChainManager::ToolChainManager(QObject *parent) : { Q_ASSERT(!m_instance); m_instance = this; + connect(Core::ICore::instance(), SIGNAL(saveSettingsRequested()), this, SLOT(saveToolChains())); connect(this, SIGNAL(toolChainAdded(ProjectExplorer::ToolChain*)), @@ -137,7 +140,7 @@ void ToolChainManager::restoreToolChains() // read all tool chains from SDK QFileInfo systemSettingsFile(Core::ICore::settings(QSettings::SystemScope)->fileName()); QList<ToolChain *> readTcs = - restoreToolChains(systemSettingsFile.absolutePath() + QLatin1String(TOOLCHAIN_FILENAME)); + restoreToolChains(systemSettingsFile.absolutePath() + QLatin1String(LEGACY_TOOLCHAIN_FILENAME)); // make sure we mark these as autodetected! foreach (ToolChain *tc, readTcs) tc->setAutoDetected(true); @@ -145,8 +148,12 @@ void ToolChainManager::restoreToolChains() tcsToRegister = readTcs; // SDK TCs are always considered to be up-to-date, so no need to // recheck them. - // read all tool chains from user file - readTcs = restoreToolChains(settingsFileName()); + // read all tool chains from user file. + // Read legacy settings once and keep them around... + QString fileName = settingsFileName(QLatin1String(TOOLCHAIN_FILENAME)); + if (!QFileInfo(fileName).exists()) + fileName = settingsFileName(QLatin1String(LEGACY_TOOLCHAIN_FILENAME)); + readTcs = restoreToolChains(fileName); foreach (ToolChain *tc, readTcs) { if (tc->isAutoDetected()) @@ -214,7 +221,7 @@ void ToolChainManager::saveToolChains() } } writer.saveValue(QLatin1String(TOOLCHAIN_COUNT_KEY), count); - writer.save(settingsFileName(), QLatin1String("QtCreatorToolChains"), Core::ICore::mainWindow()); + writer.save(settingsFileName(QLatin1String(TOOLCHAIN_FILENAME)), QLatin1String("QtCreatorToolChains"), Core::ICore::mainWindow()); // Do not save default debuggers! Those are set by the SDK! } @@ -296,7 +303,7 @@ ToolChain *ToolChainManager::findToolChain(const QString &id) const return 0; foreach (ToolChain *tc, d->toolChains()) { - if (tc->id() == id || (!tc->legacyId().isEmpty() && tc->legacyId() == id)) + if (tc->id() == id) return tc; } return 0; diff --git a/src/plugins/projectexplorer/toolchainoptionspage.cpp b/src/plugins/projectexplorer/toolchainoptionspage.cpp index 1cdbe5bafa..5cd461ef70 100644 --- a/src/plugins/projectexplorer/toolchainoptionspage.cpp +++ b/src/plugins/projectexplorer/toolchainoptionspage.cpp @@ -42,13 +42,20 @@ #include <utils/qtcassert.h> -#include <QSignalMapper> -#include <QTextStream> #include <QAction> +#include <QApplication> +#include <QHBoxLayout> +#include <QHeaderView> #include <QItemSelectionModel> #include <QLabel> #include <QMenu> #include <QMessageBox> +#include <QPushButton> +#include <QSignalMapper> +#include <QSpacerItem> +#include <QTextStream> +#include <QTreeView> +#include <QVBoxLayout> namespace ProjectExplorer { namespace Internal { @@ -92,11 +99,11 @@ public: // ToolChainModel // -------------------------------------------------------------------------- -ToolChainModel::ToolChainModel(QWidget *configWidgetParent, QObject *parent) : +ToolChainModel::ToolChainModel(QBoxLayout *parentLayout, QObject *parent) : QAbstractItemModel(parent), - m_configWidgetParent(configWidgetParent) + m_parentLayout(parentLayout) { - Q_ASSERT(m_configWidgetParent); + Q_ASSERT(m_parentLayout); connect(ToolChainManager::instance(), SIGNAL(toolChainAdded(ProjectExplorer::ToolChain*)), this, SLOT(addToolChain(ProjectExplorer::ToolChain*))); @@ -404,9 +411,8 @@ ToolChainNode *ToolChainModel::createNode(ToolChainNode *parent, ToolChain *tc, { ToolChainNode *node = new ToolChainNode(parent, tc, changed); if (node->widget) { - m_configWidgetParent->layout()->addWidget(node->widget); - connect(node->widget, SIGNAL(dirty()), - this, SLOT(setDirty())); + m_parentLayout->addWidget(node->widget); + connect(node->widget, SIGNAL(dirty()), this, SLOT(setDirty())); } return node; } @@ -471,7 +477,8 @@ void ToolChainModel::removeToolChain(ToolChain *tc) // -------------------------------------------------------------------------- ToolChainOptionsPage::ToolChainOptionsPage() : - m_ui(0), m_model(0), m_selectionModel(0), m_currentTcWidget(0) + m_model(0), m_selectionModel(0), m_currentTcWidget(0), + m_toolChainView(0), m_addButton(0), m_cloneButton(0), m_delButton(0) { setId(QLatin1String(Constants::TOOLCHAIN_SETTINGS_PAGE_ID)); setDisplayName(tr("Tool Chains")); @@ -488,19 +495,39 @@ QWidget *ToolChainOptionsPage::createPage(QWidget *parent) m_currentTcWidget = 0; - m_ui = new Ui::ToolChainOptionsPage; - m_ui->setupUi(m_configWidget); + m_toolChainView = new QTreeView(m_configWidget); + m_toolChainView->setUniformRowHeights(true); + m_toolChainView->header()->setStretchLastSection(false); + m_addButton = new QPushButton(tr("Add"), m_configWidget); + m_cloneButton = new QPushButton(tr("Clone"), m_configWidget); + m_delButton = new QPushButton(tr("Remove"), m_configWidget); + + QVBoxLayout *buttonLayout = new QVBoxLayout(); + buttonLayout->setSpacing(6); + buttonLayout->setContentsMargins(0, 0, 0, 0); + buttonLayout->addWidget(m_addButton); + buttonLayout->addWidget(m_cloneButton); + buttonLayout->addWidget(m_delButton); + buttonLayout->addItem(new QSpacerItem(10, 40, QSizePolicy::Minimum, QSizePolicy::Expanding)); + + QVBoxLayout *verticalLayout = new QVBoxLayout(); + verticalLayout->addWidget(m_toolChainView); + + QHBoxLayout *horizontalLayout = new QHBoxLayout(m_configWidget); + horizontalLayout->addLayout(verticalLayout); + horizontalLayout->addLayout(buttonLayout); Q_ASSERT(!m_model); - m_model = new ToolChainModel(m_configWidget); + m_model = new ToolChainModel(verticalLayout); + connect(m_model, SIGNAL(toolChainStateChanged()), this, SLOT(updateState())); - m_ui->toolChainView->setModel(m_model); - m_ui->toolChainView->header()->setResizeMode(0, QHeaderView::ResizeToContents); - m_ui->toolChainView->header()->setResizeMode(1, QHeaderView::Stretch); - m_ui->toolChainView->expandAll(); + m_toolChainView->setModel(m_model); + m_toolChainView->header()->setResizeMode(0, QHeaderView::ResizeToContents); + m_toolChainView->header()->setResizeMode(1, QHeaderView::Stretch); + m_toolChainView->expandAll(); - m_selectionModel = m_ui->toolChainView->selectionModel(); + m_selectionModel = m_toolChainView->selectionModel(); connect(m_selectionModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(toolChainSelectionChanged())); connect(ToolChainManager::instance(), SIGNAL(toolChainsChanged()), @@ -510,7 +537,7 @@ QWidget *ToolChainOptionsPage::createPage(QWidget *parent) m_factories = ExtensionSystem::PluginManager::getObjects<ToolChainFactory>(); // Set up add menu: - QMenu *addMenu = new QMenu(m_ui->addButton); + QMenu *addMenu = new QMenu(m_addButton); QSignalMapper *mapper = new QSignalMapper(addMenu); connect(mapper, SIGNAL(mapped(QObject*)), this, SLOT(createToolChain(QObject*))); @@ -524,12 +551,12 @@ QWidget *ToolChainOptionsPage::createPage(QWidget *parent) addMenu->addAction(action); } } - connect(m_ui->cloneButton, SIGNAL(clicked()), mapper, SLOT(map())); - mapper->setMapping(m_ui->cloneButton, static_cast<QObject *>(0)); + connect(m_cloneButton, SIGNAL(clicked()), mapper, SLOT(map())); + mapper->setMapping(m_cloneButton, static_cast<QObject *>(0)); - m_ui->addButton->setMenu(addMenu); + m_addButton->setMenu(addMenu); - connect(m_ui->delButton, SIGNAL(clicked()), this, SLOT(removeToolChain())); + connect(m_delButton, SIGNAL(clicked()), this, SLOT(removeToolChain())); // setup keywords: if (m_searchKeywords.isEmpty()) { @@ -562,8 +589,12 @@ void ToolChainOptionsPage::finish() m_configWidget = 0; // deleted by settingsdialog m_selectionModel = 0; // child of m_configWidget - m_ui = 0; // child of m_configWidget m_currentTcWidget = 0; // deleted by the model + // childs of m_configWidget + m_toolChainView = 0; + m_addButton = 0; + m_cloneButton = 0; + m_delButton = 0; } bool ToolChainOptionsPage::matches(const QString &s) const @@ -619,7 +650,7 @@ void ToolChainOptionsPage::removeToolChain() void ToolChainOptionsPage::updateState() { - if (!m_ui) + if (!m_cloneButton) return; bool canCopy = false; @@ -630,8 +661,8 @@ void ToolChainOptionsPage::updateState() canDelete = !tc->isAutoDetected(); } - m_ui->cloneButton->setEnabled(canCopy); - m_ui->delButton->setEnabled(canDelete); + m_cloneButton->setEnabled(canCopy); + m_delButton->setEnabled(canDelete); } QModelIndex ToolChainOptionsPage::currentIndex() const diff --git a/src/plugins/projectexplorer/toolchainoptionspage.h b/src/plugins/projectexplorer/toolchainoptionspage.h index 2049154455..9d882b2001 100644 --- a/src/plugins/projectexplorer/toolchainoptionspage.h +++ b/src/plugins/projectexplorer/toolchainoptionspage.h @@ -33,15 +33,16 @@ #ifndef TOOLCHAINOPTIONSPAGE_H #define TOOLCHAINOPTIONSPAGE_H -#include "ui_toolchainoptionspage.h" - #include <coreplugin/dialogs/ioptionspage.h> #include <QAbstractItemModel> QT_BEGIN_NAMESPACE +class QBoxLayout; +class QItemSelectionModel; +class QPushButton; +class QTreeView; class QTreeWidgetItem; -class QWidget; QT_END_NAMESPACE namespace ProjectExplorer { @@ -63,7 +64,7 @@ class ToolChainModel : public QAbstractItemModel Q_OBJECT public: - explicit ToolChainModel(QWidget *configWidgetParent, QObject *parent = 0); + explicit ToolChainModel(QBoxLayout *parentLayout, QObject *parent = 0); ~ToolChainModel(); QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; @@ -109,7 +110,7 @@ private: QList<ToolChainNode *> m_toAddList; QList<ToolChainNode *> m_toRemoveList; - QWidget *m_configWidgetParent; + QBoxLayout *m_parentLayout; }; // -------------------------------------------------------------------------- @@ -137,7 +138,6 @@ private slots: private: QModelIndex currentIndex() const; - Ui::ToolChainOptionsPage *m_ui; QWidget *m_configWidget; QString m_searchKeywords; @@ -145,6 +145,10 @@ private: QList<ToolChainFactory *> m_factories; QItemSelectionModel * m_selectionModel; ToolChainConfigWidget *m_currentTcWidget; + QTreeView *m_toolChainView; + QPushButton *m_addButton; + QPushButton *m_cloneButton; + QPushButton *m_delButton; }; } // namespace Internal diff --git a/src/plugins/projectexplorer/toolchainoptionspage.ui b/src/plugins/projectexplorer/toolchainoptionspage.ui deleted file mode 100644 index 8c31359673..0000000000 --- a/src/plugins/projectexplorer/toolchainoptionspage.ui +++ /dev/null @@ -1,112 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>ProjectExplorer::Internal::ToolChainOptionsPage</class> - <widget class="QWidget" name="ProjectExplorer::Internal::ToolChainOptionsPage"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>398</width> - <height>296</height> - </rect> - </property> - <layout class="QVBoxLayout" name="verticalLayout"> - <item> - <layout class="QHBoxLayout" name="horizontalLayout"> - <item> - <widget class="QTreeView" name="toolChainView"> - <property name="uniformRowHeights"> - <bool>true</bool> - </property> - <attribute name="headerStretchLastSection"> - <bool>false</bool> - </attribute> - </widget> - </item> - <item> - <layout class="QVBoxLayout" name="_2"> - <property name="spacing"> - <number>6</number> - </property> - <property name="margin"> - <number>0</number> - </property> - <item> - <widget class="QPushButton" name="addButton"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>21</width> - <height>23</height> - </size> - </property> - <property name="text"> - <string>Add</string> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="cloneButton"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>21</width> - <height>23</height> - </size> - </property> - <property name="text"> - <string>Clone</string> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="delButton"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>21</width> - <height>23</height> - </size> - </property> - <property name="text"> - <string>Remove</string> - </property> - </widget> - </item> - <item> - <spacer> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>10</width> - <height>40</height> - </size> - </property> - </spacer> - </item> - </layout> - </item> - </layout> - </item> - </layout> - </widget> - <resources/> - <connections/> -</ui> diff --git a/src/plugins/projectexplorer/wincetoolchain.cpp b/src/plugins/projectexplorer/wincetoolchain.cpp index 8108746528..eb08ddba9e 100644 --- a/src/plugins/projectexplorer/wincetoolchain.cpp +++ b/src/plugins/projectexplorer/wincetoolchain.cpp @@ -50,7 +50,6 @@ #include <QXmlStreamReader> #define KEY_ROOT "ProjectExplorer.WinCEToolChain." -static const char debuggerCommandKeyC[] = KEY_ROOT"Debugger"; static const char msvcVerKeyC[] = KEY_ROOT"MSVCVer"; static const char ceVerKeyC[] = KEY_ROOT"CEVer"; static const char binPathKeyC[] = KEY_ROOT"BinPath"; @@ -278,23 +277,6 @@ WinCEToolChain *WinCEToolChain::readFromMap(const QVariantMap &data) return 0; } -QString WinCEToolChain::legacyId() const -{ - const QChar colon = QLatin1Char(':'); - QString id = QLatin1String(Constants::WINCE_TOOLCHAIN_ID); - id += colon; - id += m_msvcVer; - id += colon; - id += m_binPath; - id += colon; - id += m_includePath; - id += colon; - id += m_libPath; - id += colon; - id += m_debuggerCommand.toString(); - return id; -} - QString WinCEToolChain::type() const { return QLatin1String("wince"); @@ -330,8 +312,6 @@ QString WinCEToolChain::ceVer() const QVariantMap WinCEToolChain::toMap() const { QVariantMap data = ToolChain::toMap(); - if (!m_debuggerCommand.isEmpty()) - data.insert(QLatin1String(debuggerCommandKeyC), m_debuggerCommand.toString()); data.insert(QLatin1String(msvcVerKeyC), m_msvcVer); data.insert(QLatin1String(ceVerKeyC), m_ceVer); @@ -356,7 +336,6 @@ bool WinCEToolChain::fromMap(const QVariantMap &data) m_libPath = data.value(QLatin1String(libPathKeyC)).toString(); m_vcvarsBat = data.value(QLatin1String(vcVarsKeyC)).toString(); - m_debuggerCommand = Utils::FileName::fromString(data.value(QLatin1String(debuggerCommandKeyC)).toString()); const QString abiString = data.value(QLatin1String(supportedAbiKeyC)).toString(); m_abi = Abi(abiString); diff --git a/src/plugins/projectexplorer/wincetoolchain.h b/src/plugins/projectexplorer/wincetoolchain.h index f09a1ded26..2f8e7db30b 100644 --- a/src/plugins/projectexplorer/wincetoolchain.h +++ b/src/plugins/projectexplorer/wincetoolchain.h @@ -57,7 +57,6 @@ public: const QString &libPath, bool autodetect = false); - QString legacyId() const; QList<Utils::FileName> suggestedMkspecList() const; static WinCEToolChain *readFromMap(const QVariantMap &data); @@ -65,8 +64,6 @@ public: QString type() const; QString typeDisplayName() const; - Utils::FileName mkspecList() const; - QString ceVer() const; QVariantMap toMap() const; diff --git a/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp b/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp index e3c16c1e5d..1c0d118e67 100644 --- a/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp @@ -37,7 +37,9 @@ #include "subcomponentmanager.h" #include "model/viewlogger.h" +#include <projectexplorer/target.h> #include <qt4projectmanager/qt4buildconfiguration.h> +#include <qtsupport/qtprofileinformation.h> #include <itemlibraryview.h> #include <itemlibrarywidget.h> @@ -89,9 +91,8 @@ #include <projectexplorer/projectexplorer.h> #include <qt4projectmanager/qt4project.h> -#include <qt4projectmanager/qt4target.h> #include <qtsupport/qtversionmanager.h> -#include <qt4projectmanager/qt4projectmanagerconstants.h> +#include <qtsupport/qtsupportconstants.h> #include <qmlprojectmanager/qmlprojectrunconfiguration.h> enum { @@ -221,8 +222,8 @@ QString DesignDocumentController::pathToQt() const { QtSupport::BaseQtVersion *activeQtVersion = QtSupport::QtVersionManager::instance()->version(d->qt_versionId); if (activeQtVersion && (activeQtVersion->qtVersion().majorVersion > 3) - && (activeQtVersion->supportsTargetId(Qt4ProjectManager::Constants::QT_SIMULATOR_TARGET_ID) - || activeQtVersion->supportsTargetId(Qt4ProjectManager::Constants::DESKTOP_TARGET_ID))) + && (activeQtVersion->type() == QLatin1String(QtSupport::Constants::DESKTOPQT) + || activeQtVersion->type() == QLatin1String(QtSupport::Constants::SIMULATORQT))) return activeQtVersion->versionInfo().value("QT_INSTALL_DATA"); return QString(); } @@ -925,22 +926,8 @@ static inline QtSupport::BaseQtVersion *getActiveQtVersion(DesignDocumentControl if (!target) return 0; - ProjectExplorer::RunConfiguration *runConfiguration = target->activeRunConfiguration(); - QmlProjectManager::QmlProjectRunConfiguration *qmlRunConfiguration = qobject_cast<QmlProjectManager::QmlProjectRunConfiguration* >(runConfiguration); - - if (qmlRunConfiguration) { - controller->connect(target, SIGNAL(activeRunConfigurationChanged(ProjectExplorer::RunConfiguration*)), controller, SLOT(activeQtVersionChanged())); - return qmlRunConfiguration->qtVersion(); - } - - Qt4ProjectManager::Qt4BuildConfiguration *activeBuildConfiguration = qobject_cast<Qt4ProjectManager::Qt4BuildConfiguration *>(target->activeBuildConfiguration()); - - if (activeBuildConfiguration) { - controller->connect(target, SIGNAL(activeBuildConfigurationChanged(ProjectExplorer::BuildConfiguration*)), controller, SLOT(activeQtVersionChanged())); - return activeBuildConfiguration->qtVersion(); - } - - return 0; + controller->connect(target, SIGNAL(profileChanged()), controller, SLOT(activeQtVersionChanged())); + return QtSupport::QtProfileInformation::qtVersion(target->profile()); } void DesignDocumentController::activeQtVersionChanged() diff --git a/src/plugins/qmlprofiler/qmlprofilertool.cpp b/src/plugins/qmlprofiler/qmlprofilertool.cpp index 191b23f904..a0243e55a2 100644 --- a/src/plugins/qmlprofiler/qmlprofilertool.cpp +++ b/src/plugins/qmlprofiler/qmlprofilertool.cpp @@ -77,6 +77,8 @@ #include <qt4projectmanager/qt-s60/s60deployconfiguration.h> #include <qt4projectmanager/qt-s60/symbianidevice.h> +#include <qtsupport/qtprofileinformation.h> + #include <QApplication> #include <QHBoxLayout> #include <QLabel> @@ -243,10 +245,9 @@ IAnalyzerEngine *QmlProfilerTool::createEngine(const AnalyzerStartParameters &sp // Check minimum Qt Version. We cannot really be sure what the Qt version // at runtime is, but guess that the active build configuraiton has been used. QtSupport::QtVersionNumber minimumVersion(4, 7, 4); - if (Qt4ProjectManager::Qt4BuildConfiguration *qt4Config - = qobject_cast<Qt4ProjectManager::Qt4BuildConfiguration*>( - runConfiguration->target()->activeBuildConfiguration())) { - if (qt4Config->qtVersion()->isValid() && qt4Config->qtVersion()->qtVersion() < minimumVersion) { + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(runConfiguration->target()->profile()); + if (version) { + if (version->isValid() && version->qtVersion() < minimumVersion) { int result = QMessageBox::warning(QApplication::activeWindow(), tr("QML Profiler"), tr("The QML profiler requires Qt 4.7.4 or newer.\n" "The Qt version configured in your active build configuration is too old.\n" @@ -306,13 +307,9 @@ bool QmlProfilerTool::canRun(RunConfiguration *runConfiguration, RunMode mode) c static QString sysroot(RunConfiguration *runConfig) { QTC_ASSERT(runConfig, return QString()); - if (Qt4ProjectManager::Qt4BuildConfiguration *buildConfig = - qobject_cast<Qt4ProjectManager::Qt4BuildConfiguration*>( - runConfig->target()->activeBuildConfiguration())) { - if (QtSupport::BaseQtVersion *qtVersion = buildConfig->qtVersion()) - return qtVersion->systemRoot(); - } - + ProjectExplorer::Profile *p = runConfig->target()->profile(); + if (p && ProjectExplorer::SysRootProfileInformation::hasSysRoot(p)) + return ProjectExplorer::SysRootProfileInformation::sysRoot(runConfig->target()->profile()).toString(); return QString(); } @@ -347,7 +344,7 @@ AnalyzerStartParameters QmlProfilerTool::createStartParameters(RunConfiguration qobject_cast<RemoteLinux::RemoteLinuxRunConfiguration *>(runConfiguration)) { sp.debuggee = rc3->remoteExecutableFilePath(); sp.debuggeeArgs = rc3->arguments(); - sp.connParams = rc3->deviceConfig()->sshParameters(); + sp.connParams = ProjectExplorer::DeviceProfileInformation::device(rc3->target()->profile())->sshParameters(); sp.analyzerCmdPrefix = rc3->commandPrefix(); sp.displayName = rc3->displayName(); sp.sysroot = sysroot(rc3); diff --git a/src/plugins/qmlprojectmanager/qmlproject.cpp b/src/plugins/qmlprojectmanager/qmlproject.cpp index 1e43c76a04..91937d6de0 100644 --- a/src/plugins/qmlprojectmanager/qmlproject.cpp +++ b/src/plugins/qmlprojectmanager/qmlproject.cpp @@ -35,7 +35,6 @@ #include "qmlprojectmanagerconstants.h" #include "fileformat/qmlprojectitem.h" #include "qmlprojectrunconfiguration.h" -#include "qmlprojecttarget.h" #include "qmlprojectconstants.h" #include "qmlprojectnodes.h" #include "qmlprojectmanager.h" @@ -47,9 +46,12 @@ #include <qtsupport/qmldumptool.h> #include <qtsupport/baseqtversion.h> #include <qtsupport/qtversionmanager.h> +#include <qtsupport/qtprofileinformation.h> #include <qmljs/qmljsmodelmanagerinterface.h> #include <utils/fileutils.h> -#include <projectexplorer/toolchainmanager.h> +#include <projectexplorer/profileinformation.h> +#include <projectexplorer/profilemanager.h> +#include <projectexplorer/target.h> #include <utils/filesystemwatcher.h> #include <QTextStream> @@ -157,13 +159,9 @@ void QmlProject::refresh(RefreshOptions options) pinfo.importPaths = importPaths(); QtSupport::BaseQtVersion *version = 0; if (activeTarget()) { - if (QmlProjectRunConfiguration *rc = qobject_cast<QmlProjectRunConfiguration *>(activeTarget()->activeRunConfiguration())) - version = rc->qtVersion(); - QList<ProjectExplorer::ToolChain *> tcList; - if (version && !version->qtAbis().isEmpty()) - tcList = ProjectExplorer::ToolChainManager::instance()->findToolChains(version->qtAbis().at(0)); - if (!tcList.isEmpty()) - QtSupport::QmlDumpTool::pathAndEnvironment(this, version, tcList.first(), false, &pinfo.qmlDumpPath, &pinfo.qmlDumpEnvironment); + ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(activeTarget()->profile()); + version = QtSupport::QtProfileInformation::qtVersion(activeTarget()->profile()); + QtSupport::QmlDumpTool::pathAndEnvironment(this, version, tc, false, &pinfo.qmlDumpPath, &pinfo.qmlDumpEnvironment); } if (version) { pinfo.tryQmlDump = true; @@ -273,14 +271,20 @@ ProjectExplorer::IProjectManager *QmlProject::projectManager() const return m_manager; } -QList<ProjectExplorer::BuildConfigWidget*> QmlProject::subConfigWidgets() +bool QmlProject::supportsProfile(ProjectExplorer::Profile *p) const { - return QList<ProjectExplorer::BuildConfigWidget*>(); + Core::Id deviceType = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(p); + if (deviceType != ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE) + return false; + + // TODO: Limit supported versions? + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(p); + return version; } -Internal::QmlProjectTarget *QmlProject::activeTarget() const +QList<ProjectExplorer::BuildConfigWidget*> QmlProject::subConfigWidgets() { - return static_cast<Internal::QmlProjectTarget *>(Project::activeTarget()); + return QList<ProjectExplorer::BuildConfigWidget*>(); } ProjectExplorer::ProjectNode *QmlProject::rootProjectNode() const @@ -298,12 +302,8 @@ bool QmlProject::fromMap(const QVariantMap &map) if (!Project::fromMap(map)) return false; - if (targets().isEmpty()) { - Internal::QmlProjectTargetFactory *factory - = ExtensionSystem::PluginManager::getObject<Internal::QmlProjectTargetFactory>(); - Internal::QmlProjectTarget *target = factory->create(this, Core::Id(Constants::QML_VIEWER_TARGET_ID)); - addTarget(target); - } + if (!activeTarget()) + addTarget(createTarget(ProjectExplorer::ProfileManager::instance()->defaultProfile())); refresh(Everything); // FIXME workaround to guarantee that run/debug actions are enabled if a valid file exists diff --git a/src/plugins/qmlprojectmanager/qmlproject.h b/src/plugins/qmlprojectmanager/qmlproject.h index 94af81d2ce..6f00900b81 100644 --- a/src/plugins/qmlprojectmanager/qmlproject.h +++ b/src/plugins/qmlprojectmanager/qmlproject.h @@ -39,13 +39,8 @@ #include <QDeclarativeEngine> -namespace QmlJS { -class ModelManagerInterface; -} - -namespace Utils { -class FileSystemWatcher; -} +namespace QmlJS { class ModelManagerInterface; } +namespace Utils { class FileSystemWatcher; } namespace QmlProjectManager { @@ -54,7 +49,6 @@ class QmlProjectItem; namespace Internal { class Manager; class QmlProjectFile; -class QmlProjectTarget; class QmlProjectNode; } // namespace Internal @@ -72,7 +66,8 @@ public: Core::Id id() const; Core::IDocument *document() const; ProjectExplorer::IProjectManager *projectManager() const; - Internal::QmlProjectTarget *activeTarget() const; + + bool supportsProfile(ProjectExplorer::Profile *p) const; QList<ProjectExplorer::BuildConfigWidget*> subConfigWidgets(); diff --git a/src/plugins/qmlprojectmanager/qmlprojectmanager.pro b/src/plugins/qmlprojectmanager/qmlprojectmanager.pro index cd40ae3e2f..5249f4687b 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectmanager.pro +++ b/src/plugins/qmlprojectmanager/qmlprojectmanager.pro @@ -25,7 +25,6 @@ HEADERS += qmlproject.h \ qmlprojectapplicationwizard.h \ qmlprojectmanager_global.h \ qmlprojectmanagerconstants.h \ - qmlprojecttarget.h \ qmlprojectrunconfigurationwidget.h SOURCES += qmlproject.cpp \ @@ -37,7 +36,6 @@ SOURCES += qmlproject.cpp \ qmlprojectrunconfiguration.cpp \ qmlprojectrunconfigurationfactory.cpp \ qmlprojectapplicationwizard.cpp \ - qmlprojecttarget.cpp \ qmlprojectrunconfigurationwidget.cpp RESOURCES += qmlproject.qrc diff --git a/src/plugins/qmlprojectmanager/qmlprojectmanager.qbs b/src/plugins/qmlprojectmanager/qmlprojectmanager.qbs index 52b421c123..9ac468e42c 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectmanager.qbs +++ b/src/plugins/qmlprojectmanager/qmlprojectmanager.qbs @@ -37,7 +37,6 @@ QtcPlugin { "qmlprojectapplicationwizard.h", "qmlprojectmanager_global.h", "qmlprojectmanagerconstants.h", - "qmlprojecttarget.h", "qmlprojectrunconfigurationwidget.h", "fileformat/qmlprojectitem.cpp", "fileformat/filefilteritems.cpp", @@ -51,7 +50,6 @@ QtcPlugin { "qmlprojectrunconfiguration.cpp", "qmlprojectrunconfigurationfactory.cpp", "qmlprojectapplicationwizard.cpp", - "qmlprojecttarget.cpp", "qmlprojectrunconfigurationwidget.cpp", "qmlproject.qrc", "QmlProject.mimetypes.xml" diff --git a/src/plugins/qmlprojectmanager/qmlprojectmanagerconstants.h b/src/plugins/qmlprojectmanager/qmlprojectmanagerconstants.h index e8bd9eeb21..2cbbc589e7 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectmanagerconstants.h +++ b/src/plugins/qmlprojectmanager/qmlprojectmanagerconstants.h @@ -36,9 +36,7 @@ namespace QmlProjectManager { namespace Constants { const char QML_RC_ID[] = "QmlProjectManager.QmlRunConfiguration"; -const char QML_VIEWER_QT_KEY[] = "QmlProjectManager.QmlRunConfiguration.QtVersion"; const char QML_VIEWER_ARGUMENTS_KEY[] = "QmlProjectManager.QmlRunConfiguration.QDeclarativeViewerArguments"; -const char QML_VIEWER_TARGET_ID[] = "QmlProjectManager.QmlTarget"; const char QML_VIEWER_TARGET_DISPLAY_NAME[] = "QML Viewer"; const char QML_MAINSCRIPT_KEY[] = "QmlProjectManager.QmlRunConfiguration.MainScript"; const char USER_ENVIRONMENT_CHANGES_KEY[] = "QmlProjectManager.QmlRunConfiguration.UserEnvironmentChanges"; diff --git a/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp b/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp index 580e08e9c9..addb170b3f 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp @@ -37,7 +37,6 @@ #include "qmlproject.h" #include "qmlprojectrunconfigurationfactory.h" #include "qmlprojectruncontrol.h" -#include "qmlprojecttarget.h" #include "fileformat/qmlprojectfileformat.h" #include <extensionsystem/pluginmanager.h> @@ -85,7 +84,6 @@ bool QmlProjectPlugin::initialize(const QStringList &, QString *errorMessage) addAutoReleasedObject(new Internal::QmlProjectRunConfigurationFactory); addAutoReleasedObject(new Internal::QmlProjectRunControlFactory); addAutoReleasedObject(new Internal::QmlProjectApplicationWizard); - addAutoReleasedObject(new Internal::QmlProjectTargetFactory); QmlProjectFileFormat::registerDeclarativeTypes(); diff --git a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp index 9a3dc44895..80346d3d13 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp @@ -33,15 +33,15 @@ #include "qmlprojectrunconfiguration.h" #include "qmlproject.h" #include "qmlprojectmanagerconstants.h" -#include "qmlprojecttarget.h" #include "qmlprojectrunconfigurationwidget.h" #include <coreplugin/mimedatabase.h> #include <coreplugin/editormanager/editormanager.h> #include <coreplugin/editormanager/ieditor.h> #include <coreplugin/icore.h> +#include <projectexplorer/target.h> #include <utils/qtcassert.h> #include <utils/qtcprocess.h> -#include <qtsupport/qtversionmanager.h> +#include <qtsupport/qtprofileinformation.h> #include <qtsupport/qtoutputformatter.h> #include <qtsupport/qtsupportconstants.h> @@ -52,7 +52,6 @@ using Core::EditorManager; using Core::ICore; using Core::IEditor; -using QtSupport::QtVersionManager; using namespace QmlProjectManager::Internal; @@ -60,29 +59,23 @@ namespace QmlProjectManager { const char * const M_CURRENT_FILE = "CurrentFile"; -QmlProjectRunConfiguration::QmlProjectRunConfiguration(QmlProjectTarget *parent) : +QmlProjectRunConfiguration::QmlProjectRunConfiguration(ProjectExplorer::Target *parent) : ProjectExplorer::RunConfiguration(parent, Core::Id(Constants::QML_RC_ID)), - m_qtVersionId(-1), m_scriptFile(M_CURRENT_FILE), - m_projectTarget(parent), m_isEnabled(false) { ctor(); - updateQtVersions(); } -QmlProjectRunConfiguration::QmlProjectRunConfiguration(QmlProjectTarget *parent, +QmlProjectRunConfiguration::QmlProjectRunConfiguration(ProjectExplorer::Target *parent, QmlProjectRunConfiguration *source) : ProjectExplorer::RunConfiguration(parent, source), - m_qtVersionId(source->m_qtVersionId), m_scriptFile(source->m_scriptFile), m_qmlViewerArgs(source->m_qmlViewerArgs), - m_projectTarget(parent), m_isEnabled(source->m_isEnabled), m_userEnvironmentChanges(source->m_userEnvironmentChanges) { ctor(); - updateQtVersions(); } bool QmlProjectRunConfiguration::isEnabled() const @@ -107,8 +100,8 @@ void QmlProjectRunConfiguration::ctor() connect(em, SIGNAL(currentEditorChanged(Core::IEditor*)), this, SLOT(changeCurrentFile(Core::IEditor*))); - QtVersionManager *qtVersions = QtVersionManager::instance(); - connect(qtVersions, SIGNAL(qtVersionsChanged(QList<int>,QList<int>,QList<int>)), this, SLOT(updateQtVersions())); + connect(target(), SIGNAL(profileChanged()), + this, SLOT(updateEnabled())); setDisplayName(tr("QML Viewer", "QMLRunConfiguration display name.")); } @@ -117,19 +110,13 @@ QmlProjectRunConfiguration::~QmlProjectRunConfiguration() { } -QmlProjectTarget *QmlProjectRunConfiguration::qmlTarget() const -{ - return static_cast<QmlProjectTarget *>(target()); -} - QString QmlProjectRunConfiguration::viewerPath() const { QtSupport::BaseQtVersion *version = qtVersion(); - if (!version) { + if (!version) return QString(); - } else { + else return version->qmlviewerCommand(); - } } QString QmlProjectRunConfiguration::observerPath() const @@ -150,7 +137,10 @@ QString QmlProjectRunConfiguration::viewerArguments() const QString args = m_qmlViewerArgs; // arguments from .qmlproject file - foreach (const QString &importPath, qmlTarget()->qmlProject()->importPaths()) { + QmlProject *project = qobject_cast<QmlProject *>(target()->project()); + if (!project) + return args; + foreach (const QString &importPath, project->importPaths()) { Utils::QtcProcess::addArg(&args, "-I"); Utils::QtcProcess::addArg(&args, importPath); } @@ -165,26 +155,10 @@ QString QmlProjectRunConfiguration::viewerArguments() const QString QmlProjectRunConfiguration::workingDirectory() const { - QFileInfo projectFile(qmlTarget()->qmlProject()->document()->fileName()); + QFileInfo projectFile(target()->project()->document()->fileName()); return canonicalCapsPath(projectFile.absolutePath()); } -int QmlProjectRunConfiguration::qtVersionId() const -{ - return m_qtVersionId; -} - -void QmlProjectRunConfiguration::setQtVersionId(int id) -{ - if (m_qtVersionId == id) - return; - - m_qtVersionId = id; - qmlTarget()->qmlProject()->refresh(QmlProject::Configuration); - if (m_configurationWidget) - m_configurationWidget.data()->updateQtVersionComboBox(); -} - /* QtDeclarative checks explicitly that the capitalization for any URL / path is exactly like the capitalization on disk.*/ QString QmlProjectRunConfiguration::canonicalCapsPath(const QString &fileName) @@ -201,14 +175,7 @@ QString QmlProjectRunConfiguration::canonicalCapsPath(const QString &fileName) QtSupport::BaseQtVersion *QmlProjectRunConfiguration::qtVersion() const { - if (m_qtVersionId == -1) - return 0; - - QtSupport::QtVersionManager *versionManager = QtSupport::QtVersionManager::instance(); - QtSupport::BaseQtVersion *version = versionManager->version(m_qtVersionId); - QTC_ASSERT(version, return 0); - - return version; + return QtSupport::QtProfileInformation::qtVersion(target()->profile()); } QWidget *QmlProjectRunConfiguration::createConfigurationWidget() @@ -220,16 +187,18 @@ QWidget *QmlProjectRunConfiguration::createConfigurationWidget() Utils::OutputFormatter *QmlProjectRunConfiguration::createOutputFormatter() const { - return new QtSupport::QtOutputFormatter(qmlTarget()->qmlProject()); + return new QtSupport::QtOutputFormatter(target()->project()); } QmlProjectRunConfiguration::MainScriptSource QmlProjectRunConfiguration::mainScriptSource() const { - if (!qmlTarget()->qmlProject()->mainFile().isEmpty()) + QmlProject *project = qobject_cast<QmlProject *>(target()->project()); + if (!project) + return FileInEditor; + if (!project->mainFile().isEmpty()) return FileInProjectFile; - if (!m_mainScriptFilename.isEmpty()) { + if (!m_mainScriptFilename.isEmpty()) return FileInSettings; - } return FileInEditor; } @@ -238,12 +207,15 @@ QmlProjectRunConfiguration::MainScriptSource QmlProjectRunConfiguration::mainScr */ QString QmlProjectRunConfiguration::mainScript() const { - if (!qmlTarget()->qmlProject()->mainFile().isEmpty()) { - const QString pathInProject = qmlTarget()->qmlProject()->mainFile(); + QmlProject *project = qobject_cast<QmlProject *>(target()->project()); + if (!project) + return m_currentFileFilename; + if (!project->mainFile().isEmpty()) { + const QString pathInProject = project->mainFile(); if (QFileInfo(pathInProject).isAbsolute()) return pathInProject; else - return qmlTarget()->qmlProject()->projectDir().absoluteFilePath(pathInProject); + return project->projectDir().absoluteFilePath(pathInProject); } if (!m_mainScriptFilename.isEmpty()) @@ -264,7 +236,7 @@ void QmlProjectRunConfiguration::setScriptSource(MainScriptSource source, } else { // FileInSettings m_scriptFile = settingsPath; m_mainScriptFilename - = qmlTarget()->qmlProject()->projectDir().absoluteFilePath(m_scriptFile); + = target()->project()->projectDirectory() + QLatin1Char('/') + m_scriptFile; } updateEnabled(); if (m_configurationWidget) @@ -289,7 +261,6 @@ QVariantMap QmlProjectRunConfiguration::toMap() const { QVariantMap map(ProjectExplorer::RunConfiguration::toMap()); - map.insert(QLatin1String(Constants::QML_VIEWER_QT_KEY), m_qtVersionId); map.insert(QLatin1String(Constants::QML_VIEWER_ARGUMENTS_KEY), m_qmlViewerArgs); map.insert(QLatin1String(Constants::QML_MAINSCRIPT_KEY), m_scriptFile); map.insert(QLatin1String(Constants::USER_ENVIRONMENT_CHANGES_KEY), @@ -299,30 +270,25 @@ QVariantMap QmlProjectRunConfiguration::toMap() const bool QmlProjectRunConfiguration::fromMap(const QVariantMap &map) { - setQtVersionId(map.value(QLatin1String(Constants::QML_VIEWER_QT_KEY), -1).toInt()); m_qmlViewerArgs = map.value(QLatin1String(Constants::QML_VIEWER_ARGUMENTS_KEY)).toString(); m_scriptFile = map.value(QLatin1String(Constants::QML_MAINSCRIPT_KEY), M_CURRENT_FILE).toString(); m_userEnvironmentChanges = Utils::EnvironmentItem::fromStringList( map.value(QLatin1String(Constants::USER_ENVIRONMENT_CHANGES_KEY)).toStringList()); - - updateQtVersions(); - if (m_scriptFile == M_CURRENT_FILE) { + if (m_scriptFile == M_CURRENT_FILE) setScriptSource(FileInEditor); - } else if (m_scriptFile.isEmpty()) { + else if (m_scriptFile.isEmpty()) setScriptSource(FileInProjectFile); - } else { + else setScriptSource(FileInSettings, m_scriptFile); - } return RunConfiguration::fromMap(map); } void QmlProjectRunConfiguration::changeCurrentFile(Core::IEditor *editor) { - if (editor) { + if (editor) m_currentFileFilename = editor->document()->fileName(); - } updateEnabled(); } @@ -341,7 +307,7 @@ void QmlProjectRunConfiguration::updateEnabled() || db->findByFile(mainScript()).type() == QLatin1String("application/x-qmlproject")) { // find a qml file with lowercase filename. This is slow, but only done // in initialization/other border cases. - foreach(const QString &filename, m_projectTarget->qmlProject()->files()) { + foreach (const QString &filename, target()->project()->files(ProjectExplorer::Project::AllFiles)) { const QFileInfo fi(filename); if (!filename.isEmpty() && fi.baseName()[0].isLower() @@ -367,29 +333,6 @@ void QmlProjectRunConfiguration::updateEnabled() emit enabledChanged(); } -void QmlProjectRunConfiguration::updateQtVersions() -{ - QtVersionManager *qtVersions = QtVersionManager::instance(); - - // - // update m_qtVersionId - // - if (!qtVersions->isValidId(m_qtVersionId) - || !isValidVersion(qtVersions->version(m_qtVersionId))) { - int newVersionId = -1; - // take first one you find - foreach (QtSupport::BaseQtVersion *version, qtVersions->validVersions()) { - if (isValidVersion(version)) { - newVersionId = version->uniqueId(); - break; - } - } - setQtVersionId(newVersionId); - } - - updateEnabled(); -} - bool QmlProjectRunConfiguration::isValidVersion(QtSupport::BaseQtVersion *version) { if (version diff --git a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.h b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.h index 97f2975837..a767cb64ba 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.h +++ b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.h @@ -50,14 +50,11 @@ namespace Utils { class EnvironmentItem; } -namespace QtSupport { - class BaseQtVersion; -} +namespace QtSupport { class BaseQtVersion; } namespace QmlProjectManager { namespace Internal { - class QmlProjectTarget; class QmlProjectRunConfigurationFactory; class QmlProjectRunConfigurationWidget; } @@ -68,20 +65,14 @@ class QMLPROJECTMANAGER_EXPORT QmlProjectRunConfiguration : public ProjectExplor friend class Internal::QmlProjectRunConfigurationFactory; friend class Internal::QmlProjectRunConfigurationWidget; - // used in qmldumptool.cpp - Q_PROPERTY(int qtVersionId READ qtVersionId) - public: - QmlProjectRunConfiguration(Internal::QmlProjectTarget *parent); + QmlProjectRunConfiguration(ProjectExplorer::Target *parent); virtual ~QmlProjectRunConfiguration(); - Internal::QmlProjectTarget *qmlTarget() const; - QString viewerPath() const; QString observerPath() const; QString viewerArguments() const; QString workingDirectory() const; - int qtVersionId() const; QtSupport::BaseQtVersion *qtVersion() const; enum MainScriptSource { @@ -110,10 +101,9 @@ public slots: private slots: void updateEnabled(); - void updateQtVersions(); protected: - QmlProjectRunConfiguration(Internal::QmlProjectTarget *parent, + QmlProjectRunConfiguration(ProjectExplorer::Target *parent, QmlProjectRunConfiguration *source); virtual bool fromMap(const QVariantMap &map); void setEnabled(bool value); @@ -121,7 +111,6 @@ protected: private: void ctor(); static bool isValidVersion(QtSupport::BaseQtVersion *version); - void setQtVersionId(int id); static QString canonicalCapsPath(const QString &filePath); @@ -138,7 +127,6 @@ private: QString m_scriptFile; QString m_qmlViewerArgs; - Internal::QmlProjectTarget *m_projectTarget; QWeakPointer<Internal::QmlProjectRunConfigurationWidget> m_configurationWidget; bool m_isEnabled; diff --git a/src/plugins/qmlprojectmanager/qmlprojectrunconfigurationfactory.cpp b/src/plugins/qmlprojectmanager/qmlprojectrunconfigurationfactory.cpp index 877cacf0ed..1704ff0ceb 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectrunconfigurationfactory.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectrunconfigurationfactory.cpp @@ -31,20 +31,21 @@ **************************************************************************/ #include "qmlprojectmanagerconstants.h" +#include "qmlproject.h" #include "qmlprojectrunconfiguration.h" #include "qmlprojectrunconfigurationfactory.h" -#include "qmlprojecttarget.h" +#include <projectexplorer/profileinformation.h> #include <projectexplorer/projectconfiguration.h> #include <projectexplorer/runconfiguration.h> +#include <projectexplorer/target.h> namespace QmlProjectManager { namespace Internal { QmlProjectRunConfigurationFactory::QmlProjectRunConfigurationFactory(QObject *parent) : ProjectExplorer::IRunConfigurationFactory(parent) -{ -} +{ setObjectName(QLatin1String("QmlProjectRunConfigurationFactory")); } QmlProjectRunConfigurationFactory::~QmlProjectRunConfigurationFactory() { @@ -52,7 +53,7 @@ QmlProjectRunConfigurationFactory::~QmlProjectRunConfigurationFactory() QList<Core::Id> QmlProjectRunConfigurationFactory::availableCreationIds(ProjectExplorer::Target *parent) const { - if (!qobject_cast<QmlProjectTarget *>(parent)) + if (!canHandle(parent)) return QList<Core::Id>(); return QList<Core::Id>() << Core::Id(Constants::QML_RC_ID); } @@ -66,7 +67,7 @@ QString QmlProjectRunConfigurationFactory::displayNameForId(const Core::Id id) c bool QmlProjectRunConfigurationFactory::canCreate(ProjectExplorer::Target *parent, const Core::Id id) const { - if (!qobject_cast<QmlProjectTarget *>(parent)) + if (!canHandle(parent)) return false; return id == Core::Id(Constants::QML_RC_ID); } @@ -75,8 +76,7 @@ ProjectExplorer::RunConfiguration *QmlProjectRunConfigurationFactory::create(Pro { if (!canCreate(parent, id)) return 0; - QmlProjectTarget *qmlparent = static_cast<QmlProjectTarget *>(parent); - return new QmlProjectRunConfiguration(qmlparent); + return new QmlProjectRunConfiguration(parent); } bool QmlProjectRunConfigurationFactory::canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const @@ -88,8 +88,7 @@ ProjectExplorer::RunConfiguration *QmlProjectRunConfigurationFactory::restore(Pr { if (!canRestore(parent, map)) return 0; - QmlProjectTarget *qmlparent = static_cast<QmlProjectTarget *>(parent); - QmlProjectRunConfiguration *rc = new QmlProjectRunConfiguration(qmlparent); + QmlProjectRunConfiguration *rc = new QmlProjectRunConfiguration(parent); if (rc->fromMap(map)) return rc; delete rc; @@ -106,8 +105,17 @@ ProjectExplorer::RunConfiguration *QmlProjectRunConfigurationFactory::clone(Proj { if (!canClone(parent, source)) return 0; - QmlProjectTarget *qmlparent = static_cast<QmlProjectTarget *>(parent); - return new QmlProjectRunConfiguration(qmlparent, qobject_cast<QmlProjectRunConfiguration *>(source)); + return new QmlProjectRunConfiguration(parent, qobject_cast<QmlProjectRunConfiguration *>(source)); +} + +bool QmlProjectRunConfigurationFactory::canHandle(ProjectExplorer::Target *parent) const +{ + if (!parent->project()->supportsProfile(parent->profile())) + return false; + if (!qobject_cast<QmlProject *>(parent->project())) + return false; + Core::Id deviceType = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(parent->profile()); + return deviceType == Core::Id(ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE); } } // namespace Internal diff --git a/src/plugins/qmlprojectmanager/qmlprojectrunconfigurationfactory.h b/src/plugins/qmlprojectmanager/qmlprojectrunconfigurationfactory.h index ee2e615dea..8969a35f89 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectrunconfigurationfactory.h +++ b/src/plugins/qmlprojectmanager/qmlprojectrunconfigurationfactory.h @@ -55,6 +55,9 @@ public: ProjectExplorer::RunConfiguration *restore(ProjectExplorer::Target *parent, const QVariantMap &map); bool canClone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration *source) const; ProjectExplorer::RunConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration *source); + +private: + bool canHandle(ProjectExplorer::Target *parent) const; }; } // namespace Internal diff --git a/src/plugins/qmlprojectmanager/qmlprojectrunconfigurationwidget.cpp b/src/plugins/qmlprojectmanager/qmlprojectrunconfigurationwidget.cpp index 8b07a5fe74..886f319ba1 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectrunconfigurationwidget.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectrunconfigurationwidget.cpp @@ -32,7 +32,6 @@ #include "qmlprojectrunconfigurationwidget.h" #include "qmlprojectrunconfiguration.h" -#include "qmlprojecttarget.h" #include "qmlproject.h" #include <coreplugin/helpmanager.h> @@ -40,11 +39,9 @@ #include <projectexplorer/environmentwidget.h> #include <projectexplorer/projectexplorer.h> #include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/target.h> #include <utils/detailswidget.h> #include <utils/environment.h> -#include <utils/qtcassert.h> -#include <qtsupport/qtsupportconstants.h> -#include <qtsupport/qtversionmanager.h> #include <QLineEdit> #include <QComboBox> @@ -54,14 +51,12 @@ #include <QStandardItemModel> using Core::ICore; -using QtSupport::QtVersionManager; namespace QmlProjectManager { namespace Internal { QmlProjectRunConfigurationWidget::QmlProjectRunConfigurationWidget(QmlProjectRunConfiguration *rc) : m_runConfiguration(rc), - m_qtVersionComboBox(0), m_fileListCombo(0), m_fileListModel(new QStandardItemModel(this)) { @@ -86,38 +81,16 @@ QmlProjectRunConfigurationWidget::QmlProjectRunConfigurationWidget(QmlProjectRun connect(ProjectExplorer::ProjectExplorerPlugin::instance(), SIGNAL(fileListChanged()), SLOT(updateFileComboBox())); - m_qtVersionComboBox = new QComboBox; - m_qtVersionComboBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); - connect(m_qtVersionComboBox, SIGNAL(activated(int)), - this, SLOT(onQtVersionSelectionChanged())); - - QPushButton *pushButton = new QPushButton; - pushButton->setText(tr("Manage Qt versions...")); - connect(pushButton, SIGNAL(clicked()), this, SLOT(manageQtVersions())); - - QHBoxLayout *qtVersionLayout = new QHBoxLayout; - qtVersionLayout->addWidget(m_qtVersionComboBox); - qtVersionLayout->addWidget(pushButton); - QLineEdit *qmlViewerArgs = new QLineEdit; qmlViewerArgs->setText(rc->m_qmlViewerArgs); connect(qmlViewerArgs, SIGNAL(textChanged(QString)), this, SLOT(onViewerArgsChanged())); - form->addRow(tr("Qt version:"), qtVersionLayout); form->addRow(tr("Arguments:"), qmlViewerArgs); form->addRow(tr("Main QML file:"), m_fileListCombo); layout->addWidget(detailsWidget); // - // Debugging - // - - QtVersionManager *qtVersions = QtVersionManager::instance(); - connect(qtVersions, SIGNAL(qtVersionsChanged(QList<int>,QList<int>,QList<int>)), - this, SLOT(updateQtVersionComboBox())); - - // // Environment // @@ -145,7 +118,6 @@ QmlProjectRunConfigurationWidget::QmlProjectRunConfigurationWidget(QmlProjectRun layout->addWidget(m_environmentWidget); updateFileComboBox(); - updateQtVersionComboBox(); } static bool caseInsensitiveLessThan(const QString &s1, const QString &s2) @@ -155,8 +127,8 @@ static bool caseInsensitiveLessThan(const QString &s1, const QString &s2) void QmlProjectRunConfigurationWidget::updateFileComboBox() { - QmlProject *project = m_runConfiguration->qmlTarget()->qmlProject(); - QDir projectDir = project->projectDir(); + ProjectExplorer::Project *project = m_runConfiguration->target()->project(); + QDir projectDir(project->projectDirectory()); if (m_runConfiguration->mainScriptSource() == QmlProjectRunConfiguration::FileInProjectFile) { const QString mainScriptInFilePath @@ -172,7 +144,7 @@ void QmlProjectRunConfigurationWidget::updateFileComboBox() m_fileListModel->appendRow(new QStandardItem(CURRENT_FILE)); QModelIndex currentIndex; - QStringList sortedFiles = project->files(); + QStringList sortedFiles = project->files(ProjectExplorer::Project::AllFiles); // make paths relative to project directory QStringList relativeFiles; @@ -216,50 +188,12 @@ void QmlProjectRunConfigurationWidget::setMainScript(int index) } } -void QmlProjectRunConfigurationWidget::onQtVersionSelectionChanged() -{ - QVariant data = m_qtVersionComboBox->itemData(m_qtVersionComboBox->currentIndex()); - QTC_ASSERT(data.isValid() && data.canConvert(QVariant::Int), return); - m_runConfiguration->setQtVersionId(data.toInt()); - m_runConfiguration->updateEnabled(); - m_environmentWidget->setBaseEnvironment(m_runConfiguration->baseEnvironment()); -} - void QmlProjectRunConfigurationWidget::onViewerArgsChanged() { if (QLineEdit *lineEdit = qobject_cast<QLineEdit*>(sender())) m_runConfiguration->m_qmlViewerArgs = lineEdit->text(); } -void QmlProjectRunConfigurationWidget::manageQtVersions() -{ - ICore::showOptionsDialog(ProjectExplorer::Constants::PROJECTEXPLORER_SETTINGS_CATEGORY, - QtSupport::Constants::QTVERSION_SETTINGS_PAGE_ID); -} - -void QmlProjectRunConfigurationWidget::updateQtVersionComboBox() -{ - m_qtVersionComboBox->clear(); - - QtVersionManager *qtVersions = QtVersionManager::instance(); - foreach (QtSupport::BaseQtVersion *version, qtVersions->validVersions()) { - if (m_runConfiguration->isValidVersion(version)) { - m_qtVersionComboBox->addItem(version->displayName(), version->uniqueId()); - } - } - - if (m_runConfiguration->m_qtVersionId != -1) { - int index = m_qtVersionComboBox->findData(m_runConfiguration->m_qtVersionId); - QTC_ASSERT(index >= 0, return); - m_qtVersionComboBox->setCurrentIndex(index); - } else { - m_qtVersionComboBox->addItem(tr("Invalid Qt version"), -1); - m_qtVersionComboBox->setCurrentIndex(0); - } - // Might have edited the qt version or changed e.g. the sysroot of a SymbianQtVersion - m_environmentWidget->setBaseEnvironment(m_runConfiguration->baseEnvironment()); -} - void QmlProjectRunConfigurationWidget::userChangesChanged() { m_runConfiguration->setUserEnvironmentChanges(m_environmentWidget->userChanges()); @@ -270,6 +204,5 @@ void QmlProjectRunConfigurationWidget::userEnvironmentChangesChanged() m_environmentWidget->setUserChanges(m_runConfiguration->userEnvironmentChanges()); } - } // namespace Internal } // namespace QmlProjectManager diff --git a/src/plugins/qmlprojectmanager/qmlprojectrunconfigurationwidget.h b/src/plugins/qmlprojectmanager/qmlprojectrunconfigurationwidget.h index 1bf02cdf88..5acbb95057 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectrunconfigurationwidget.h +++ b/src/plugins/qmlprojectmanager/qmlprojectrunconfigurationwidget.h @@ -59,21 +59,17 @@ public: explicit QmlProjectRunConfigurationWidget(QmlProjectRunConfiguration *rc); public slots: - void updateQtVersionComboBox(); void userEnvironmentChangesChanged(); void updateFileComboBox(); private slots: void setMainScript(int index); - void onQtVersionSelectionChanged(); void onViewerArgsChanged(); void userChangesChanged(); - void manageQtVersions(); private: QmlProjectRunConfiguration *m_runConfiguration; - QComboBox *m_qtVersionComboBox; QComboBox *m_fileListCombo; QStandardItemModel *m_fileListModel; diff --git a/src/plugins/qmlprojectmanager/qmlprojecttarget.cpp b/src/plugins/qmlprojectmanager/qmlprojecttarget.cpp deleted file mode 100644 index c520131433..0000000000 --- a/src/plugins/qmlprojectmanager/qmlprojecttarget.cpp +++ /dev/null @@ -1,158 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. -** -**************************************************************************/ - -#include "qmlprojecttarget.h" - -#include "qmlproject.h" -#include "qmlprojectmanagerconstants.h" -#include "qmlprojectrunconfiguration.h" - -#include <QDebug> -#include <QApplication> -#include <QStyle> - -namespace QmlProjectManager { -namespace Internal { - -QmlProjectTarget::QmlProjectTarget(QmlProject *parent) : - ProjectExplorer::Target(parent, Core::Id(Constants::QML_VIEWER_TARGET_ID)) -{ - setDisplayName(QApplication::translate("QmlProjectManager::QmlTarget", - Constants::QML_VIEWER_TARGET_DISPLAY_NAME, - "QML Viewer target display name")); - setIcon(qApp->style()->standardIcon(QStyle::SP_ComputerIcon)); -} - -QmlProjectTarget::~QmlProjectTarget() -{ -} - -ProjectExplorer::BuildConfigWidget *QmlProjectTarget::createConfigWidget() -{ - return 0; -} - -QmlProject *QmlProjectTarget::qmlProject() const -{ - return static_cast<QmlProject *>(project()); -} - -ProjectExplorer::IBuildConfigurationFactory *QmlProjectTarget::buildConfigurationFactory(void) const -{ - return 0; -} - -bool QmlProjectTarget::fromMap(const QVariantMap &map) -{ - if (!Target::fromMap(map)) - return false; - - if (runConfigurations().isEmpty()) { - qWarning() << "Failed to restore run configuration of QML project!"; - return false; - } - - setDisplayName(QApplication::translate("QmlProjectManager::QmlTarget", - Constants::QML_VIEWER_TARGET_DISPLAY_NAME, - "QML Viewer target display name")); - - return true; -} - -QmlProjectTargetFactory::QmlProjectTargetFactory(QObject *parent) : - ITargetFactory(parent) -{ -} - -QmlProjectTargetFactory::~QmlProjectTargetFactory() -{ -} - -bool QmlProjectTargetFactory::supportsTargetId(const Core::Id id) const -{ - return id == Core::Id(Constants::QML_VIEWER_TARGET_ID); -} - -QList<Core::Id> QmlProjectTargetFactory::supportedTargetIds() const -{ - return QList<Core::Id>() << Core::Id(Constants::QML_VIEWER_TARGET_ID); -} - -QString QmlProjectTargetFactory::displayNameForId(const Core::Id id) const -{ - if (id == Core::Id(Constants::QML_VIEWER_TARGET_ID)) - return QCoreApplication::translate("QmlProjectManager::QmlTarget", - Constants::QML_VIEWER_TARGET_DISPLAY_NAME, - "QML Viewer target display name"); - return QString(); -} - -bool QmlProjectTargetFactory::canCreate(ProjectExplorer::Project *parent, const Core::Id id) const -{ - if (!qobject_cast<QmlProject *>(parent)) - return false; - return id == Core::Id(Constants::QML_VIEWER_TARGET_ID); -} - -QmlProjectTarget *QmlProjectTargetFactory::create(ProjectExplorer::Project *parent, const Core::Id id) -{ - if (!canCreate(parent, id)) - return 0; - QmlProject *qmlproject(static_cast<QmlProject *>(parent)); - QmlProjectTarget *target = new QmlProjectTarget(qmlproject); - - // Add RunConfiguration (QML does not have BuildConfigurations) - QmlProjectRunConfiguration *runConf = new QmlProjectRunConfiguration(target); - target->addRunConfiguration(runConf); - - return target; -} - -bool QmlProjectTargetFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const -{ - return canCreate(parent, ProjectExplorer::idFromMap(map)); -} - -QmlProjectTarget *QmlProjectTargetFactory::restore(ProjectExplorer::Project *parent, const QVariantMap &map) -{ - if (!canRestore(parent, map)) - return 0; - QmlProject *qmlproject(static_cast<QmlProject *>(parent)); - QmlProjectTarget *target(new QmlProjectTarget(qmlproject)); - if (target->fromMap(map)) - return target; - delete target; - return 0; -} - -} // namespace Internal -} // namespace QmlProjectManager diff --git a/src/plugins/qmlprojectmanager/qmlprojecttarget.h b/src/plugins/qmlprojectmanager/qmlprojecttarget.h deleted file mode 100644 index 7359bb81fd..0000000000 --- a/src/plugins/qmlprojectmanager/qmlprojecttarget.h +++ /dev/null @@ -1,89 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. -** -**************************************************************************/ - -#ifndef QMLPROJECTTARGET_H -#define QMLPROJECTTARGET_H - -#include <projectexplorer/target.h> - -#include <QStringList> -#include <QVariantMap> - -namespace QmlProjectManager { -class QmlProject; -class QmlProjectRunConfiguration; - -namespace Internal { - -class QmlProjectTargetFactory; - -class QmlProjectTarget : public ProjectExplorer::Target -{ - Q_OBJECT - friend class QmlProjectTargetFactory; - -public: - explicit QmlProjectTarget(QmlProject *parent); - ~QmlProjectTarget(); - - ProjectExplorer::BuildConfigWidget *createConfigWidget(); - - QmlProject *qmlProject() const; - - ProjectExplorer::IBuildConfigurationFactory *buildConfigurationFactory() const; - -protected: - bool fromMap(const QVariantMap &map); -}; - -class QmlProjectTargetFactory : public ProjectExplorer::ITargetFactory -{ - Q_OBJECT - -public: - explicit QmlProjectTargetFactory(QObject *parent = 0); - ~QmlProjectTargetFactory(); - - bool supportsTargetId(const Core::Id id) const; - QList<Core::Id> supportedTargetIds() const; - QString displayNameForId(const Core::Id id) const; - - bool canCreate(ProjectExplorer::Project *parent, const Core::Id id) const; - QmlProjectTarget *create(ProjectExplorer::Project *parent, const Core::Id id); - bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const; - QmlProjectTarget *restore(ProjectExplorer::Project *parent, const QVariantMap &map); -}; - -} // namespace Internal -} // namespace QmlProjectManager - -#endif // QMLPROJECTTARGET_H diff --git a/src/plugins/qt4projectmanager/buildconfigurationinfo.h b/src/plugins/qt4projectmanager/buildconfigurationinfo.h index 3deb409c6e..bfb4d2e711 100644 --- a/src/plugins/qt4projectmanager/buildconfigurationinfo.h +++ b/src/plugins/qt4projectmanager/buildconfigurationinfo.h @@ -34,56 +34,43 @@ #define BUILDCONFIGURATIONINFO_H #include "qt4projectmanager_global.h" + #include <coreplugin/featureprovider.h> #include <qtsupport/baseqtversion.h> namespace Qt4ProjectManager { -struct QT4PROJECTMANAGER_EXPORT BuildConfigurationInfo { + +class QT4PROJECTMANAGER_EXPORT BuildConfigurationInfo +{ +public: explicit BuildConfigurationInfo() - : qtVersionId(-1), buildConfig(QtSupport::BaseQtVersion::QmakeBuildConfig(0)), importing(false), temporaryQtVersion(0) - {} + : buildConfig(QtSupport::BaseQtVersion::QmakeBuildConfig(0)), importing(false) + { } - explicit BuildConfigurationInfo(int v, QtSupport::BaseQtVersion::QmakeBuildConfigs bc, + explicit BuildConfigurationInfo(QtSupport::BaseQtVersion::QmakeBuildConfigs bc, const QString &aa, const QString &d, bool importing_ = false, - QtSupport::BaseQtVersion *temporaryQtVersion_ = 0, const QString &makefile_ = QString()) - : qtVersionId(v), buildConfig(bc), + : buildConfig(bc), additionalArguments(aa), directory(d), - importing(importing_), temporaryQtVersion(temporaryQtVersion_), + importing(importing_), makefile(makefile_) { } - bool isValid() const - { - return version() != 0; - } - bool operator ==(const BuildConfigurationInfo &other) const { - return qtVersionId == other.qtVersionId - && buildConfig == other.buildConfig + return buildConfig == other.buildConfig && additionalArguments == other.additionalArguments && directory == other.directory && importing == other.importing - && temporaryQtVersion == other.temporaryQtVersion && makefile == other.makefile; } - QtSupport::BaseQtVersion *version() const; - int qtVersionId; QtSupport::BaseQtVersion::QmakeBuildConfigs buildConfig; QString additionalArguments; QString directory; bool importing; - QtSupport::BaseQtVersion *temporaryQtVersion; QString makefile; - - static QList<BuildConfigurationInfo> importBuildConfigurations(const QString &proFilePath); - static QList<BuildConfigurationInfo> checkForBuild(const QString &directory, const QString &proFilePath); - static QList<BuildConfigurationInfo> filterBuildConfigurationInfos(const QList<BuildConfigurationInfo> &infos, Core::Id id); - static QList<BuildConfigurationInfo> filterBuildConfigurationInfos(const QList<BuildConfigurationInfo> &infos, Core::FeatureSet features); - static QList<BuildConfigurationInfo> filterBuildConfigurationInfosByPlatform(const QList<BuildConfigurationInfo> &infos, const QString &platform); }; } // namespace Qt4ProjectManager diff --git a/src/plugins/qt4projectmanager/customwidgetwizard/customwidgetwizarddialog.cpp b/src/plugins/qt4projectmanager/customwidgetwizard/customwidgetwizarddialog.cpp index f0d92d995d..520091e3d6 100644 --- a/src/plugins/qt4projectmanager/customwidgetwizard/customwidgetwizarddialog.cpp +++ b/src/plugins/qt4projectmanager/customwidgetwizard/customwidgetwizarddialog.cpp @@ -35,6 +35,32 @@ #include "customwidgetpluginwizardpage.h" #include "customwidgetwizard.h" +#include <projectexplorer/devicesupport/idevice.h> +#include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/profileinformation.h> +#include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/profileinformation.h> +#include <projectexplorer/profilemanager.h> +#include <qtsupport/qtprofileinformation.h> +#include <qtsupport/qtsupportconstants.h> + +namespace { + +class DesktopQtProfileMatcher : public ProjectExplorer::ProfileMatcher +{ +public: + bool matches(const ProjectExplorer::Profile *p) const + { + ProjectExplorer::IDevice::ConstPtr dev = ProjectExplorer::DeviceProfileInformation::device(p); + if (dev.isNull() || dev->id() != Core::Id(ProjectExplorer::Constants::DESKTOP_DEVICE_ID)) + return false; + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(p); + return version && version->type() == QtSupport::Constants::DESKTOPQT; + } +}; + +} // namespace + namespace Qt4ProjectManager { namespace Internal { @@ -54,8 +80,7 @@ CustomWidgetWizardDialog::CustomWidgetWizardDialog(const QString &templateName, setIntroDescription(tr("This wizard generates a Qt4 Designer Custom Widget " "or a Qt4 Designer Custom Widget Collection project.")); - - addTargetSetupPage(BaseQt4ProjectWizardDialog::desktopTarget()); + addTargetSetupPage(); m_widgetPageId = addPage(m_widgetsPage); m_pluginPageId = addPage(m_pluginPage); wizardProgress()->item(m_widgetPageId)->setTitle(tr("Custom Widgets")); diff --git a/src/plugins/qt4projectmanager/externaleditors.cpp b/src/plugins/qt4projectmanager/externaleditors.cpp index fc02094407..8c0ed398e4 100644 --- a/src/plugins/qt4projectmanager/externaleditors.cpp +++ b/src/plugins/qt4projectmanager/externaleditors.cpp @@ -32,13 +32,14 @@ #include "externaleditors.h" #include "qt4project.h" -#include "qt4target.h" #include "qt4projectmanagerconstants.h" #include "qt4buildconfiguration.h" #include <utils/synchronousprocess.h> #include <projectexplorer/projectexplorer.h> +#include <projectexplorer/target.h> #include <projectexplorer/session.h> +#include <qtsupport/qtprofileinformation.h> #include <qtsupport/qtversionmanager.h> #include <designer/designerconstants.h> @@ -142,12 +143,10 @@ bool ExternalQtEditor::getEditorLaunchData(const QString &fileName, { // Get the binary either from the current Qt version of the project or Path if (const Qt4Project *project = qt4ProjectFor(fileName)) { - if (const Qt4BaseTarget *target = project->activeTarget()) { - if (const Qt4BuildConfiguration *qt4bc = target->activeQt4BuildConfiguration()) { - if (const QtSupport::BaseQtVersion *qtVersion = qt4bc->qtVersion()) { - data->binary = (qtVersion->*commandAccessor)(); - data->workingDirectory = project->projectDirectory(); - } + if (const ProjectExplorer::Target *target = project->activeTarget()) { + if (const QtSupport::BaseQtVersion *qtVersion = QtSupport::QtProfileInformation::qtVersion(target->profile())) { + data->binary = (qtVersion->*commandAccessor)(); + data->workingDirectory = project->projectDirectory(); } } } diff --git a/src/plugins/qt4projectmanager/makestep.cpp b/src/plugins/qt4projectmanager/makestep.cpp index 2afc49d89a..400dbcc37b 100644 --- a/src/plugins/qt4projectmanager/makestep.cpp +++ b/src/plugins/qt4projectmanager/makestep.cpp @@ -34,18 +34,20 @@ #include "ui_makestep.h" #include "qt4project.h" -#include "qt4target.h" #include "qt4nodes.h" #include "qt4buildconfiguration.h" #include "qt4projectmanagerconstants.h" +#include <projectexplorer/target.h> #include <projectexplorer/toolchain.h> #include <projectexplorer/buildsteplist.h> #include <projectexplorer/projectexplorer.h> #include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/profileinformation.h> #include <extensionsystem/pluginmanager.h> #include <utils/qtcprocess.h> #include <qtsupport/qtparser.h> +#include <qtsupport/qtprofileinformation.h> #include <QDir> #include <QFileInfo> @@ -152,11 +154,13 @@ bool MakeStep::init() return false; } - if (!bc->toolChain()) { + ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(target()->profile()); + if (!tc) { m_tasks.append(ProjectExplorer::Task(ProjectExplorer::Task::Error, - tr("Qt Creator needs a tool chain set up to build. Configure a tool chain in Project mode."), + tr("Qt Creator needs a tool chain set up to build. Configure a tool chain the profile options."), Utils::FileName(), -1, Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM))); + return false; } ProjectExplorer::ProcessParameters *pp = processParameters(); @@ -169,7 +173,7 @@ bool MakeStep::init() workingDirectory = bc->buildDirectory(); pp->setWorkingDirectory(workingDirectory); - QString makeCmd = bc->makeCommand(); + QString makeCmd = tc->makeCommand(); if (!m_makeCmd.isEmpty()) makeCmd = m_makeCmd; pp->setCommand(makeCmd); @@ -181,8 +185,6 @@ bool MakeStep::init() QString args; - ProjectExplorer::ToolChain *toolchain = bc->toolChain(); - Qt4ProjectManager::Qt4ProFileNode *subNode = bc->subNodeBuild(); if (subNode) { QString makefile = subNode->makefile(); @@ -245,12 +247,11 @@ bool MakeStep::init() // so we only do it for unix and if the user didn't override the make command // but for now this is the least invasive change // We also prepend "L" to the MAKEFLAGS, so that nmake / jom are less verbose - ProjectExplorer::ToolChain *toolChain = bc->toolChain(); - if (toolChain && m_makeCmd.isEmpty()) { - if (toolChain->targetAbi().binaryFormat() != ProjectExplorer::Abi::PEFormat ) + if (tc && m_makeCmd.isEmpty()) { + if (tc->targetAbi().binaryFormat() != ProjectExplorer::Abi::PEFormat ) Utils::QtcProcess::addArg(&args, QLatin1String("-w")); - if (toolChain->targetAbi().os() == ProjectExplorer::Abi::WindowsOS - && toolChain->targetAbi().osFlavor() != ProjectExplorer::Abi::WindowsMSysFlavor) { + if (tc->targetAbi().os() == ProjectExplorer::Abi::WindowsOS + && tc->targetAbi().osFlavor() != ProjectExplorer::Abi::WindowsMSysFlavor) { const QString makeFlags = QLatin1String("MAKEFLAGS"); env.set(makeFlags, QLatin1Char('L') + env.value(makeFlags)); } @@ -260,20 +261,21 @@ bool MakeStep::init() pp->setArguments(args); ProjectExplorer::IOutputParser *parser = 0; - if (bc->qtVersion()) - parser = bc->qtVersion()->createOutputParser(); + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(target()->profile()); + if (version) + parser = version->createOutputParser(); if (parser) parser->appendOutputParser(new QtSupport::QtParser); else parser = new QtSupport::QtParser; - if (toolchain) - parser->appendOutputParser(toolchain->outputParser()); + if (tc) + parser->appendOutputParser(tc->outputParser()); parser->setWorkingDirectory(workingDirectory); setOutputParser(parser); - m_scriptTarget = (bc->qt4Target()->qt4Project()->rootQt4ProjectNode()->projectType() == ScriptTemplate); + m_scriptTarget = (static_cast<Qt4Project *>(bc->target()->project())->rootQt4ProjectNode()->projectType() == ScriptTemplate); return AbstractProcessStep::init(); } @@ -351,7 +353,6 @@ MakeStepConfigWidget::MakeStepConfigWidget(MakeStep *makeStep) m_ui->makePathChooser->setPath(makeCmd); m_ui->makeArgumentsLineEdit->setText(m_makeStep->userArguments()); - updateMakeOverrideLabel(); updateDetails(); connect(m_ui->makePathChooser, SIGNAL(changed(QString)), @@ -365,7 +366,7 @@ MakeStepConfigWidget::MakeStepConfigWidget(MakeStep *makeStep) ProjectExplorer::BuildConfiguration *bc = makeStep->buildConfiguration(); if (!bc) { // That means the step is in the deploylist, so we listen to the active build config - // changed signal and update various things in return + // changed signal and react to the buildDirectoryChanged() signal of the buildconfiguration bc = makeStep->target()->activeBuildConfiguration(); m_bc = bc; connect (makeStep->target(), SIGNAL(activeBuildConfigurationChanged(ProjectExplorer::BuildConfiguration*)), @@ -375,17 +376,11 @@ MakeStepConfigWidget::MakeStepConfigWidget(MakeStep *makeStep) if (bc) { connect(bc, SIGNAL(buildDirectoryChanged()), this, SLOT(updateDetails())); - connect(bc, SIGNAL(toolChainChanged()), - this, SLOT(updateDetails())); - - connect(bc, SIGNAL(qtVersionChanged()), - this, SLOT(qtVersionChanged())); } connect(ProjectExplorer::ProjectExplorerPlugin::instance(), SIGNAL(settingsChanged()), - this, SLOT(updateMakeOverrideLabel())); - connect(ProjectExplorer::ProjectExplorerPlugin::instance(), SIGNAL(settingsChanged()), this, SLOT(updateDetails())); + connect(m_makeStep->target(), SIGNAL(profileChanged()), this, SLOT(updateDetails())); } void MakeStepConfigWidget::activeBuildConfigurationChanged() @@ -393,62 +388,55 @@ void MakeStepConfigWidget::activeBuildConfigurationChanged() if (m_bc) { disconnect(m_bc, SIGNAL(buildDirectoryChanged()), this, SLOT(updateDetails())); - disconnect(m_bc, SIGNAL(toolChainChanged()), - this, SLOT(updateDetails())); - - disconnect(m_bc, SIGNAL(qtVersionChanged()), - this, SLOT(qtVersionChanged())); } m_bc = m_makeStep->target()->activeBuildConfiguration(); - updateMakeOverrideLabel(); updateDetails(); if (m_bc) { connect(m_bc, SIGNAL(buildDirectoryChanged()), this, SLOT(updateDetails())); - connect(m_bc, SIGNAL(toolChainChanged()), - this, SLOT(updateDetails())); - - connect(m_bc, SIGNAL(qtVersionChanged()), - this, SLOT(qtVersionChanged())); } } -MakeStepConfigWidget::~MakeStepConfigWidget() +void MakeStepConfigWidget::setSummaryText(const QString &text) { - delete m_ui; + if (text == m_summaryText) + return; + m_summaryText = text; + emit updateSummary(); } -void MakeStepConfigWidget::qtVersionChanged() +MakeStepConfigWidget::~MakeStepConfigWidget() { - updateMakeOverrideLabel(); - updateDetails(); + delete m_ui; } -void MakeStepConfigWidget::updateMakeOverrideLabel() +void MakeStepConfigWidget::updateDetails() { - Qt4BuildConfiguration *bc = m_makeStep->qt4BuildConfiguration(); - if (!bc) - bc = qobject_cast<Qt4BuildConfiguration *>(m_makeStep->target()->activeBuildConfiguration()); - if (bc) - m_ui->makeLabel->setText(tr("Override %1:").arg(bc->makeCommand())); + ProjectExplorer::ToolChain *tc + = ProjectExplorer::ToolChainProfileInformation::toolChain(m_makeStep->target()->profile()); + if (tc) + m_ui->makeLabel->setText(tr("Override %1:").arg(tc->makeCommand())); else m_ui->makeLabel->setText(tr("Make:")); -} -void MakeStepConfigWidget::updateDetails() -{ + if (!tc) { + setSummaryText(tr("<b>Make:</b> No tool chain set in profile.")); + return; + } Qt4BuildConfiguration *bc = m_makeStep->qt4BuildConfiguration(); if (!bc) bc = qobject_cast<Qt4BuildConfiguration *>(m_makeStep->target()->activeBuildConfiguration()); - if (!bc) - m_summaryText = tr("No Qt4 build configuration."); // Can't happen + if (!bc) { + setSummaryText(tr("<b>Make:</b> No Qt4 build configuration.")); + return; + } ProjectExplorer::ProcessParameters param; param.setMacroExpander(bc->macroExpander()); param.setWorkingDirectory(bc->buildDirectory()); - QString makeCmd = bc->makeCommand(); + QString makeCmd = tc->makeCommand(); if (!m_makeStep->makeCommand().isEmpty()) makeCmd = m_makeStep->makeCommand(); param.setCommand(makeCmd); @@ -469,23 +457,22 @@ void MakeStepConfigWidget::updateDetails() // so we only do it for unix and if the user didn't override the make command // but for now this is the least invasive change // We also prepend "L" to the MAKEFLAGS, so that nmake / jom are less verbose - ProjectExplorer::ToolChain *toolChain = bc->toolChain(); - if (toolChain && m_makeStep->makeCommand().isEmpty()) { - if (toolChain->targetAbi().binaryFormat() != ProjectExplorer::Abi::PEFormat ) + if (tc && m_makeStep->makeCommand().isEmpty()) { + if (tc->targetAbi().binaryFormat() != ProjectExplorer::Abi::PEFormat ) Utils::QtcProcess::addArg(&args, QLatin1String("-w")); - if (toolChain->targetAbi().os() == ProjectExplorer::Abi::WindowsOS - && toolChain->targetAbi().osFlavor() != ProjectExplorer::Abi::WindowsMSysFlavor) { + if (tc->targetAbi().os() == ProjectExplorer::Abi::WindowsOS + && tc->targetAbi().osFlavor() != ProjectExplorer::Abi::WindowsMSysFlavor) { const QString makeFlags = QLatin1String("MAKEFLAGS"); env.set(makeFlags, QLatin1Char('L') + env.value(makeFlags)); } } param.setArguments(args); param.setEnvironment(env); - m_summaryText = param.summaryInWorkdir(displayName()); if (param.commandMissing()) - m_summaryText = tr("<b>Make:</b> %1 not found in the environment.").arg(makeCmd); // Override display text - emit updateSummary(); + setSummaryText(tr("<b>Make:</b> %1 not found in the environment.").arg(makeCmd)); // Override display text + else + setSummaryText(param.summaryInWorkdir(displayName())); } QString MakeStepConfigWidget::summaryText() const diff --git a/src/plugins/qt4projectmanager/makestep.h b/src/plugins/qt4projectmanager/makestep.h index b902b8b5c7..64662e83d7 100644 --- a/src/plugins/qt4projectmanager/makestep.h +++ b/src/plugins/qt4projectmanager/makestep.h @@ -136,12 +136,12 @@ private slots: void makeEdited(); void makeArgumentsLineEdited(); - void updateMakeOverrideLabel(); void updateDetails(); void userArgumentsChanged(); - void qtVersionChanged(); void activeBuildConfigurationChanged(); private: + void setSummaryText(const QString &text); + Internal::Ui::MakeStep *m_ui; MakeStep *m_makeStep; QString m_summaryText; diff --git a/src/plugins/qt4projectmanager/qmakeprofileconfigwidget.cpp b/src/plugins/qt4projectmanager/qmakeprofileconfigwidget.cpp new file mode 100644 index 0000000000..bfb8439296 --- /dev/null +++ b/src/plugins/qt4projectmanager/qmakeprofileconfigwidget.cpp @@ -0,0 +1,89 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. +** +**************************************************************************/ + +#include "qmakeprofileconfigwidget.h" + +#include "qt4projectmanagerconstants.h" +#include "qmakeprofileinformation.h" + +#include <coreplugin/icore.h> +#include <projectexplorer/projectexplorerconstants.h> + +#include <QHBoxLayout> +#include <QLineEdit> + +namespace Qt4ProjectManager { +namespace Internal { + +QmakeProfileConfigWidget::QmakeProfileConfigWidget(ProjectExplorer::Profile *p, + QWidget *parent) : + ProjectExplorer::ProfileConfigWidget(parent), + m_profile(p), + m_lineEdit(new QLineEdit) +{ + QHBoxLayout *layout = new QHBoxLayout(this); + layout->setMargin(0); + + m_lineEdit->setContentsMargins(0, 0, 0, 0); + layout->addWidget(m_lineEdit); + + discard(); // set up everything according to profile + connect(m_lineEdit, SIGNAL(textEdited(QString)), this, SIGNAL(dirty())); +} + +QString QmakeProfileConfigWidget::displayName() const +{ + return tr("Mkspec:"); +} + +void QmakeProfileConfigWidget::makeReadOnly() +{ + m_lineEdit->setEnabled(false); +} + +void QmakeProfileConfigWidget::apply() +{ + QmakeProfileInformation::setMkspec(m_profile, Utils::FileName::fromString(m_lineEdit->text())); +} + +void QmakeProfileConfigWidget::discard() +{ + m_lineEdit->setText(QmakeProfileInformation::mkspec(m_profile).toString()); +} + +bool QmakeProfileConfigWidget::isDirty() const +{ + return m_lineEdit->text() != QmakeProfileInformation::mkspec(m_profile).toString(); +} + +} // namespace Internal +} // namespace Qt4ProjectManager diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortarget.h b/src/plugins/qt4projectmanager/qmakeprofileconfigwidget.h index 0815c724fc..b4bda7b1b0 100644 --- a/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortarget.h +++ b/src/plugins/qt4projectmanager/qmakeprofileconfigwidget.h @@ -30,38 +30,43 @@ ** **************************************************************************/ -#ifndef QT4SIMULATORTARGET_H -#define QT4SIMULATORTARGET_H +#ifndef QT4PM_QMAKEPROFILECONFIGWIDGET_H +#define QT4PM_QMAKEPROFILECONFIGWIDGET_H -#include "qt4target.h" +#include <projectexplorer/profileconfigwidget.h> -namespace Qt4ProjectManager { +QT_FORWARD_DECLARE_CLASS(QLineEdit) + +namespace ProjectExplorer { class Profile; } -class Qt4Project; -class Qt4BuildConfigurationFactory; +namespace Qt4ProjectManager { +class BaseQtVersion; namespace Internal { -class Qt4SimulatorTarget : public Qt4BaseTarget +class QmakeProfileConfigWidget : public ProjectExplorer::ProfileConfigWidget { - friend class Qt4SimulatorTargetFactory; Q_OBJECT + public: - Qt4SimulatorTarget(Qt4Project *parent, const Core::Id id); - ~Qt4SimulatorTarget(); + QmakeProfileConfigWidget(ProjectExplorer::Profile *p, QWidget *parent = 0); - ProjectExplorer::IBuildConfigurationFactory *buildConfigurationFactory() const; + QString displayName() const; - void createApplicationProFiles(bool reparse); - QList<ProjectExplorer::RunConfiguration *> runConfigurationsForNode(ProjectExplorer::Node *n); + void makeReadOnly(); - static QString defaultDisplayName(); + void apply(); + void discard(); + bool isDirty() const; private: - Qt4BuildConfigurationFactory *m_buildConfigurationFactory; + int findQtVersion(const int id) const; + + ProjectExplorer::Profile *m_profile; + QLineEdit *m_lineEdit; }; } // namespace Internal -} // namespace Qt4ProjectManager +} // namespace Debugger -#endif // QT4SIMULATORTARGET_H +#endif // QT4PM_QMAKEPROFILECONFIGWIDGET_H diff --git a/src/plugins/qt4projectmanager/qmakeprofileinformation.cpp b/src/plugins/qt4projectmanager/qmakeprofileinformation.cpp new file mode 100644 index 0000000000..348e939c31 --- /dev/null +++ b/src/plugins/qt4projectmanager/qmakeprofileinformation.cpp @@ -0,0 +1,123 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. +** +**************************************************************************/ + +#include "qmakeprofileinformation.h" + +#include "qmakeprofileinformation.h" +#include "qmakeprofileconfigwidget.h" + +#include <projectexplorer/projectexplorerconstants.h> + +#include <qtsupport/baseqtversion.h> +#include <qtsupport/qtprofileinformation.h> + +namespace Qt4ProjectManager { +namespace Internal { +const char MKSPEC_INFORMATION[] = "QtPM4.mkSpecInformation"; +} // namespace Internal + +QmakeProfileInformation::QmakeProfileInformation() +{ + setObjectName(QLatin1String("QmakeProfileInformation")); +} + +Core::Id QmakeProfileInformation::dataId() const +{ + static Core::Id id = Core::Id(Internal::MKSPEC_INFORMATION); + return id; +} + +unsigned int QmakeProfileInformation::priority() const +{ + return 24000; +} + +QVariant QmakeProfileInformation::defaultValue(ProjectExplorer::Profile *p) const +{ + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(p); + if (!version) // No version, so no qmake + return QString(); + + ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(p); + + const QList<Utils::FileName> tcSpecList = tc ? tc->suggestedMkspecList() : QList<Utils::FileName>(); + foreach (const Utils::FileName &tcSpec, tcSpecList) { + if (version->hasMkspec(tcSpec)) + return tcSpec.toString(); + } + + return version ? version->mkspec().toString() : QString(); +} + +QList<ProjectExplorer::Task> QmakeProfileInformation::validate(ProjectExplorer::Profile *p) const +{ + QList<ProjectExplorer::Task> result; + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(p); + + Utils::FileName mkspec = QmakeProfileInformation::mkspec(p); + if (!version && !mkspec.isEmpty()) + result << ProjectExplorer::Task(ProjectExplorer::Task::Warning, + tr("No Qt version set, so mkspec is ignored."), + Utils::FileName(), -1, + Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM)); + if (version && !version->hasMkspec(mkspec)) + result << ProjectExplorer::Task(ProjectExplorer::Task::Error, + tr("Mkspec not found for Qt version."), + Utils::FileName(), -1, + Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM)); + return result; +} + +ProjectExplorer::ProfileConfigWidget * +QmakeProfileInformation::createConfigWidget(ProjectExplorer::Profile *p) const +{ + return new Internal::QmakeProfileConfigWidget(p); +} + +ProjectExplorer::ProfileInformation::ItemList QmakeProfileInformation::toUserOutput(ProjectExplorer::Profile *p) const +{ + return ItemList() << qMakePair(tr("mkspec"), mkspec(p).toUserOutput()); +} + +Utils::FileName QmakeProfileInformation::mkspec(const ProjectExplorer::Profile *p) +{ + if (!p) + return Utils::FileName(); + return Utils::FileName::fromString(p->value(Core::Id(Internal::MKSPEC_INFORMATION)).toString()); +} + +void QmakeProfileInformation::setMkspec(ProjectExplorer::Profile *p, const Utils::FileName &fn) +{ + p->setValue(Core::Id(Internal::MKSPEC_INFORMATION), fn.toString()); +} + +} // namespace Qt4ProjectManager diff --git a/src/plugins/qt4projectmanager/qmakeprofileinformation.h b/src/plugins/qt4projectmanager/qmakeprofileinformation.h new file mode 100644 index 0000000000..013f102e49 --- /dev/null +++ b/src/plugins/qt4projectmanager/qmakeprofileinformation.h @@ -0,0 +1,67 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. +** +**************************************************************************/ + +#ifndef QT4PM_QMAKEPROFILEINFORMATION_H +#define QT4PM_QMAKEPROFILEINFORMATION_H + +#include "qt4projectmanager_global.h" + +#include <projectexplorer/profilemanager.h> + +namespace Qt4ProjectManager { + +class QT4PROJECTMANAGER_EXPORT QmakeProfileInformation : public ProjectExplorer::ProfileInformation +{ + Q_OBJECT + +public: + QmakeProfileInformation(); + + Core::Id dataId() const; + + unsigned int priority() const; // the higher the closer to the top. + + QVariant defaultValue(ProjectExplorer::Profile *p) const; + + QList<ProjectExplorer::Task> validate(ProjectExplorer::Profile *p) const; + + ProjectExplorer::ProfileConfigWidget *createConfigWidget(ProjectExplorer::Profile *p) const; + + ItemList toUserOutput(ProjectExplorer::Profile *p) const; + + static Utils::FileName mkspec(const ProjectExplorer::Profile *p); + static void setMkspec(ProjectExplorer::Profile *p, const Utils::FileName &fn); +}; + +} // namespace Qt4ProjectManager + +#endif // QT4PM_QMAKEPROFILEINFORMATION_H diff --git a/src/plugins/qt4projectmanager/qmakerunconfigurationfactory.cpp b/src/plugins/qt4projectmanager/qmakerunconfigurationfactory.cpp new file mode 100644 index 0000000000..4844d237eb --- /dev/null +++ b/src/plugins/qt4projectmanager/qmakerunconfigurationfactory.cpp @@ -0,0 +1,73 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. +** +**************************************************************************/ + +#include "qmakerunconfigurationfactory.h" + +#include <extensionsystem/pluginmanager.h> +#include <projectexplorer/target.h> +#include <qtsupport/customexecutablerunconfiguration.h> + +namespace Qt4ProjectManager { + +QmakeRunConfigurationFactory::QmakeRunConfigurationFactory(QObject *parent) : + ProjectExplorer::IRunConfigurationFactory(parent) +{ } + +QmakeRunConfigurationFactory *QmakeRunConfigurationFactory::find(ProjectExplorer::Target *t) +{ + if (!t) + return 0; + + QList<QmakeRunConfigurationFactory *> factories + = ExtensionSystem::PluginManager::instance()->getObjects<QmakeRunConfigurationFactory>(); + foreach (QmakeRunConfigurationFactory *factory, factories) { + if (factory->canHandle(t)) + return factory; + } + return 0; +} + +void QmakeRunConfigurationFactory::removeUnconfiguredCustomExectutableRunConfigurations(ProjectExplorer::Target *t) +{ + QList<ProjectExplorer::RunConfiguration*> toRemove; + // Remove all run configurations which the new project wizard created + foreach (ProjectExplorer::RunConfiguration * rc, t->runConfigurations()) { + QtSupport::CustomExecutableRunConfiguration *cerc + = qobject_cast<QtSupport::CustomExecutableRunConfiguration *>(rc); + if (cerc && !cerc->isConfigured()) + toRemove.append(rc); + } + foreach (ProjectExplorer::RunConfiguration *rc, toRemove) + t->removeRunConfiguration(rc); +} + +} // namespace Qt4ProjectManager diff --git a/src/plugins/qt4projectmanager/qt-s60/qt4symbiantarget.h b/src/plugins/qt4projectmanager/qmakerunconfigurationfactory.h index 1b356a5dde..373341b922 100644 --- a/src/plugins/qt4projectmanager/qt-s60/qt4symbiantarget.h +++ b/src/plugins/qt4projectmanager/qmakerunconfigurationfactory.h @@ -30,41 +30,34 @@ ** **************************************************************************/ -#ifndef QT4SYMBIANTARGET_H -#define QT4SYMBIANTARGET_H +#ifndef QMAKERUNCONFIGURATIONFACTORY_H +#define QMAKERUNCONFIGURATIONFACTORY_H -#include "qt4target.h" +#include "qt4projectmanager_global.h" -#include <QPixmap> +#include <projectexplorer/runconfiguration.h> -namespace Qt4ProjectManager { -class Qt4Project; -class Qt4BuildConfigurationFactory; -namespace Internal { +namespace ProjectExplorer { class Node; } +namespace Qt4ProjectManager { -class Qt4SymbianTarget : public Qt4BaseTarget +class QT4PROJECTMANAGER_EXPORT QmakeRunConfigurationFactory : public ProjectExplorer::IRunConfigurationFactory { - friend class Qt4SymbianTargetFactory; // for from Map Q_OBJECT -public: - Qt4SymbianTarget(Qt4Project *parent, const Core::Id id); - ~Qt4SymbianTarget(); - ProjectExplorer::IBuildConfigurationFactory *buildConfigurationFactory() const; +public: + explicit QmakeRunConfigurationFactory(QObject *parent = 0); - void createApplicationProFiles(bool reparse); - virtual QList<ProjectExplorer::RunConfiguration *> runConfigurationsForNode(ProjectExplorer::Node *n); + virtual bool canHandle(ProjectExplorer::Target *t) const = 0; + virtual QList<ProjectExplorer::RunConfiguration *> runConfigurationsForNode(ProjectExplorer::Target *t, + ProjectExplorer::Node *n) = 0; - static QString defaultDisplayName(const Core::Id id); - static QIcon iconForId(Core::Id id); + static QmakeRunConfigurationFactory *find(ProjectExplorer::Target *t); protected: - ProjectExplorer::IDevice::ConstPtr currentDevice() const; - -private: - Qt4BuildConfigurationFactory *m_buildConfigurationFactory; + void removeUnconfiguredCustomExectutableRunConfigurations(ProjectExplorer::Target *t); }; -} // namespace Internal -} // namespace Qt4ProjectManager -#endif // QT4SYMBIANTARGET_H + +} // Qt4ProjectManager + +#endif // QMAKERUNCONFIGURATIONFACTORY_H diff --git a/src/plugins/qt4projectmanager/qmakestep.cpp b/src/plugins/qt4projectmanager/qmakestep.cpp index 365be43db7..4af5f7de27 100644 --- a/src/plugins/qt4projectmanager/qmakestep.cpp +++ b/src/plugins/qt4projectmanager/qmakestep.cpp @@ -39,19 +39,21 @@ #include "qt4project.h" #include "qt4projectmanagerconstants.h" #include "qt4projectmanager.h" -#include "qt4target.h" +#include "qmakeprofileinformation.h" #include "qt4nodes.h" -#include "qt4basetargetfactory.h" #include <projectexplorer/buildmanager.h> #include <projectexplorer/buildsteplist.h> #include <projectexplorer/projectexplorer.h> +#include <projectexplorer/profileinformation.h> +#include <projectexplorer/target.h> #include <projectexplorer/toolchain.h> #include <coreplugin/icore.h> #include <coreplugin/mainwindow.h> #include <coreplugin/progressmanager/progressmanager.h> #include <coreplugin/messagemanager.h> +#include <qtsupport/qtprofileinformation.h> #include <qtsupport/qtversionmanager.h> #include <qtsupport/debugginghelperbuildtask.h> #include <utils/qtcassert.h> @@ -169,9 +171,9 @@ QString QMakeStep::allArguments(bool shorted) /// QMAKE_VAR_QMLJSDEBUGGER_PATH QStringList QMakeStep::deducedArguments() { - Qt4BuildConfiguration *bc = qt4BuildConfiguration(); QStringList arguments; - ProjectExplorer::ToolChain *tc = bc->toolChain(); + ProjectExplorer::ToolChain *tc + = ProjectExplorer::ToolChainProfileInformation::toolChain(target()->profile()); ProjectExplorer::Abi targetAbi; if (tc) targetAbi = tc->targetAbi(); @@ -197,16 +199,16 @@ QStringList QMakeStep::deducedArguments() } } - const QtSupport::BaseQtVersion *qtVersion = bc->qtVersion(); - if (linkQmlDebuggingLibrary() && qtVersion) { - if (!qtVersion->needsQmlDebuggingLibrary()) { + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(target()->profile()); + if (linkQmlDebuggingLibrary() && version) { + if (!version->needsQmlDebuggingLibrary()) { // This Qt version has the QML debugging services built in, however // they still need to be enabled at compile time - arguments << (qtVersion->qtVersion().majorVersion >= 5 ? + arguments << (version->qtVersion().majorVersion >= 5 ? QLatin1String(Constants::QMAKEVAR_DECLARATIVE_DEBUG5) : QLatin1String(Constants::QMAKEVAR_DECLARATIVE_DEBUG4)); } else { - const QString qmlDebuggingHelperLibrary = qtVersion->qmlDebuggingHelperLibrary(true); + const QString qmlDebuggingHelperLibrary = version->qmlDebuggingHelperLibrary(true); if (!qmlDebuggingHelperLibrary.isEmpty()) { // Do not turn debugger path into native path separators: Qmake does not like that! const QString debuggingHelperPath @@ -225,8 +227,8 @@ QStringList QMakeStep::deducedArguments() /// -after OBJECTS_DIR, MOC_DIR, UI_DIR, RCC_DIR QStringList QMakeStep::deducedArgumentsAfter() { - Qt4BuildConfiguration *bc = qt4BuildConfiguration(); - if (bc->qtVersion() && !bc->qtVersion()->supportsShadowBuilds()) { + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(target()->profile()); + if (version && version->supportsShadowBuilds()) { // We have a target which does not allow shadow building. // But we really don't want to have the build artefacts in the source dir // so we try to hack around it, to make the common cases work. @@ -244,7 +246,7 @@ QStringList QMakeStep::deducedArgumentsAfter() bool QMakeStep::init() { Qt4BuildConfiguration *qt4bc = qt4BuildConfiguration(); - const QtSupport::BaseQtVersion *qtVersion = qt4bc->qtVersion(); + const QtSupport::BaseQtVersion *qtVersion = QtSupport::QtProfileInformation::qtVersion(target()->profile()); if (!qtVersion) return false; @@ -262,11 +264,10 @@ bool QMakeStep::init() QString makefile = workingDirectory; if (qt4bc->subNodeBuild()) { - if (!qt4bc->subNodeBuild()->makefile().isEmpty()) { + if (!qt4bc->subNodeBuild()->makefile().isEmpty()) makefile.append(qt4bc->subNodeBuild()->makefile()); - } else { + else makefile.append(QLatin1String("/Makefile")); - } } else if (!qt4bc->makefile().isEmpty()) { makefile.append(QLatin1Char('/')); makefile.append(qt4bc->makefile()); @@ -275,14 +276,7 @@ bool QMakeStep::init() } // Check whether we need to run qmake - bool makefileOutDated = true; - if (QFileInfo(makefile).exists()) { - Utils::FileName qmakePath = QtSupport::QtVersionManager::findQMakeBinaryFromMakefile(makefile); - if (qtVersion->qmakeCommand() == qmakePath) { - makefileOutDated = !qt4bc->compareToImportFrom(makefile); - } - } - + bool makefileOutDated = (qt4bc->compareToImportFrom(makefile) != Qt4BuildConfiguration::MakefileMatches); if (m_forced || makefileOutDated) m_needToRunQMake = true; m_forced = false; @@ -296,16 +290,12 @@ bool QMakeStep::init() setOutputParser(new QMakeParser); - Qt4ProFileNode *node = qt4bc->qt4Target()->qt4Project()->rootQt4ProjectNode(); + Qt4ProFileNode *node = static_cast<Qt4Project *>(qt4bc->target()->project())->rootQt4ProjectNode(); if (qt4bc->subNodeBuild()) node = qt4bc->subNodeBuild(); QString proFile = node->path(); - QtSupport::BaseQtVersion *version = qt4BuildConfiguration()->qtVersion(); - m_tasks = version->reportIssues(proFile, workingDirectory); - - foreach (Qt4BaseTargetFactory *factory, Qt4BaseTargetFactory::qt4BaseTargetFactoriesForIds(version->supportedTargetIds().toList())) - m_tasks.append(factory->reportIssues(proFile)); + m_tasks = qtVersion->reportIssues(proFile, workingDirectory); qSort(m_tasks); m_scriptTemplate = node->projectType() == ScriptTemplate; @@ -387,12 +377,12 @@ void QMakeStep::setUserArguments(const QString &arguments) emit userArgumentsChanged(); qt4BuildConfiguration()->emitQMakeBuildConfigurationChanged(); - qt4BuildConfiguration()->emitProFileEvaluateNeeded(); + qt4BuildConfiguration()->emitEvaluateBuildSystem(); } bool QMakeStep::isQmlDebuggingLibrarySupported(QString *reason) const { - QtSupport::BaseQtVersion *version = qt4BuildConfiguration()->qtVersion(); + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(target()->profile()); if (!version) { if (reason) *reason = tr("No Qt version."); @@ -403,7 +393,7 @@ bool QMakeStep::isQmlDebuggingLibrarySupported(QString *reason) const return true; if (!version->qtAbis().isEmpty()) { - ProjectExplorer::Abi abi = qt4BuildConfiguration()->qtVersion()->qtAbis().first(); + ProjectExplorer::Abi abi = version->qtAbis().first(); if (abi.osFlavor() == ProjectExplorer::Abi::MaemoLinuxFlavor) { if (reason) reason->clear(); @@ -449,7 +439,7 @@ void QMakeStep::setLinkQmlDebuggingLibrary(bool enable) emit linkQmlDebuggingLibraryChanged(); qt4BuildConfiguration()->emitQMakeBuildConfigurationChanged(); - qt4BuildConfiguration()->emitProFileEvaluateNeeded(); + qt4BuildConfiguration()->emitEvaluateBuildSystem(); } QStringList QMakeStep::parserArguments() @@ -468,7 +458,6 @@ QString QMakeStep::userArguments() Utils::FileName QMakeStep::mkspec() { - Qt4BuildConfiguration *bc = qt4BuildConfiguration(); QString additionalArguments = m_userArgs; for (Utils::QtcProcess::ArgIterator ait(&additionalArguments); ait.next(); ) { if (ait.value() == QLatin1String("-spec")) { @@ -477,7 +466,7 @@ Utils::FileName QMakeStep::mkspec() } } - return static_cast<Qt4BaseTarget *>(target())->mkspec(bc); + return Qt4ProjectManager::QmakeProfileInformation::mkspec(target()->profile()); } QVariantMap QMakeStep::toMap() const @@ -538,14 +527,9 @@ QMakeStepConfigWidget::QMakeStepConfigWidget(QMakeStep *step) this, SLOT(userArgumentsChanged())); connect(step, SIGNAL(linkQmlDebuggingLibraryChanged()), this, SLOT(linkQmlDebuggingLibraryChanged())); - connect(step->qt4BuildConfiguration(), SIGNAL(qtVersionChanged()), - this, SLOT(qtVersionChanged())); - connect(step->qt4BuildConfiguration(), SIGNAL(toolChainChanged()), - this, SLOT(qtVersionChanged())); connect(step->qt4BuildConfiguration(), SIGNAL(qmakeBuildConfigurationChanged()), this, SLOT(qmakeBuildConfigChanged())); - connect(QtSupport::QtVersionManager::instance(), SIGNAL(dumpUpdatedFor(Utils::FileName)), - this, SLOT(qtVersionsDumpUpdated(Utils::FileName))); + connect(step->target(), SIGNAL(profileChanged()), this, SLOT(qtVersionChanged())); } QMakeStepConfigWidget::~QMakeStepConfigWidget() @@ -575,13 +559,6 @@ void QMakeStepConfigWidget::qtVersionChanged() updateQmlDebuggingOption(); } -void QMakeStepConfigWidget::qtVersionsDumpUpdated(const Utils::FileName &qmakeCommand) -{ - QtSupport::BaseQtVersion *version = m_step->qt4BuildConfiguration()->qtVersion(); - if (version && version->qmakeCommand() == qmakeCommand) - qtVersionChanged(); -} - void QMakeStepConfigWidget::qmakeBuildConfigChanged() { Qt4BuildConfiguration *bc = m_step->qt4BuildConfiguration(); @@ -666,12 +643,14 @@ void QMakeStepConfigWidget::linkQmlDebuggingLibraryChecked(bool checked) void QMakeStepConfigWidget::buildQmlDebuggingHelper() { - QtSupport::BaseQtVersion *version = m_step->qt4BuildConfiguration()->qtVersion(); + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(m_step->target()->profile()); if (!version) return; + ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(m_step->target()->profile()); + QtSupport::DebuggingHelperBuildTask *buildTask = - new QtSupport::DebuggingHelperBuildTask(version, m_step->qt4BuildConfiguration()->toolChain(), + new QtSupport::DebuggingHelperBuildTask(version, tc, QtSupport::DebuggingHelperBuildTask::QmlDebugging); // pop up Application Output on error @@ -685,8 +664,7 @@ void QMakeStepConfigWidget::buildQmlDebuggingHelper() void QMakeStepConfigWidget::updateSummaryLabel() { - Qt4BuildConfiguration *qt4bc = m_step->qt4BuildConfiguration(); - QtSupport::BaseQtVersion *qtVersion = qt4bc->qtVersion(); + QtSupport::BaseQtVersion *qtVersion = QtSupport::QtProfileInformation::qtVersion(m_step->target()->profile()); if (!qtVersion) { setSummaryText(tr("<b>qmake:</b> No Qt version set. Cannot run qmake.")); return; @@ -696,15 +674,6 @@ void QMakeStepConfigWidget::updateSummaryLabel() // And we only use the .pro filename not the full path QString program = qtVersion->qmakeCommand().toFileInfo().fileName(); setSummaryText(tr("<b>qmake:</b> %1 %2").arg(program, args)); - - ToolChain *tc = qt4bc->toolChain(); - if (!tc) - return; - QList<Utils::FileName> tcSpecList = tc->mkspecList(); - if (!tcSpecList.isEmpty() && !tcSpecList.contains(m_step->mkspec())) - setAdditionalSummaryText(tr("<b>Warning:</b> The tool chain suggests using another mkspec.")); - else - setAdditionalSummaryText(QString()); } void QMakeStepConfigWidget::updateQmlDebuggingOption() @@ -725,8 +694,7 @@ void QMakeStepConfigWidget::updateQmlDebuggingOption() void QMakeStepConfigWidget::updateEffectiveQMakeCall() { - Qt4BuildConfiguration *qt4bc = m_step->qt4BuildConfiguration(); - QtSupport::BaseQtVersion *qtVersion = qt4bc->qtVersion(); + QtSupport::BaseQtVersion *qtVersion = QtSupport::QtProfileInformation::qtVersion(m_step->target()->profile()); QString program = tr("<No Qt version>"); if (qtVersion) program = qtVersion->qmakeCommand().toFileInfo().fileName(); @@ -758,14 +726,6 @@ void QMakeStepConfigWidget::setSummaryText(const QString &text) emit updateSummary(); } -void QMakeStepConfigWidget::setAdditionalSummaryText(const QString &text) -{ - if (text == m_additionalSummaryText) - return; - m_additionalSummaryText = text; - emit updateAdditionalSummary(); -} - //// // QMakeStepFactory //// diff --git a/src/plugins/qt4projectmanager/qmakestep.h b/src/plugins/qt4projectmanager/qmakestep.h index 4483c4b474..69f7fdea5f 100644 --- a/src/plugins/qt4projectmanager/qmakestep.h +++ b/src/plugins/qt4projectmanager/qmakestep.h @@ -151,7 +151,6 @@ public: private slots: // slots for handling buildconfiguration/step signals void qtVersionChanged(); - void qtVersionsDumpUpdated(const Utils::FileName &qmakeCommand); void qmakeBuildConfigChanged(); void userArgumentsChanged(); void linkQmlDebuggingLibraryChanged(); @@ -173,7 +172,6 @@ private: void updateEffectiveQMakeCall(); void setSummaryText(const QString &); - void setAdditionalSummaryText(const QString &); Internal::Ui::QMakeStep *m_ui; QMakeStep *m_step; diff --git a/src/plugins/qt4projectmanager/qt-desktop/desktopqtversion.cpp b/src/plugins/qt4projectmanager/qt-desktop/desktopqtversion.cpp index 5617070ea4..1c78eeacdd 100644 --- a/src/plugins/qt4projectmanager/qt-desktop/desktopqtversion.cpp +++ b/src/plugins/qt4projectmanager/qt-desktop/desktopqtversion.cpp @@ -84,29 +84,6 @@ QList<ProjectExplorer::Abi> DesktopQtVersion::detectQtAbis() const return qtAbisFromLibrary(qtCorePath(versionInfo(), qtVersionString())); } -bool DesktopQtVersion::supportsTargetId(const Core::Id id) const -{ - using namespace ProjectExplorer; - if (id == Core::Id(Constants::DESKTOP_TARGET_ID)) - return true; - if (id == Core::Id("RemoteLinux.EmbeddedLinuxTarget")) { - foreach (const Abi &abi, qtAbis()) { - switch (abi.os()) { - case Abi::BsdOS: case Abi::LinuxOS: case Abi::MacOS: case Abi::UnixOS: - return true; - default: - break; - } - } - } - return false; -} - -QSet<Core::Id> DesktopQtVersion::supportedTargetIds() const -{ - return QSet<Core::Id>() << Core::Id(Constants::DESKTOP_TARGET_ID); -} - QString DesktopQtVersion::description() const { return QCoreApplication::translate("QtVersion", "Desktop", "Qt Version is meant for the desktop"); diff --git a/src/plugins/qt4projectmanager/qt-desktop/desktopqtversion.h b/src/plugins/qt4projectmanager/qt-desktop/desktopqtversion.h index c5a0e998e6..bd965e685f 100644 --- a/src/plugins/qt4projectmanager/qt-desktop/desktopqtversion.h +++ b/src/plugins/qt4projectmanager/qt-desktop/desktopqtversion.h @@ -53,9 +53,6 @@ public: QList<ProjectExplorer::Abi> detectQtAbis() const; - bool supportsTargetId(const Core::Id id) const; - QSet<Core::Id> supportedTargetIds() const; - QString description() const; Core::FeatureSet availableFeatures() const; diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt-desktop.pri b/src/plugins/qt4projectmanager/qt-desktop/qt-desktop.pri index 8f3fcfd8ef..46424cc4b0 100644 --- a/src/plugins/qt4projectmanager/qt-desktop/qt-desktop.pri +++ b/src/plugins/qt4projectmanager/qt-desktop/qt-desktop.pri @@ -1,10 +1,6 @@ HEADERS += \ $$PWD/qt4runconfiguration.h \ - $$PWD/qt4desktoptargetfactory.h \ - $$PWD/qt4simulatortargetfactory.h \ - $$PWD/qt4desktoptarget.h \ - $$PWD/qt4simulatortarget.h \ $$PWD/desktopqtversionfactory.h \ $$PWD/simulatorqtversionfactory.h \ $$PWD/desktopqtversion.h \ @@ -12,10 +8,6 @@ HEADERS += \ SOURCES += \ $$PWD/qt4runconfiguration.cpp \ - $$PWD/qt4desktoptargetfactory.cpp \ - $$PWD/qt4simulatortargetfactory.cpp \ - $$PWD/qt4desktoptarget.cpp \ - $$PWD/qt4simulatortarget.cpp \ $$PWD/desktopqtversionfactory.cpp \ $$PWD/simulatorqtversionfactory.cpp \ $$PWD/desktopqtversion.cpp \ diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptarget.cpp b/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptarget.cpp deleted file mode 100644 index d784efcea6..0000000000 --- a/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptarget.cpp +++ /dev/null @@ -1,110 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. -** -**************************************************************************/ - -#include "qt4desktoptarget.h" -#include "qt4project.h" -#include "qt4nodes.h" -#include "qt4runconfiguration.h" -#include "qt4buildconfiguration.h" -#include <projectexplorer/deployconfiguration.h> -#include <qtsupport/customexecutablerunconfiguration.h> -#include <QApplication> -#include <QStyle> - -using namespace Qt4ProjectManager; -using namespace Qt4ProjectManager::Internal; - -Qt4DesktopTarget::Qt4DesktopTarget(Qt4Project *parent, const Core::Id id) : - Qt4BaseTarget(parent, id), - m_buildConfigurationFactory(new Qt4BuildConfigurationFactory(this)) -{ - setDisplayName(defaultDisplayName()); - setIcon(qApp->style()->standardIcon(QStyle::SP_ComputerIcon)); -} - -Qt4DesktopTarget::~Qt4DesktopTarget() -{ -} - -QString Qt4DesktopTarget::defaultDisplayName() -{ - return QApplication::translate("Qt4ProjectManager::Qt4Target", "Desktop", "Qt4 Desktop target display name"); -} - -ProjectExplorer::IBuildConfigurationFactory *Qt4DesktopTarget::buildConfigurationFactory() const -{ - return m_buildConfigurationFactory; -} - -void Qt4DesktopTarget::createApplicationProFiles(bool reparse) -{ - if (!reparse) - removeUnconfiguredCustomExectutableRunConfigurations(); - - // We use the list twice - QList<Qt4ProFileNode *> profiles = qt4Project()->applicationProFiles(); - QHash<QString, bool> paths; - foreach (Qt4ProFileNode *pro, profiles) { - bool isConsole = pro->variableValue(ConfigVar).contains(QLatin1String("console")); - paths.insert(pro->path(), isConsole); - } - - foreach (ProjectExplorer::RunConfiguration *rc, runConfigurations()) - if (Qt4RunConfiguration *qt4rc = qobject_cast<Qt4RunConfiguration *>(rc)) { - paths.remove(qt4rc->proFilePath()); - } - - // Only add new runconfigurations if there are none. - QHash<QString, bool>::const_iterator it, end; - end = paths.constEnd(); - for (it = paths.constBegin(); it != end; ++it) { - Qt4RunConfiguration *qt4rc = new Qt4RunConfiguration(this, it.key()); - if (it.value()) - qt4rc->setRunMode(ProjectExplorer::LocalApplicationRunConfiguration::Console); - addRunConfiguration(qt4rc); - } - - // Oh still none? Add a custom executable runconfiguration - if (runConfigurations().isEmpty()) { - addRunConfiguration(new QtSupport::CustomExecutableRunConfiguration(this)); - } -} - -QList<ProjectExplorer::RunConfiguration *> Qt4DesktopTarget::runConfigurationsForNode(ProjectExplorer::Node *n) -{ - QList<ProjectExplorer::RunConfiguration *> result; - foreach (ProjectExplorer::RunConfiguration *rc, runConfigurations()) - if (Qt4RunConfiguration *qt4c = qobject_cast<Qt4RunConfiguration *>(rc)) - if (qt4c->proFilePath() == n->path()) - result << rc; - return result; -} diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.cpp b/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.cpp index 47ab921d69..6895748264 100644 --- a/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.cpp +++ b/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.cpp @@ -32,6 +32,7 @@ #include "qt4desktoptargetfactory.h" #include "buildconfigurationinfo.h" +#include "qt4buildconfiguration.h" #include "qt4projectmanagerconstants.h" #include "qt4project.h" #include "qt4runconfiguration.h" @@ -39,8 +40,9 @@ #include <projectexplorer/deployconfiguration.h> #include <projectexplorer/projectexplorerconstants.h> -#include <projectexplorer/projectexplorerconstants.h> #include <qtsupport/customexecutablerunconfiguration.h> +#include <qtsupport/qtprofileinformation.h> +#include <qtsupport/qtsupportconstants.h> #include <qtsupport/qtversionmanager.h> @@ -55,58 +57,29 @@ using ProjectExplorer::idFromMap; Qt4DesktopTargetFactory::Qt4DesktopTargetFactory(QObject *parent) : Qt4BaseTargetFactory(parent) -{ - connect(QtSupport::QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>,QList<int>,QList<int>)), - this, SIGNAL(canCreateTargetIdsChanged())); -} +{ } Qt4DesktopTargetFactory::~Qt4DesktopTargetFactory() -{ -} - -bool Qt4DesktopTargetFactory::supportsTargetId(const Core::Id id) const -{ - return id == Core::Id(Constants::DESKTOP_TARGET_ID); -} - -QList<Core::Id> Qt4DesktopTargetFactory::supportedTargetIds() const -{ - return QList<Core::Id>() << Core::Id(Constants::DESKTOP_TARGET_ID); -} - -QString Qt4DesktopTargetFactory::displayNameForId(const Core::Id id) const -{ - if (id == Core::Id(Constants::DESKTOP_TARGET_ID)) - return Qt4DesktopTarget::defaultDisplayName(); - return QString(); -} +{ } -QString Qt4DesktopTargetFactory::buildNameForId(const Core::Id id) const +bool Qt4DesktopTargetFactory::supportsProfile(const ProjectExplorer::Profile *p) const { - if (id == Core::Id(Constants::DESKTOP_TARGET_ID)) - return QLatin1String("desktop"); - return QString(); -} - -QIcon Qt4DesktopTargetFactory::iconForId(const Core::Id id) const -{ - if (id == Core::Id(Constants::DESKTOP_TARGET_ID)) - return qApp->style()->standardIcon(QStyle::SP_ComputerIcon); - return QIcon(); + if (!p) + return false; + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(p); + return version && version->type() == QLatin1String(QtSupport::Constants::DESKTOPQT); } -bool Qt4DesktopTargetFactory::canCreate(ProjectExplorer::Project *parent, const Core::Id id) const +bool Qt4DesktopTargetFactory::canCreate(ProjectExplorer::Project *parent, const ProjectExplorer::Profile *p) const { if (!qobject_cast<Qt4Project *>(parent)) return false; - if (!supportsTargetId(id)) - return false; - return QtSupport::QtVersionManager::instance()->supportsTargetId(id); + return supportsProfile(p); } bool Qt4DesktopTargetFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const { - return qobject_cast<Qt4Project *>(parent) && supportsTargetId(idFromMap(map)); + return qobject_cast<Qt4Project *>(parent) && supportsProfile(profileFromMap(map)); } ProjectExplorer::Target *Qt4DesktopTargetFactory::restore(ProjectExplorer::Project *parent, const QVariantMap &map) @@ -115,7 +88,10 @@ ProjectExplorer::Target *Qt4DesktopTargetFactory::restore(ProjectExplorer::Proj return 0; Qt4Project *qt4project = static_cast<Qt4Project *>(parent); - Qt4DesktopTarget *target = new Qt4DesktopTarget(qt4project, idFromMap(map)); + ProjectExplorer::Profile *p = profileFromMap(map); + if (!p) + return 0; + Qt4DesktopTarget *target = new Qt4DesktopTarget(qt4project, p); if (target->fromMap(map)) return target; @@ -123,70 +99,44 @@ ProjectExplorer::Target *Qt4DesktopTargetFactory::restore(ProjectExplorer::Proj return 0; } -Qt4TargetSetupWidget *Qt4DesktopTargetFactory::createTargetSetupWidget(const Core::Id id, const QString &proFilePath, - const QtSupport::QtVersionNumber &minimumQtVersion, - const QtSupport::QtVersionNumber &maximumQtVersion, - const Core::FeatureSet &requiredFeatures, - bool importEnabled, QList<BuildConfigurationInfo> importInfos) -{ - - QList<BuildConfigurationInfo> infos = this->availableBuildConfigurations(id, proFilePath, - minimumQtVersion, - maximumQtVersion, - requiredFeatures); - if (infos.isEmpty() && importInfos.isEmpty()) - return 0; - Qt4DefaultTargetSetupWidget *widget = new Qt4DefaultTargetSetupWidget(this, id, proFilePath, infos, - minimumQtVersion, maximumQtVersion, - requiredFeatures, - importEnabled, importInfos, - Qt4DefaultTargetSetupWidget::USER); - widget->setBuildConfiguraionComboBoxVisible(true); - return widget; -} - -ProjectExplorer::Target *Qt4DesktopTargetFactory::create(ProjectExplorer::Project *parent, const Core::Id id) +ProjectExplorer::Target *Qt4DesktopTargetFactory::create(ProjectExplorer::Project *parent, ProjectExplorer::Profile *p) { - if (!canCreate(parent, id)) + if (!canCreate(parent, p)) return 0; - QList<QtSupport::BaseQtVersion *> knownVersions = QtSupport::QtVersionManager::instance()->versionsForTargetId(id); - if (knownVersions.isEmpty()) - return 0; - - QtSupport::BaseQtVersion *qtVersion = knownVersions.first(); + QtSupport::BaseQtVersion *qtVersion = QtSupport::QtProfileInformation::qtVersion(p); QtSupport::BaseQtVersion::QmakeBuildConfigs config = qtVersion->defaultBuildConfig(); QList<BuildConfigurationInfo> infos; - infos.append(BuildConfigurationInfo(qtVersion->uniqueId(), config, QString(), QString())); - infos.append(BuildConfigurationInfo(qtVersion->uniqueId(), config ^ QtSupport::BaseQtVersion::DebugBuild, QString(), QString())); + infos.append(BuildConfigurationInfo(config, QString(), QString())); + infos.append(BuildConfigurationInfo(config ^ QtSupport::BaseQtVersion::DebugBuild, QString(), QString())); - return create(parent, id, infos); + return create(parent, p, infos); } -QSet<QString> Qt4DesktopTargetFactory::targetFeatures(const Core::Id id) const +QSet<QString> Qt4DesktopTargetFactory::targetFeatures(ProjectExplorer::Profile *s) const { - Q_UNUSED(id); QSet<QString> features; - features << QLatin1String(Constants::DESKTOP_TARGETFEATURE_ID); - features << QLatin1String(Constants::SHADOWBUILD_TARGETFEATURE_ID); + if (supportsProfile(s)) + features << QLatin1String(Constants::DESKTOP_TARGETFEATURE_ID) + << QLatin1String(Constants::SHADOWBUILD_TARGETFEATURE_ID); return features; } -ProjectExplorer::Target *Qt4DesktopTargetFactory::create(ProjectExplorer::Project *parent, const Core::Id id, const QList<BuildConfigurationInfo> &infos) +ProjectExplorer::Target *Qt4DesktopTargetFactory::create(ProjectExplorer::Project *parent, + ProjectExplorer::Profile *p, + const QList<BuildConfigurationInfo> &infos) { - if (!canCreate(parent, id)) + if (!canCreate(parent, p)) return 0; if (infos.isEmpty()) return 0; - Qt4DesktopTarget *t = new Qt4DesktopTarget(static_cast<Qt4Project *>(parent), id); + Qt4DesktopTarget *t = new Qt4DesktopTarget(static_cast<Qt4Project *>(parent), p); foreach (const BuildConfigurationInfo &info, infos) - t->addQt4BuildConfiguration(msgBuildConfigurationName(info), QString(), - info.version(), info.buildConfig, + Qt4BuildConfiguration::setup(t, buildConfigurationDisplayName(info), QString(), info.buildConfig, info.additionalArguments, info.directory, info.importing); - t->addDeployConfiguration(t->createDeployConfiguration(Core::Id(ProjectExplorer::Constants::DEFAULT_DEPLOYCONFIGURATION_ID))); t->createApplicationProFiles(false); diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.h b/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.h deleted file mode 100644 index be5ced77fa..0000000000 --- a/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.h +++ /dev/null @@ -1,71 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. -** -**************************************************************************/ - -#ifndef QT4DESKTOPTARGETFACTORY_H -#define QT4DESKTOPTARGETFACTORY_H - -#include "qt4basetargetfactory.h" - -namespace Qt4ProjectManager { -namespace Internal { -class Qt4DesktopTargetFactory : public Qt4BaseTargetFactory -{ - Q_OBJECT -public: - Qt4DesktopTargetFactory(QObject *parent = 0); - ~Qt4DesktopTargetFactory(); - - QList<Core::Id> supportedTargetIds() const; - QString displayNameForId(const Core::Id id) const; - QIcon iconForId(const Core::Id id) const; - - bool canCreate(ProjectExplorer::Project *parent, const Core::Id id) const; - bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const; - ProjectExplorer::Target *restore(ProjectExplorer::Project *parent, const QVariantMap &map); - - virtual bool supportsTargetId(const Core::Id id) const; - - Qt4TargetSetupWidget *createTargetSetupWidget(const Core::Id id, const QString &proFilePath, - const QtSupport::QtVersionNumber &minimumQtVersion, - const QtSupport::QtVersionNumber &maximumQtVersion, - const Core::FeatureSet &requiredFeatures, - bool importEnabled, QList<BuildConfigurationInfo> importInfos); - QString buildNameForId(const Core::Id id) const; - QSet<QString> targetFeatures(const Core::Id id) const; - - ProjectExplorer::Target *create(ProjectExplorer::Project *parent, const Core::Id id); - ProjectExplorer::Target *create(ProjectExplorer::Project *parent, const Core::Id id, - const QList<BuildConfigurationInfo> &infos); -}; -} -} -#endif // QT4DESKTOPTARGETFACTORY_H diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4runconfiguration.cpp b/src/plugins/qt4projectmanager/qt-desktop/qt4runconfiguration.cpp index 044b5680c2..98ab43b34f 100644 --- a/src/plugins/qt4projectmanager/qt-desktop/qt4runconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt-desktop/qt4runconfiguration.cpp @@ -35,7 +35,6 @@ #include "makestep.h" #include "qt4nodes.h" #include "qt4project.h" -#include "qt4target.h" #include "qt4buildconfiguration.h" #include "qt4projectmanagerconstants.h" #include "qmakestep.h" @@ -48,16 +47,20 @@ #include <coreplugin/helpmanager.h> #include <projectexplorer/buildstep.h> #include <projectexplorer/environmentwidget.h> -#include <projectexplorer/toolchain.h> +#include <projectexplorer/target.h> +#include <projectexplorer/projectexplorerconstants.h> #include <utils/qtcassert.h> #include <utils/qtcprocess.h> #include <utils/pathchooser.h> #include <utils/detailswidget.h> #include <utils/stringutils.h> #include <utils/persistentsettings.h> +#include <qtsupport/customexecutablerunconfiguration.h> #include <qtsupport/qtoutputformatter.h> +#include <qtsupport/qtsupportconstants.h> #include <qtsupport/baseqtversion.h> #include <qtsupport/profilereader.h> +#include <qtsupport/qtprofileinformation.h> #include <QFormLayout> #include <QInputDialog> @@ -76,7 +79,6 @@ using Utils::PersistentSettingsReader; using Utils::PersistentSettingsWriter; namespace { -const char * const QT4_RC_ID("Qt4ProjectManager.Qt4RunConfiguration"); const char * const QT4_RC_PREFIX("Qt4ProjectManager.Qt4RunConfiguration."); const char * const COMMAND_LINE_ARGUMENTS_KEY("Qt4ProjectManager.Qt4RunConfiguration.CommandLineArguments"); @@ -89,7 +91,7 @@ const char * const USER_WORKING_DIRECTORY_KEY("Qt4ProjectManager.Qt4RunConfigura QString pathFromId(Core::Id id) { - QString idstr = QString::fromUtf8(id.name()); + QString idstr = id.toString(); const QString prefix = QLatin1String(QT4_RC_PREFIX); if (!idstr.startsWith(prefix)) return QString(); @@ -102,19 +104,21 @@ QString pathFromId(Core::Id id) // Qt4RunConfiguration // -Qt4RunConfiguration::Qt4RunConfiguration(Qt4BaseTarget *parent, const QString &proFilePath) : - LocalApplicationRunConfiguration(parent, Core::Id(QT4_RC_ID)), - m_proFilePath(proFilePath), +Qt4RunConfiguration::Qt4RunConfiguration(ProjectExplorer::Target *parent, Core::Id id) : + LocalApplicationRunConfiguration(parent, id), + m_proFilePath(pathFromId(id)), m_runMode(Gui), m_isUsingDyldImageSuffix(false), - m_baseEnvironmentBase(Qt4RunConfiguration::BuildEnvironmentBase), - m_parseSuccess(parent->qt4Project()->validParse(m_proFilePath)), - m_parseInProgress(parent->qt4Project()->parseInProgress(m_proFilePath)) + m_baseEnvironmentBase(Qt4RunConfiguration::BuildEnvironmentBase) { + Qt4Project *project = static_cast<Qt4Project *>(parent->project()); + m_parseSuccess = project->validParse(m_proFilePath); + m_parseInProgress = project->parseInProgress(m_proFilePath); + ctor(); } -Qt4RunConfiguration::Qt4RunConfiguration(Qt4BaseTarget *parent, Qt4RunConfiguration *source) : +Qt4RunConfiguration::Qt4RunConfiguration(ProjectExplorer::Target *parent, Qt4RunConfiguration *source) : LocalApplicationRunConfiguration(parent, source), m_commandLineArguments(source->m_commandLineArguments), m_proFilePath(source->m_proFilePath), @@ -133,11 +137,6 @@ Qt4RunConfiguration::~Qt4RunConfiguration() { } -Qt4BaseTarget *Qt4RunConfiguration::qt4Target() const -{ - return static_cast<Qt4BaseTarget *>(target()); -} - bool Qt4RunConfiguration::isEnabled() const { return m_parseSuccess && !m_parseInProgress; @@ -150,7 +149,7 @@ QString Qt4RunConfiguration::disabledReason() const .arg(QFileInfo(m_proFilePath).fileName()); if (!m_parseSuccess) - return qt4Target()->qt4Project()->disabledReasonForRunConfiguration(m_proFilePath); + return static_cast<Qt4Project *>(target()->project())->disabledReasonForRunConfiguration(m_proFilePath); return QString(); } @@ -182,10 +181,22 @@ void Qt4RunConfiguration::ctor() { setDefaultDisplayName(defaultDisplayName()); - connect(qt4Target(), SIGNAL(environmentChanged()), + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(target()->profile()); + m_forcedGuiMode = (version && version->type() == QtSupport::Constants::SIMULATORQT); + + connect(target(), SIGNAL(environmentChanged()), this, SIGNAL(baseEnvironmentChanged())); - connect(qt4Target()->qt4Project(), SIGNAL(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode*,bool,bool)), + connect(target()->project(), SIGNAL(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode*,bool,bool)), this, SLOT(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode*,bool,bool))); + connect(target(), SIGNAL(profileChanged()), + this, SLOT(profileChanged())); +} + +void Qt4RunConfiguration::profileChanged() +{ + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(target()->profile()); + m_forcedGuiMode = (version && version->type() == QtSupport::Constants::SIMULATORQT); + emit runModeChanged(runMode()); // Always emit } ////// @@ -251,7 +262,7 @@ Qt4RunConfigurationWidget::Qt4RunConfigurationWidget(Qt4RunConfiguration *qt4Run m_useTerminalCheck = new QCheckBox(tr("Run in terminal"), this); m_useTerminalCheck->setChecked(m_qt4RunConfiguration->runMode() == ProjectExplorer::LocalApplicationRunConfiguration::Console); toplayout->addRow(QString(), m_useTerminalCheck); - m_useTerminalCheck->setVisible(qt4RunConfiguration->target()->id() != Core::Id(Constants::QT_SIMULATOR_TARGET_ID)); + m_useTerminalCheck->setVisible(!m_qt4RunConfiguration->forcedGuiMode()); #ifdef Q_OS_MAC m_usingDyldImageSuffix = new QCheckBox(tr("Use debug version of frameworks (DYLD_IMAGE_SUFFIX=_debug)"), this); @@ -431,8 +442,10 @@ void Qt4RunConfigurationWidget::commandLineArgumentsChanged(const QString &args) void Qt4RunConfigurationWidget::runModeChanged(LocalApplicationRunConfiguration::RunMode runMode) { - if (!m_ignoreChange) + if (!m_ignoreChange) { + m_useTerminalCheck->setVisible(!m_qt4RunConfiguration->forcedGuiMode()); m_useTerminalCheck->setChecked(runMode == LocalApplicationRunConfiguration::Console); + } } void Qt4RunConfigurationWidget::usingDyldImageSuffixChanged(bool state) @@ -496,15 +509,15 @@ bool Qt4RunConfiguration::fromMap(const QVariantMap &map) m_userEnvironmentChanges = Utils::EnvironmentItem::fromStringList(map.value(QLatin1String(USER_ENVIRONMENT_CHANGES_KEY)).toStringList()); m_baseEnvironmentBase = static_cast<BaseEnvironmentBase>(map.value(QLatin1String(BASE_ENVIRONMENT_BASE_KEY), static_cast<int>(Qt4RunConfiguration::BuildEnvironmentBase)).toInt()); - m_parseSuccess = qt4Target()->qt4Project()->validParse(m_proFilePath); - m_parseInProgress = qt4Target()->qt4Project()->parseInProgress(m_proFilePath); + m_parseSuccess = static_cast<Qt4Project *>(target()->project())->validParse(m_proFilePath); + m_parseInProgress = static_cast<Qt4Project *>(target()->project())->parseInProgress(m_proFilePath); return RunConfiguration::fromMap(map); } QString Qt4RunConfiguration::executable() const { - Qt4Project *pro = qt4Target()->qt4Project(); + Qt4Project *pro = static_cast<Qt4Project *>(target()->project()); TargetInformation ti = pro->rootQt4ProjectNode()->targetInformation(m_proFilePath); if (!ti.valid) return QString(); @@ -513,9 +526,16 @@ QString Qt4RunConfiguration::executable() const LocalApplicationRunConfiguration::RunMode Qt4RunConfiguration::runMode() const { + if (m_forcedGuiMode) + return LocalApplicationRunConfiguration::Gui; return m_runMode; } +bool Qt4RunConfiguration::forcedGuiMode() const +{ + return m_forcedGuiMode; +} + bool Qt4RunConfiguration::isUsingDyldImageSuffix() const { return m_isUsingDyldImageSuffix; @@ -540,7 +560,7 @@ QString Qt4RunConfiguration::baseWorkingDirectory() const return m_userWorkingDirectory; // else what the pro file reader tells us - Qt4Project *pro = qt4Target()->qt4Project(); + Qt4Project *pro = static_cast<Qt4Project *>(target()->project()); TargetInformation ti = pro->rootQt4ProjectNode()->targetInformation(m_proFilePath); if (!ti.valid) return QString(); @@ -575,7 +595,8 @@ Utils::Environment Qt4RunConfiguration::baseEnvironment() const // Nothing } else if (m_baseEnvironmentBase == Qt4RunConfiguration::SystemEnvironmentBase) { env = Utils::Environment::systemEnvironment(); - } else if (m_baseEnvironmentBase == Qt4RunConfiguration::BuildEnvironmentBase) { + } else if (m_baseEnvironmentBase == Qt4RunConfiguration::BuildEnvironmentBase + && target()->activeBuildConfiguration()) { env = target()->activeBuildConfiguration()->environment(); } if (m_isUsingDyldImageSuffix) { @@ -585,7 +606,7 @@ Utils::Environment Qt4RunConfiguration::baseEnvironment() const // The user could be linking to a library found via a -L/some/dir switch // to find those libraries while actually running we explicitly prepend those // dirs to the library search path - const Qt4ProFileNode *node = qt4Target()->qt4Project()->rootQt4ProjectNode()->findProFileFor(m_proFilePath); + const Qt4ProFileNode *node = static_cast<Qt4Project *>(target()->project())->rootQt4ProjectNode()->findProFileFor(m_proFilePath); if (node) { const QStringList libDirectories = node->variableValue(LibDirectoriesVar); if (!libDirectories.isEmpty()) { @@ -600,7 +621,7 @@ Utils::Environment Qt4RunConfiguration::baseEnvironment() const } // libDirectories } // node - QtSupport::BaseQtVersion *qtVersion = qt4Target()->activeQt4BuildConfiguration()->qtVersion(); + QtSupport::BaseQtVersion *qtVersion = QtSupport::QtProfileInformation::qtVersion(target()->profile()); if (qtVersion) env.prependOrSetLibrarySearchPath(qtVersion->versionInfo().value(QLatin1String("QT_INSTALL_LIBS"))); return env; @@ -656,7 +677,7 @@ QString Qt4RunConfiguration::proFilePath() const QString Qt4RunConfiguration::dumperLibrary() const { - QtSupport::BaseQtVersion *version = qt4Target()->activeQt4BuildConfiguration()->qtVersion(); + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(target()->profile()); if (version) return version->gdbDebuggingHelperLibrary(); return QString(); @@ -664,7 +685,7 @@ QString Qt4RunConfiguration::dumperLibrary() const QStringList Qt4RunConfiguration::dumperLibraryLocations() const { - QtSupport::BaseQtVersion *version = qt4Target()->activeQt4BuildConfiguration()->qtVersion(); + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(target()->profile()); if (version) return version->debuggingHelperLibraryLocations(); return QStringList(); @@ -695,7 +716,7 @@ Qt4RunConfiguration::BaseEnvironmentBase Qt4RunConfiguration::baseEnvironmentBas Utils::OutputFormatter *Qt4RunConfiguration::createOutputFormatter() const { - return new QtSupport::QtOutputFormatter(qt4Target()->qt4Project()); + return new QtSupport::QtOutputFormatter(target()->project()); } /// @@ -704,50 +725,50 @@ Utils::OutputFormatter *Qt4RunConfiguration::createOutputFormatter() const /// Qt4RunConfigurationFactory::Qt4RunConfigurationFactory(QObject *parent) : - ProjectExplorer::IRunConfigurationFactory(parent) -{ -} + QmakeRunConfigurationFactory(parent) +{ setObjectName(QLatin1String("Qt4RunConfigurationFactory")); } Qt4RunConfigurationFactory::~Qt4RunConfigurationFactory() -{ -} +{ } bool Qt4RunConfigurationFactory::canCreate(ProjectExplorer::Target *parent, const Core::Id id) const { - Qt4BaseTarget *t = qobject_cast<Qt4BaseTarget *>(parent); - if (!t) + if (!canHandle(parent)) return false; - if (t->id() != Core::Id(Constants::DESKTOP_TARGET_ID) - && t->id() != Core::Id(Constants::QT_SIMULATOR_TARGET_ID)) - return false; - return t->qt4Project()->hasApplicationProFile(pathFromId(id)); + Qt4Project *project = static_cast<Qt4Project *>(parent->project()); + return project->hasApplicationProFile(pathFromId(id)); } ProjectExplorer::RunConfiguration *Qt4RunConfigurationFactory::create(ProjectExplorer::Target *parent, const Core::Id id) { if (!canCreate(parent, id)) return 0; - Qt4BaseTarget *t = static_cast<Qt4BaseTarget *>(parent); - return new Qt4RunConfiguration(t, pathFromId(id)); + + Qt4RunConfiguration *rc = new Qt4RunConfiguration(parent, id); + QList<Qt4ProFileNode *> profiles = static_cast<Qt4Project *>(parent->project())->applicationProFiles(); + foreach (Qt4ProFileNode *node, profiles) { + if (node->path() != rc->proFilePath()) + continue; + rc->setRunMode(node->variableValue(ConfigVar).contains(QLatin1String("console")) + ? ProjectExplorer::LocalApplicationRunConfiguration::Console + : ProjectExplorer::LocalApplicationRunConfiguration::Gui); + break; + } + return rc; } bool Qt4RunConfigurationFactory::canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const { - if (!qobject_cast<Qt4BaseTarget *>(parent)) - return false; - if (parent->id() != Core::Id(Constants::DESKTOP_TARGET_ID) - && parent->id() != Core::Id(Constants::QT_SIMULATOR_TARGET_ID)) + if (!canHandle(parent)) return false; - QString id = QString::fromLatin1(ProjectExplorer::idFromMap(map).name()); - return id.startsWith(QLatin1String(QT4_RC_ID)); + return ProjectExplorer::idFromMap(map).toString().startsWith(QLatin1String(QT4_RC_PREFIX)); } ProjectExplorer::RunConfiguration *Qt4RunConfigurationFactory::restore(ProjectExplorer::Target *parent, const QVariantMap &map) { if (!canRestore(parent, map)) return 0; - Qt4BaseTarget *t = static_cast<Qt4BaseTarget *>(parent); - Qt4RunConfiguration *rc = new Qt4RunConfiguration(t, QString()); + Qt4RunConfiguration *rc = new Qt4RunConfiguration(parent, ProjectExplorer::idFromMap(map)); if (rc->fromMap(map)) return rc; @@ -764,23 +785,20 @@ ProjectExplorer::RunConfiguration *Qt4RunConfigurationFactory::clone(ProjectExpl { if (!canClone(parent, source)) return 0; - Qt4BaseTarget *t = static_cast<Qt4BaseTarget *>(parent); Qt4RunConfiguration *old = static_cast<Qt4RunConfiguration *>(source); - return new Qt4RunConfiguration(t, old); + return new Qt4RunConfiguration(parent, old); } QList<Core::Id> Qt4RunConfigurationFactory::availableCreationIds(ProjectExplorer::Target *parent) const { QList<Core::Id> result; - Qt4BaseTarget *t = qobject_cast<Qt4BaseTarget *>(parent); - if (!t) + if (!canHandle(parent)) return result; - if (t->id() != Core::Id(Constants::DESKTOP_TARGET_ID) - && t->id() != Core::Id(Constants::QT_SIMULATOR_TARGET_ID)) - return result; - QStringList proFiles = t->qt4Project()->applicationProFilePathes(QLatin1String(QT4_RC_PREFIX)); + + Qt4Project *project = static_cast<Qt4Project *>(parent->project()); + QStringList proFiles = project->applicationProFilePathes(QLatin1String(QT4_RC_PREFIX)); foreach (const QString &pf, proFiles) - result << Core::Id(pf.toUtf8().constData()); + result << Core::Id(pf); return result; } @@ -788,3 +806,24 @@ QString Qt4RunConfigurationFactory::displayNameForId(const Core::Id id) const { return QFileInfo(pathFromId(id)).completeBaseName(); } + +bool Qt4RunConfigurationFactory::canHandle(ProjectExplorer::Target *t) const +{ + if (!t->project()->supportsProfile(t->profile())) + return false; + if (!qobject_cast<Qt4Project *>(t->project())) + return false; + Core::Id devType = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(t->profile()); + return devType == Core::Id(ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE); +} + +QList<ProjectExplorer::RunConfiguration *> Qt4RunConfigurationFactory::runConfigurationsForNode(ProjectExplorer::Target *t, ProjectExplorer::Node *n) +{ + QList<ProjectExplorer::RunConfiguration *> result; + foreach (ProjectExplorer::RunConfiguration *rc, t->runConfigurations()) + if (Qt4RunConfiguration *qt4c = qobject_cast<Qt4RunConfiguration *>(rc)) + if (qt4c->proFilePath() == n->path()) + result << rc; + return result; + +} diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4runconfiguration.h b/src/plugins/qt4projectmanager/qt-desktop/qt4runconfiguration.h index 8152690879..765f38fae4 100644 --- a/src/plugins/qt4projectmanager/qt-desktop/qt4runconfiguration.h +++ b/src/plugins/qt4projectmanager/qt-desktop/qt4runconfiguration.h @@ -33,6 +33,8 @@ #ifndef QT4RUNCONFIGURATION_H #define QT4RUNCONFIGURATION_H +#include "qmakerunconfigurationfactory.h" + #include <projectexplorer/applicationrunconfiguration.h> #include <utils/environment.h> @@ -61,7 +63,6 @@ namespace ProjectExplorer { namespace Qt4ProjectManager { class Qt4Project; -class Qt4BaseTarget; class Qt4ProFileNode; class Qt4PriFileNode; @@ -76,17 +77,16 @@ class Qt4RunConfiguration : public ProjectExplorer::LocalApplicationRunConfigura friend class Qt4RunConfigurationFactory; public: - Qt4RunConfiguration(Qt4BaseTarget *parent, const QString &proFilePath); + Qt4RunConfiguration(ProjectExplorer::Target *parent, Core::Id id); virtual ~Qt4RunConfiguration(); - Qt4BaseTarget *qt4Target() const; - virtual bool isEnabled() const; virtual QString disabledReason() const; virtual QWidget *createConfigurationWidget(); virtual QString executable() const; virtual RunMode runMode() const; + bool forcedGuiMode() const; virtual QString workingDirectory() const; virtual QString commandLineArguments() const; virtual Utils::Environment environment() const; @@ -115,10 +115,11 @@ signals: void effectiveTargetInformationChanged(); private slots: + void profileChanged(); void proFileUpdated(Qt4ProjectManager::Qt4ProFileNode *pro, bool success, bool parseInProgress); protected: - Qt4RunConfiguration(Qt4BaseTarget *parent, Qt4RunConfiguration *source); + Qt4RunConfiguration(ProjectExplorer::Target *parent, Qt4RunConfiguration *source); virtual bool fromMap(const QVariantMap &map); private: @@ -146,6 +147,7 @@ private: // Cached startup sub project information ProjectExplorer::LocalApplicationRunConfiguration::RunMode m_runMode; + bool m_forcedGuiMode; bool m_userSetName; bool m_isUsingDyldImageSuffix; QString m_userWorkingDirectory; @@ -204,23 +206,27 @@ private: bool m_isShown; }; -class Qt4RunConfigurationFactory : public ProjectExplorer::IRunConfigurationFactory +class Qt4RunConfigurationFactory : public QmakeRunConfigurationFactory { Q_OBJECT public: explicit Qt4RunConfigurationFactory(QObject *parent = 0); - virtual ~Qt4RunConfigurationFactory(); + ~Qt4RunConfigurationFactory(); - virtual bool canCreate(ProjectExplorer::Target *parent, const Core::Id id) const; - virtual ProjectExplorer::RunConfiguration *create(ProjectExplorer::Target *parent, const Core::Id id); - virtual bool canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const; - virtual ProjectExplorer::RunConfiguration *restore(ProjectExplorer::Target *parent, const QVariantMap &map); - virtual bool canClone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration *source) const; - virtual ProjectExplorer::RunConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration *source); + bool canCreate(ProjectExplorer::Target *parent, const Core::Id id) const; + ProjectExplorer::RunConfiguration *create(ProjectExplorer::Target *parent, const Core::Id id); + bool canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const; + ProjectExplorer::RunConfiguration *restore(ProjectExplorer::Target *parent, const QVariantMap &map); + bool canClone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration *source) const; + ProjectExplorer::RunConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration *source); QList<Core::Id> availableCreationIds(ProjectExplorer::Target *parent) const; QString displayNameForId(const Core::Id id) const; + + bool canHandle(ProjectExplorer::Target *t) const; + QList<ProjectExplorer::RunConfiguration *> runConfigurationsForNode(ProjectExplorer::Target *t, + ProjectExplorer::Node *n); }; } // namespace Internal diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortarget.cpp b/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortarget.cpp deleted file mode 100644 index 049f3d0501..0000000000 --- a/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortarget.cpp +++ /dev/null @@ -1,106 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. -** -**************************************************************************/ - -#include "qt4simulatortarget.h" -#include "qt4project.h" -#include "qt4nodes.h" -#include "qt4runconfiguration.h" -#include "qt4buildconfiguration.h" - -#include <projectexplorer/deployconfiguration.h> -#include <qtsupport/customexecutablerunconfiguration.h> -#include <QApplication> - -using namespace Qt4ProjectManager; -using namespace Qt4ProjectManager::Internal; - - -// ------------------------------------------------------------------------- -// Qt4Target -// ------------------------------------------------------------------------- - -Qt4SimulatorTarget::Qt4SimulatorTarget(Qt4Project *parent, const Core::Id id) : - Qt4BaseTarget(parent, id), - m_buildConfigurationFactory(new Qt4BuildConfigurationFactory(this)) -{ - setDisplayName(defaultDisplayName()); - setIcon(QIcon(QLatin1String(":/projectexplorer/images/SymbianEmulator.png"))); -} - -Qt4SimulatorTarget::~Qt4SimulatorTarget() -{ -} - -QString Qt4SimulatorTarget::defaultDisplayName() -{ - return QApplication::translate("Qt4ProjectManager::Qt4Target", "Qt Simulator", "Qt4 Simulator target display name"); -} - -ProjectExplorer::IBuildConfigurationFactory *Qt4SimulatorTarget::buildConfigurationFactory() const -{ - return m_buildConfigurationFactory; -} - -void Qt4SimulatorTarget::createApplicationProFiles(bool reparse) -{ - if (!reparse) - removeUnconfiguredCustomExectutableRunConfigurations(); - - // We use the list twice - QList<Qt4ProFileNode *> profiles = qt4Project()->applicationProFiles(); - QSet<QString> paths; - foreach (Qt4ProFileNode *pro, profiles) - paths << pro->path(); - - foreach (ProjectExplorer::RunConfiguration *rc, runConfigurations()) - if (Qt4RunConfiguration *qt4rc = qobject_cast<Qt4RunConfiguration *>(rc)) - paths.remove(qt4rc->proFilePath()); - - // Only add new runconfigurations if there are none. - foreach (const QString &path, paths) - addRunConfiguration(new Qt4RunConfiguration(this, path)); - - // Oh still none? Add a custom executable runconfiguration - if (runConfigurations().isEmpty()) { - addRunConfiguration(new QtSupport::CustomExecutableRunConfiguration(this)); - } -} - -QList<ProjectExplorer::RunConfiguration *> Qt4SimulatorTarget::runConfigurationsForNode(ProjectExplorer::Node *n) -{ - QList<ProjectExplorer::RunConfiguration *> result; - foreach (ProjectExplorer::RunConfiguration *rc, runConfigurations()) - if (Qt4RunConfiguration *qt4c = qobject_cast<Qt4RunConfiguration *>(rc)) - if (qt4c->proFilePath() == n->path()) - result << rc; - return result; -} diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.cpp b/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.cpp deleted file mode 100644 index cf20eb813c..0000000000 --- a/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.cpp +++ /dev/null @@ -1,173 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. -** -**************************************************************************/ - -#include "qt4simulatortargetfactory.h" -#include "buildconfigurationinfo.h" -#include "qt4projectmanagerconstants.h" -#include "qt4project.h" -#include "qt4runconfiguration.h" -#include "qt4simulatortarget.h" -#include <qtsupport/qtversionmanager.h> - -#include <projectexplorer/deployconfiguration.h> -#include <projectexplorer/projectexplorerconstants.h> -#include <qtsupport/customexecutablerunconfiguration.h> - -#include <QApplication> -#include <QStyle> - -using namespace Qt4ProjectManager; -using namespace Qt4ProjectManager::Internal; -using ProjectExplorer::idFromMap; - -// ------------------------------------------------------------------------- -// Qt4SimulatorTargetFactory -// ------------------------------------------------------------------------- - -Qt4SimulatorTargetFactory::Qt4SimulatorTargetFactory(QObject *parent) : - Qt4BaseTargetFactory(parent) -{ - connect(QtSupport::QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>,QList<int>,QList<int>)), - this, SIGNAL(canCreateTargetIdsChanged())); -} - -Qt4SimulatorTargetFactory::~Qt4SimulatorTargetFactory() -{ -} - -bool Qt4SimulatorTargetFactory::supportsTargetId(const Core::Id id) const -{ - return id == Core::Id(Constants::QT_SIMULATOR_TARGET_ID); -} - -QList<Core::Id> Qt4SimulatorTargetFactory::supportedTargetIds() const -{ - return QList<Core::Id>() << Core::Id(Constants::QT_SIMULATOR_TARGET_ID); -} - -QString Qt4SimulatorTargetFactory::displayNameForId(const Core::Id id) const -{ - if (id == Core::Id(Constants::QT_SIMULATOR_TARGET_ID)) - return Qt4SimulatorTarget::defaultDisplayName(); - return QString(); -} - -QIcon Qt4SimulatorTargetFactory::iconForId(const Core::Id id) const -{ - if (id == Core::Id(Constants::QT_SIMULATOR_TARGET_ID)) - return QIcon(QLatin1String(":/projectexplorer/images/SymbianEmulator.png")); - return QIcon(); -} - -QString Qt4SimulatorTargetFactory::buildNameForId(const Core::Id id) const -{ - if (id == Core::Id(Constants::QT_SIMULATOR_TARGET_ID)) - return QLatin1String("simulator"); - return QString(); -} - -bool Qt4SimulatorTargetFactory::canCreate(ProjectExplorer::Project *parent, const Core::Id id) const -{ - if (!qobject_cast<Qt4Project *>(parent)) - return false; - if (!supportsTargetId(id)) - return false; - return QtSupport::QtVersionManager::instance()->supportsTargetId(id); -} - -bool Qt4SimulatorTargetFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const -{ - return qobject_cast<Qt4Project *>(parent) && supportsTargetId(idFromMap(map)); -} - -ProjectExplorer::Target *Qt4SimulatorTargetFactory::restore(ProjectExplorer::Project *parent, const QVariantMap &map) -{ - if (!canRestore(parent, map)) - return 0; - - Qt4Project *qt4project = static_cast<Qt4Project *>(parent); - Qt4SimulatorTarget *target = new Qt4SimulatorTarget(qt4project, idFromMap(map)); - if (target->fromMap(map)) - return target; - delete target; - return 0; -} - -QSet<QString> Qt4SimulatorTargetFactory::targetFeatures(const Core::Id /*id*/) const -{ - QSet<QString> features; - - features << QLatin1String(Constants::MOBILE_TARGETFEATURE_ID) - << QLatin1String(Constants::SHADOWBUILD_TARGETFEATURE_ID); - - return features; -} - -ProjectExplorer::Target *Qt4SimulatorTargetFactory::create(ProjectExplorer::Project *parent, const Core::Id id) -{ - if (!canCreate(parent, id)) - return 0; - - QList<QtSupport::BaseQtVersion *> knownVersions = QtSupport::QtVersionManager::instance()->versionsForTargetId(id); - if (knownVersions.isEmpty()) - return 0; - - QtSupport::BaseQtVersion *qtVersion = knownVersions.first(); - QtSupport::BaseQtVersion::QmakeBuildConfigs config = qtVersion->defaultBuildConfig(); - QList<BuildConfigurationInfo> infos; - infos.append(BuildConfigurationInfo(qtVersion->uniqueId(), config, QString(), QString())); - infos.append(BuildConfigurationInfo(qtVersion->uniqueId(), config ^ QtSupport::BaseQtVersion::DebugBuild, QString(), QString())); - - return create(parent, id, infos); -} - -ProjectExplorer::Target *Qt4SimulatorTargetFactory::create(ProjectExplorer::Project *parent, const Core::Id id, - const QList<BuildConfigurationInfo> &infos) -{ - if (!canCreate(parent, id)) - return 0; - if (infos.isEmpty()) - return 0; - Qt4SimulatorTarget *t = new Qt4SimulatorTarget(static_cast<Qt4Project *>(parent), id); - - foreach (const BuildConfigurationInfo &info, infos) - t->addQt4BuildConfiguration(msgBuildConfigurationName(info), QString(), info.version(), info.buildConfig, - info.additionalArguments, info.directory, info.importing); - - t->addDeployConfiguration(t->createDeployConfiguration(Core::Id(ProjectExplorer::Constants::DEFAULT_DEPLOYCONFIGURATION_ID))); - - t->createApplicationProFiles(false); - - if (t->runConfigurations().isEmpty()) - t->addRunConfiguration(new QtSupport::CustomExecutableRunConfiguration(t)); - return t; -} diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.h b/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.h deleted file mode 100644 index 8c0f96f9e2..0000000000 --- a/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.h +++ /dev/null @@ -1,69 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. -** -**************************************************************************/ - -#ifndef QT4SIMULATORTARGETFACTORY_H -#define QT4SIMULATORTARGETFACTORY_H - -#include "qt4basetargetfactory.h" - -namespace Qt4ProjectManager { -namespace Internal { - -class Qt4SimulatorTargetFactory : public Qt4BaseTargetFactory -{ - Q_OBJECT -public: - Qt4SimulatorTargetFactory(QObject *parent = 0); - ~Qt4SimulatorTargetFactory(); - - bool supportsTargetId(const Core::Id id) const; - - QList<Core::Id> supportedTargetIds() const; - QString displayNameForId(const Core::Id id) const; - QIcon iconForId(const Core::Id id) const; - - bool canCreate(ProjectExplorer::Project *parent, const Core::Id id) const; - bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const; - ProjectExplorer::Target *restore(ProjectExplorer::Project *parent, const QVariantMap &map); - - QSet<QString> targetFeatures(const Core::Id id) const; - - QString buildNameForId(const Core::Id id) const; - ProjectExplorer::Target *create(ProjectExplorer::Project *parent, const Core::Id id); - ProjectExplorer::Target *create(ProjectExplorer::Project *parent, const Core::Id id, - const QList<BuildConfigurationInfo> &infos); -}; - -} -} - -#endif // QT4SIMULATORTARGETFACTORY_H diff --git a/src/plugins/qt4projectmanager/qt-desktop/simulatorqtversion.cpp b/src/plugins/qt4projectmanager/qt-desktop/simulatorqtversion.cpp index e0f4328e24..f9d31d37b9 100644 --- a/src/plugins/qt4projectmanager/qt-desktop/simulatorqtversion.cpp +++ b/src/plugins/qt4projectmanager/qt-desktop/simulatorqtversion.cpp @@ -85,16 +85,6 @@ QList<ProjectExplorer::Abi> SimulatorQtVersion::detectQtAbis() const return qtAbisFromLibrary(qtCorePath(versionInfo(), qtVersionString())); } -bool SimulatorQtVersion::supportsTargetId(const Core::Id id) const -{ - return id == Core::Id(Constants::QT_SIMULATOR_TARGET_ID); -} - -QSet<Core::Id> SimulatorQtVersion::supportedTargetIds() const -{ - return QSet<Core::Id>() << Core::Id(Constants::QT_SIMULATOR_TARGET_ID); -} - QString SimulatorQtVersion::description() const { return QCoreApplication::translate("QtVersion", "Qt Simulator", "Qt Version is meant for Qt Simulator"); diff --git a/src/plugins/qt4projectmanager/qt-desktop/simulatorqtversion.h b/src/plugins/qt4projectmanager/qt-desktop/simulatorqtversion.h index 69d5cf2feb..25a4342510 100644 --- a/src/plugins/qt4projectmanager/qt-desktop/simulatorqtversion.h +++ b/src/plugins/qt4projectmanager/qt-desktop/simulatorqtversion.h @@ -53,9 +53,6 @@ public: QList<ProjectExplorer::Abi> detectQtAbis() const; - bool supportsTargetId(const Core::Id id) const; - QSet<Core::Id> supportedTargetIds() const; - QString description() const; Core::FeatureSet availableFeatures() const; diff --git a/src/plugins/qt4projectmanager/qt-s60/codaruncontrol.cpp b/src/plugins/qt4projectmanager/qt-s60/codaruncontrol.cpp index f9f5753356..ee0ecf5cb1 100644 --- a/src/plugins/qt4projectmanager/qt-s60/codaruncontrol.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/codaruncontrol.cpp @@ -40,13 +40,12 @@ #include "codamessage.h" #include "qt4buildconfiguration.h" -#include "qt4symbiantarget.h" -#include "qt4target.h" #include "symbiandevicemanager.h" #include <coreplugin/icore.h> #include <utils/qtcassert.h> #include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/target.h> #include <symbianutils/symbiandevicemanager.h> diff --git a/src/plugins/qt4projectmanager/qt-s60/gccetoolchain.cpp b/src/plugins/qt4projectmanager/qt-s60/gccetoolchain.cpp index bad030375d..a3818cd52c 100644 --- a/src/plugins/qt4projectmanager/qt-s60/gccetoolchain.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/gccetoolchain.cpp @@ -181,7 +181,6 @@ QList<ProjectExplorer::ToolChain *> GcceToolChainFactory::autoDetect() GcceToolChain *tc = new GcceToolChain(false); tc->setCompilerCommand(Utils::FileName(fi)); tc->setDisplayName(tr("GCCE from Qt version")); - tc->setDebuggerCommand(ProjectExplorer::ToolChainManager::instance()->defaultDebugger(tc->targetAbi())); result.append(tc); } } @@ -195,7 +194,6 @@ QList<ProjectExplorer::ToolChain *> GcceToolChainFactory::autoDetect() GcceToolChain *tc = new GcceToolChain(true); tc->setCompilerCommand(fullPath); tc->setDisplayName(tr("GCCE (%1)").arg(version)); - tc->setDebuggerCommand(ProjectExplorer::ToolChainManager::instance()->defaultDebugger(tc->targetAbi())); if (tc->targetAbi() == ProjectExplorer::Abi(ProjectExplorer::Abi::ArmArchitecture, ProjectExplorer::Abi::SymbianOS, ProjectExplorer::Abi::SymbianDeviceFlavor, diff --git a/src/plugins/qt4projectmanager/qt-s60/qt-s60.pri b/src/plugins/qt4projectmanager/qt-s60/qt-s60.pri index f25ce876fd..5f1fb95de6 100644 --- a/src/plugins/qt4projectmanager/qt-s60/qt-s60.pri +++ b/src/plugins/qt4projectmanager/qt-s60/qt-s60.pri @@ -21,8 +21,6 @@ SOURCES += $$PWD/s60manager.cpp \ $$PWD/certificatepathchooser.cpp \ $$PWD/s60symbiancertificate.cpp \ $$PWD/s60certificatedetailsdialog.cpp \ - $$PWD/qt4symbiantargetfactory.cpp \ - $$PWD/qt4symbiantarget.cpp \ $$PWD/s60runcontrolfactory.cpp \ $$PWD/codaruncontrol.cpp \ $$PWD/s60runcontrolbase.cpp \ @@ -57,8 +55,6 @@ HEADERS += $$PWD/s60manager.h \ $$PWD/certificatepathchooser.h \ $$PWD/s60symbiancertificate.h \ $$PWD/s60certificatedetailsdialog.h \ - $$PWD/qt4symbiantargetfactory.h \ - $$PWD/qt4symbiantarget.h \ $$PWD/s60runcontrolfactory.h \ $$PWD/codaruncontrol.h \ $$PWD/s60runcontrolbase.h \ diff --git a/src/plugins/qt4projectmanager/qt-s60/qt4symbiantarget.cpp b/src/plugins/qt4projectmanager/qt-s60/qt4symbiantarget.cpp deleted file mode 100644 index 00d3fad54a..0000000000 --- a/src/plugins/qt4projectmanager/qt-s60/qt4symbiantarget.cpp +++ /dev/null @@ -1,130 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. -** -**************************************************************************/ - -#include "qt4symbiantarget.h" -#include "qt4projectmanagerconstants.h" -#include "qt4project.h" -#include "qt4nodes.h" -#include "qt4buildconfiguration.h" -#include "symbianidevice.h" - -#include "qt-s60/s60deployconfiguration.h" -#include "qt-s60/s60devicerunconfiguration.h" - -#include <projectexplorer/devicesupport/idevice.h> -#include <projectexplorer/project.h> -#include <projectexplorer/toolchainmanager.h> -#include <projectexplorer/toolchain.h> -#include <qtsupport/customexecutablerunconfiguration.h> -#include <extensionsystem/pluginmanager.h> -#include <QApplication> - -using namespace Qt4ProjectManager; -using namespace Qt4ProjectManager::Internal; - -Qt4SymbianTarget::Qt4SymbianTarget(Qt4Project *parent, const Core::Id id) : - Qt4BaseTarget(parent, id), - m_buildConfigurationFactory(new Qt4BuildConfigurationFactory(this)) -{ - setDisplayName(defaultDisplayName(id)); - setIcon(iconForId(id)); -} - -Qt4SymbianTarget::~Qt4SymbianTarget() -{ } - -QString Qt4SymbianTarget::defaultDisplayName(const Core::Id id) -{ - if (id == Core::Id(Constants::S60_DEVICE_TARGET_ID)) - return QApplication::translate("Qt4ProjectManager::Qt4Target", "Symbian Device", "Qt4 Symbian Device target display name"); - return QString(); -} - -QIcon Qt4SymbianTarget::iconForId(Core::Id id) -{ - if (id == Core::Id(Constants::S60_DEVICE_TARGET_ID)) - return QIcon(QLatin1String(":/projectexplorer/images/SymbianDevice.png")); - return QIcon(); -} - -ProjectExplorer::IBuildConfigurationFactory *Qt4SymbianTarget::buildConfigurationFactory() const -{ - return m_buildConfigurationFactory; -} - -void Qt4SymbianTarget::createApplicationProFiles(bool reparse) -{ - if (!reparse) - removeUnconfiguredCustomExectutableRunConfigurations(); - - // We use the list twice - QList<Qt4ProFileNode *> profiles = qt4Project()->applicationProFiles(); - QSet<QString> paths; - foreach (Qt4ProFileNode *pro, profiles) - paths << pro->path(); - - if (id() == Core::Id(Constants::S60_DEVICE_TARGET_ID)) { - foreach (ProjectExplorer::RunConfiguration *rc, runConfigurations()) - if (S60DeviceRunConfiguration *qt4rc = qobject_cast<S60DeviceRunConfiguration *>(rc)) - paths.remove(qt4rc->proFilePath()); - - // Only add new runconfigurations if there are none. - foreach (const QString &path, paths) - addRunConfiguration(new S60DeviceRunConfiguration(this, path)); - } - - // Oh still none? Add a custom executable runconfiguration - if (runConfigurations().isEmpty()) { - addRunConfiguration(new QtSupport::CustomExecutableRunConfiguration(this)); - } -} - -QList<ProjectExplorer::RunConfiguration *> Qt4SymbianTarget::runConfigurationsForNode(ProjectExplorer::Node *n) -{ - QList<ProjectExplorer::RunConfiguration *> result; - foreach (ProjectExplorer::RunConfiguration *rc, runConfigurations()) { - if (id() == Core::Id(Constants::S60_DEVICE_TARGET_ID)) { - if (S60DeviceRunConfiguration *s60rc = qobject_cast<S60DeviceRunConfiguration *>(rc)) - if (s60rc->proFilePath() == n->path()) - result << rc; - } - } - return result; -} - -ProjectExplorer::IDevice::ConstPtr Qt4SymbianTarget::currentDevice() const -{ - S60DeployConfiguration *dc = dynamic_cast<S60DeployConfiguration *>(activeDeployConfiguration()); - if (dc) - return dc->device(); - return ProjectExplorer::IDevice::ConstPtr(); -} diff --git a/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.cpp b/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.cpp deleted file mode 100644 index 9f90794900..0000000000 --- a/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.cpp +++ /dev/null @@ -1,223 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. -** -**************************************************************************/ - -#include "qt4symbiantargetfactory.h" -#include "qt4projectmanagerconstants.h" -#include "qt4project.h" -#include "buildconfigurationinfo.h" - -#include "qt-s60/s60deployconfiguration.h" -#include "qt-s60/s60devicerunconfiguration.h" -#include "qt-s60/s60createpackagestep.h" -#include "qt-s60/s60deploystep.h" -#include "qt-s60/qt4symbiantarget.h" - -#include <projectexplorer/projectexplorerconstants.h> -#include <projectexplorer/toolchainmanager.h> -#include <qtsupport/customexecutablerunconfiguration.h> - -#include <qtsupport/qtversionmanager.h> - -using ProjectExplorer::idFromMap; -using ProjectExplorer::Task; -using namespace Qt4ProjectManager; -using namespace Qt4ProjectManager::Internal; - -// ------------------------------------------------------------------------- -// Qt4SymbianTargetFactory -// ------------------------------------------------------------------------- - -Qt4SymbianTargetFactory::Qt4SymbianTargetFactory(QObject *parent) : - Qt4BaseTargetFactory(parent) -{ - connect(QtSupport::QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>,QList<int>,QList<int>)), - this, SIGNAL(canCreateTargetIdsChanged())); -} - -Qt4SymbianTargetFactory::~Qt4SymbianTargetFactory() -{ -} - -bool Qt4SymbianTargetFactory::supportsTargetId(const Core::Id id) const -{ - return id == Core::Id(Constants::S60_DEVICE_TARGET_ID); -} - -QList<Core::Id> Qt4SymbianTargetFactory::supportedTargetIds() const -{ - QList<Core::Id> ids; - ids << Core::Id(Constants::S60_DEVICE_TARGET_ID); - return ids; -} - -QString Qt4SymbianTargetFactory::displayNameForId(const Core::Id id) const -{ - return Qt4SymbianTarget::defaultDisplayName(id); -} - -QIcon Qt4SymbianTargetFactory::iconForId(const Core::Id id) const -{ - if (id == Core::Id(Constants::S60_DEVICE_TARGET_ID)) - return QIcon(QLatin1String(":/projectexplorer/images/SymbianDevice.png")); - return QIcon(); -} - -bool Qt4SymbianTargetFactory::canCreate(ProjectExplorer::Project *parent, const Core::Id id) const -{ - if (!qobject_cast<Qt4Project *>(parent)) - return false; - if (!supportsTargetId(id)) - return false; - return QtSupport::QtVersionManager::instance()->supportsTargetId(id); -} - -bool Qt4SymbianTargetFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const -{ - return qobject_cast<Qt4Project *>(parent) && supportsTargetId(idFromMap(map)); -} - -ProjectExplorer::Target *Qt4SymbianTargetFactory::restore(ProjectExplorer::Project *parent, const QVariantMap &map) -{ - if (!canRestore(parent, map)) - return 0; - - Qt4Project *qt4project = static_cast<Qt4Project *>(parent); - Qt4SymbianTarget *target = new Qt4SymbianTarget(qt4project, idFromMap(map)); - - if (target->fromMap(map)) - return target; - delete target; - return 0; -} - -QString Qt4SymbianTargetFactory::shadowBuildDirectory(const QString &profilePath, const Core::Id id, const QString &suffix) -{ - Q_UNUSED(id); - Q_UNUSED(suffix); - return QFileInfo(profilePath).absolutePath(); -} - -QList<ProjectExplorer::Task> Qt4SymbianTargetFactory::reportIssues(const QString &proFile) -{ - QList<ProjectExplorer::Task> results; - // Warn of strange characters in project name and path: - const QString projectName = proFile.mid(proFile.lastIndexOf(QLatin1Char('/')) + 1); - QString projectPath = proFile.left(proFile.lastIndexOf(QLatin1Char('/'))); -#if defined (Q_OS_WIN) - if (projectPath.at(1) == QLatin1Char(':') && projectPath.at(0).toUpper() >= QLatin1Char('A') && projectPath.at(0).toUpper() <= QLatin1Char('Z')) - projectPath.remove(0, 2); -#endif - if (projectPath.contains(QLatin1Char(' '))) { - results.append(Task(Task::Warning, - QCoreApplication::translate("ProjectExplorer::Internal::S60ProjectChecker", - "The Symbian tool chain does not handle spaces " - "in the project path '%1'.").arg(projectPath), - Utils::FileName(), -1, Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM))); - } - if (projectName.contains(QRegExp(QLatin1String("[^a-zA-Z0-9.-]")))) { - results.append(Task(Task::Warning, - QCoreApplication::translate("ProjectExplorer::Internal::S60ProjectChecker", - "The Symbian tool chain does not handle special " - "characters in the project name '%1' well.") - .arg(projectName), - Utils::FileName(), -1, Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM))); - } - return results; -} - -QList<BuildConfigurationInfo> Qt4SymbianTargetFactory::availableBuildConfigurations(const Core::Id id, const QString &proFilePath, - const QtSupport::QtVersionNumber &minimumQtVersion, - const QtSupport::QtVersionNumber &maximumQtVersion, - const Core::FeatureSet &requiredFeatures) -{ - return Qt4BaseTargetFactory::availableBuildConfigurations(id, proFilePath, minimumQtVersion, maximumQtVersion, requiredFeatures); -} - -bool Qt4SymbianTargetFactory::selectByDefault(const Core::Id id) const -{ - Q_UNUSED(id); - return true; -} - -QSet<QString> Qt4SymbianTargetFactory::targetFeatures(const Core::Id /*id*/) const -{ - QSet<QString> features; - features << QLatin1String(Constants::MOBILE_TARGETFEATURE_ID); - - return features; -} - -ProjectExplorer::Target *Qt4SymbianTargetFactory::create(ProjectExplorer::Project *parent, const Core::Id id) -{ - if (!canCreate(parent, id)) - return 0; - - QList<QtSupport::BaseQtVersion *> knownVersions = QtSupport::QtVersionManager::instance()->versionsForTargetId(id); - if (knownVersions.isEmpty()) - return 0; - - QtSupport::BaseQtVersion *qtVersion = knownVersions.first(); - QtSupport::BaseQtVersion::QmakeBuildConfigs config = qtVersion->defaultBuildConfig(); - - QList<BuildConfigurationInfo> infos; - infos.append(BuildConfigurationInfo(qtVersion->uniqueId(), config, QString(), QString())); - infos.append(BuildConfigurationInfo(qtVersion->uniqueId(), config ^ QtSupport::BaseQtVersion::DebugBuild, QString(), QString())); - - return create(parent, id, infos); -} - -ProjectExplorer::Target *Qt4SymbianTargetFactory::create(ProjectExplorer::Project *parent, const Core::Id id, const QList<BuildConfigurationInfo> &infos) -{ - if (!canCreate(parent, id)) - return 0; - Qt4SymbianTarget *t = new Qt4SymbianTarget(static_cast<Qt4Project *>(parent), id); - foreach (const BuildConfigurationInfo &info, infos) - t->addQt4BuildConfiguration(msgBuildConfigurationName(info), QString(), - info.version(), info.buildConfig, - info.additionalArguments, info.directory, info.importing); - - t->addDeployConfiguration(t->createDeployConfiguration(Core::Id(S60_DEPLOYCONFIGURATION_ID))); - - t->createApplicationProFiles(false); - - if (t->runConfigurations().isEmpty()) - t->addRunConfiguration(new QtSupport::CustomExecutableRunConfiguration(t)); - return t; -} - -ProjectExplorer::Target *Qt4SymbianTargetFactory::create(ProjectExplorer::Project *parent, const Core::Id id, Qt4TargetSetupWidget *widget) -{ - if (!widget->isTargetSelected()) - return 0; - Qt4DefaultTargetSetupWidget *w = static_cast<Qt4DefaultTargetSetupWidget *>(widget); - return create(parent, id, w->buildConfigurationInfos()); -} diff --git a/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.h b/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.h deleted file mode 100644 index c802a50607..0000000000 --- a/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.h +++ /dev/null @@ -1,77 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. -** -**************************************************************************/ - -#ifndef QT4SYMBIANTARGETFACTORY_H -#define QT4SYMBIANTARGETFACTORY_H - -#include "qt4basetargetfactory.h" - -namespace Qt4ProjectManager { -namespace Internal { -class Qt4SymbianTargetFactory : public Qt4BaseTargetFactory -{ - Q_OBJECT -public: - Qt4SymbianTargetFactory(QObject *parent = 0); - ~Qt4SymbianTargetFactory(); - - QList<Core::Id> supportedTargetIds() const; - bool supportsTargetId(const Core::Id id) const; - QString displayNameForId(const Core::Id id) const; - QIcon iconForId(const Core::Id id) const; - - bool canCreate(ProjectExplorer::Project *parent, const Core::Id id) const; - bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const; - virtual ProjectExplorer::Target *restore(ProjectExplorer::Project *parent, const QVariantMap &map); - - virtual ProjectExplorer::Target *create(ProjectExplorer::Project *parent, const Core::Id id); - virtual ProjectExplorer::Target *create(ProjectExplorer::Project *parent, const Core::Id id, - const QList<BuildConfigurationInfo> &infos); - virtual ProjectExplorer::Target *create(ProjectExplorer::Project *parent, const Core::Id id, - Qt4TargetSetupWidget *widget); - - QString shadowBuildDirectory(const QString &profilePath, const Core::Id id, const QString &suffix); - QList<ProjectExplorer::Task> reportIssues(const QString &proFile); - QList<BuildConfigurationInfo> availableBuildConfigurations(const Core::Id id, const QString &proFilePath, - const QtSupport::QtVersionNumber &minimumQtVersion, - const QtSupport::QtVersionNumber &maximumQtVersion, - const Core::FeatureSet &requiredFeatures); - - bool selectByDefault(const Core::Id id) const; - QSet<QString> targetFeatures(const Core::Id id) const; -}; - -} // namespace Internal -} // namespace Qt4ProjectManager - - -#endif // QT4SYMBIANTARGETFACTORY_H diff --git a/src/plugins/qt4projectmanager/qt-s60/rvcttoolchain.cpp b/src/plugins/qt4projectmanager/qt-s60/rvcttoolchain.cpp index 21e30c9097..9ffc10b37f 100644 --- a/src/plugins/qt4projectmanager/qt-s60/rvcttoolchain.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/rvcttoolchain.cpp @@ -62,7 +62,6 @@ static const char *const RVCT_LICENSE_KEY = "ARMLMD_LICENSE_FILE"; static const char rvctPathKeyC[] = "Qt4ProjectManager.RvctToolChain.CompilerPath"; static const char rvctEnvironmentKeyC[] = "Qt4ProjectManager.RvctToolChain.Environment"; static const char rvctArmVersionKeyC[] = "Qt4ProjectManager.RvctToolChain.ArmVersion"; -static const char debuggerCommandKeyC[] = "Qt4ProjectManager.RvctToolChain.Debugger"; static QString valueOf(const QList<Utils::EnvironmentItem> &items, const QString &suffix) { @@ -104,8 +103,7 @@ RvctToolChain::RvctToolChain(const RvctToolChain &tc) : ToolChain(tc), m_compilerCommand(tc.m_compilerCommand), m_environmentChanges(tc.m_environmentChanges), - m_armVersion(tc.m_armVersion), - m_debuggerCommand(tc.debuggerCommand()) + m_armVersion(tc.m_armVersion) { } RvctToolChain::RvctVersion RvctToolChain::version(const Utils::FileName &rvctPath) @@ -253,8 +251,7 @@ bool RvctToolChain::operator ==(const ToolChain &other) const const RvctToolChain *otherPtr = dynamic_cast<const RvctToolChain *>(&other); return m_compilerCommand == otherPtr->m_compilerCommand && m_environmentChanges == otherPtr->m_environmentChanges - && m_armVersion == otherPtr->m_armVersion - && m_debuggerCommand == otherPtr->m_debuggerCommand; + && m_armVersion == otherPtr->m_armVersion; } void RvctToolChain::setEnvironmentChanges(const QList<Utils::EnvironmentItem> &changes) @@ -285,19 +282,6 @@ Utils::FileName RvctToolChain::compilerCommand() const return m_compilerCommand; } -void RvctToolChain::setDebuggerCommand(const Utils::FileName &d) -{ - if (m_debuggerCommand == d) - return; - m_debuggerCommand = d; - toolChainUpdated(); -} - -Utils::FileName RvctToolChain::debuggerCommand() const -{ - return m_debuggerCommand; -} - void RvctToolChain::setArmVersion(RvctToolChain::ArmVersion av) { if (m_armVersion == av) @@ -339,7 +323,6 @@ QVariantMap RvctToolChain::toMap() const tmp.insert(i.name, i.value); result.insert(QLatin1String(rvctEnvironmentKeyC), tmp); result.insert(QLatin1String(rvctArmVersionKeyC), static_cast<int>(m_armVersion)); - result.insert(QLatin1String(debuggerCommandKeyC), m_debuggerCommand.toString()); return result; } @@ -354,17 +337,9 @@ bool RvctToolChain::fromMap(const QVariantMap &data) for (QVariantMap::const_iterator i = tmp.constBegin(); i != tmp.constEnd(); ++i) m_environmentChanges.append(Utils::EnvironmentItem(i.key(), i.value().toString())); m_armVersion = static_cast<ArmVersion>(data.value(QLatin1String(rvctArmVersionKeyC), 0).toInt()); - m_debuggerCommand = Utils::FileName::fromString(data.value(QLatin1String(debuggerCommandKeyC)).toString()); return isValid(); } -QString RvctToolChain::legacyId() const -{ - const QChar dot = QLatin1Char('.'); - return QLatin1String(Constants::RVCT_TOOLCHAIN_ID) + QLatin1Char(':') + m_compilerCommand.toString() + dot - + armVersionString(m_armVersion) + dot + m_debuggerCommand.toString(); -} - QString RvctToolChain::varName(const QString &postFix) const { return QString::fromLatin1("RVCT%1%2%3") @@ -381,7 +356,6 @@ RvctToolChainConfigWidget::RvctToolChainConfigWidget(RvctToolChain *tc) : m_model(new Utils::EnvironmentModel(this)) { m_ui->setupUi(this); - addDebuggerCommandControls(m_ui->formLayout, QStringList(QLatin1String("--version"))); m_ui->environmentView->setModel(m_model); m_ui->environmentView->horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents); @@ -400,8 +374,6 @@ RvctToolChainConfigWidget::RvctToolChainConfigWidget(RvctToolChain *tc) : m_ui->versionComboBox->setCurrentIndex(static_cast<int>(tc->armVersion())); connect(m_ui->versionComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(emitDirty())); - addMkspecControls(m_ui->formLayout); - setFromToolChain(); } @@ -419,8 +391,6 @@ void RvctToolChainConfigWidget::apply() tc->setCompilerCommand(m_ui->compilerPath->fileName()); tc->setArmVersion(static_cast<RvctToolChain::ArmVersion>(m_ui->versionComboBox->currentIndex())); tc->setEnvironmentChanges(changes); - tc->setDebuggerCommand(debuggerCommand()); - tc->setMkspecList(mkspecList()); m_model->setUserChanges(changes); } @@ -434,8 +404,6 @@ void RvctToolChainConfigWidget::setFromToolChain() m_ui->compilerPath->setFileName(tc->compilerCommand()); m_ui->versionComboBox->setCurrentIndex(static_cast<int>(tc->armVersion())); - setDebuggerCommand(tc->debuggerCommand()); - setMkspecList(tc->mkspecList()); } bool RvctToolChainConfigWidget::isDirty() const @@ -445,9 +413,7 @@ bool RvctToolChainConfigWidget::isDirty() const return tc->compilerCommand() != m_ui->compilerPath->fileName() || tc->armVersion() != static_cast<RvctToolChain::ArmVersion>(m_ui->versionComboBox->currentIndex()) - || tc->environmentChanges() != environmentChanges() - || tc->debuggerCommand() != debuggerCommand() - || tc->mkspecList() != mkspecList(); + || tc->environmentChanges() != environmentChanges(); } void RvctToolChainConfigWidget::makeReadOnly() @@ -544,7 +510,6 @@ QList<ProjectExplorer::ToolChain *> RvctToolChainFactory::autoDetect() tc->setDisplayName(name.arg(armVersionString(tc->armVersion())) .arg(v.majorVersion).arg(v.minorVersion).arg(v.build)); tc->setVersion(v); - tc->setDebuggerCommand(ProjectExplorer::ToolChainManager::instance()->defaultDebugger(tc->targetAbi())); result.append(tc); tc = new RvctToolChain(true); @@ -554,7 +519,6 @@ QList<ProjectExplorer::ToolChain *> RvctToolChainFactory::autoDetect() tc->setDisplayName(name.arg(armVersionString(tc->armVersion())) .arg(v.majorVersion).arg(v.minorVersion).arg(v.build)); tc->setVersion(v); - tc->setDebuggerCommand(ProjectExplorer::ToolChainManager::instance()->defaultDebugger(tc->targetAbi())); result.append(tc); } diff --git a/src/plugins/qt4projectmanager/qt-s60/rvcttoolchain.h b/src/plugins/qt4projectmanager/qt-s60/rvcttoolchain.h index 36e9df44d3..62435f7cea 100644 --- a/src/plugins/qt4projectmanager/qt-s60/rvcttoolchain.h +++ b/src/plugins/qt4projectmanager/qt-s60/rvcttoolchain.h @@ -85,8 +85,6 @@ public: QString typeDisplayName() const; ProjectExplorer::Abi targetAbi() const; - QString legacyId() const; - bool isValid() const; QByteArray predefinedMacros(const QStringList &cxxflags) const; @@ -105,9 +103,6 @@ public: void setCompilerCommand(const Utils::FileName &path); Utils::FileName compilerCommand() const; - void setDebuggerCommand(const Utils::FileName &d); - Utils::FileName debuggerCommand() const; - void setArmVersion(ArmVersion); ArmVersion armVersion() const; @@ -130,7 +125,6 @@ private: QList<Utils::EnvironmentItem> m_environmentChanges; ArmVersion m_armVersion; mutable RvctVersion m_version; - Utils::FileName m_debuggerCommand; friend class RvctToolChainFactory; }; diff --git a/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.cpp b/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.cpp index 493c9bd65f..464f842132 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.cpp @@ -43,6 +43,7 @@ #include "s60certificateinfo.h" #include "s60certificatedetailsdialog.h" #include "symbianqtversion.h" +#include "symbianidevicefactory.h" #include <app/app_version.h> @@ -52,11 +53,14 @@ #include <projectexplorer/buildconfiguration.h> #include <projectexplorer/buildsteplist.h> #include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/profileinformation.h> #include <projectexplorer/target.h> #include <projectexplorer/project.h> #include <projectexplorer/gnumakeparser.h> #include <projectexplorer/task.h> +#include <qtsupport/qtprofileinformation.h> + #include <QDir> #include <QTimer> #include <QCryptographicHash> @@ -182,12 +186,21 @@ Qt4BuildConfiguration *S60CreatePackageStep::qt4BuildConfiguration() const bool S60CreatePackageStep::init() { Qt4Project *pro = qobject_cast<Qt4Project *>(project()); + ProjectExplorer::ToolChain *tc + = ProjectExplorer::ToolChainProfileInformation::toolChain(target()->profile()); QList<Qt4ProFileNode *> nodes = pro->allProFiles(); - SymbianQtVersion *sqv = dynamic_cast<SymbianQtVersion *>(qt4BuildConfiguration()->qtVersion()); - if (!sqv) + SymbianQtVersion *sqv + = dynamic_cast<SymbianQtVersion *>(QtSupport::QtProfileInformation::qtVersion(target()->profile())); + if (!sqv) { + emit addOutput(tr("The selected profile is not configured with a Symbian Qt"), BuildStep::ErrorOutput); + return false; + } + if (!tc) { + emit addOutput(tr("The selected profile has no toolchain"), BuildStep::ErrorOutput); return false; + } m_isBuildWithSymbianSbsV2 = sqv->isBuildWithSymbianSbsV2(); m_workingDirectories.clear(); @@ -198,7 +211,7 @@ bool S60CreatePackageStep::init() } projectCapabilities.removeDuplicates(); - m_makeCmd = qt4BuildConfiguration()->makeCommand(); + m_makeCmd = tc->makeCommand(); if (!QFileInfo(m_makeCmd).isAbsolute()) { // Try to detect command in environment const QString tmp = qt4BuildConfiguration()->environment().searchInPath(m_makeCmd); @@ -265,7 +278,7 @@ void S60CreatePackageStep::handleWarnAboutPatching() changedText = tr("<p>Qt modified some of your packages.</p>"); } const QString text = - tr("%1<p><em>These changes were not part of your build system</em> but are required to " + tr("%1<p><em>These changes were not part of your build profile</em> but are required to " "make sure the <em>self-signed</em> package can be installed successfully on a device.</p>" "<p>Check the Issues pane for more details on the modifications made.</p>" "<p>Please see the <a href=\"%2\">documentation</a> for other signing options which " @@ -739,11 +752,7 @@ S60CreatePackageStepFactory::~S60CreatePackageStepFactory() bool S60CreatePackageStepFactory::canCreate(ProjectExplorer::BuildStepList *parent, const Core::Id id) const { - if (parent->id() != Core::Id(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY)) - return false; - if (parent->target()->id() != Core::Id(Constants::S60_DEVICE_TARGET_ID)) - return false; - return (id == Core::Id(SIGN_BS_ID)); + return canHandle(parent) && id == Core::Id(SIGN_BS_ID); } ProjectExplorer::BuildStep *S60CreatePackageStepFactory::create(ProjectExplorer::BuildStepList *parent, const Core::Id id) @@ -765,6 +774,16 @@ ProjectExplorer::BuildStep *S60CreatePackageStepFactory::clone(ProjectExplorer:: return new S60CreatePackageStep(parent, static_cast<S60CreatePackageStep *>(source)); } +bool S60CreatePackageStepFactory::canHandle(ProjectExplorer::BuildStepList *parent) const +{ + if (parent->id() != Core::Id(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY)) + return false; + Core::Id deviceType = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(parent->target()->profile()); + if (deviceType != SymbianIDeviceFactory::deviceType()) + return false; + return qobject_cast<Qt4Project *>(parent->target()->project()); +} + bool S60CreatePackageStepFactory::canRestore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map) const { return canCreate(parent, ProjectExplorer::idFromMap(map)); @@ -783,11 +802,10 @@ ProjectExplorer::BuildStep *S60CreatePackageStepFactory::restore(ProjectExplorer QList<Core::Id> S60CreatePackageStepFactory::availableCreationIds(ProjectExplorer::BuildStepList *parent) const { - if (parent->id() != Core::Id(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY)) + if (!canHandle(parent)) return QList<Core::Id>(); - if (parent->target()->id() == Core::Id(Constants::S60_DEVICE_TARGET_ID)) - return QList<Core::Id>() << Core::Id(SIGN_BS_ID); - return QList<Core::Id>(); + + return QList<Core::Id>() << Core::Id(SIGN_BS_ID); } QString S60CreatePackageStepFactory::displayNameForId(const Core::Id id) const diff --git a/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.h b/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.h index 8cbdb8aa1c..b308036123 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.h +++ b/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.h @@ -73,6 +73,8 @@ public: ProjectExplorer::BuildStep *restore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map); bool canClone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *product) const; ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *product); + + bool canHandle(ProjectExplorer::BuildStepList *parent) const; }; diff --git a/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.cpp index 6b7f323378..0e9b22f2b1 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.cpp @@ -34,11 +34,9 @@ #include "s60deployconfigurationwidget.h" #include "s60manager.h" #include "qt4project.h" -#include "qt4target.h" #include "qt4nodes.h" #include "qt4projectmanagerconstants.h" #include "qt4buildconfiguration.h" -#include "qt4symbiantarget.h" #include "s60createpackagestep.h" #include "s60deploystep.h" #include "symbianidevice.h" @@ -51,9 +49,13 @@ #include <projectexplorer/buildsteplist.h> #include <projectexplorer/devicesupport/devicemanager.h> #include <projectexplorer/project.h> +#include <projectexplorer/profileinformation.h> +#include <projectexplorer/target.h> #include <projectexplorer/toolchain.h> #include <projectexplorer/devicesupport/devicemanager.h> +#include <qtsupport/qtprofileinformation.h> + #include <QFileInfo> using namespace ProjectExplorer; @@ -107,15 +109,17 @@ S60DeployConfiguration::S60DeployConfiguration(Target *target, S60DeployConfigur void S60DeployConfiguration::ctor() { setDefaultDisplayName(defaultDisplayName()); + + Qt4Project *project = static_cast<Qt4Project *>(target()->project()); // TODO disable S60 Deploy Configuration while parsing // requires keeping track of the parsing state of the project - connect(qt4Target()->qt4Project(), SIGNAL(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode*,bool,bool)), + connect(project, SIGNAL(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode*,bool,bool)), this, SLOT(slotTargetInformationChanged(Qt4ProjectManager::Qt4ProFileNode*,bool,bool))); - connect(qt4Target(), SIGNAL(activeBuildConfigurationChanged(ProjectExplorer::BuildConfiguration*)), + connect(target(), SIGNAL(activeBuildConfigurationChanged(ProjectExplorer::BuildConfiguration*)), this, SLOT(updateActiveBuildConfiguration(ProjectExplorer::BuildConfiguration*))); - connect(qt4Target(), SIGNAL(activeRunConfigurationChanged(ProjectExplorer::RunConfiguration*)), + connect(target(), SIGNAL(activeRunConfigurationChanged(ProjectExplorer::RunConfiguration*)), this, SLOT(updateActiveRunConfiguration(ProjectExplorer::RunConfiguration*))); - updateActiveBuildConfiguration(qt4Target()->activeBuildConfiguration()); + updateActiveBuildConfiguration(target()->activeBuildConfiguration()); } S60DeployConfiguration::~S60DeployConfiguration() @@ -155,7 +159,7 @@ bool S60DeployConfiguration::hasSisPackage(const Qt4ProFileNode &projectNode) co QStringList S60DeployConfiguration::signedPackages() const { - QList<Qt4ProFileNode *> list = qt4Target()->qt4Project()->allProFiles(); + QList<Qt4ProFileNode *> list = static_cast<Qt4Project *>(target()->project())->allProFiles(); QStringList result; foreach (Qt4ProFileNode *node, list) { if (!hasSisPackage(*node)) @@ -183,7 +187,7 @@ SymbianIDevice::ConstPtr S60DeployConfiguration::device() const QStringList S60DeployConfiguration::packageFileNamesWithTargetInfo() const { - QList<Qt4ProFileNode *> leafs = qt4Target()->qt4Project()->allProFiles(); + QList<Qt4ProFileNode *> leafs = static_cast<Qt4Project *>(target()->project())->allProFiles(); QStringList result; foreach (Qt4ProFileNode *qt4ProFileNode, leafs) { if (!hasSisPackage(*qt4ProFileNode)) @@ -192,9 +196,10 @@ QStringList S60DeployConfiguration::packageFileNamesWithTargetInfo() const if (!ti.valid) continue; QString baseFileName = ti.buildDir + QLatin1Char('/') + ti.target; + ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(target()->profile()); baseFileName += QLatin1Char('_') + (isDebug() ? QLatin1String("debug") : QLatin1String("release")) - + QLatin1Char('-') + S60Manager::platform(qt4Target()->activeBuildConfiguration()->toolChain()) + QLatin1String(".sis"); + + QLatin1Char('-') + S60Manager::platform(tc) + QLatin1String(".sis"); result << baseFileName; } return result; @@ -202,7 +207,7 @@ QStringList S60DeployConfiguration::packageFileNamesWithTargetInfo() const QStringList S60DeployConfiguration::packageTemplateFileNames() const { - QList<Qt4ProFileNode *> list = qt4Target()->qt4Project()->allProFiles(); + QList<Qt4ProFileNode *> list = static_cast<Qt4Project *>(target()->project())->allProFiles(); QStringList result; foreach (Qt4ProFileNode *node, list) { if (!hasSisPackage(*node)) @@ -216,7 +221,7 @@ QStringList S60DeployConfiguration::packageTemplateFileNames() const QStringList S60DeployConfiguration::appPackageTemplateFileNames() const { - QList<Qt4ProFileNode *> list = qt4Target()->qt4Project()->allProFiles(); + QList<Qt4ProFileNode *> list = static_cast<Qt4Project *>(target()->project())->allProFiles(); QStringList result; foreach (Qt4ProFileNode *node, list) { if (!hasSisPackage(*node)) @@ -258,16 +263,10 @@ bool S60DeployConfiguration::isSigned() const return false; } -ProjectExplorer::ToolChain *S60DeployConfiguration::toolChain() const -{ - if (Qt4BuildConfiguration *bc = qobject_cast<Qt4BuildConfiguration *>(target()->activeBuildConfiguration())) - return bc->toolChain(); - return 0; -} - bool S60DeployConfiguration::isDebug() const { - const Qt4BuildConfiguration *qt4bc = qt4Target()->activeQt4BuildConfiguration(); + const Qt4BuildConfiguration *qt4bc = qobject_cast<Qt4BuildConfiguration *>(target()->activeBuildConfiguration()); + QTC_ASSERT(qt4bc, return false); return (qt4bc->qmakeBuildConfiguration() & QtSupport::BaseQtVersion::DebugBuild); } @@ -276,13 +275,6 @@ QString S60DeployConfiguration::symbianTarget() const return isDebug() ? QLatin1String("udeb") : QLatin1String("urel"); } -const QtSupport::BaseQtVersion *S60DeployConfiguration::qtVersion() const -{ - if (const Qt4BuildConfiguration *qt4bc = qt4Target()->activeQt4BuildConfiguration()) - return qt4bc->qtVersion(); - return 0; -} - void S60DeployConfiguration::updateActiveBuildConfiguration(ProjectExplorer::BuildConfiguration *buildConfiguration) { if (m_activeBuildConfiguration) @@ -311,7 +303,7 @@ QVariantMap S60DeployConfiguration::toMap() const QString S60DeployConfiguration::defaultDisplayName() const { - QList<Qt4ProFileNode *> list = qt4Target()->qt4Project()->allProFiles(); + QList<Qt4ProFileNode *> list = static_cast<Qt4Project *>(target()->project())->allProFiles(); foreach (Qt4ProFileNode *node, list) { TargetInformation ti = node->targetInformation(); if (ti.valid && !ti.buildDir.isEmpty()) @@ -332,11 +324,6 @@ bool S60DeployConfiguration::fromMap(const QVariantMap &map) return true; } -Qt4SymbianTarget *S60DeployConfiguration::qt4Target() const -{ - return static_cast<Qt4SymbianTarget *>(target()); -} - char S60DeployConfiguration::installationDrive() const { return m_installationDrive; @@ -375,8 +362,7 @@ const QList<S60DeployConfiguration::DeviceDrive> &S60DeployConfiguration::availa S60DeployConfigurationFactory::S60DeployConfigurationFactory(QObject *parent) : DeployConfigurationFactory(parent) -{ -} +{ setObjectName(QLatin1String("S60DeployConfiguration")); } S60DeployConfigurationFactory::~S60DeployConfigurationFactory() { @@ -385,11 +371,16 @@ S60DeployConfigurationFactory::~S60DeployConfigurationFactory() QList<Core::Id> S60DeployConfigurationFactory::availableCreationIds(Target *parent) const { QList<Core::Id> result; - Qt4SymbianTarget *target = qobject_cast<Qt4SymbianTarget *>(parent); - if (!target || target->id() != Core::Id(Constants::S60_DEVICE_TARGET_ID)) + Qt4Project *project = qobject_cast<Qt4Project *>(parent->project()); + + if (!project) + return result; + + ProjectExplorer::IDevice::ConstPtr dev = ProjectExplorer::DeviceProfileInformation::device(parent->profile()); + if (dev.isNull() || dev->type() != SymbianIDeviceFactory::deviceType()) return result; - QStringList proFiles = target->qt4Project()->applicationProFilePathes(QLatin1String(S60_DC_PREFIX)); + QStringList proFiles = project->applicationProFilePathes(QLatin1String(S60_DC_PREFIX)); foreach (const QString &pf, proFiles) result << Core::Id(pf.toUtf8().constData()); return result; @@ -407,8 +398,7 @@ DeployConfiguration *S60DeployConfigurationFactory::create(Target *parent, const if (!canCreate(parent, id)) return 0; - Qt4SymbianTarget *t = static_cast<Qt4SymbianTarget *>(parent); - S60DeployConfiguration *dc = new S60DeployConfiguration(t); + S60DeployConfiguration *dc = new S60DeployConfiguration(parent); dc->setDefaultDisplayName(tr("Deploy to Symbian device")); dc->stepList()->insertStep(0, new S60CreatePackageStep(dc->stepList())); @@ -418,11 +408,13 @@ DeployConfiguration *S60DeployConfigurationFactory::create(Target *parent, const bool S60DeployConfigurationFactory::canCreate(Target *parent, const Core::Id id) const { - Qt4SymbianTarget * t = qobject_cast<Qt4SymbianTarget *>(parent); - if (!t || t->id() != Core::Id(Constants::S60_DEVICE_TARGET_ID) - || !QString::fromUtf8(id.name()).startsWith(QLatin1String(S60_DEPLOYCONFIGURATION_ID))) + Qt4Project *project = qobject_cast<Qt4Project *>(parent->project()); + if (!project) return false; - return true; + ProjectExplorer::IDevice::ConstPtr dev = ProjectExplorer::DeviceProfileInformation::device(parent->profile()); + if (dev.isNull() || dev->type() != SymbianIDeviceFactory::deviceType()) + return false; + return id == Core::Id(S60_DEPLOYCONFIGURATION_ID); } bool S60DeployConfigurationFactory::canRestore(Target *parent, const QVariantMap& map) const @@ -434,8 +426,7 @@ DeployConfiguration *S60DeployConfigurationFactory::restore(Target *parent, cons { if (!canRestore(parent, map)) return 0; - Qt4SymbianTarget *t = static_cast<Qt4SymbianTarget *>(parent); - S60DeployConfiguration *dc = new S60DeployConfiguration(t); + S60DeployConfiguration *dc = new S60DeployConfiguration(parent); if (dc->fromMap(map)) return dc; @@ -445,7 +436,7 @@ DeployConfiguration *S60DeployConfigurationFactory::restore(Target *parent, cons bool S60DeployConfigurationFactory::canClone(Target *parent, DeployConfiguration *source) const { - if (!qobject_cast<Qt4SymbianTarget *>(parent)) + if (!qobject_cast<Qt4Project *>(parent->project())) return false; return source->id() == Core::Id(S60_DEPLOYCONFIGURATION_ID); } @@ -454,7 +445,6 @@ DeployConfiguration *S60DeployConfigurationFactory::clone(Target *parent, Deploy { if (!canClone(parent, source)) return 0; - Qt4SymbianTarget *t = static_cast<Qt4SymbianTarget *>(parent); - S60DeployConfiguration * old = static_cast<S60DeployConfiguration *>(source); - return new S60DeployConfiguration(t, old); + S60DeployConfiguration *old = static_cast<S60DeployConfiguration *>(source); + return new S60DeployConfiguration(parent, old); } diff --git a/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.h b/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.h index ca5552c9a0..ed7de185d1 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.h +++ b/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.h @@ -71,9 +71,6 @@ public: ProjectExplorer::DeployConfigurationWidget *configurationWidget() const; - const QtSupport::BaseQtVersion *qtVersion() const; - ProjectExplorer::ToolChain *toolChain() const; - char installationDrive() const; void setInstallationDrive(char drive); @@ -118,7 +115,6 @@ private: bool isStaticLibrary(const Qt4ProFileNode &projectNode) const; bool isApplication(const Qt4ProFileNode &projectNode) const; bool hasSisPackage(const Qt4ProFileNode &projectNode) const; - Internal::Qt4SymbianTarget *qt4Target() const; private: ProjectExplorer::BuildConfiguration *m_activeBuildConfiguration; diff --git a/src/plugins/qt4projectmanager/qt-s60/s60deploystep.cpp b/src/plugins/qt4projectmanager/qt-s60/s60deploystep.cpp index 239e981361..b6ab99ee9c 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60deploystep.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60deploystep.cpp @@ -33,15 +33,18 @@ #include "s60deploystep.h" #include "qt4buildconfiguration.h" +#include "qt4project.h" #include "s60deployconfiguration.h" #include "s60devicerunconfiguration.h" #include "symbianidevice.h" +#include "symbianidevicefactory.h" #include "codadevice.h" #include "codaruncontrol.h" #include <coreplugin/icore.h> #include <projectexplorer/buildsteplist.h> #include <projectexplorer/target.h> +#include <projectexplorer/profileinformation.h> #include <projectexplorer/projectexplorerconstants.h> #include <qt4projectmanagerconstants.h> @@ -678,11 +681,7 @@ S60DeployStepFactory::~S60DeployStepFactory() bool S60DeployStepFactory::canCreate(ProjectExplorer::BuildStepList *parent, const Core::Id id) const { - if (parent->id() != Core::Id(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY)) - return false; - if (parent->target()->id() != Core::Id(Constants::S60_DEVICE_TARGET_ID)) - return false; - return (id == Core::Id(S60_DEPLOY_STEP_ID)); + return canHandle(parent) && id == Core::Id(S60_DEPLOY_STEP_ID); } ProjectExplorer::BuildStep *S60DeployStepFactory::create(ProjectExplorer::BuildStepList *parent, const Core::Id id) @@ -708,6 +707,16 @@ ProjectExplorer::BuildStep *S60DeployStepFactory::clone(ProjectExplorer::BuildSt return new S60DeployStep(parent, static_cast<S60DeployStep *>(source)); } +bool S60DeployStepFactory::canHandle(BuildStepList *parent) const +{ + if (parent->id() != Core::Id(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY)) + return false; + Core::Id deviceType = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(parent->target()->profile()); + if (deviceType != SymbianIDeviceFactory::deviceType()) + return false; + return qobject_cast<Qt4Project *>(parent->target()->project()); +} + bool S60DeployStepFactory::canRestore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map) const { return canCreate(parent, ProjectExplorer::idFromMap(map)); @@ -726,10 +735,9 @@ ProjectExplorer::BuildStep *S60DeployStepFactory::restore(ProjectExplorer::Build QList<Core::Id> S60DeployStepFactory::availableCreationIds(ProjectExplorer::BuildStepList *parent) const { - if (parent->id() == Core::Id(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY) - && parent->target()->id() == Core::Id(Constants::S60_DEVICE_TARGET_ID)) - return QList<Core::Id>() << Core::Id(S60_DEPLOY_STEP_ID); - return QList<Core::Id>(); + if (!canHandle(parent)) + return QList<Core::Id>(); + return QList<Core::Id>() << Core::Id(S60_DEPLOY_STEP_ID); } QString S60DeployStepFactory::displayNameForId(const Core::Id id) const diff --git a/src/plugins/qt4projectmanager/qt-s60/s60deploystep.h b/src/plugins/qt4projectmanager/qt-s60/s60deploystep.h index bbe172f4bd..e2e15e7396 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60deploystep.h +++ b/src/plugins/qt4projectmanager/qt-s60/s60deploystep.h @@ -82,6 +82,8 @@ public: ProjectExplorer::BuildStep *restore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map); bool canClone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *product) const; ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *product); + + bool canHandle(ProjectExplorer::BuildStepList *parent) const; }; class S60DeployStep : public ProjectExplorer::BuildStep diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicedebugruncontrol.cpp b/src/plugins/qt4projectmanager/qt-s60/s60devicedebugruncontrol.cpp index 924ab78920..041fa573b5 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60devicedebugruncontrol.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60devicedebugruncontrol.cpp @@ -33,7 +33,6 @@ #include "s60devicedebugruncontrol.h" #include "codaruncontrol.h" -#include "qt4symbiantarget.h" #include "s60deployconfiguration.h" #include "s60devicerunconfiguration.h" #include "symbianidevice.h" @@ -41,8 +40,9 @@ #include <coreplugin/icore.h> #include <debugger/debuggerengine.h> #include <debugger/debuggerstartparameters.h> -#include <projectexplorer/project.h> #include <projectexplorer/buildconfiguration.h> +#include <projectexplorer/project.h> +#include <projectexplorer/target.h> #include <utils/qtcassert.h> #include <QFileInfo> diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp index 70d9a978d3..99e304829d 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp @@ -35,17 +35,20 @@ #include "qt4project.h" #include "qt4nodes.h" #include "qt4projectmanagerconstants.h" -#include "qt4symbiantarget.h" -#include "qt4target.h" #include "qt4buildconfiguration.h" #include "s60deployconfiguration.h" #include "s60devicerunconfigurationwidget.h" #include "s60manager.h" #include "symbianidevice.h" +#include "symbianidevicefactory.h" #include "symbianqtversion.h" #include <utils/qtcassert.h> +#include <projectexplorer/profileinformation.h> +#include <projectexplorer/target.h> +#include <qtsupport/customexecutablerunconfiguration.h> #include <qtsupport/qtoutputformatter.h> +#include <qtsupport/qtprofileinformation.h> using namespace ProjectExplorer; using namespace Qt4ProjectManager; @@ -75,17 +78,19 @@ QString pathFromId(Core::Id id) // ======== S60DeviceRunConfiguration -S60DeviceRunConfiguration::S60DeviceRunConfiguration(Qt4BaseTarget *parent, const QString &proFilePath) : - RunConfiguration(parent, Core::Id(S60_DEVICE_RC_ID)), - m_proFilePath(proFilePath), - m_validParse(parent->qt4Project()->validParse(proFilePath)), - m_parseInProgress(parent->qt4Project()->parseInProgress(proFilePath)) +S60DeviceRunConfiguration::S60DeviceRunConfiguration(Target *parent, Core::Id id) : + RunConfiguration(parent, id), + m_proFilePath(pathFromId(id)) { + Qt4Project *project = static_cast<Qt4Project *>(parent->project()); + m_validParse = project->validParse(m_proFilePath); + m_parseInProgress = project->parseInProgress(m_proFilePath); + ctor(); } -S60DeviceRunConfiguration::S60DeviceRunConfiguration(Qt4BaseTarget *target, S60DeviceRunConfiguration *source) : - RunConfiguration(target, source), +S60DeviceRunConfiguration::S60DeviceRunConfiguration(Target *parent, S60DeviceRunConfiguration *source) : + RunConfiguration(parent, source), m_proFilePath(source->m_proFilePath), m_commandLineArguments(source->m_commandLineArguments), m_validParse(source->m_validParse), @@ -103,7 +108,7 @@ void S60DeviceRunConfiguration::ctor() //: S60 device runconfiguration default display name (no profile set) setDefaultDisplayName(tr("Run on Symbian device")); - Qt4Project *pro = qt4Target()->qt4Project(); + Qt4Project *pro = static_cast<Qt4Project *>(target()->project()); connect(pro, SIGNAL(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode*,bool,bool)), this, SLOT(proFileUpdate(Qt4ProjectManager::Qt4ProFileNode*,bool,bool))); } @@ -126,11 +131,6 @@ S60DeviceRunConfiguration::~S60DeviceRunConfiguration() { } -Qt4SymbianTarget *S60DeviceRunConfiguration::qt4Target() const -{ - return static_cast<Qt4SymbianTarget *>(target()); -} - bool S60DeviceRunConfiguration::isEnabled() const { return m_validParse && !m_parseInProgress; @@ -142,7 +142,7 @@ QString S60DeviceRunConfiguration::disabledReason() const return tr("The .pro file '%1' is currently being parsed.") .arg(QFileInfo(m_proFilePath).fileName()); if (!m_validParse) - return qt4Target()->qt4Project()->disabledReasonForRunConfiguration(m_proFilePath); + return static_cast<Qt4Project *>(target()->project())->disabledReasonForRunConfiguration(m_proFilePath); return QString(); } @@ -153,7 +153,7 @@ QWidget *S60DeviceRunConfiguration::createConfigurationWidget() Utils::OutputFormatter *S60DeviceRunConfiguration::createOutputFormatter() const { - return new QtSupport::QtOutputFormatter(qt4Target()->qt4Project()); + return new QtSupport::QtOutputFormatter(target()->project()); } QVariantMap S60DeviceRunConfiguration::toMap() const @@ -179,8 +179,8 @@ bool S60DeviceRunConfiguration::fromMap(const QVariantMap &map) if (!QFileInfo(m_proFilePath).exists()) return false; - m_validParse = qt4Target()->qt4Project()->validParse(m_proFilePath); - m_parseInProgress = qt4Target()->qt4Project()->parseInProgress(m_proFilePath); + m_validParse = static_cast<Qt4Project *>(target()->project())->validParse(m_proFilePath); + m_parseInProgress = static_cast<Qt4Project *>(target()->project())->parseInProgress(m_proFilePath); setDefaultDisplayName(tr("%1 on Symbian Device").arg(QFileInfo(m_proFilePath).completeBaseName())); @@ -198,23 +198,16 @@ static inline QString fixBaseNameTarget(const QString &in) QString S60DeviceRunConfiguration::targetName() const { - TargetInformation ti = qt4Target()->qt4Project()->rootQt4ProjectNode()->targetInformation(projectFilePath()); + TargetInformation ti = static_cast<Qt4Project *>(target()->project()) + ->rootQt4ProjectNode()->targetInformation(projectFilePath()); if (!ti.valid) return QString(); return ti.target; } -SymbianQtVersion *S60DeviceRunConfiguration::qtVersion() const -{ - if (const BuildConfiguration *bc = target()->activeBuildConfiguration()) - if (const Qt4BuildConfiguration *qt4bc = qobject_cast<const Qt4BuildConfiguration *>(bc)) - return dynamic_cast<SymbianQtVersion *>(qt4bc->qtVersion()); - return 0; -} - bool S60DeviceRunConfiguration::isDebug() const { - const Qt4BuildConfiguration *qt4bc = qt4Target()->activeQt4BuildConfiguration(); + const Qt4BuildConfiguration *qt4bc = static_cast<const Qt4BuildConfiguration *>(target()->activeBuildConfiguration()); return (qt4bc->qmakeBuildConfiguration() & QtSupport::BaseQtVersion::DebugBuild); } @@ -224,12 +217,18 @@ QString S60DeviceRunConfiguration::symbianTarget() const } // ABLD/Raptor: Return executable from device/EPOC -static inline QString localExecutableFromVersion(const SymbianQtVersion *qtv, - const QString &symbianTarget, /* udeb/urel */ - const QString &targetName, - const ProjectExplorer::ToolChain *tc) +static inline QString localExecutableFromVersion(const ProjectExplorer::Profile *p, + const QString &symbianTarget, /* udeb/urel */ + const QString &targetName) { - Q_ASSERT(qtv); + Q_ASSERT(p); + + ToolChain *tc = ToolChainProfileInformation::toolChain(p); + SymbianQtVersion *qtv = dynamic_cast<SymbianQtVersion *>(QtSupport::QtProfileInformation::qtVersion(p)); + QString root; + if (SysRootProfileInformation::hasSysRoot(p)) + root = SysRootProfileInformation::sysRoot(p).toString(); + if (!tc) return QString(); @@ -237,19 +236,18 @@ static inline QString localExecutableFromVersion(const SymbianQtVersion *qtv, QString platform = S60Manager::platform(tc); if (qtv->isBuildWithSymbianSbsV2() && platform == QLatin1String("gcce")) platform = QLatin1String("armv5"); - QTextStream(&localExecutable) << qtv->systemRoot() << "/epoc32/release/" + QTextStream(&localExecutable) << root << "/epoc32/release/" << platform << '/' << symbianTarget << '/' << targetName << ".exe"; return localExecutable; } QString S60DeviceRunConfiguration::localExecutableFileName() const { - TargetInformation ti = qt4Target()->qt4Project()->rootQt4ProjectNode()->targetInformation(projectFilePath()); + TargetInformation ti = static_cast<Qt4Project *>(target()->project())->rootQt4ProjectNode()->targetInformation(projectFilePath()); if (!ti.valid) return QString(); - ProjectExplorer::ToolChain *tc = target()->activeBuildConfiguration()->toolChain(); - return localExecutableFromVersion(qtVersion(), symbianTarget(), targetName(), tc); + return localExecutableFromVersion(target()->profile(), symbianTarget(), targetName()); } quint32 S60DeviceRunConfiguration::executableUid() const @@ -293,7 +291,7 @@ QString S60DeviceRunConfiguration::qmlCommandLineArguments() const QString args; if (debuggerAspect()->useQmlDebugger()) { const S60DeployConfiguration *activeDeployConf = - qobject_cast<S60DeployConfiguration *>(qt4Target()->activeDeployConfiguration()); + qobject_cast<const S60DeployConfiguration *>(target()->activeDeployConfiguration()); QTC_ASSERT(activeDeployConf, return args); QSharedPointer<const SymbianIDevice> dev = activeDeployConf->device().dynamicCast<const SymbianIDevice>(); @@ -313,24 +311,22 @@ QString S60DeviceRunConfiguration::proFilePath() const // ======== S60DeviceRunConfigurationFactory S60DeviceRunConfigurationFactory::S60DeviceRunConfigurationFactory(QObject *parent) : - IRunConfigurationFactory(parent) -{ -} + QmakeRunConfigurationFactory(parent) +{ setObjectName(QLatin1String("S60DeviceRunConfigurationFactory"));} S60DeviceRunConfigurationFactory::~S60DeviceRunConfigurationFactory() -{ -} +{ } QList<Core::Id> S60DeviceRunConfigurationFactory::availableCreationIds(Target *parent) const { QList<Core::Id> result; - Qt4SymbianTarget *target = qobject_cast<Qt4SymbianTarget *>(parent); - if (!target || target->id() != Core::Id(Constants::S60_DEVICE_TARGET_ID)) + if (!canHandle(parent)) return result; - QStringList proFiles = target->qt4Project()->applicationProFilePathes(QLatin1String(S60_DEVICE_RC_PREFIX)); + Qt4Project *project = static_cast<Qt4Project *>(parent->project()); + QStringList proFiles = project->applicationProFilePathes(QLatin1String(S60_DEVICE_RC_PREFIX)); foreach (const QString &pf, proFiles) - result << Core::Id(pf.toUtf8().constData()); + result << Core::Id(pf); return result; } @@ -341,12 +337,34 @@ QString S60DeviceRunConfigurationFactory::displayNameForId(const Core::Id id) co return QString(); } +bool S60DeviceRunConfigurationFactory::canHandle(Target *t) const +{ + if (!t->project()->supportsProfile(t->profile())) + return false; + if (!qobject_cast<Qt4Project *>(t->project())) + return false; + + Core::Id deviceType = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(t->profile()); + return deviceType == SymbianIDeviceFactory::deviceType(); +} + +QList<RunConfiguration *> S60DeviceRunConfigurationFactory::runConfigurationsForNode(Target *t, ProjectExplorer::Node *n) +{ + QList<ProjectExplorer::RunConfiguration *> result; + foreach (ProjectExplorer::RunConfiguration *rc, t->runConfigurations()) { + if (S60DeviceRunConfiguration *s60rc = qobject_cast<S60DeviceRunConfiguration *>(rc)) + if (s60rc->proFilePath() == n->path()) + result << rc; + } + return result; +} + bool S60DeviceRunConfigurationFactory::canCreate(Target *parent, const Core::Id id) const { - Qt4SymbianTarget *t = qobject_cast<Qt4SymbianTarget *>(parent); - if (!t || t->id() != Core::Id(Constants::S60_DEVICE_TARGET_ID)) + if (!canHandle(parent)) return false; - return t->qt4Project()->hasApplicationProFile(pathFromId(id)); + Qt4Project *project = static_cast<Qt4Project *>(parent->project()); + return project->hasApplicationProFile(pathFromId(id)); } RunConfiguration *S60DeviceRunConfigurationFactory::create(Target *parent, const Core::Id id) @@ -354,25 +372,23 @@ RunConfiguration *S60DeviceRunConfigurationFactory::create(Target *parent, const if (!canCreate(parent, id)) return 0; - Qt4SymbianTarget *t = static_cast<Qt4SymbianTarget *>(parent); - return new S60DeviceRunConfiguration(t, pathFromId(id)); + return new S60DeviceRunConfiguration(parent, id); } bool S60DeviceRunConfigurationFactory::canRestore(Target *parent, const QVariantMap &map) const { - Qt4SymbianTarget *t = qobject_cast<Qt4SymbianTarget *>(parent); - if (!t || t->id() != Core::Id(Constants::S60_DEVICE_TARGET_ID)) + if (!canHandle(parent)) return false; - QString id = QString::fromUtf8(ProjectExplorer::idFromMap(map).name()); - return id == QLatin1String(S60_DEVICE_RC_ID); + + const Core::Id id = ProjectExplorer::idFromMap(map); + return id == Core::Id(S60_DEVICE_RC_ID); } RunConfiguration *S60DeviceRunConfigurationFactory::restore(Target *parent, const QVariantMap &map) { if (!canRestore(parent, map)) return 0; - Qt4SymbianTarget *t = static_cast<Qt4SymbianTarget *>(parent); - S60DeviceRunConfiguration *rc = new S60DeviceRunConfiguration(t, QString()); + S60DeviceRunConfiguration *rc = new S60DeviceRunConfiguration(parent, idFromMap(map)); if (rc->fromMap(map)) return rc; @@ -382,7 +398,7 @@ RunConfiguration *S60DeviceRunConfigurationFactory::restore(Target *parent, cons bool S60DeviceRunConfigurationFactory::canClone(Target *parent, RunConfiguration *source) const { - if (!qobject_cast<Qt4SymbianTarget *>(parent)) + if (!canHandle(parent)) return false; return source->id() == Core::Id(S60_DEVICE_RC_ID); } @@ -391,7 +407,6 @@ RunConfiguration *S60DeviceRunConfigurationFactory::clone(Target *parent, RunCon { if (!canClone(parent, source)) return 0; - Qt4SymbianTarget *t = static_cast<Qt4SymbianTarget *>(parent); S60DeviceRunConfiguration *old = static_cast<S60DeviceRunConfiguration *>(source); - return new S60DeviceRunConfiguration(t, old); + return new S60DeviceRunConfiguration(parent, old); } diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h index 1480e04ff7..82f181ac9a 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h +++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h @@ -33,8 +33,10 @@ #ifndef S60DEVICERUNCONFIGURATION_H #define S60DEVICERUNCONFIGURATION_H +#include "../qmakerunconfigurationfactory.h" +#include "../qt4projectmanager_global.h" + #include <projectexplorer/runconfiguration.h> -#include <qt4projectmanager/qt4projectmanager_global.h> #include <QFutureInterface> #include <QStringList> @@ -43,14 +45,12 @@ QT_BEGIN_NAMESPACE class QWidget; QT_END_NAMESPACE +namespace ProjectExplorer { class Node; } + namespace Qt4ProjectManager { -class Qt4BaseTarget; class Qt4ProFileNode; -namespace Internal { -class SymbianQtVersion; -class Qt4SymbianTarget; -} +namespace Internal { class SymbianQtVersion; } class S60DeviceRunConfigurationFactory; @@ -60,7 +60,7 @@ class QT4PROJECTMANAGER_EXPORT S60DeviceRunConfiguration : public ProjectExplore friend class S60DeviceRunConfigurationFactory; public: - S60DeviceRunConfiguration(Qt4ProjectManager::Qt4BaseTarget *parent, const QString &proFilePath); + S60DeviceRunConfiguration(ProjectExplorer::Target *parent, Core::Id id); virtual ~S60DeviceRunConfiguration(); bool isEnabled() const; @@ -89,7 +89,7 @@ signals: void targetInformationChanged(); protected: - S60DeviceRunConfiguration(Qt4ProjectManager::Qt4BaseTarget *parent, S60DeviceRunConfiguration *source); + S60DeviceRunConfiguration(ProjectExplorer::Target *parent, S60DeviceRunConfiguration *source); QString defaultDisplayName() const; virtual bool fromMap(const QVariantMap &map); @@ -98,8 +98,6 @@ private slots: private: void ctor(); - Internal::Qt4SymbianTarget *qt4Target() const; - Internal::SymbianQtVersion *qtVersion() const; QString m_proFilePath; QString m_commandLineArguments; @@ -107,7 +105,7 @@ private: bool m_parseInProgress; }; -class S60DeviceRunConfigurationFactory : public ProjectExplorer::IRunConfigurationFactory +class S60DeviceRunConfigurationFactory : public QmakeRunConfigurationFactory { Q_OBJECT @@ -125,6 +123,10 @@ public: QList<Core::Id> availableCreationIds(ProjectExplorer::Target *parent) const; // used to translate the ids to names to display to the user QString displayNameForId(const Core::Id id) const; + + bool canHandle(ProjectExplorer::Target *t) const; + QList<ProjectExplorer::RunConfiguration *> runConfigurationsForNode(ProjectExplorer::Target *t, + ProjectExplorer::Node *n); }; } // namespace Qt4ProjectManager diff --git a/src/plugins/qt4projectmanager/qt-s60/s60manager.cpp b/src/plugins/qt4projectmanager/qt-s60/s60manager.cpp index 35213a401e..252984fd7c 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60manager.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60manager.cpp @@ -31,9 +31,7 @@ **************************************************************************/ #include "s60manager.h" -//#include "qtversionmanager.h" -//#include "s60devicespreferencepane.h" #include "s60devicerunconfiguration.h" #include "s60createpackagestep.h" #include "s60deployconfiguration.h" @@ -43,7 +41,6 @@ #include "symbianidevice.h" #include "symbianidevicefactory.h" -#include "qt4symbiantargetfactory.h" #include "s60publishingwizardfactories.h" #include "gccetoolchain.h" @@ -120,7 +117,6 @@ S60Manager::S60Manager(QObject *parent) : QObject(parent) addAutoReleasedObject(new S60DeployStepFactory); addAutoReleasedObject(new S60DeviceDebugRunControlFactory); - addAutoReleasedObject(new Qt4SymbianTargetFactory); addAutoReleasedObject(new S60DeployConfigurationFactory); addAutoReleasedObject(new S60PublishingWizardFactoryOvi); @@ -154,7 +150,7 @@ QString S60Manager::platform(const ProjectExplorer::ToolChain *tc) return target.right(target.lastIndexOf(QLatin1Char('-'))); } -void S60Manager::delayedInitialize() +void S60Manager::extensionsInitialize() { handleQtVersionChanges(); connect(QtSupport::QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>,QList<int>,QList<int>)), diff --git a/src/plugins/qt4projectmanager/qt-s60/s60manager.h b/src/plugins/qt4projectmanager/qt-s60/s60manager.h index febcefc693..4f7a030b73 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60manager.h +++ b/src/plugins/qt4projectmanager/qt-s60/s60manager.h @@ -49,11 +49,12 @@ class S60Manager : public QObject public: S60Manager(QObject *parent = 0); ~S60Manager(); + static S60Manager *instance(); static QString platform(const ProjectExplorer::ToolChain *tc); - void delayedInitialize(); + void extensionsInitialize(); private slots: void symbianDeviceRemoved(const SymbianUtils::SymbianDevice &d); diff --git a/src/plugins/qt4projectmanager/qt-s60/s60publisherovi.cpp b/src/plugins/qt4projectmanager/qt-s60/s60publisherovi.cpp index 32c0fcc57e..4d0b8e3dac 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60publisherovi.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60publisherovi.cpp @@ -31,7 +31,6 @@ **************************************************************************/ #include "s60publisherovi.h" -#include "qt4symbiantarget.h" #include "s60certificateinfo.h" #include "s60manager.h" @@ -43,7 +42,9 @@ #include <projectexplorer/buildsteplist.h> #include <projectexplorer/buildstep.h> +#include <projectexplorer/target.h> #include <qtsupport/qtversionmanager.h> +#include <qtsupport/qtprofileinformation.h> #include <qtsupport/profilereader.h> #include <utils/qtcassert.h> @@ -131,6 +132,7 @@ void S60PublisherOvi::cleanUp() void S60PublisherOvi::completeCreation() { +#if 0 // FIXME: This needs serious reworking! // set active target m_activeTargetOfProject = qobject_cast<Qt4SymbianTarget *>(m_qt4bc->target()); QTC_ASSERT(m_activeTargetOfProject, return); @@ -213,6 +215,7 @@ void S60PublisherOvi::completeCreation() } } } +#endif } bool S60PublisherOvi::isDynamicLibrary(const Qt4Project &project) const @@ -292,9 +295,8 @@ bool S60PublisherOvi::isVendorNameValid(const QString &vendorName) const QString S60PublisherOvi::qtVersion() const { - if (!m_qt4bc->qtVersion()) - return QString(); - return m_qt4bc->qtVersion()->displayName(); + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(m_qt4bc->target()->profile()); + return version ? version->displayName() : QString(); } QString S60PublisherOvi::uid3() const @@ -439,7 +441,8 @@ void S60PublisherOvi::publishStepFinished(bool success) bool S60PublisherOvi::sisExists(QString &sisFile) { QString fileNamePostFix = QLatin1String("_installer_unsigned.sis"); - if (m_qt4bc->qtVersion()->qtVersion() == QtSupport::QtVersionNumber(4,6,3) ) + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(m_qt4bc->target()->profile()); + if (version && version->qtVersion() == QtSupport::QtVersionNumber(4,6,3) ) fileNamePostFix = QLatin1String("_installer.sis"); sisFile = m_qt4bc->buildDirectory() + QLatin1Char('/') + m_qt4project->displayName() + fileNamePostFix; @@ -451,7 +454,8 @@ bool S60PublisherOvi::sisExists(QString &sisFile) QString S60PublisherOvi::createdSisFileContainingFolder() { QString fileNamePostFix = QLatin1String("_installer_unsigned.sis"); - if (m_qt4bc->qtVersion()->qtVersion() == QtSupport::QtVersionNumber(4,6,3) ) + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(m_qt4bc->target()->profile()); + if (version && version->qtVersion() == QtSupport::QtVersionNumber(4,6,3) ) fileNamePostFix = QLatin1String("_installer.sis"); QString resultFile = m_qt4bc->buildDirectory() + QLatin1Char('/') + m_qt4project->displayName() + fileNamePostFix; @@ -463,7 +467,8 @@ QString S60PublisherOvi::createdSisFileContainingFolder() QString S60PublisherOvi::createdSisFilePath() { QString fileNamePostFix = QLatin1String("_installer_unsigned.sis"); - if (m_qt4bc->qtVersion()->qtVersion() == QtSupport::QtVersionNumber(4,6,3) ) + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(m_qt4bc->target()->profile()); + if (version && version->qtVersion() == QtSupport::QtVersionNumber(4,6,3) ) fileNamePostFix = QLatin1String("_installer.sis"); const QString resultFile = m_qt4bc->buildDirectory() + QLatin1Char('/') diff --git a/src/plugins/qt4projectmanager/qt-s60/s60publishingbuildsettingspageovi.cpp b/src/plugins/qt4projectmanager/qt-s60/s60publishingbuildsettingspageovi.cpp index 158c9f98ae..cd92115c4a 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60publishingbuildsettingspageovi.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60publishingbuildsettingspageovi.cpp @@ -54,6 +54,7 @@ S60PublishingBuildSettingsPageOvi::S60PublishingBuildSettingsPageOvi(S60Publishe { m_ui->setupUi(this); +#if 0 // FIXME: This needs serious work! QList<Qt4BuildConfiguration *> list; foreach (const ProjectExplorer::Target *const target, project->targets()) { if (target->id() != Core::Id(Qt4ProjectManager::Constants::S60_DEVICE_TARGET_ID)) @@ -92,6 +93,9 @@ S60PublishingBuildSettingsPageOvi::S60PublishingBuildSettingsPageOvi(S60Publishe m_ui->toolchainInfoIconLabel->setToolTip(tr("No valid tool chain has been detected.<br>" "Define a correct tool chain in \"Options > Tool Chains\"")); populateToolchainList(m_bc); +#else + Q_UNUSED(project); +#endif //change the build configuration if the user changes it connect(m_ui->chooseBuildConfigDropDown, SIGNAL(currentIndexChanged(int)), this, SLOT(buildConfigChosen())); @@ -106,6 +110,7 @@ bool S60PublishingBuildSettingsPageOvi::isComplete() const void S60PublishingBuildSettingsPageOvi::populateToolchainList(ProjectExplorer::BuildConfiguration *bc) { +#if 0 // FIXME: Do the right thing here... if (!bc) return; @@ -134,6 +139,9 @@ void S60PublishingBuildSettingsPageOvi::populateToolchainList(ProjectExplorer::B toolchainChosen(); else bc->setToolChain(m_toolchain); +#else + Q_UNUSED(bc); +#endif } void S60PublishingBuildSettingsPageOvi::buildConfigChosen() @@ -149,6 +157,7 @@ void S60PublishingBuildSettingsPageOvi::buildConfigChosen() void S60PublishingBuildSettingsPageOvi::toolchainChosen() { +#if 0 // FIXME: Do the right thing! const int currentIndex = m_ui->chooseToolchainDropDown->currentIndex(); if (currentIndex == -1) { m_toolchain = 0; @@ -160,6 +169,7 @@ void S60PublishingBuildSettingsPageOvi::toolchainChosen() if (m_bc) m_bc->setToolChain(m_toolchain); +#endif emit toolchainConfigurationChosen(); } diff --git a/src/plugins/qt4projectmanager/qt-s60/s60publishingwizardfactories.cpp b/src/plugins/qt4projectmanager/qt-s60/s60publishingwizardfactories.cpp index 9ab0e9b60c..3924b1bc18 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60publishingwizardfactories.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60publishingwizardfactories.cpp @@ -39,6 +39,10 @@ #include <projectexplorer/target.h> +#include <qtsupport/qtsupportconstants.h> +#include <qtsupport/baseqtversion.h> +#include <qtsupport/qtprofileinformation.h> + using namespace ProjectExplorer; namespace Qt4ProjectManager { @@ -71,7 +75,8 @@ bool S60PublishingWizardFactoryOvi::canCreateWizard(const Project *project) cons if (!qobject_cast<const Qt4Project *>(project)) return false; foreach (const Target *const target, project->targets()) { - if (target->id() == Core::Id(Constants::S60_DEVICE_TARGET_ID)) + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(target->profile()); + if (version->type() == QLatin1String(QtSupport::Constants::SYMBIANQT)) return true; } return false; diff --git a/src/plugins/qt4projectmanager/qt-s60/s60publishingwizardfactories.h b/src/plugins/qt4projectmanager/qt-s60/s60publishingwizardfactories.h index 6bcb4d9bee..4ec25e743d 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60publishingwizardfactories.h +++ b/src/plugins/qt4projectmanager/qt-s60/s60publishingwizardfactories.h @@ -38,17 +38,16 @@ namespace Qt4ProjectManager { namespace Internal { -class S60PublishingWizardFactoryOvi - : public ProjectExplorer::IPublishingWizardFactory +class S60PublishingWizardFactoryOvi : public ProjectExplorer::IPublishingWizardFactory { Q_OBJECT public: explicit S60PublishingWizardFactoryOvi(QObject *parent =0); private: - virtual QString displayName() const; - virtual QString description() const; - virtual bool canCreateWizard(const ProjectExplorer::Project *project) const; - virtual QWizard *createWizard(const ProjectExplorer::Project *project) const; + QString displayName() const; + QString description() const; + bool canCreateWizard(const ProjectExplorer::Project *project) const; + QWizard *createWizard(const ProjectExplorer::Project *project) const; }; } // namespace Internal } // namespace Qt4ProjectManager diff --git a/src/plugins/qt4projectmanager/qt-s60/s60runcontrolbase.cpp b/src/plugins/qt4projectmanager/qt-s60/s60runcontrolbase.cpp index bdb4a94358..774618bf12 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60runcontrolbase.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60runcontrolbase.cpp @@ -32,20 +32,17 @@ #include "s60runcontrolbase.h" +#include "qt4buildconfiguration.h" #include "s60deployconfiguration.h" #include "s60devicerunconfiguration.h" -#include "qt4buildconfiguration.h" -#include "qt4symbiantarget.h" -#include "qt4target.h" - -#include <utils/qtcassert.h> - -#include <debugger/debuggerconstants.h> #include <analyzerbase/analyzerconstants.h> - #include <coreplugin/icore.h> +#include <debugger/debuggerconstants.h> #include <coreplugin/progressmanager/progressmanager.h> +#include <projectexplorer/target.h> +#include <qtsupport/qtprofileinformation.h> +#include <utils/qtcassert.h> #include <QDateTime> #include <QDir> @@ -96,7 +93,7 @@ S60RunControlBase::S60RunControlBase(RunConfiguration *runConfiguration, m_commandLineArguments.prepend(QLatin1Char(' ')); m_commandLineArguments.prepend(qmlArgs); } - if (const QtSupport::BaseQtVersion *qtv = activeBuildConf->qtVersion()) { + if (const QtSupport::BaseQtVersion *qtv = QtSupport::QtProfileInformation::qtVersion(runConfiguration->target()->profile())) { m_qtDir = qtv->versionInfo().value(QLatin1String("QT_INSTALL_DATA")); m_qtBinPath = qtv->versionInfo().value(QLatin1String("QT_INSTALL_BINS")); } diff --git a/src/plugins/qt4projectmanager/qt-s60/s60runcontrolfactory.cpp b/src/plugins/qt4projectmanager/qt-s60/s60runcontrolfactory.cpp index f1f96795f8..b9ac0026cf 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60runcontrolfactory.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60runcontrolfactory.cpp @@ -35,8 +35,8 @@ #include "codaruncontrol.h" #include "s60devicerunconfiguration.h" #include "s60deployconfiguration.h" -#include "qt4symbiantarget.h" +#include <projectexplorer/target.h> #include <utils/qtcassert.h> using namespace ProjectExplorer; diff --git a/src/plugins/qt4projectmanager/qt-s60/symbianqtversion.cpp b/src/plugins/qt4projectmanager/qt-s60/symbianqtversion.cpp index 045712879e..7cb2f69230 100644 --- a/src/plugins/qt4projectmanager/qt-s60/symbianqtversion.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/symbianqtversion.cpp @@ -36,6 +36,7 @@ #include "qt-s60/abldparser.h" #include <projectexplorer/gnumakeparser.h> +#include <projectexplorer/profileinformation.h> #include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/toolchain.h> #include <projectexplorer/toolchainmanager.h> @@ -54,14 +55,12 @@ using namespace Qt4ProjectManager; using namespace Qt4ProjectManager::Internal; SymbianQtVersion::SymbianQtVersion() - : BaseQtVersion(), - m_validSystemRoot(false) + : BaseQtVersion() { } SymbianQtVersion::SymbianQtVersion(const Utils::FileName &path, bool isAutodetected, const QString &autodetectionSource) - : BaseQtVersion(path, isAutodetected, autodetectionSource), - m_validSystemRoot(false) + : BaseQtVersion(path, isAutodetected, autodetectionSource) { } @@ -81,8 +80,7 @@ bool SymbianQtVersion::equals(BaseQtVersion *other) if (!BaseQtVersion::equals(other)) return false; SymbianQtVersion *o = static_cast<SymbianQtVersion *>(other); - return m_sbsV2Directory == o->m_sbsV2Directory - && m_systemRoot == o->m_systemRoot; + return m_sbsV2Directory == o->m_sbsV2Directory; } QString SymbianQtVersion::type() const @@ -94,8 +92,6 @@ bool SymbianQtVersion::isValid() const { if (!BaseQtVersion::isValid()) return false; - if (!m_validSystemRoot) - return false; if (isBuildWithSymbianSbsV2() && (m_sbsV2Directory.isEmpty() || !QFileInfo(m_sbsV2Directory + QLatin1String("/sbs")).exists())) return false; return true; @@ -104,8 +100,6 @@ bool SymbianQtVersion::isValid() const QString SymbianQtVersion::invalidReason() const { QString tmp = BaseQtVersion::invalidReason(); - if (tmp.isEmpty() && !m_validSystemRoot) - return QCoreApplication::translate("QtVersion", "The \"Open C/C++ plugin\" is not installed in the Symbian SDK or the Symbian SDK path is misconfigured"); if (isBuildWithSymbianSbsV2() && (m_sbsV2Directory.isEmpty() || !QFileInfo(m_sbsV2Directory + QLatin1String("/sbs")).exists())) return QCoreApplication::translate("QtVersion", "SBS was not found."); @@ -113,21 +107,8 @@ QString SymbianQtVersion::invalidReason() const return tmp; } -bool SymbianQtVersion::toolChainAvailable(const QString &id) const -{ - if (!isValid()) - return false; - if (id == QLatin1String(Constants::S60_DEVICE_TARGET_ID)) { - QList<ProjectExplorer::ToolChain *> tcList = - ProjectExplorer::ToolChainManager::instance()->toolChains(); - return !tcList.isEmpty(); - } - return false; -} - void SymbianQtVersion::restoreLegacySettings(QSettings *s) { - setSystemRoot(QDir::fromNativeSeparators(s->value(QLatin1String("S60SDKDirectory")).toString())); setSbsV2Directory(QDir::fromNativeSeparators(s->value(QLatin1String("SBSv2Directory")).toString())); } @@ -135,14 +116,12 @@ void SymbianQtVersion::fromMap(const QVariantMap &map) { BaseQtVersion::fromMap(map); setSbsV2Directory(QDir::fromNativeSeparators(map.value(QLatin1String("SBSv2Directory")).toString())); - setSystemRoot(QDir::fromNativeSeparators(map.value(QLatin1String("SystemRoot")).toString())); } QVariantMap SymbianQtVersion::toMap() const { QVariantMap result = BaseQtVersion::toMap(); result.insert(QLatin1String("SBSv2Directory"), sbsV2Directory()); - result.insert(QLatin1String("SystemRoot"), systemRoot()); return result; } @@ -155,16 +134,6 @@ QList<ProjectExplorer::Abi> SymbianQtVersion::detectQtAbis() const 32); } -bool SymbianQtVersion::supportsTargetId(const Core::Id id) const -{ - return supportedTargetIds().contains(id); -} - -QSet<Core::Id> SymbianQtVersion::supportedTargetIds() const -{ - return QSet<Core::Id>() << Core::Id(Constants::S60_DEVICE_TARGET_ID); -} - QString SymbianQtVersion::description() const { return QCoreApplication::translate("QtVersion", "Symbian", "Qt Version is meant for Symbian"); @@ -198,11 +167,11 @@ static const char *S60_EPOC_HEADERS[] = { "epoc32/include/platform/mw/loc/sc" }; -void SymbianQtVersion::addToEnvironment(Utils::Environment &env) const +void SymbianQtVersion::addToEnvironment(const ProjectExplorer::Profile *p, Utils::Environment &env) const { - BaseQtVersion::addToEnvironment(env); + BaseQtVersion::addToEnvironment(p, env); // Generic Symbian environment: - QString epocRootPath = systemRoot(); + QString epocRootPath = ProjectExplorer::SysRootProfileInformation::sysRoot(p).toString(); QDir epocDir(epocRootPath); // Clean up epoc root path for the environment: @@ -253,10 +222,10 @@ void SymbianQtVersion::addToEnvironment(Utils::Environment &env) const } } -QList<ProjectExplorer::HeaderPath> SymbianQtVersion::systemHeaderPathes() const +QList<ProjectExplorer::HeaderPath> SymbianQtVersion::systemHeaderPathes(const ProjectExplorer::Profile *p) const { QList<ProjectExplorer::HeaderPath> result; - QString root = systemRoot() + QLatin1Char('/'); + QString root = ProjectExplorer::SysRootProfileInformation::sysRoot(p).toString() + QLatin1Char('/'); const int count = sizeof(S60_EPOC_HEADERS) / sizeof(const char *); for (int i = 0; i < count; ++i) { const QDir dir(root + QLatin1String(S60_EPOC_HEADERS[i])); @@ -264,7 +233,7 @@ QList<ProjectExplorer::HeaderPath> SymbianQtVersion::systemHeaderPathes() const result.append(ProjectExplorer::HeaderPath(dir.absolutePath(), ProjectExplorer::HeaderPath::GlobalHeaderPath)); } - result.append(BaseQtVersion::systemHeaderPathes()); + result.append(BaseQtVersion::systemHeaderPathes(p)); return result; } @@ -313,39 +282,6 @@ void SymbianQtVersion::parseMkSpec(ProFileEvaluator *evaluator) const BaseQtVersion::parseMkSpec(evaluator); } -QList<ProjectExplorer::Task> SymbianQtVersion::reportIssuesImpl(const QString &proFile, const QString &buildDir) -{ - QList<ProjectExplorer::Task> results = BaseQtVersion::reportIssuesImpl(proFile, buildDir); - const QString epocRootDir = systemRoot(); - // Report an error if project- and epoc directory are on different drives: - if (!epocRootDir.startsWith(proFile.left(3), Qt::CaseInsensitive)) { - // Note: SBSv2 works fine with the EPOCROOT and the sources being on different drives, - // but it fails when Qt is on a different drive than the sources. Since - // the SDK installs Qt and the EPOCROOT on the same drive we just stick with this - // warning. - results.append(ProjectExplorer::Task(ProjectExplorer::Task::Error, - QCoreApplication::translate("ProjectExplorer::Internal::S60ProjectChecker", - "The Symbian SDK and the project sources must reside on the same drive."), - Utils::FileName(), -1, Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM))); - } - return results; -} - -void SymbianQtVersion::setSystemRoot(const QString &root) -{ - if (root == m_systemRoot) - return; - m_systemRoot = root; - - m_validSystemRoot = false; - if (!m_systemRoot.isEmpty()) { - if (!m_systemRoot.endsWith(QLatin1Char('/'))) - m_systemRoot.append(QLatin1Char('/')); - QFileInfo cppheader(m_systemRoot + QLatin1String("epoc32/include/stdapis/string.h")); - m_validSystemRoot = cppheader.exists(); - } -} - Core::FeatureSet SymbianQtVersion::availableFeatures() const { Core::FeatureSet features = QtSupport::BaseQtVersion::availableFeatures(); @@ -366,11 +302,6 @@ QString SymbianQtVersion::platformDisplayName() const return QLatin1String(QtSupport::Constants::SYMBIAN_PLATFORM_TR); } -QString SymbianQtVersion::systemRoot() const -{ - return m_systemRoot; -} - QtSupport::QtConfigWidget *SymbianQtVersion::createConfigurationWidget() const { return new SymbianQtConfigWidget(const_cast<SymbianQtVersion *>(this)); @@ -383,16 +314,6 @@ SymbianQtConfigWidget::SymbianQtConfigWidget(SymbianQtVersion *version) fl->setMargin(0); setLayout(fl); - Utils::PathChooser *s60sdkPath = new Utils::PathChooser; - s60sdkPath->setExpectedKind(Utils::PathChooser::ExistingDirectory); - - fl->addRow(tr("S60 SDK:"), s60sdkPath); - - s60sdkPath->setPath(QDir::toNativeSeparators(version->systemRoot())); - - connect(s60sdkPath, SIGNAL(changed(QString)), - this, SLOT(updateCurrentS60SDKDirectory(QString))); - if (version->isBuildWithSymbianSbsV2()) { Utils::PathChooser *sbsV2Path = new Utils::PathChooser; sbsV2Path->setExpectedKind(Utils::PathChooser::ExistingDirectory); @@ -404,12 +325,6 @@ SymbianQtConfigWidget::SymbianQtConfigWidget(SymbianQtVersion *version) } } -void SymbianQtConfigWidget::updateCurrentS60SDKDirectory(const QString &path) -{ - m_version->setSystemRoot(QDir::fromNativeSeparators(path)); - emit changed(); -} - void SymbianQtConfigWidget::updateCurrentSbsV2Directory(const QString &path) { m_version->setSbsV2Directory(QDir::fromNativeSeparators(path)); diff --git a/src/plugins/qt4projectmanager/qt-s60/symbianqtversion.h b/src/plugins/qt4projectmanager/qt-s60/symbianqtversion.h index d21ea2132c..13c47631af 100644 --- a/src/plugins/qt4projectmanager/qt-s60/symbianqtversion.h +++ b/src/plugins/qt4projectmanager/qt-s60/symbianqtversion.h @@ -53,29 +53,21 @@ public: bool isValid() const; QString invalidReason() const; - bool toolChainAvailable(const QString &id) const; - void restoreLegacySettings(QSettings *s); void fromMap(const QVariantMap &map); QVariantMap toMap() const; QList<ProjectExplorer::Abi> detectQtAbis() const; - bool supportsTargetId(const Core::Id id) const; - QSet<Core::Id> supportedTargetIds() const; - QString description() const; bool supportsShadowBuilds() const; bool supportsBinaryDebuggingHelper() const; - void addToEnvironment(Utils::Environment &env) const; - QList<ProjectExplorer::HeaderPath> systemHeaderPathes() const; + void addToEnvironment(const ProjectExplorer::Profile *p, Utils::Environment &env) const; + QList<ProjectExplorer::HeaderPath> systemHeaderPathes(const ProjectExplorer::Profile *p) const; ProjectExplorer::IOutputParser *createOutputParser() const; - QString systemRoot() const; - void setSystemRoot(const QString &); - bool isBuildWithSymbianSbsV2() const; QString sbsV2Directory() const; @@ -88,23 +80,22 @@ public: QString platformDisplayName() const; protected: - QList<ProjectExplorer::Task> reportIssuesImpl(const QString &proFile, const QString &buildDir); void parseMkSpec(ProFileEvaluator *) const; private: QString m_sbsV2Directory; - QString m_systemRoot; - mutable bool m_validSystemRoot; mutable bool m_isBuildUsingSbsV2; }; class SymbianQtConfigWidget : public QtSupport::QtConfigWidget { Q_OBJECT + public: SymbianQtConfigWidget(SymbianQtVersion *version); + public slots: void updateCurrentSbsV2Directory(const QString &path); - void updateCurrentS60SDKDirectory(const QString &path); + private: SymbianQtVersion *m_version; }; diff --git a/src/plugins/qt4projectmanager/qt4basetargetfactory.h b/src/plugins/qt4projectmanager/qt4basetargetfactory.h deleted file mode 100644 index 7482faf6ae..0000000000 --- a/src/plugins/qt4projectmanager/qt4basetargetfactory.h +++ /dev/null @@ -1,106 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. -** -**************************************************************************/ - -#ifndef QT4BASETARGETFACTORY_H -#define QT4BASETARGETFACTORY_H - -#include "qt4projectmanager_global.h" - -#include <projectexplorer/task.h> -#include <projectexplorer/target.h> - -#include <QList> - -namespace Core { -class FeatureSet; -} - -namespace QtSupport { -class QtVersionNumber; -} - -namespace Qt4ProjectManager { -class Qt4TargetSetupWidget; -struct BuildConfigurationInfo; - -class QT4PROJECTMANAGER_EXPORT Qt4BaseTargetFactory : public ProjectExplorer::ITargetFactory -{ - Q_OBJECT -public: - explicit Qt4BaseTargetFactory(QObject *parent); - virtual ~Qt4BaseTargetFactory(); - - virtual Qt4TargetSetupWidget *createTargetSetupWidget(const Core::Id id, - const QString &proFilePath, - const QtSupport::QtVersionNumber &minimumQtVersion, - const QtSupport::QtVersionNumber &maximumQtVersion, - const Core::FeatureSet &requiredFeatures, - bool importEnabled, - QList<BuildConfigurationInfo> importInfos); - - /// suffix should be unique - virtual QString shadowBuildDirectory(const QString &profilePath, const Core::Id id, const QString &suffix); - /// used by the default implementation of shadowBuildDirectory - virtual QString buildNameForId(const Core::Id id) const; - - /// used by the default implementation of createTargetSetupWidget - /// not needed otherwise - /// by default creates one debug + one release buildconfiguration per qtversion - virtual QList<BuildConfigurationInfo> availableBuildConfigurations(const Core::Id id, const QString &proFilePath, - const QtSupport::QtVersionNumber &minimumQtVersion, - const QtSupport::QtVersionNumber &maximumQtVersion, - const Core::FeatureSet &requiredFeatures); - - virtual QList<ProjectExplorer::Task> reportIssues(const QString &proFile); - /// only used in the TargetSetupPage - virtual QIcon iconForId(const Core::Id id) const = 0; - - virtual QSet<QString> targetFeatures(const Core::Id id) const = 0; - virtual bool selectByDefault(const Core::Id id) const; - - virtual ProjectExplorer::Target *create(ProjectExplorer::Project *parent, const Core::Id id) = 0; - virtual ProjectExplorer::Target *create(ProjectExplorer::Project *parent, const Core::Id id, - const QList<BuildConfigurationInfo> &infos) = 0; - virtual ProjectExplorer::Target *create(ProjectExplorer::Project *parent, const Core::Id id, - Qt4TargetSetupWidget *widget); - - static Qt4BaseTargetFactory *qt4BaseTargetFactoryForId(const Core::Id id); - - static QList<Qt4BaseTargetFactory *> qt4BaseTargetFactoriesForIds(const QList<Core::Id> &ids); - -protected: - static QString msgBuildConfigurationName(const BuildConfigurationInfo &info); -}; - -} // namespace Qt4ProjectManager - -#endif // QT4BASETARGETFACTORY_H diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp index 7a86929c61..5649140986 100644 --- a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp @@ -33,22 +33,24 @@ #include "qt4buildconfiguration.h" #include "qt4project.h" -#include "qt4target.h" +#include "qt4projectconfigwidget.h" #include "qt4projectmanagerconstants.h" #include "qt4nodes.h" #include "qmakestep.h" #include "makestep.h" -#include "qt4basetargetfactory.h" #include <utils/qtcassert.h> #include <utils/qtcprocess.h> #include <limits> #include <projectexplorer/buildsteplist.h> #include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/target.h> #include <projectexplorer/toolchain.h> -#include <projectexplorer/toolchainmanager.h> +#include <projectexplorer/profileinformation.h> +#include <qtsupport/qtsupportconstants.h> #include <qtsupport/qtversionfactory.h> #include <qtsupport/baseqtversion.h> +#include <qtsupport/qtprofileinformation.h> #include <qtsupport/qtversionmanager.h> #include <QDebug> @@ -59,22 +61,19 @@ using namespace Qt4ProjectManager::Internal; using namespace ProjectExplorer; namespace { -const char * const QT4_BC_ID_PREFIX("Qt4ProjectManager.Qt4BuildConfiguration."); const char * const QT4_BC_ID("Qt4ProjectManager.Qt4BuildConfiguration"); const char * const USE_SHADOW_BUILD_KEY("Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild"); const char * const BUILD_DIRECTORY_KEY("Qt4ProjectManager.Qt4BuildConfiguration.BuildDirectory"); const char * const BUILD_CONFIGURATION_KEY("Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration"); -const char * const QT_VERSION_ID_KEY("Qt4ProjectManager.Qt4BuildConfiguration.QtVersionId"); enum { debug = 0 }; } -Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4BaseTarget *target) : +Qt4BuildConfiguration::Qt4BuildConfiguration(Target *target) : BuildConfiguration(target, Core::Id(QT4_BC_ID)), m_shadowBuild(true), m_isEnabled(false), - m_qtVersionId(-1), m_qmakeBuildConfiguration(0), m_subNodeBuild(0), m_fileNodeBuild(0) @@ -82,11 +81,10 @@ Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4BaseTarget *target) : ctor(); } -Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4BaseTarget *target, const Core::Id id) : +Qt4BuildConfiguration::Qt4BuildConfiguration(Target *target, const Core::Id id) : BuildConfiguration(target, id), m_shadowBuild(true), m_isEnabled(false), - m_qtVersionId(-1), m_qmakeBuildConfiguration(0), m_subNodeBuild(0), m_fileNodeBuild(0) @@ -94,12 +92,11 @@ Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4BaseTarget *target, const Core:: ctor(); } -Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4BaseTarget *target, Qt4BuildConfiguration *source) : +Qt4BuildConfiguration::Qt4BuildConfiguration(Target *target, Qt4BuildConfiguration *source) : BuildConfiguration(target, source), m_shadowBuild(source->m_shadowBuild), m_isEnabled(false), m_buildDirectory(source->m_buildDirectory), - m_qtVersionId(source->m_qtVersionId), m_qmakeBuildConfiguration(source->m_qmakeBuildConfiguration), m_subNodeBuild(0), // temporary value, so not copied m_fileNodeBuild(0) @@ -117,7 +114,6 @@ QVariantMap Qt4BuildConfiguration::toMap() const QVariantMap map(BuildConfiguration::toMap()); map.insert(QLatin1String(USE_SHADOW_BUILD_KEY), m_shadowBuild); map.insert(QLatin1String(BUILD_DIRECTORY_KEY), m_buildDirectory); - map.insert(QLatin1String(QT_VERSION_ID_KEY), m_qtVersionId); map.insert(QLatin1String(BUILD_CONFIGURATION_KEY), int(m_qmakeBuildConfiguration)); return map; } @@ -128,52 +124,11 @@ bool Qt4BuildConfiguration::fromMap(const QVariantMap &map) return false; m_shadowBuild = map.value(QLatin1String(USE_SHADOW_BUILD_KEY), true).toBool(); - m_qtVersionId = map.value(QLatin1String(QT_VERSION_ID_KEY)).toInt(); m_qmakeBuildConfiguration = QtSupport::BaseQtVersion::QmakeBuildConfigs(map.value(QLatin1String(BUILD_CONFIGURATION_KEY)).toInt()); m_buildDirectory = map.value(QLatin1String(BUILD_DIRECTORY_KEY), defaultShadowBuildDirectory()).toString(); - // Pick a Qt version if the default version is used: - // We assume that the default Qt version was used in earlier versions of Qt creator. - // Pick a Qt version that supports this target (usually desktop) - if (m_qtVersionId == 0) { - QList<QtSupport::BaseQtVersion *> versions = QtSupport::QtVersionManager::instance()->versionsForTargetId(target()->id()); - foreach (QtSupport::BaseQtVersion *v, versions) { - if (v->isValid()) { - m_qtVersionId = v->uniqueId(); - break; - } - } - if (m_qtVersionId == 0) - m_qtVersionId = -1; - } - - QtSupport::BaseQtVersion *version = QtSupport::QtVersionManager::instance()->version(m_qtVersionId); - if (!version || !version->supportsTargetId(target()->id())) { - m_qtVersionId = -1; - version = 0; - } - m_lastEmmitedBuildDirectory = buildDirectory(); - - ProjectExplorer::ToolChain *tc = toolChain(); - if (version && version->isValid()) { - if (tc && !qt4Target()->possibleToolChains(this).contains(tc)) - setToolChain(0); - if (!toolChain()) - setToolChain(qt4Target()->preferredToolChain(this)); - m_shadowBuild = (m_shadowBuild && version->supportsShadowBuilds()); - } - - if (!toolChain()) { - if (version && version->isValid()) { - qWarning("Warning: No tool chain available for '%s' from %s used in '%s'.", - qPrintable(version->displayName()), qPrintable(version->qmakeCommand().toUserOutput()), - qPrintable(target()->id().toString())); - } else { - qWarning("Warning: No tool chain available for invalid Qt version used in '%s'.", - qPrintable(target()->id().toString())); - } - } + m_qtVersionSupportsShadowBuilds = supportsShadowBuilds(); return true; } @@ -183,55 +138,47 @@ void Qt4BuildConfiguration::ctor() connect(this, SIGNAL(environmentChanged()), this, SLOT(emitBuildDirectoryChanged())); connect(this, SIGNAL(environmentChanged()), - this, SLOT(emitProFileEvaluateNeeded())); - connect(qt4Target()->qt4Project(), SIGNAL(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode*,bool,bool)), - this, SLOT(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode*,bool,bool))); + this, SLOT(emitEvaluateBuildSystem())); + connect(target(), SIGNAL(profileChanged()), + this, SLOT(profileChanged())); +} - QtSupport::QtVersionManager *vm = QtSupport::QtVersionManager::instance(); - connect(vm, SIGNAL(qtVersionsChanged(QList<int>,QList<int>,QList<int>)), - this, SLOT(qtVersionsChanged(QList<int>,QList<int>,QList<int>))); +void Qt4BuildConfiguration::profileChanged() +{ + // emit qtVersionChanged(); TODO what was connected to that + emit requestBuildSystemEvaluation(); + emit environmentChanged(); + emitBuildDirectoryChanged(); } void Qt4BuildConfiguration::emitBuildDirectoryChanged() { - if (buildDirectory() != m_lastEmmitedBuildDirectory) { + // We also emit buildDirectoryChanged if the the qt version's supportShadowBuild changed + if (buildDirectory() != m_lastEmmitedBuildDirectory + || supportsShadowBuilds() != m_qtVersionSupportsShadowBuilds) { m_lastEmmitedBuildDirectory = buildDirectory(); + m_qtVersionSupportsShadowBuilds = supportsShadowBuilds(); emit buildDirectoryChanged(); } } -void Qt4BuildConfiguration::proFileUpdated(Qt4ProjectManager::Qt4ProFileNode *, bool success, bool parseInProgress) -{ - // Changing the included Qt modules from 0 to at least one might have caused the - // tool chain to become invalid. - if (!success || parseInProgress) - return; - if (!qt4Target()->possibleToolChains(this).contains(toolChain())) - setToolChain(qt4Target()->preferredToolChain(this)); -} - -Qt4BaseTarget *Qt4BuildConfiguration::qt4Target() const -{ - return static_cast<Qt4BaseTarget *>(target()); -} - Utils::Environment Qt4BuildConfiguration::baseEnvironment() const { Utils::Environment env = BuildConfiguration::baseEnvironment(); - if (qtVersion()) - qtVersion()->addToEnvironment(env); - - ToolChain *tc = toolChain(); - if (tc) - tc->addToEnvironment(env); + target()->profile()->addToEnvironment(env); return env; } +BuildConfigWidget *Qt4BuildConfiguration::createConfigWidget() +{ + return new Qt4ProjectConfigWidget(target()); +} + QString Qt4BuildConfiguration::defaultShadowBuildDirectory() const { - Qt4BaseTargetFactory *factory = Qt4BaseTargetFactory::qt4BaseTargetFactoryForId(qt4Target()->id()); // todo displayName isn't ideal - return factory->shadowBuildDirectory(qt4Target()->qt4Project()->document()->fileName(), qt4Target()->id(), displayName()); + return Qt4Project::shadowBuildDirectory(target()->project()->document()->fileName(), + target()->profile(), displayName()); } /// returns the unexpanded build directory @@ -255,6 +202,12 @@ QString Qt4BuildConfiguration::buildDirectory() const return QDir::cleanPath(environment().expandVariables(rawBuildDirectory())); } +bool Qt4BuildConfiguration::supportsShadowBuilds() +{ + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(target()->profile()); + return !version || version->supportsShadowBuilds(); +} + /// If only a sub tree should be build this function returns which sub node /// should be build /// \see Qt4BuildConfiguration::setSubNodeBuild @@ -304,7 +257,7 @@ QString Qt4BuildConfiguration::shadowBuildDirectory() const void Qt4BuildConfiguration::setShadowBuildAndDirectory(bool shadowBuild, const QString &buildDirectory) { - QtSupport::BaseQtVersion *version = qtVersion(); + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(target()->profile()); QString directoryToSet = buildDirectory; bool toSet = (shadowBuild && version && version->isValid() && version->supportsShadowBuilds()); if (m_shadowBuild == toSet && m_buildDirectory == directoryToSet) @@ -315,13 +268,7 @@ void Qt4BuildConfiguration::setShadowBuildAndDirectory(bool shadowBuild, const Q emit environmentChanged(); emitBuildDirectoryChanged(); - emit proFileEvaluateNeeded(this); -} - -QString Qt4BuildConfiguration::makeCommand() const -{ - ToolChain *tc = toolChain(); - return tc ? tc->makeCommand() : QLatin1String("make"); + emitEvaluateBuildSystem(); } static inline QString symbianMakeTarget(QtSupport::BaseQtVersion::QmakeBuildConfigs buildConfig, @@ -335,64 +282,18 @@ static inline QString symbianMakeTarget(QtSupport::BaseQtVersion::QmakeBuildConf QString Qt4BuildConfiguration::defaultMakeTarget() const { - ToolChain *tc = toolChain(); - if (!tc || target()->id() != Core::Id(Constants::S60_DEVICE_TARGET_ID)) + ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(target()->profile()); + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(target()->profile()); + if (!tc || !version || version->type() != QtSupport::Constants::SYMBIANQT) return QString(); - const QtSupport::BaseQtVersion::QmakeBuildConfigs buildConfig = qmakeBuildConfiguration(); + const QtSupport::BaseQtVersion::QmakeBuildConfigs buildConfig = qmakeBuildConfiguration(); return symbianMakeTarget(buildConfig, tc->defaultMakeTarget()); } QString Qt4BuildConfiguration::makefile() const { - return qt4Target()->qt4Project()->rootQt4ProjectNode()->makefile(); -} - -QtSupport::BaseQtVersion *Qt4BuildConfiguration::qtVersion() const -{ - QtSupport::QtVersionManager *vm = QtSupport::QtVersionManager::instance(); - return vm->version(m_qtVersionId); -} - -void Qt4BuildConfiguration::setQtVersion(QtSupport::BaseQtVersion *version) -{ - if (version == 0) { - m_qtVersionId = -1; - m_shadowBuild = false; - setToolChain(0); - emit proFileEvaluateNeeded(this); - emit qtVersionChanged(); - emit environmentChanged(); - emitBuildDirectoryChanged(); - return; - } - if (m_qtVersionId == version->uniqueId()) - return; - - m_qtVersionId = version->uniqueId(); - - if (!qt4Target()->possibleToolChains(this).contains(toolChain())) - setToolChain(qt4Target()->preferredToolChain(this)); - m_shadowBuild = m_shadowBuild && qtVersion()->supportsShadowBuilds(); - - emit proFileEvaluateNeeded(this); - emit qtVersionChanged(); - emit environmentChanged(); - emitBuildDirectoryChanged(); -} - -void Qt4BuildConfiguration::setToolChain(ProjectExplorer::ToolChain *tc) -{ - if (tc != 0 && m_qtVersionId > 0 && !qt4Target()->possibleToolChains(this).contains(tc)) - return; - - if (toolChain() == tc) - return; - - BuildConfiguration::setToolChain(tc); - - emit proFileEvaluateNeeded(this); - emitBuildDirectoryChanged(); + return static_cast<Qt4Project *>(target()->project())->rootQt4ProjectNode()->makefile(); } QtSupport::BaseQtVersion::QmakeBuildConfigs Qt4BuildConfiguration::qmakeBuildConfiguration() const @@ -406,14 +307,14 @@ void Qt4BuildConfiguration::setQMakeBuildConfiguration(QtSupport::BaseQtVersion: return; m_qmakeBuildConfiguration = config; - emit proFileEvaluateNeeded(this); + emitEvaluateBuildSystem(); emit qmakeBuildConfigurationChanged(); emitBuildDirectoryChanged(); } -void Qt4BuildConfiguration::emitProFileEvaluateNeeded() +void Qt4BuildConfiguration::emitEvaluateBuildSystem() { - emit proFileEvaluateNeeded(this); + emit requestBuildSystemEvaluation(); } void Qt4BuildConfiguration::emitQMakeBuildConfigurationChanged() @@ -431,11 +332,11 @@ void Qt4BuildConfiguration::emitS60CreatesSmartInstallerChanged() emit s60CreatesSmartInstallerChanged(); } - QStringList Qt4BuildConfiguration::configCommandLineArguments() const { QStringList result; - QtSupport::BaseQtVersion::QmakeBuildConfigs defaultBuildConfiguration = qtVersion() ? qtVersion()->defaultBuildConfig() : (QtSupport::BaseQtVersion::DebugBuild | QtSupport::BaseQtVersion::BuildAll); + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(target()->profile()); + QtSupport::BaseQtVersion::QmakeBuildConfigs defaultBuildConfiguration = version ? version->defaultBuildConfig() : (QtSupport::BaseQtVersion::DebugBuild | QtSupport::BaseQtVersion::BuildAll); QtSupport::BaseQtVersion::QmakeBuildConfigs userBuildConfiguration = m_qmakeBuildConfiguration; if ((defaultBuildConfiguration & QtSupport::BaseQtVersion::BuildAll) && !(userBuildConfiguration & QtSupport::BaseQtVersion::BuildAll)) result << QLatin1String("CONFIG-=debug_and_release"); @@ -471,30 +372,15 @@ MakeStep *Qt4BuildConfiguration::makeStep() const return 0; } -void Qt4BuildConfiguration::qtVersionsChanged(const QList<int> &addedVersions, const QList<int> &removedVersions, const QList<int> &changedVersions) -{ - Q_UNUSED(addedVersions); - if (removedVersions.contains(m_qtVersionId)) { - m_qtVersionId = -1; - QList<QtSupport::BaseQtVersion *> versionList - = QtSupport::QtVersionManager::instance()->versionsForTargetId(target()->id()); - if (!versionList.isEmpty()) - m_qtVersionId = versionList.at(0)->uniqueId(); - emit qtVersionChanged(); - } else if (changedVersions.contains(m_qtVersionId)) { - emit environmentChanged(); - } -} - // returns true if both are equal -bool Qt4BuildConfiguration::compareToImportFrom(const QString &makefile) +Qt4BuildConfiguration::MakefileState Qt4BuildConfiguration::compareToImportFrom(const QString &makefile) { QMakeStep *qs = qmakeStep(); if (QFileInfo(makefile).exists() && qs) { Utils::FileName qmakePath = QtSupport::QtVersionManager::findQMakeBinaryFromMakefile(makefile); - QtSupport::BaseQtVersion *version = qtVersion(); + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(target()->profile()); if (!version) - return false; + return MakefileForWrongProject; if (version->qmakeCommand() == qmakePath) { // same qtversion QPair<QtSupport::BaseQtVersion::QmakeBuildConfigs, QString> result = @@ -509,7 +395,7 @@ bool Qt4BuildConfiguration::compareToImportFrom(const QString &makefile) QString userArgs = qs->userArguments(); // This copies the settings from userArgs to actualArgs (minus some we // are not interested in), splitting them up into individual strings: - extractSpecFromArguments(&userArgs, workingDirectory, version, &actualArgs), + extractSpecFromArguments(&userArgs, workingDirectory, version, &actualArgs); actualArgs = qs->deducedArguments() + actualArgs + qs->deducedArgumentsAfter(); Utils::FileName actualSpec = qs->mkspec(); @@ -543,21 +429,26 @@ bool Qt4BuildConfiguration::compareToImportFrom(const QString &makefile) if (actualArgs == parsedArgs) { // Specs match exactly if (actualSpec == parsedSpec) - return true; + return MakefileMatches; // Actual spec is the default one // qDebug()<<"AS vs VS"<<actualSpec<<version->mkspec(); if ((actualSpec == version->mkspec() || actualSpec == Utils::FileName::fromString(QLatin1String("default"))) && (parsedSpec == version->mkspec() || parsedSpec == Utils::FileName::fromString(QLatin1String("default")) || parsedSpec.isEmpty())) - return true; + return MakefileMatches; } - } else if (debug) { - qDebug()<<"different qmake buildconfigurations buildconfiguration:"<<qmakeBuildConfiguration()<<" Makefile:"<<result.first; + return MakefileIncompatible; + } else { + if (debug) + qDebug()<<"different qmake buildconfigurations buildconfiguration:"<<qmakeBuildConfiguration()<<" Makefile:"<<result.first; + return MakefileIncompatible; } - } else if (debug) { - qDebug()<<"diffrent qt versions, buildconfiguration:"<<version->qmakeCommand().toString()<<" Makefile:"<<qmakePath.toString(); + } else { + if (debug) + qDebug()<<"diffrent qt versions, buildconfiguration:"<<version->qmakeCommand().toString()<<" Makefile:"<<qmakePath.toString(); + return MakefileForWrongProject; } } - return false; + return MakefileMissing; } bool Qt4BuildConfiguration::removeQMLInspectorFromArguments(QString *args) @@ -649,10 +540,8 @@ Utils::FileName Qt4BuildConfiguration::extractSpecFromArguments(QString *args, ProjectExplorer::IOutputParser *Qt4BuildConfiguration::createOutputParser() const { - ToolChain *tc = toolChain(); - if (tc) - return toolChain()->outputParser(); - return 0; + ToolChain *tc = ToolChainProfileInformation::toolChain(target()->profile()); + return tc ? tc->outputParser() : 0; } bool Qt4BuildConfiguration::isEnabled() const @@ -698,77 +587,51 @@ void Qt4BuildConfigurationFactory::update() emit availableCreationIdsChanged(); } -QList<Core::Id> Qt4BuildConfigurationFactory::availableCreationIds(ProjectExplorer::Target *parent) const +bool Qt4BuildConfigurationFactory::canHandle(const Target *t) const { - QList<Core::Id> results; - if (!qobject_cast<Qt4BaseTarget *>(parent)) - return results; - - QtSupport::QtVersionManager *vm = QtSupport::QtVersionManager::instance(); - QList<QtSupport::BaseQtVersion *> versions = vm->versionsForTargetId(parent->id()); - foreach (QtSupport::BaseQtVersion *v, versions) { - if (v->toolChainAvailable(parent->id())) - results << Core::Id(QLatin1String(QT4_BC_ID_PREFIX) + QString::number(v->uniqueId())); - } - - - return results; + if (!t->project()->supportsProfile(t->profile())) + return false; + return qobject_cast<Qt4Project *>(t->project()); } -int idToUniqueId(const Core::Id id) +QList<Core::Id> Qt4BuildConfigurationFactory::availableCreationIds(const Target *parent) const { - QString rest = id.name().mid(QString(QT4_BC_ID_PREFIX).length()); - bool ok; - int unqieuid = rest.toInt(&ok); - if (!ok) - return -1; - return unqieuid; + if (!canHandle(parent)) + return QList<Core::Id>(); + return QList<Core::Id>() << Core::Id(QT4_BC_ID); } QString Qt4BuildConfigurationFactory::displayNameForId(const Core::Id id) const { - if (!id.name().startsWith(QT4_BC_ID_PREFIX)) + if (id != Core::Id(QT4_BC_ID)) return QString(); - QtSupport::QtVersionManager *vm = QtSupport::QtVersionManager::instance(); - QtSupport::BaseQtVersion *v = vm->version(idToUniqueId(id)); - if (!v) - return QString(); - return tr("Using Qt Version \"%1\"").arg(v->displayName()); + return tr("Qmake based build"); } -bool Qt4BuildConfigurationFactory::canCreate(ProjectExplorer::Target *parent, const Core::Id id) const +bool Qt4BuildConfigurationFactory::canCreate(const Target *parent, const Core::Id id) const { - const QString idStr = QString::fromLatin1(id.name()); - if (!qobject_cast<Qt4BaseTarget *>(parent)) - return false; - if (!id.name().startsWith(QT4_BC_ID_PREFIX)) - return false; - - QtSupport::BaseQtVersion *version = QtSupport::QtVersionManager::instance()->version(idToUniqueId(id)); - if (!version || - !version->supportsTargetId(parent->id())) + if (!canHandle(parent)) return false; - return true; + return id.toString() == QLatin1String(QT4_BC_ID); } -BuildConfiguration *Qt4BuildConfigurationFactory::create(ProjectExplorer::Target *parent, const Core::Id id) +BuildConfiguration *Qt4BuildConfigurationFactory::create(ProjectExplorer::Target *parent, const Core::Id id, const QString &name) { if (!canCreate(parent, id)) return 0; - QtSupport::BaseQtVersion *version = QtSupport::QtVersionManager::instance()->version(idToUniqueId(id)); + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(parent->profile()); Q_ASSERT(version); - Qt4BaseTarget *qt4Target = static_cast<Qt4BaseTarget *>(parent); - - bool ok; - QString buildConfigurationName = QInputDialog::getText(0, - tr("New Configuration"), - tr("New configuration name:"), - QLineEdit::Normal, - version->displayName(), - &ok); + bool ok = true; + QString buildConfigurationName = name; + if (buildConfigurationName.isEmpty()) + buildConfigurationName = QInputDialog::getText(0, + tr("New Configuration"), + tr("New configuration name:"), + QLineEdit::Normal, + version->displayName(), &ok); buildConfigurationName = buildConfigurationName.trimmed(); if (!ok || buildConfigurationName.isEmpty()) return 0; @@ -790,129 +653,76 @@ BuildConfiguration *Qt4BuildConfigurationFactory::create(ProjectExplorer::Target qSwap(customFirstName, customSecondName); } - BuildConfiguration *bc = qt4Target->addQt4BuildConfiguration(defaultFirstName, customFirstName, - version, - version->defaultBuildConfig(), - QString(), QString(), false); - - qt4Target->addQt4BuildConfiguration(defaultSecondName, customSecondName, - version, - (version->defaultBuildConfig() ^ QtSupport::BaseQtVersion::DebugBuild), - QString(), QString(), false); + BuildConfiguration *bc + = Qt4BuildConfiguration::setup(parent, defaultFirstName, customFirstName, + version->defaultBuildConfig(), QString(), QString(), false); + parent->addBuildConfiguration( + Qt4BuildConfiguration::setup(parent, defaultSecondName, customSecondName, + (version->defaultBuildConfig() ^ QtSupport::BaseQtVersion::DebugBuild), + QString(), QString(), false)); return bc; } -bool Qt4BuildConfigurationFactory::canClone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const +bool Qt4BuildConfigurationFactory::canClone(const Target *parent, ProjectExplorer::BuildConfiguration *source) const { - if (!qobject_cast<Qt4BaseTarget *>(parent)) - return false; - Qt4BuildConfiguration *qt4bc(qobject_cast<Qt4BuildConfiguration *>(source)); - if (!qt4bc) - return false; - - QtSupport::BaseQtVersion *version = qt4bc->qtVersion(); - if (!version || - !version->supportsTargetId(parent->id())) - return false; - return true; + return canHandle(parent) && qobject_cast<Qt4BuildConfiguration *>(source); } BuildConfiguration *Qt4BuildConfigurationFactory::clone(Target *parent, BuildConfiguration *source) { if (!canClone(parent, source)) return 0; - Qt4BaseTarget *target = static_cast<Qt4BaseTarget *>(parent); Qt4BuildConfiguration *oldbc(static_cast<Qt4BuildConfiguration *>(source)); - return new Qt4BuildConfiguration(target, oldbc); + return new Qt4BuildConfiguration(parent, oldbc); } -bool Qt4BuildConfigurationFactory::canRestore(Target *parent, const QVariantMap &map) const +bool Qt4BuildConfigurationFactory::canRestore(const Target *parent, const QVariantMap &map) const { - QString id = QString::fromLatin1(ProjectExplorer::idFromMap(map).name()); // unicode save - if (!qobject_cast<Qt4BaseTarget *>(parent)) + if (!canHandle(parent)) return false; - return id.startsWith(QLatin1String(QT4_BC_ID_PREFIX)) || - id == QLatin1String(QT4_BC_ID); + return ProjectExplorer::idFromMap(map).toString() == QLatin1String(QT4_BC_ID); } BuildConfiguration *Qt4BuildConfigurationFactory::restore(Target *parent, const QVariantMap &map) { if (!canRestore(parent, map)) return 0; - Qt4BaseTarget *target = static_cast<Qt4BaseTarget *>(parent); - Qt4BuildConfiguration *bc = new Qt4BuildConfiguration(target); + Qt4BuildConfiguration *bc = new Qt4BuildConfiguration(parent); if (bc->fromMap(map)) return bc; delete bc; return 0; } -void Qt4BuildConfiguration::importFromBuildDirectory() +QList<BuildConfigurationInfo> Qt4BuildConfigurationFactory::availableBuildConfigurations(const ProjectExplorer::Profile *p, + const QString &proFilePath) { - QString directory = buildDirectory(); - if (!directory.isEmpty()) { - QString mkfile = directory; - if (makefile().isEmpty()) - mkfile.append(QLatin1String("/Makefile")); - else - mkfile.append(makefile()); - - Utils::FileName qmakePath = QtSupport::QtVersionManager::findQMakeBinaryFromMakefile(mkfile); - if (!qmakePath.isEmpty()) { - QtSupport::QtVersionManager *vm = QtSupport::QtVersionManager::instance(); - QtSupport::BaseQtVersion *version = vm->qtVersionForQMakeBinary(qmakePath); - if (!version) { - version = QtSupport::QtVersionFactory::createQtVersionFromQMakePath(qmakePath); - vm->addVersion(version); - } + QList<BuildConfigurationInfo> infoList; - QPair<QtSupport::BaseQtVersion::QmakeBuildConfigs, QString> result = - QtSupport::QtVersionManager::scanMakeFile(mkfile, version->defaultBuildConfig()); - QtSupport::BaseQtVersion::QmakeBuildConfigs qmakeBuildConfig = result.first; - - QString additionalArguments = result.second; - Utils::FileName parsedSpec = Qt4BuildConfiguration::extractSpecFromArguments(&additionalArguments, directory, version); - const bool enableQmlDebugger = - Qt4BuildConfiguration::removeQMLInspectorFromArguments(&additionalArguments); - - // So we got all the information now apply it... - setQtVersion(version); - - QMakeStep *qs = qmakeStep(); - qs->setUserArguments(additionalArguments); - qs->setLinkQmlDebuggingLibrary(enableQmlDebugger); - if (!parsedSpec.isEmpty() && parsedSpec != Utils::FileName::fromString(QLatin1String("default")) && qs->mkspec() != parsedSpec) { - Utils::QtcProcess::addArgs(&additionalArguments, (QStringList() << QLatin1String("-spec") << parsedSpec.toUserOutput())); - qs->setUserArguments(additionalArguments); - } + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(p); + if (!version || !version->isValid()) + return infoList; + QtSupport::BaseQtVersion::QmakeBuildConfigs config = version->defaultBuildConfig(); + BuildConfigurationInfo info = BuildConfigurationInfo(config, QString(), QString(), false); + info.directory = Qt4Project::shadowBuildDirectory(proFilePath, p, buildConfigurationDisplayName(info)); + infoList.append(info); - setQMakeBuildConfiguration(qmakeBuildConfig); - // Adjust command line arguments, this is ugly as hell - // If we are switching to BuildAll we want "release" in there and no "debug" - // or "debug" in there and no "release" - // If we are switching to not BuildAll we want neither "release" nor "debug" in there - bool debug = qmakeBuildConfig & QtSupport::BaseQtVersion::DebugBuild; - bool haveTag = !(qmakeBuildConfig & QtSupport::BaseQtVersion::BuildAll); - QString makeCmdArguments = makeStep()->userArguments(); - Utils::QtcProcess::ArgIterator ait(&makeCmdArguments); - while (ait.next()) { - if (ait.value() == QLatin1String("debug")) { - if (!haveTag && debug) - haveTag = true; - else - ait.deleteArg(); - } else if (ait.value() == QLatin1String("release")) { - if (!haveTag && !debug) - haveTag = true; - else - ait.deleteArg(); - } - } - if (!haveTag) - ait.appendArg(QLatin1String(debug ? "debug" : "release")); - makeStep()->setUserArguments(makeCmdArguments); - } - } + info.buildConfig = config ^ QtSupport::BaseQtVersion::DebugBuild; + info.directory = Qt4Project::shadowBuildDirectory(proFilePath, p, buildConfigurationDisplayName(info)); + if (!QFileInfo(info.directory).exists()) + infoList.append(info); + + return infoList; +} + +// Return name of a build configuration. +QString Qt4BuildConfigurationFactory::buildConfigurationDisplayName(const BuildConfigurationInfo &info) +{ + return (info.buildConfig & QtSupport::BaseQtVersion::DebugBuild) ? + //: Name of a debug build configuration to created by a project wizard. We recommend not translating it. + tr("Debug") : + //: Name of a release build configuration to be created by a project wizard. We recommend not translating it. + tr("Release"); } BuildConfiguration::BuildType Qt4BuildConfiguration::buildType() const @@ -922,3 +732,53 @@ BuildConfiguration::BuildType Qt4BuildConfiguration::buildType() const else return Release; } + +Qt4BuildConfiguration *Qt4BuildConfiguration::setup(Target *t, QString defaultDisplayName, + QString displayName, + QtSupport::BaseQtVersion::QmakeBuildConfigs qmakeBuildConfiguration, + QString additionalArguments, QString directory, + bool importing) +{ + bool debug = qmakeBuildConfiguration & QtSupport::BaseQtVersion::DebugBuild; + + // Add the buildconfiguration + Qt4BuildConfiguration *bc = new Qt4BuildConfiguration(t); + bc->setDefaultDisplayName(defaultDisplayName); + bc->setDisplayName(displayName); + + ProjectExplorer::BuildStepList *buildSteps = + bc->stepList(Core::Id(ProjectExplorer::Constants::BUILDSTEPS_BUILD)); + ProjectExplorer::BuildStepList *cleanSteps = + bc->stepList(Core::Id(ProjectExplorer::Constants::BUILDSTEPS_CLEAN)); + Q_ASSERT(buildSteps); + Q_ASSERT(cleanSteps); + + QMakeStep *qmakeStep = new QMakeStep(buildSteps); + buildSteps->insertStep(0, qmakeStep); + + MakeStep *makeStep = new MakeStep(buildSteps); + buildSteps->insertStep(1, makeStep); + + MakeStep* cleanStep = new MakeStep(cleanSteps); + cleanStep->setClean(true); + cleanStep->setUserArguments(QLatin1String("clean")); + cleanSteps->insertStep(0, cleanStep); + + bool enableQmlDebugger + = Qt4BuildConfiguration::removeQMLInspectorFromArguments(&additionalArguments); + if (!additionalArguments.isEmpty()) + qmakeStep->setUserArguments(additionalArguments); + if (importing) + qmakeStep->setLinkQmlDebuggingLibrary(enableQmlDebugger); + + // set some options for qmake and make + if (qmakeBuildConfiguration & QtSupport::BaseQtVersion::BuildAll) // debug_and_release => explicit targets + makeStep->setUserArguments(debug ? QLatin1String("debug") : QLatin1String("release")); + + bc->setQMakeBuildConfiguration(qmakeBuildConfiguration); + + if (!directory.isEmpty()) + bc->setShadowBuildAndDirectory(directory != t->project()->projectDirectory(), directory); + + return bc; +} diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.h b/src/plugins/qt4projectmanager/qt4buildconfiguration.h index b2ba12ac9a..11d3bc2baa 100644 --- a/src/plugins/qt4projectmanager/qt4buildconfiguration.h +++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.h @@ -35,19 +35,17 @@ #include "qt4projectmanager_global.h" +#include "buildconfigurationinfo.h" + #include <projectexplorer/buildconfiguration.h> #include <qtsupport/baseqtversion.h> -namespace ProjectExplorer { -class ToolChain; -class FileNode; -} +namespace ProjectExplorer { class FileNode; } namespace Qt4ProjectManager { class QMakeStep; class MakeStep; -class Qt4BaseTarget; class Qt4BuildConfigurationFactory; class Qt4ProFileNode; @@ -57,14 +55,13 @@ class QT4PROJECTMANAGER_EXPORT Qt4BuildConfiguration : public ProjectExplorer::B friend class Qt4BuildConfigurationFactory; public: - explicit Qt4BuildConfiguration(Qt4BaseTarget *target); - virtual ~Qt4BuildConfiguration(); - - Qt4BaseTarget *qt4Target() const; + explicit Qt4BuildConfiguration(ProjectExplorer::Target *target); + ~Qt4BuildConfiguration(); - virtual Utils::Environment baseEnvironment() const; + Utils::Environment baseEnvironment() const; - virtual QString buildDirectory() const; + ProjectExplorer::BuildConfigWidget *createConfigWidget(); + QString buildDirectory() const; bool shadowBuild() const; QString shadowBuildDirectory() const; void setShadowBuildAndDirectory(bool shadowBuild, const QString &buildDirectory); @@ -75,12 +72,6 @@ public: ProjectExplorer::FileNode *fileNodeBuild() const; void setFileNodeBuild(ProjectExplorer::FileNode *node); - // returns the qtVersion - QtSupport::BaseQtVersion *qtVersion() const; - void setQtVersion(QtSupport::BaseQtVersion *); - - void setToolChain(ProjectExplorer::ToolChain *tc); - QtSupport::BaseQtVersion::QmakeBuildConfigs qmakeBuildConfiguration() const; void setQMakeBuildConfiguration(QtSupport::BaseQtVersion::QmakeBuildConfigs config); @@ -106,11 +97,11 @@ public: QMakeStep *qmakeStep() const; MakeStep *makeStep() const; - QString makeCommand() const; QString defaultMakeTarget() const; QString makefile() const; - bool compareToImportFrom(const QString &makefile); + enum MakefileState { MakefileMatches, MakefileForWrongProject, MakefileIncompatible, MakefileMissing }; + MakefileState compareToImportFrom(const QString &makefile); static bool removeQMLInspectorFromArguments(QString *args); static Utils::FileName extractSpecFromArguments(QString *arguments, const QString &directory, const QtSupport::BaseQtVersion *version, @@ -127,39 +118,37 @@ public: BuildType buildType() const; + static Qt4BuildConfiguration *setup(ProjectExplorer::Target *t, + QString defaultDisplayName, + QString displayName, + QtSupport::BaseQtVersion::QmakeBuildConfigs qmakeBuildConfiguration, + QString additionalArguments, + QString directory, + bool importing); + /// returns whether the qt version in the profile supports shadow building (also true for no qt version) + bool supportsShadowBuilds(); + public slots: - void importFromBuildDirectory(); - void emitProFileEvaluateNeeded(); + void emitEvaluateBuildSystem(); signals: - /// emitted if the qt version changes (either directly, or because the default qt version changed - /// or because the user changed the settings for the qt version - void qtVersionChanged(); /// emitted for setQMakeBuildConfig, not emitted for qt version changes, even /// if those change the qmakebuildconfig void qmakeBuildConfigurationChanged(); /// emitted when smart installer property of S60 create package step changes void s60CreatesSmartInstallerChanged(); - /// emitted if the build configuration changed in a way that - /// should trigger a reevaluation of all .pro files - void proFileEvaluateNeeded(Qt4ProjectManager::Qt4BuildConfiguration *); - - void buildDirectoryInitialized(); - private slots: - void qtVersionsChanged(const QList<int> &addedVersions, const QList<int> &removedVersions, const QList<int> &changedVersions); + void profileChanged(); void emitBuildDirectoryChanged(); - void proFileUpdated(Qt4ProjectManager::Qt4ProFileNode *, bool, bool parseInProgress); protected: - Qt4BuildConfiguration(Qt4BaseTarget *target, Qt4BuildConfiguration *source); - Qt4BuildConfiguration(Qt4BaseTarget *target, const Core::Id id); + Qt4BuildConfiguration(ProjectExplorer::Target *target, Qt4BuildConfiguration *source); + Qt4BuildConfiguration(ProjectExplorer::Target *target, const Core::Id id); virtual bool fromMap(const QVariantMap &map); private: void ctor(); - void pickValidQtVersion(); QString rawBuildDirectory() const; QString defaultShadowBuildDirectory() const; @@ -167,7 +156,7 @@ private: bool m_isEnabled; QString m_buildDirectory; QString m_lastEmmitedBuildDirectory; - int m_qtVersionId; + bool m_qtVersionSupportsShadowBuilds; QtSupport::BaseQtVersion::QmakeBuildConfigs m_qmakeBuildConfiguration; Qt4ProjectManager::Qt4ProFileNode *m_subNodeBuild; ProjectExplorer::FileNode *m_fileNodeBuild; @@ -181,18 +170,24 @@ public: explicit Qt4BuildConfigurationFactory(QObject *parent = 0); ~Qt4BuildConfigurationFactory(); - QList<Core::Id> availableCreationIds(ProjectExplorer::Target *parent) const; + QList<Core::Id> availableCreationIds(const ProjectExplorer::Target *parent) const; QString displayNameForId(const Core::Id id) const; - bool canCreate(ProjectExplorer::Target *parent, const Core::Id id) const; - ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent, const Core::Id id); - bool canClone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const; + bool canCreate(const ProjectExplorer::Target *parent, const Core::Id id) const; + ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent, const Core::Id id, const QString &name = QString()); + bool canClone(const ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const; ProjectExplorer::BuildConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source); - bool canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const; + bool canRestore(const ProjectExplorer::Target *parent, const QVariantMap &map) const; ProjectExplorer::BuildConfiguration *restore(ProjectExplorer::Target *parent, const QVariantMap &map); + static QList<BuildConfigurationInfo> availableBuildConfigurations(const ProjectExplorer::Profile *p, const QString &proFilePath); + static QString buildConfigurationDisplayName(const BuildConfigurationInfo &info); + private slots: void update(); + +private: + bool canHandle(const ProjectExplorer::Target *t) const; }; } // namespace Qt4ProjectManager diff --git a/src/plugins/qt4projectmanager/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp index 2bb595682c..7ac30646fa 100644 --- a/src/plugins/qt4projectmanager/qt4nodes.cpp +++ b/src/plugins/qt4projectmanager/qt4nodes.cpp @@ -32,12 +32,12 @@ #include "qt4nodes.h" #include "qt4project.h" -#include "qt4target.h" #include "qt4projectmanager.h" #include "qt4projectmanagerconstants.h" #include "qtuicodemodelsupport.h" #include "qmakestep.h" #include "qt4buildconfiguration.h" +#include "qmakerunconfigurationfactory.h" #include <projectexplorer/nodesvisitor.h> #include <projectexplorer/runconfiguration.h> @@ -53,9 +53,12 @@ #include <cpptools/ModelManagerInterface.h> #include <cplusplus/CppDocument.h> #include <extensionsystem/pluginmanager.h> -#include <projectexplorer/projectexplorer.h> #include <projectexplorer/buildmanager.h> +#include <projectexplorer/projectexplorer.h> +#include <projectexplorer/target.h> #include <qtsupport/profilereader.h> +#include <qtsupport/qtprofileinformation.h> +#include <qtsupport/qtsupportconstants.h> #include <utils/qtcassert.h> #include <utils/stringutils.h> @@ -801,8 +804,9 @@ void Qt4PriFileNode::folderChanged(const QString &folder) // We need to regenerate that list by running qmake // Other platforms do not have a explicit list of files to package, but package // directories - foreach (ProjectExplorer::Target *target, m_project->targets()) { - if (target->id() == Core::Id(Constants::S60_DEVICE_TARGET_ID)) { + foreach (const ProjectExplorer::Target *target, m_project->targets()) { + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(target->profile()); + if (version && version->type() == QtSupport::Constants::SYMBIANQT) { foreach (ProjectExplorer::BuildConfiguration *bc, target->buildConfigurations()) { Qt4BuildConfiguration *qt4bc = qobject_cast<Qt4BuildConfiguration *>(bc); if (qt4bc) { @@ -833,9 +837,9 @@ bool Qt4PriFileNode::deploysFolder(const QString &folder) const QList<ProjectExplorer::RunConfiguration *> Qt4PriFileNode::runConfigurationsFor(Node *node) { - Qt4BaseTarget *target = m_project->activeTarget(); - if (target) - return target->runConfigurationsForNode(node); + QmakeRunConfigurationFactory *factory = QmakeRunConfigurationFactory::find(m_project->activeTarget()); + if (factory) + return factory->runConfigurationsForNode(m_project->activeTarget(), node); return QList<ProjectExplorer::RunConfiguration *>(); } @@ -917,8 +921,9 @@ QList<ProjectNode::ProjectAction> Qt4PriFileNode::supportedActions(Node *node) c actions << Rename; - Qt4BaseTarget *target = m_project->activeTarget(); - if (target && !target->runConfigurationsForNode(node).isEmpty()) + ProjectExplorer::Target *target = m_project->activeTarget(); + QmakeRunConfigurationFactory *factory = QmakeRunConfigurationFactory::find(target); + if (factory && !factory->runConfigurationsForNode(target, node).isEmpty()) actions << HasSubProjectRunConfigurations; return actions; @@ -2321,8 +2326,9 @@ TargetInformation Qt4ProFileNode::targetInformation(QtSupport::ProFileReader *re // Hmm can we find out whether it's debug or release in a saner way? // Theoretically it's in CONFIG QString qmakeBuildConfig = QLatin1String("release"); - Qt4BaseTarget *target = m_project->activeTarget(); - if (!target || target->activeQt4BuildConfiguration()->qmakeBuildConfiguration() & QtSupport::BaseQtVersion::DebugBuild) + ProjectExplorer::Target *target = m_project->activeTarget(); + Qt4BuildConfiguration *bc = target ? qobject_cast<Qt4BuildConfiguration *>(target->activeBuildConfiguration()) : 0; + if (!target || !bc || bc->qmakeBuildConfiguration() & QtSupport::BaseQtVersion::DebugBuild) qmakeBuildConfig = QLatin1String("debug"); wd += QLatin1Char('/') + qmakeBuildConfig; } @@ -2454,7 +2460,7 @@ QString Qt4ProFileNode::buildDir(Qt4BuildConfiguration *bc) const const QDir srcDirRoot = QFileInfo(m_project->rootProjectNode()->path()).absoluteDir(); const QString relativeDir = srcDirRoot.relativeFilePath(m_projectDir); if (!bc && m_project->activeTarget()) - bc = m_project->activeTarget()->activeQt4BuildConfiguration(); + bc = qobject_cast<Qt4BuildConfiguration *>(m_project->activeTarget()->activeBuildConfiguration()); if (!bc) return QString(); return QDir(bc->buildDirectory()).absoluteFilePath(relativeDir); diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp index 44c12bfc93..54abc51f7e 100644 --- a/src/plugins/qt4projectmanager/qt4project.cpp +++ b/src/plugins/qt4projectmanager/qt4project.cpp @@ -33,15 +33,14 @@ #include "qt4project.h" #include "qt4projectmanager.h" -#include "qt4target.h" #include "makestep.h" #include "qmakestep.h" +#include "qmakerunconfigurationfactory.h" #include "qt4nodes.h" #include "qt4projectconfigwidget.h" #include "qt4projectmanagerconstants.h" #include "qt4buildconfiguration.h" #include "findqt4profiles.h" -#include "qt4basetargetfactory.h" #include "buildconfigurationinfo.h" #include <coreplugin/icore.h> @@ -57,6 +56,7 @@ #include <projectexplorer/headerpath.h> #include <projectexplorer/target.h> #include <projectexplorer/buildenvironmentwidget.h> +#include <projectexplorer/profileinformation.h> #include <projectexplorer/projectexplorer.h> #include <projectexplorer/projectexplorerconstants.h> #include <utils/qtcassert.h> @@ -64,6 +64,7 @@ #include <qtsupport/qmldumptool.h> #include <qtsupport/baseqtversion.h> #include <qtsupport/profilereader.h> +#include <qtsupport/qtprofileinformation.h> #include <qtsupport/qtsupportconstants.h> #include <qtsupport/qtversionmanager.h> #include <utils/QtConcurrentTools> @@ -80,6 +81,43 @@ using namespace ProjectExplorer; enum { debug = 0 }; +// ----------------------------------------------------------------------- +// Helpers: +// ----------------------------------------------------------------------- + +namespace { + +Qt4BuildConfiguration *enableActiveQt4BuildConfiguration(ProjectExplorer::Target *t, bool enabled) +{ + if (!t) + return 0; + Qt4BuildConfiguration *bc = qobject_cast<Qt4BuildConfiguration *>(t->activeBuildConfiguration()); + if (!bc) + return 0; + bc->setEnabled(enabled); + return bc; +} + +QString sanitize(const QString &input) +{ + QString result; + result.reserve(input.size()); + foreach (const QChar &qc, input) { + const char c = qc.toLatin1(); + if ((c >= 'a' && c <='z') + || (c >= 'A' && c <= 'Z') + || (c >= '0' && c <= '9') + || c == '-' + || c == '_') + result.append(qc); + else + result.append(QLatin1Char('_')); + } + return result; +} + +} // namespace + namespace Qt4ProjectManager { namespace Internal { @@ -139,7 +177,8 @@ private: }; // Qt4ProjectFiles: Struct for (Cached) lists of files in a project -struct Qt4ProjectFiles { +class Qt4ProjectFiles { +public: void clear(); bool equals(const Qt4ProjectFiles &f) const; @@ -371,7 +410,6 @@ bool Qt4Project::fromMap(const QVariantMap &map) if (t->buildConfigurations().isEmpty()) { qWarning() << "Removing" << t->id().name() << "since it has no buildconfigurations!"; removeTarget(t); - delete t; } } @@ -385,51 +423,22 @@ bool Qt4Project::fromMap(const QVariantMap &map) // This might be incorrect, need a full update updateCodeModels(); - foreach (Target *t, targets()) - static_cast<Qt4BaseTarget *>(t)->createApplicationProFiles(false); - - foreach (Target *t, targets()) - onAddedTarget(t); - + // We have the profile nodes now, so we know the runconfigs! connect(m_nodesWatcher, SIGNAL(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode*,bool,bool)), this, SIGNAL(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode*,bool,bool))); // Now we emit update once :) m_rootProjectNode->emitProFileUpdatedRecursive(); - - // Setup Qt versions supported (== possible targets). - connect(this, SIGNAL(addedTarget(ProjectExplorer::Target*)), - this, SLOT(onAddedTarget(ProjectExplorer::Target*))); - connect(this, SIGNAL(activeTargetChanged(ProjectExplorer::Target*)), this, SLOT(activeTargetWasChanged())); - emit fromMapFinished(); - return true; } -Qt4BaseTarget *Qt4Project::activeTarget() const +void Qt4Project::evaluateBuildSystem() { - return static_cast<Qt4BaseTarget *>(Project::activeTarget()); -} - -void Qt4Project::onAddedTarget(ProjectExplorer::Target *t) -{ - Q_ASSERT(t); - Qt4BaseTarget *qt4target = qobject_cast<Qt4BaseTarget *>(t); - Q_ASSERT(qt4target); - connect(qt4target, SIGNAL(buildDirectoryInitialized()), - this, SIGNAL(buildDirectoryInitialized())); - connect(qt4target, SIGNAL(proFileEvaluateNeeded(Qt4ProjectManager::Qt4BaseTarget*)), - this, SLOT(proFileEvaluateNeeded(Qt4ProjectManager::Qt4BaseTarget*))); -} - -void Qt4Project::proFileEvaluateNeeded(Qt4ProjectManager::Qt4BaseTarget *target) -{ - if (activeTarget() == target) - scheduleAsyncUpdate(); + scheduleAsyncUpdate(); } /// equalFileList compares two file lists ignoring @@ -473,15 +482,15 @@ void Qt4Project::updateCppCodeModel() { typedef CPlusPlus::CppModelManagerInterface::ProjectPart ProjectPart; + Profile *p = 0; QtSupport::BaseQtVersion *qtVersion = 0; ToolChain *tc = 0; - if (Qt4BaseTarget *target = activeTarget()) { - qtVersion = target->activeQt4BuildConfiguration()->qtVersion(); - tc = target->activeQt4BuildConfiguration()->toolChain(); - } else { - qtVersion = qt4ProjectManager()->unconfiguredSettings().version; - tc = qt4ProjectManager()->unconfiguredSettings().toolchain; - } + if (ProjectExplorer::Target *target = activeTarget()) + p = target->profile(); + else + p = ProfileManager::instance()->defaultProfile(); + qtVersion = QtSupport::QtProfileInformation::qtVersion(p); + tc = ToolChainProfileInformation::toolChain(p); CPlusPlus::CppModelManagerInterface *modelmanager = CPlusPlus::CppModelManagerInterface::instance(); @@ -519,7 +528,7 @@ void Qt4Project::updateCppCodeModel() if (tc) headers = tc->systemHeaderPaths(); // todo pass cxxflags? if (qtVersion) { - headers.append(qtVersion->systemHeaderPathes()); + headers.append(qtVersion->systemHeaderPathes(p)); } foreach (const HeaderPath &headerPath, headers) { @@ -585,41 +594,32 @@ void Qt4Project::updateQmlJSCodeModel() bool preferDebugDump = false; projectInfo.tryQmlDump = false; - QtSupport::BaseQtVersion *qtVersion = 0; - if (Qt4BaseTarget *t = activeTarget()) { - if (Qt4BuildConfiguration *bc = t->activeQt4BuildConfiguration()) { - qtVersion = bc->qtVersion(); + ProjectExplorer::Target *t = activeTarget(); + ProjectExplorer::Profile *p = t ? t->profile() : ProjectExplorer::ProfileManager::instance()->defaultProfile(); + QtSupport::BaseQtVersion *qtVersion = QtSupport::QtProfileInformation::qtVersion(p); + + if (t) { + if (Qt4BuildConfiguration *bc = qobject_cast<Qt4BuildConfiguration *>(t->activeBuildConfiguration())) preferDebugDump = bc->qmakeBuildConfiguration() & QtSupport::BaseQtVersion::DebugBuild; - } } else { - qtVersion = qt4ProjectManager()->unconfiguredSettings().version; if (qtVersion) preferDebugDump = qtVersion->defaultBuildConfig() & QtSupport::BaseQtVersion::DebugBuild; } - if (qtVersion) { - if (qtVersion && qtVersion->isValid()) { - projectInfo.tryQmlDump = qtVersion->type() == QLatin1String(QtSupport::Constants::DESKTOPQT) - || qtVersion->type() == QLatin1String(QtSupport::Constants::SIMULATORQT); - projectInfo.qtImportsPath = qtVersion->versionInfo().value(QLatin1String("QT_INSTALL_IMPORTS")); - if (!projectInfo.qtImportsPath.isEmpty()) - projectInfo.importPaths += projectInfo.qtImportsPath; - projectInfo.qtVersionString = qtVersion->qtVersionString(); - } + if (qtVersion && qtVersion->isValid()) { + projectInfo.tryQmlDump = qtVersion->type() == QLatin1String(QtSupport::Constants::DESKTOPQT) + || qtVersion->type() == QLatin1String(QtSupport::Constants::SIMULATORQT); + projectInfo.qtImportsPath = qtVersion->versionInfo().value(QLatin1String("QT_INSTALL_IMPORTS")); + if (!projectInfo.qtImportsPath.isEmpty()) + projectInfo.importPaths += projectInfo.qtImportsPath; + projectInfo.qtVersionString = qtVersion->qtVersionString(); } projectInfo.importPaths.removeDuplicates(); if (projectInfo.tryQmlDump) { - if (Qt4BaseTarget *target = activeTarget()) { - const Qt4BuildConfiguration *bc = target->activeQt4BuildConfiguration(); - if (bc) - QtSupport::QmlDumpTool::pathAndEnvironment(this, bc->qtVersion(), bc->toolChain(), - preferDebugDump, &projectInfo.qmlDumpPath, - &projectInfo.qmlDumpEnvironment); - } else { - UnConfiguredSettings us = qt4ProjectManager()->unconfiguredSettings(); - QtSupport::QmlDumpTool::pathAndEnvironment(this, us.version, us.toolchain, - preferDebugDump, &projectInfo.qmlDumpPath, &projectInfo.qmlDumpEnvironment); - } + QtSupport::QmlDumpTool::pathAndEnvironment(this, qtVersion, + ToolChainProfileInformation::toolChain(p), + preferDebugDump, &projectInfo.qmlDumpPath, + &projectInfo.qmlDumpEnvironment); } else { projectInfo.qmlDumpPath.clear(); projectInfo.qmlDumpEnvironment.clear(); @@ -640,10 +640,8 @@ void Qt4Project::update() if (debug) qDebug()<<"State is now Base"; m_asyncUpdateState = Base; - Qt4BaseTarget *target = activeTarget(); - if (target) - target->activeQt4BuildConfiguration()->setEnabled(true); - emit proParsingDone(); + enableActiveQt4BuildConfiguration(activeTarget(), true); + buildSystemEvaluationFinished(true); } void Qt4Project::scheduleAsyncUpdate(Qt4ProFileNode *node) @@ -664,8 +662,7 @@ void Qt4Project::scheduleAsyncUpdate(Qt4ProFileNode *node) return; } - if (activeTarget() && activeTarget()->activeQt4BuildConfiguration()) - activeTarget()->activeQt4BuildConfiguration()->setEnabled(false); + enableActiveQt4BuildConfiguration(activeTarget(), false); if (m_asyncUpdateState == AsyncFullUpdatePending) { // Just postpone @@ -735,8 +732,7 @@ void Qt4Project::scheduleAsyncUpdate() qDebug()<<" update in progress, canceling and setting state to full update pending"; m_cancelEvaluate = true; m_asyncUpdateState = AsyncFullUpdatePending; - if (activeTarget() && activeTarget()->activeQt4BuildConfiguration()) - activeTarget()->activeQt4BuildConfiguration()->setEnabled(false); + enableActiveQt4BuildConfiguration(activeTarget(), false); m_rootProjectNode->setParseInProgressRecursive(true); return; } @@ -744,8 +740,7 @@ void Qt4Project::scheduleAsyncUpdate() if (debug) qDebug()<<" starting timer for full update, setting state to full update pending"; m_partialEvaluate.clear(); - if (activeTarget() && activeTarget()->activeQt4BuildConfiguration()) - activeTarget()->activeQt4BuildConfiguration()->setEnabled(false); + enableActiveQt4BuildConfiguration(activeTarget(), false); m_rootProjectNode->setParseInProgressRecursive(true); m_asyncUpdateState = AsyncFullUpdatePending; m_asyncUpdateTimer.start(); @@ -793,13 +788,10 @@ void Qt4Project::decrementPendingEvaluateFutures() } else if (m_asyncUpdateState != ShuttingDown){ // After being done, we need to call: m_asyncUpdateState = Base; - if (activeTarget() && activeTarget()->activeQt4BuildConfiguration()) - activeTarget()->activeQt4BuildConfiguration()->setEnabled(true); - foreach (Target *t, targets()) - static_cast<Qt4BaseTarget *>(t)->createApplicationProFiles(true); + enableActiveQt4BuildConfiguration(activeTarget(), true); updateFileList(); updateCodeModels(); - emit proParsingDone(); + buildSystemEvaluationFinished(true); if (debug) qDebug()<<" Setting state to Base"; } @@ -855,6 +847,12 @@ Qt4Manager *Qt4Project::qt4ProjectManager() const return m_manager; } +bool Qt4Project::supportsProfile(Profile *p) const +{ + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(p); + return version; +} + QString Qt4Project::displayName() const { return QFileInfo(document()->fileName()).completeBaseName(); @@ -924,43 +922,33 @@ QtSupport::ProFileReader *Qt4Project::createProFileReader(Qt4ProFileNode *qt4Pro m_proFileOption = new ProFileOption; m_proFileOptionRefCnt = 0; - QtSupport::BaseQtVersion *qtVersion = 0; - ProjectExplorer::ToolChain *tc = 0; + Profile *p; Utils::Environment env = Utils::Environment::systemEnvironment(); + Qt4BuildConfiguration *currentBc = bc; QStringList qmakeArgs; - if (bc) { - qtVersion = bc->qtVersion(); - env = bc->environment(); - tc = bc->toolChain(); - if (QMakeStep *qs = bc->qmakeStep()) { - qmakeArgs = qs->parserArguments(); - m_proFileOption->qmakespec = qs->mkspec().toString(); + if (!currentBc) + currentBc = activeTarget() ? qobject_cast<Qt4BuildConfiguration *>(activeTarget()->activeBuildConfiguration()) : 0; + + if (currentBc) { + p = currentBc->target()->profile(); + env = currentBc->environment(); + if (currentBc->qmakeStep()) { + qmakeArgs = currentBc->qmakeStep()->parserArguments(); + m_proFileOption->qmakespec = currentBc->qmakeStep()->mkspec().toString(); } else { qmakeArgs = bc->configCommandLineArguments(); } - } else if (Qt4BaseTarget *target = activeTarget()) { - if (Qt4BuildConfiguration *bc = target->activeQt4BuildConfiguration()) { - qtVersion = bc->qtVersion(); - env = bc->environment(); - tc = bc->toolChain(); - if (QMakeStep *qs = bc->qmakeStep()) { - qmakeArgs = qs->parserArguments(); - m_proFileOption->qmakespec = qs->mkspec().toString(); - } else { - qmakeArgs = bc->configCommandLineArguments(); - } - } } else { - UnConfiguredSettings ucs = qt4ProjectManager()->unconfiguredSettings(); - qtVersion = ucs.version; - tc = ucs.toolchain; + p = ProfileManager::instance()->defaultProfile(); } - if (qtVersion && qtVersion->isValid()) { + QtSupport::BaseQtVersion *qtVersion = QtSupport::QtProfileInformation::qtVersion(p); + QString systemRoot = SysRootProfileInformation::hasSysRoot(p) + ? SysRootProfileInformation::sysRoot(p).toString() : QString(); + + if (qtVersion && qtVersion->isValid()) m_proFileOption->properties = qtVersion->versionInfo(); - if (tc) - m_proFileOption->sysroot = qtVersion->systemRoot(); - } + m_proFileOption->sysroot = systemRoot; Utils::Environment::const_iterator eit = env.constBegin(), eend = env.constEnd(); for (; eit != eend; ++eit) @@ -1334,30 +1322,19 @@ bool Qt4Project::needsConfiguration() const void Qt4Project::configureAsExampleProject(const QStringList &platforms) { - QList<Qt4BaseTargetFactory *> factories = ExtensionSystem::PluginManager::getObjects<Qt4BaseTargetFactory>(); - foreach (Qt4BaseTargetFactory *factory, factories) { - foreach (const Core::Id id, factory->supportedTargetIds()) { - QList<BuildConfigurationInfo> infos - = factory->availableBuildConfigurations(id, rootProjectNode()->path(), - QtSupport::QtVersionNumber(), - QtSupport::QtVersionNumber(INT_MAX, INT_MAX, INT_MAX), - Core::FeatureSet()); - if (!platforms.isEmpty()) { - QList<BuildConfigurationInfo> filtered; - foreach (const BuildConfigurationInfo &info, infos) { - foreach (const QString &platform, platforms) { - if (info.version()->supportsPlatform(platform)) { - filtered << info; - break; - } - } - } - infos = filtered; - } - - if (!infos.isEmpty()) - addTarget(factory->create(this, id, infos)); - } + QList<Profile *> profiles = ProjectExplorer::ProfileManager::instance()->profiles(); + foreach (Profile *p, profiles) { + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(p); + if (!version) + continue; + if (!platforms.isEmpty() && !platforms.contains(version->platformName())) + continue; + + QList<BuildConfigurationInfo> infoList + = Qt4BuildConfigurationFactory::availableBuildConfigurations(p, document()->fileName()); + if (infoList.isEmpty()) + continue; + addTarget(createTarget(p, infoList)); } ProjectExplorer::ProjectExplorerPlugin::instance()->requestProjectModeUpdate(this); } @@ -1379,6 +1356,55 @@ QString Qt4Project::disabledReasonForRunConfiguration(const QString &proFilePath .arg(QFileInfo(proFilePath).fileName()); } +QString Qt4Project::shadowBuildDirectory(const QString &profilePath, const Profile *p, const QString &suffix) +{ + if (profilePath.isEmpty()) + return QString(); + QFileInfo info(profilePath); + + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(p); + if (version && !version->supportsShadowBuilds()) + return info.absolutePath(); + + QString base = QDir::cleanPath(projectDirectory(profilePath) + QLatin1String("/../") + + info.baseName() + QLatin1String("-build-")); + return base + buildNameFor(p) + QLatin1String("-") + sanitize(suffix); +} + +QString Qt4Project::buildNameFor(const Profile *p) +{ + if (!p) + return QLatin1String("unknown"); + return QString::fromLatin1(p->id().name()).mid(31, 6); // part of the UUID, should be pretty unique;-) +} + +Target *Qt4Project::createTarget(Profile *p, const QList<BuildConfigurationInfo> &infoList) +{ + if (target(p)) + return 0; + + Target *t = new Target(this, p); + + // Build Configurations: + foreach (const BuildConfigurationInfo &info, infoList) { + QString name = info.buildConfig & QtSupport::BaseQtVersion::DebugBuild + ? tr("Debug") : tr("Release"); + Qt4BuildConfiguration *bc + = Qt4BuildConfiguration::setup(t, name, name, + info.buildConfig, info.additionalArguments, + info.directory, info.importing); + t->addBuildConfiguration(bc); + } + + // Deploy Configurations: + t->updateDefaultDeployConfigurations(); + + // Run Configurations: + t->updateDefaultRunConfigurations(); + + return t; +} + } // namespace Qt4ProjectManager #include "qt4project.moc" diff --git a/src/plugins/qt4projectmanager/qt4project.h b/src/plugins/qt4projectmanager/qt4project.h index a568aeb5b3..7ca97059f3 100644 --- a/src/plugins/qt4projectmanager/qt4project.h +++ b/src/plugins/qt4projectmanager/qt4project.h @@ -48,35 +48,27 @@ QT_BEGIN_NAMESPACE struct ProFileOption; QT_END_NAMESPACE -namespace QtSupport { -class ProFileReader; -} +namespace QtSupport { class ProFileReader; } namespace Qt4ProjectManager { -class Qt4ProFileNode; -class Qt4PriFileNode; -class Qt4BaseTarget; +class BuildConfigurationInfo; +class MakeStep; +class QMakeStep; class Qt4BuildConfiguration; class Qt4Manager; - -namespace Internal { - class DeployHelperRunStep; - class FileItem; - class GCCPreprocessor; - struct Qt4ProjectFiles; - class Qt4ProjectConfigWidget; - class Qt4ProjectFile; - class Qt4NodesWatcher; -} - -class QMakeStep; -class MakeStep; - -class Qt4Project; +class Qt4PriFileNode; +class Qt4ProFileNode; class Qt4RunStep; namespace Internal { class CentralizedFolderWatcher; +class DeployHelperRunStep; +class FileItem; +class GCCPreprocessor; +class Qt4ProjectFiles; +class Qt4ProjectConfigWidget; +class Qt4ProjectFile; +class Qt4NodesWatcher; } class QT4PROJECTMANAGER_EXPORT Qt4Project : public ProjectExplorer::Project @@ -93,7 +85,7 @@ public: ProjectExplorer::IProjectManager *projectManager() const; Qt4Manager *qt4ProjectManager() const; - Qt4BaseTarget *activeTarget() const; + bool supportsProfile(ProjectExplorer::Profile *p) const; ProjectExplorer::ProjectNode *rootProjectNode() const; Qt4ProFileNode *rootQt4ProjectNode() const; @@ -142,28 +134,31 @@ public: /// \internal QString disabledReasonForRunConfiguration(const QString &proFilePath); + /// suffix should be unique + static QString shadowBuildDirectory(const QString &profilePath, const ProjectExplorer::Profile *p, + const QString &suffix); + /// used by the default implementation of shadowBuildDirectory + static QString buildNameFor(const ProjectExplorer::Profile *p); + + ProjectExplorer::Target *createTarget(ProjectExplorer::Profile *p, const QList<BuildConfigurationInfo> &infoList); + signals: - void proParsingDone(); void proFileUpdated(Qt4ProjectManager::Qt4ProFileNode *node, bool, bool); - void buildDirectoryInitialized(); - void fromMapFinished(); public slots: void proFileParseError(const QString &errorMessage); void update(); protected: - virtual bool fromMap(const QVariantMap &map); + bool fromMap(const QVariantMap &map); private slots: - void proFileEvaluateNeeded(Qt4ProjectManager::Qt4BaseTarget *target); - void asyncUpdate(); - void onAddedTarget(ProjectExplorer::Target *t); void activeTargetWasChanged(); private: + void evaluateBuildSystem(); void scheduleAsyncUpdate(); void updateCppCodeModel(); diff --git a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp index 0f24693b1f..7318f21849 100644 --- a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp +++ b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp @@ -35,25 +35,24 @@ #include "makestep.h" #include "qmakestep.h" #include "qt4project.h" -#include "qt4target.h" #include "qt4projectmanagerconstants.h" #include "qt4projectmanager.h" #include "qt4buildconfiguration.h" -#include "qt4basetargetfactory.h" #include "ui_qt4projectconfigwidget.h" #include <coreplugin/icore.h> #include <coreplugin/idocument.h> -#include <projectexplorer/toolchainmanager.h> +#include <projectexplorer/target.h> #include <projectexplorer/toolchain.h> #include <projectexplorer/task.h> #include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/buildconfiguration.h> #include <qtsupport/qtversionfactory.h> #include <qtsupport/baseqtversion.h> -#include <qtsupport/qtversionmanager.h> +#include <qtsupport/qtprofileinformation.h> #include <qtsupport/qtsupportconstants.h> +#include <qtsupport/qtversionmanager.h> #include <utils/qtcassert.h> #include <utils/qtcprocess.h> #include <extensionsystem/pluginmanager.h> @@ -70,7 +69,7 @@ using namespace Qt4ProjectManager; using namespace Qt4ProjectManager::Internal; using namespace ProjectExplorer; -Qt4ProjectConfigWidget::Qt4ProjectConfigWidget(Qt4BaseTarget *target) +Qt4ProjectConfigWidget::Qt4ProjectConfigWidget(ProjectExplorer::Target *target) : BuildConfigWidget(), m_buildConfiguration(0), m_ignoreChange(false) @@ -89,7 +88,6 @@ Qt4ProjectConfigWidget::Qt4ProjectConfigWidget(Qt4BaseTarget *target) m_ui->shadowBuildDirEdit->setPromptDialogTitle(tr("Shadow Build Directory")); m_ui->shadowBuildDirEdit->setExpectedKind(Utils::PathChooser::ExistingDirectory); - m_ui->shadowBuildDirEdit->setBaseDirectory(target->qt4Project()->projectDirectory()); connect(m_ui->shadowBuildCheckBox, SIGNAL(clicked(bool)), this, SLOT(shadowBuildClicked(bool))); @@ -100,32 +98,11 @@ Qt4ProjectConfigWidget::Qt4ProjectConfigWidget(Qt4BaseTarget *target) connect(m_ui->shadowBuildDirEdit, SIGNAL(changed(QString)), this, SLOT(shadowBuildEdited())); - connect(m_ui->qtVersionComboBox, SIGNAL(currentIndexChanged(QString)), - this, SLOT(qtVersionSelected(QString))); - - connect(m_ui->toolChainComboBox, SIGNAL(activated(int)), - this, SLOT(toolChainSelected(int))); - - connect(m_ui->importLabel, SIGNAL(linkActivated(QString)), - this, SLOT(importLabelClicked())); - - connect(m_ui->manageQtVersionPushButtons, SIGNAL(clicked()), - this, SLOT(manageQtVersions())); - - connect(m_ui->manageToolChainPushButton, SIGNAL(clicked()), - this, SLOT(manageToolChains())); - - connect(target->qt4Project(), SIGNAL(environmentChanged()), - this, SLOT(environmentChanged())); - - connect(target->qt4Project(), SIGNAL(buildDirectoryInitialized()), - this, SLOT(updateImportLabel())); - - connect(target->qt4Project(), SIGNAL(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode*,bool,bool)), - this, SLOT(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode*,bool,bool))); - - connect(ProjectExplorer::ToolChainManager::instance(), SIGNAL(toolChainsChanged()), - this, SLOT(updateToolChainCombo())); + Qt4Project *project = qobject_cast<Qt4Project *>(target->project()); + if (project) { + connect(project, SIGNAL(environmentChanged()), this, SLOT(environmentChanged())); + connect(project, SIGNAL(buildDirectoryInitialized()), this, SLOT(updateProblemLabel())); + } } Qt4ProjectConfigWidget::~Qt4ProjectConfigWidget() @@ -135,30 +112,9 @@ Qt4ProjectConfigWidget::~Qt4ProjectConfigWidget() void Qt4ProjectConfigWidget::updateDetails() { - QtSupport::BaseQtVersion *version = m_buildConfiguration->qtVersion(); - - QString versionString; - if (version) - versionString = version->displayName(); - - if (!version || !version->isValid()) { - // Not a valid qt version - m_detailsContainer->setSummaryText( - tr("using <font color=\"#ff0000\">invalid</font> Qt Version: <b>%1</b><br>" - "%2") - .arg(versionString, - version ? version->invalidReason() : tr("No Qt Version found."))); - } else { - // Qt Version, Build Directory and tool chain - m_detailsContainer->setSummaryText( - tr("using Qt version: <b>%1</b><br>" - "with tool chain <b>%2</b><br>" - "building in <b>%3</b>") - .arg(versionString, - m_buildConfiguration->toolChain() ? m_buildConfiguration->toolChain()->displayName() : - tr("<Invalid tool chain>"), - QDir::toNativeSeparators(m_buildConfiguration->buildDirectory()))); - } + m_detailsContainer->setSummaryText( + tr("building in <b>%3</b>") + .arg(QDir::toNativeSeparators(m_buildConfiguration->buildDirectory()))); } void Qt4ProjectConfigWidget::environmentChanged() @@ -166,28 +122,6 @@ void Qt4ProjectConfigWidget::environmentChanged() m_ui->shadowBuildDirEdit->setEnvironment(m_buildConfiguration->environment()); } -void Qt4ProjectConfigWidget::updateShadowBuildUi() -{ - QtSupport::BaseQtVersion *version = m_buildConfiguration->qtVersion(); - m_ui->shadowBuildCheckBox->setEnabled(version && version->supportsShadowBuilds()); - bool isShadowbuilding = m_buildConfiguration->shadowBuild(); - m_ui->shadowBuildDirEdit->setEnabled(isShadowbuilding && version && version->supportsShadowBuilds()); - m_browseButton->setEnabled(isShadowbuilding && version && version->supportsShadowBuilds()); - m_ui->shadowBuildDirEdit->setPath(m_buildConfiguration->shadowBuildDirectory()); -} - -void Qt4ProjectConfigWidget::manageQtVersions() -{ - Core::ICore::showOptionsDialog(QLatin1String(ProjectExplorer::Constants::PROJECTEXPLORER_SETTINGS_CATEGORY), - QLatin1String(QtSupport::Constants::QTVERSION_SETTINGS_PAGE_ID)); -} - -void Qt4ProjectConfigWidget::manageToolChains() -{ - Core::ICore::showOptionsDialog(QLatin1String(ProjectExplorer::Constants::PROJECTEXPLORER_SETTINGS_CATEGORY), - QLatin1String(ProjectExplorer::Constants::TOOLCHAIN_SETTINGS_PAGE_ID)); -} - QString Qt4ProjectConfigWidget::displayName() const { return tr("General"); @@ -203,95 +137,20 @@ void Qt4ProjectConfigWidget::init(ProjectExplorer::BuildConfiguration *bc) if (m_buildConfiguration) { disconnect(m_buildConfiguration, SIGNAL(buildDirectoryChanged()), this, SLOT(buildDirectoryChanged())); - disconnect(m_buildConfiguration, SIGNAL(qtVersionChanged()), - this, SLOT(qtVersionChanged())); disconnect(m_buildConfiguration, SIGNAL(qmakeBuildConfigurationChanged()), - this, SLOT(updateImportLabel())); - disconnect(m_buildConfiguration, SIGNAL(toolChainChanged()), - this, SLOT(toolChainChanged())); + this, SLOT(updateProblemLabel())); } m_buildConfiguration = static_cast<Qt4BuildConfiguration *>(bc); m_ui->shadowBuildDirEdit->setEnvironment(m_buildConfiguration->environment()); connect(m_buildConfiguration, SIGNAL(buildDirectoryChanged()), this, SLOT(buildDirectoryChanged())); - connect(m_buildConfiguration, SIGNAL(qtVersionChanged()), - this, SLOT(qtVersionChanged())); connect(m_buildConfiguration, SIGNAL(qmakeBuildConfigurationChanged()), - this, SLOT(updateImportLabel())); - connect(m_buildConfiguration, SIGNAL(toolChainChanged()), - this, SLOT(toolChainChanged())); + this, SLOT(updateProblemLabel())); - qtVersionsChanged(); - QtSupport::QtVersionManager *vm = QtSupport::QtVersionManager::instance(); - connect(vm, SIGNAL(qtVersionsChanged(QList<int>,QList<int>,QList<int>)), - this, SLOT(qtVersionsChanged())); + m_ui->shadowBuildDirEdit->setBaseDirectory(m_buildConfiguration->target()->project()->projectDirectory()); - bool shadowBuild = m_buildConfiguration->shadowBuild(); - m_ui->shadowBuildCheckBox->setChecked(shadowBuild); - m_ui->shadowBuildCheckBox->setEnabled(m_buildConfiguration->qtVersion() - && m_buildConfiguration->qtVersion()->supportsShadowBuilds()); - - updateShadowBuildUi(); - updateImportLabel(); - updateToolChainCombo(); - updateDetails(); - - connect(ToolChainManager::instance(), SIGNAL(toolChainAdded(ProjectExplorer::ToolChain*)), - this, SLOT(updateToolChainCombo())); - connect(ToolChainManager::instance(), SIGNAL(toolChainRemoved(ProjectExplorer::ToolChain*)), - this, SLOT(updateToolChainCombo())); -} - -void Qt4ProjectConfigWidget::qtVersionChanged() -{ - if (m_ignoreChange) - return; - - int versionId = -1; - if (m_buildConfiguration->qtVersion()) - versionId = m_buildConfiguration->qtVersion()->uniqueId(); - int comboBoxIndex = m_ui->qtVersionComboBox->findData(QVariant(versionId), Qt::UserRole); - m_ui->qtVersionComboBox->setCurrentIndex(comboBoxIndex); - - updateShadowBuildUi(); - updateImportLabel(); - updateToolChainCombo(); - updateDetails(); -} - -void Qt4ProjectConfigWidget::qtVersionsChanged() -{ - m_ignoreChange = true; - QtSupport::QtVersionManager *vm = QtSupport::QtVersionManager::instance(); - - m_ui->qtVersionComboBox->clear(); - QtSupport::BaseQtVersion *qtVersion = m_buildConfiguration->qtVersion(); - - QList<QtSupport::BaseQtVersion *> validVersions = vm->versionsForTargetId(m_buildConfiguration->target()->id()); - if (!validVersions.isEmpty()) { - for (int i = 0; i < validVersions.size(); ++i) { - const QtSupport::BaseQtVersion *version = validVersions.at(i); - m_ui->qtVersionComboBox->addItem(version->displayName(), - version->uniqueId()); - - if (version == qtVersion) { - m_ui->qtVersionComboBox->setCurrentIndex(i); - m_ui->qtVersionComboBox->setToolTip(version->toHtml(false)); - } - } - } - if (!qtVersion || !qtVersion->isValid()) { - m_ui->qtVersionComboBox->addItem(tr("Invalid Qt version"), -1); - m_ui->qtVersionComboBox->setCurrentIndex(m_ui->qtVersionComboBox->count() - 1); - } - m_ui->qtVersionComboBox->setEnabled(m_ui->qtVersionComboBox->count() > 1); - m_ignoreChange = false; - - updateToolChainCombo(); - updateShadowBuildUi(); - updateDetails(); - updateImportLabel(); + buildDirectoryChanged(); } void Qt4ProjectConfigWidget::buildDirectoryChanged() @@ -299,8 +158,13 @@ void Qt4ProjectConfigWidget::buildDirectoryChanged() if (m_ignoreChange) return; m_ui->shadowBuildDirEdit->setPath(m_buildConfiguration->shadowBuildDirectory()); + bool shadowBuild = m_buildConfiguration->shadowBuild(); + m_ui->shadowBuildCheckBox->setChecked(shadowBuild); + m_ui->shadowBuildDirEdit->setEnabled(shadowBuild); + m_browseButton->setEnabled(shadowBuild); + updateDetails(); - updateImportLabel(); + updateProblemLabel(); } void Qt4ProjectConfigWidget::onBeforeBeforeShadowBuildDirBrowsed() @@ -321,7 +185,7 @@ void Qt4ProjectConfigWidget::shadowBuildClicked(bool checked) m_ignoreChange = false; updateDetails(); - updateImportLabel(); + updateProblemLabel(); } void Qt4ProjectConfigWidget::shadowBuildEdited() @@ -335,238 +199,110 @@ void Qt4ProjectConfigWidget::shadowBuildEdited() // if the directory already exists // check if we have a build in there and // offer to import it - updateImportLabel(); + updateProblemLabel(); updateDetails(); } -void Qt4ProjectConfigWidget::updateImportLabel() +void Qt4ProjectConfigWidget::updateProblemLabel() { - bool visible = false; - bool targetMatches = false; + bool targetMismatch = false; bool incompatibleBuild = false; - bool couldnotparse = false; + bool allGood = false; + + ProjectExplorer::Profile *p = m_buildConfiguration->target()->profile(); + const QString proFileName = m_buildConfiguration->target()->project()->document()->fileName(); + + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(p); + if (!version) { + m_ui->problemLabel->setVisible(true); + m_ui->warningLabel->setVisible(true); + m_ui->problemLabel->setText(tr("This target can not build this project since it does not define a " + "Qt version.")); + return; + } - QtSupport::QtVersionManager *vm = QtSupport::QtVersionManager::instance(); // we only show if we actually have a qmake and makestep if (m_buildConfiguration->qmakeStep() && m_buildConfiguration->makeStep()) { - QString makefile = m_buildConfiguration->buildDirectory(); + QString makefile = m_buildConfiguration->buildDirectory() + QLatin1Char('/'); if (m_buildConfiguration->makefile().isEmpty()) - makefile.append(QLatin1String("/Makefile")); + makefile.append(QLatin1String("Makefile")); else makefile.append(m_buildConfiguration->makefile()); - Utils::FileName qmakePath = QtSupport::QtVersionManager::findQMakeBinaryFromMakefile(makefile); - QtSupport::BaseQtVersion *version = m_buildConfiguration->qtVersion(); - // check that there's a makefile - if (!qmakePath.isEmpty()) { - // Is it from the same build? - QtSupport::QtVersionManager::MakefileCompatible mc = - QtSupport::QtVersionManager::makefileIsFor(makefile, m_buildConfiguration->target()->project()->document()->fileName()); - if (mc == QtSupport::QtVersionManager::DifferentProject) { - incompatibleBuild = true; - } else if (mc == QtSupport::QtVersionManager::SameProject) { - if (qmakePath != (version ? version->qmakeCommand() : Utils::FileName())) { - // and that the qmake path is different from the current version - // import enable - visible = true; - QtSupport::BaseQtVersion *newVersion = vm->qtVersionForQMakeBinary(qmakePath); - bool mustDelete(false); - if (!newVersion) { - newVersion = QtSupport::QtVersionFactory::createQtVersionFromQMakePath(qmakePath); - mustDelete = true; - } - targetMatches = newVersion ? newVersion->supportsTargetId(m_buildConfiguration->target()->id()) : false; - if (mustDelete) - delete newVersion; - } else { - // check that the qmake flags, arguments match - visible = !m_buildConfiguration->compareToImportFrom(makefile); - targetMatches = true; - } - } else if (mc == QtSupport::QtVersionManager::CouldNotParse) { - couldnotparse = true; - } + switch (m_buildConfiguration->compareToImportFrom(makefile)) { + case Qt4BuildConfiguration::MakefileMatches: + allGood = true; + break; + case Qt4BuildConfiguration::MakefileMissing: + allGood = true; + break; + case Qt4BuildConfiguration::MakefileIncompatible: + incompatibleBuild = true; + break; + case Qt4BuildConfiguration::MakefileForWrongProject: + targetMismatch = true; + break; } } - QString buildDirectory = m_buildConfiguration->target()->project()->projectDirectory();; - if (m_buildConfiguration->shadowBuild()) - buildDirectory = m_buildConfiguration->buildDirectory(); - QList<ProjectExplorer::Task> issues; - if (QtSupport::BaseQtVersion *version = m_buildConfiguration->qtVersion()) { - issues = version->reportIssues(m_buildConfiguration->target()->project()->document()->fileName(), - buildDirectory); - foreach (Qt4BaseTargetFactory *factory, - Qt4BaseTargetFactory::qt4BaseTargetFactoriesForIds(version->supportedTargetIds().toList())) - issues.append(factory->reportIssues(m_buildConfiguration->target()->project()->document()->fileName())); + QString shadowBuildWarning; + if (!version->supportsShadowBuilds() && m_buildConfiguration->shadowBuild()) { + shadowBuildWarning =tr("The qt version %1 does not support shadow builds, building might fail.") + .arg(version->displayName()) + + QLatin1String("<br>"); + } + if (allGood) { + QString buildDirectory = m_buildConfiguration->target()->project()->projectDirectory();; + if (m_buildConfiguration->shadowBuild()) + buildDirectory = m_buildConfiguration->buildDirectory(); + QList<ProjectExplorer::Task> issues; + issues = version->reportIssues(proFileName, buildDirectory); qSort(issues); - } - if (incompatibleBuild) { + if (issues.isEmpty() && shadowBuildWarning.isEmpty()) { + m_ui->problemLabel->setVisible(false); + m_ui->warningLabel->setVisible(false); + } else { + m_ui->problemLabel->setVisible(true); + m_ui->warningLabel->setVisible(true); + QString text = QLatin1String("<nobr>") + shadowBuildWarning; + foreach (const ProjectExplorer::Task &task, issues) { + QString type; + switch (task.type) { + case ProjectExplorer::Task::Error: + type = tr("Error:"); + type += QLatin1Char(' '); + break; + case ProjectExplorer::Task::Warning: + type = tr("Warning:"); + type += QLatin1Char(' '); + break; + case ProjectExplorer::Task::Unknown: + default: + break; + } + if (!text.endsWith(QLatin1String("br>"))) + text.append(QLatin1String("<br>")); + text.append(type + task.description); + } + m_ui->problemLabel->setText(text); + } + } else if (targetMismatch) { m_ui->problemLabel->setVisible(true); m_ui->warningLabel->setVisible(true); - m_ui->importLabel->setVisible(false); - m_ui->problemLabel->setText(tr("A build for a different project exists in %1, which will be overwritten.", - "%1 build directory"). - arg(m_ui->shadowBuildDirEdit->path())); - } else if (!issues.isEmpty()) { + m_ui->problemLabel->setText(shadowBuildWarning + tr("A build for a different project exists in %1, which will be overwritten.", + "%1 build directory") + .arg(m_ui->shadowBuildDirEdit->path())); + } else if (incompatibleBuild) { + m_ui->warningLabel->setVisible(true); m_ui->problemLabel->setVisible(true); + m_ui->problemLabel->setText(shadowBuildWarning +tr("An incompatible build exists in %1, which will be overwritten.", + "%1 build directory") + .arg(m_ui->shadowBuildDirEdit->path())); + } else if (shadowBuildWarning.isEmpty()) { m_ui->warningLabel->setVisible(true); - m_ui->importLabel->setVisible(visible); - QString text = QLatin1String("<nobr>"); - foreach (const ProjectExplorer::Task &task, issues) { - QString type; - switch (task.type) { - case ProjectExplorer::Task::Error: - type = tr("Error:"); - type += QLatin1Char(' '); - break; - case ProjectExplorer::Task::Warning: - type = tr("Warning:"); - type += QLatin1Char(' '); - break; - case ProjectExplorer::Task::Unknown: - default: - break; - } - if (!text.endsWith(QLatin1String("br>"))) - text.append(QLatin1String("<br>")); - text.append(type + task.description); - } - m_ui->problemLabel->setText(text); - } else if (targetMatches) { - m_ui->problemLabel->setVisible(false); - m_ui->warningLabel->setVisible(false); - m_ui->importLabel->setVisible(visible); - } else if (couldnotparse) { - m_ui->problemLabel->setVisible(false); - m_ui->warningLabel->setVisible(false); - m_ui->importLabel->setVisible(false); - } else { // target did not match - m_ui->warningLabel->setVisible(visible); - m_ui->problemLabel->setVisible(visible); - m_ui->problemLabel->setText(tr("An incompatible build exists in %1, which will be overwritten.", - "%1 build directory"). - arg(m_ui->shadowBuildDirEdit->path())); - m_ui->importLabel->setVisible(false); - } -} - -void Qt4ProjectConfigWidget::importLabelClicked() -{ - if (!m_buildConfiguration->qmakeStep() || !m_buildConfiguration->makeStep()) - return; - - // We do the importing via a single shot timer due to QTCREATORBUG-2723 - // Adding a qtversion might trigger a supportedTargetIds changed signal - // which results in a recreation of all the widgets on the page - // That means also "this" gets deleted - QTimer::singleShot(0, m_buildConfiguration, SLOT(importFromBuildDirectory())); -} - -void Qt4ProjectConfigWidget::qtVersionSelected(const QString &) -{ - if (m_ignoreChange) - return; - - int newQtVersionId = m_ui->qtVersionComboBox->itemData(m_ui->qtVersionComboBox->currentIndex()).toInt(); - - if (m_ui->qtVersionComboBox->itemData(m_ui->qtVersionComboBox->count() - 1).toInt() == -1) - m_ui->qtVersionComboBox->removeItem(m_ui->qtVersionComboBox->count() - 1); - - QtSupport::QtVersionManager *vm = QtSupport::QtVersionManager::instance(); - QtSupport::BaseQtVersion *newQtVersion = vm->version(newQtVersionId); - - if (newQtVersion) { - const QString qtVersionName = newQtVersion->displayName(); - QString defaultConfigName = (m_buildConfiguration->buildType() & BuildConfiguration::Debug) ? - //: Name of a debug build configuration to created by a project wizard, %1 being the Qt version name. We recommend not translating it. - tr("%1 Debug").arg(qtVersionName) : - //: Name of a release build configuration to created by a project wizard, %1 being the Qt version name. We recommend not translating it. - tr("%1 Release").arg(qtVersionName); - - // make name unique - QStringList displayNames; - foreach (const BuildConfiguration *bc, m_buildConfiguration->target()->buildConfigurations()) { - if (bc != m_buildConfiguration) - displayNames << bc->displayName(); - } - defaultConfigName = Project::makeUnique(defaultConfigName, displayNames); - - m_buildConfiguration->setDefaultDisplayName(defaultConfigName); - } - - m_ignoreChange = true; - m_buildConfiguration->setQtVersion(newQtVersion); - m_ignoreChange = false; - - m_ui->qtVersionComboBox->setToolTip(newQtVersion ? newQtVersion->toHtml(false) : QString()); - - updateShadowBuildUi(); - updateToolChainCombo(); - updateImportLabel(); - updateDetails(); -} - -void Qt4ProjectConfigWidget::toolChainChanged() -{ - if (m_ignoreChange) - return; - bool foundTc = false; - for (int i = 0; i < m_ui->toolChainComboBox->count(); ++i) { - ProjectExplorer::ToolChain *tc = - static_cast<ProjectExplorer::ToolChain *>(m_ui->toolChainComboBox->itemData(i, Qt::UserRole).value<void *>()); - if (tc == m_buildConfiguration->toolChain()) { - m_ignoreChange = true; - m_ui->toolChainComboBox->setCurrentIndex(i); - m_ignoreChange = false; - foundTc = true; - break; - } - } - if (foundTc) { - int index = m_ui->toolChainComboBox->findData(qVariantFromValue(static_cast<void *>(0))); - if (index >= 0) - m_ui->toolChainComboBox->removeItem(index); - } else { - m_ignoreChange = true; - m_ui->toolChainComboBox->addItem(tr("<No tool chain selected>"), qVariantFromValue(static_cast<void *>(0))); - m_ui->toolChainComboBox->setCurrentIndex(m_ui->toolChainComboBox->count() - 1); - m_ignoreChange = false; + m_ui->problemLabel->setVisible(true); + m_ui->problemLabel->setText(shadowBuildWarning); } } - -void Qt4ProjectConfigWidget::proFileUpdated(Qt4ProjectManager::Qt4ProFileNode * /*node*/, bool success, bool parseInProgress) -{ - if (!success || parseInProgress) - return; - updateToolChainCombo(); -} - -void Qt4ProjectConfigWidget::updateToolChainCombo() -{ - m_ui->toolChainComboBox->clear(); - QList<ProjectExplorer::ToolChain *> toolchains = - m_buildConfiguration->qt4Target()->possibleToolChains(m_buildConfiguration); - - foreach (ProjectExplorer::ToolChain *toolchain, toolchains) - m_ui->toolChainComboBox->addItem(toolchain->displayName(), - qVariantFromValue(static_cast<void *>(toolchain))); - m_ui->toolChainComboBox->setEnabled(toolchains.size() > 1); - toolChainChanged(); -} - -void Qt4ProjectConfigWidget::toolChainSelected(int index) -{ - if (m_ignoreChange) - return; - ProjectExplorer::ToolChain *selectedToolChain = - static_cast<ProjectExplorer::ToolChain *>( - m_ui->toolChainComboBox->itemData(index, - Qt::UserRole).value<void *>()); - m_ignoreChange = true; - m_buildConfiguration->setToolChain(selectedToolChain); - m_ignoreChange = false; - updateDetails(); -} diff --git a/src/plugins/qt4projectmanager/qt4projectconfigwidget.h b/src/plugins/qt4projectmanager/qt4projectconfigwidget.h index 0302ec0d54..bb73777a59 100644 --- a/src/plugins/qt4projectmanager/qt4projectconfigwidget.h +++ b/src/plugins/qt4projectmanager/qt4projectconfigwidget.h @@ -44,7 +44,6 @@ namespace Utils { } namespace Qt4ProjectManager { -class Qt4BaseTarget; class Qt4BuildConfiguration; class Qt4ProFileNode; @@ -57,7 +56,7 @@ class Qt4ProjectConfigWidget : public ProjectExplorer::BuildConfigWidget { Q_OBJECT public: - explicit Qt4ProjectConfigWidget(Qt4BaseTarget *target); + Qt4ProjectConfigWidget(ProjectExplorer::Target *target); ~Qt4ProjectConfigWidget(); QString displayName() const; @@ -68,25 +67,14 @@ private slots: void shadowBuildClicked(bool checked); void onBeforeBeforeShadowBuildDirBrowsed(); void shadowBuildEdited(); - void qtVersionSelected(const QString &); - void toolChainSelected(int index); - void manageQtVersions(); - void manageToolChains(); - void importLabelClicked(); // Changes triggered from creator - void qtVersionsChanged(); - void qtVersionChanged(); void buildDirectoryChanged(); - void toolChainChanged(); - void updateImportLabel(); + void updateProblemLabel(); void environmentChanged(); - void proFileUpdated(Qt4ProjectManager::Qt4ProFileNode*,bool,bool); - void updateToolChainCombo(); private: void updateDetails(); - void updateShadowBuildUi(); Ui::Qt4ProjectConfigWidget *m_ui; QAbstractButton *m_browseButton; diff --git a/src/plugins/qt4projectmanager/qt4projectconfigwidget.ui b/src/plugins/qt4projectmanager/qt4projectconfigwidget.ui index 65f7c995e8..35f7acd185 100644 --- a/src/plugins/qt4projectmanager/qt4projectconfigwidget.ui +++ b/src/plugins/qt4projectmanager/qt4projectconfigwidget.ui @@ -6,107 +6,59 @@ <rect> <x>0</x> <y>0</y> - <width>712</width> - <height>188</height> + <width>408</width> + <height>78</height> </rect> </property> <layout class="QGridLayout" name="gridLayout"> - <item row="0" column="0"> - <widget class="QLabel" name="qtVersionLabel"> + <item row="1" column="0"> + <widget class="QLabel" name="buildDirLabel"> <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Preferred"> + <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> - <string>Qt version:</string> + <string>Build directory:</string> </property> </widget> </item> - <item row="0" column="1"> - <layout class="QHBoxLayout" name="horizontalLayout"> - <property name="spacing"> - <number>4</number> - </property> + <item row="2" column="1"> + <layout class="QHBoxLayout" name="horizontalLayout_2"> <item> - <widget class="QComboBox" name="qtVersionComboBox"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> + <widget class="QLabel" name="warningLabel"> + <property name="pixmap"> + <pixmap resource="../projectexplorer/projectexplorer.qrc">:/projectexplorer/images/compile_warning.png</pixmap> </property> </widget> </item> <item> - <widget class="QPushButton" name="manageQtVersionPushButtons"> - <property name="text"> - <string>Manage...</string> - </property> - </widget> - </item> - </layout> - </item> - <item row="1" column="0"> - <widget class="QLabel" name="toolchainLabel"> - <property name="text"> - <string>Tool chain:</string> - </property> - </widget> - </item> - <item row="1" column="1"> - <layout class="QHBoxLayout" name="horizontalLayout_3"> - <property name="spacing"> - <number>4</number> - </property> - <item> - <widget class="QComboBox" name="toolChainComboBox"> + <widget class="QLabel" name="problemLabel"> <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> - <horstretch>0</horstretch> + <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> + <horstretch>10</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="manageToolChainPushButton"> <property name="text"> - <string>Manage...</string> + <string>problemLabel</string> + </property> + <property name="wordWrap"> + <bool>true</bool> </property> </widget> </item> </layout> </item> - <item row="2" column="0"> + <item row="0" column="0"> <widget class="QLabel" name="shadowBuildLabel"> <property name="text"> <string>Shadow build:</string> </property> </widget> </item> - <item row="2" column="1"> - <widget class="QCheckBox" name="shadowBuildCheckBox"> - <property name="text"> - <string/> - </property> - </widget> - </item> - <item row="3" column="0"> - <widget class="QLabel" name="buildDirLabel"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Build directory:</string> - </property> - </widget> - </item> - <item row="3" column="1"> + <item row="1" column="1"> <widget class="Utils::PathChooser" name="shadowBuildDirEdit" native="true"> <property name="sizePolicy"> <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> @@ -116,42 +68,12 @@ </property> </widget> </item> - <item row="4" column="1"> - <layout class="QHBoxLayout" name="horizontalLayout_2"> - <item> - <widget class="QLabel" name="importLabel"> - <property name="text"> - <string><a href="import">Import existing build</a></string> - </property> - <property name="textFormat"> - <enum>Qt::RichText</enum> - </property> - </widget> - </item> - <item> - <widget class="QLabel" name="warningLabel"> - <property name="pixmap"> - <pixmap resource="../projectexplorer/projectexplorer.qrc">:/projectexplorer/images/compile_warning.png</pixmap> - </property> - </widget> - </item> - <item> - <widget class="QLabel" name="problemLabel"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>10</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>problemLabel</string> - </property> - <property name="wordWrap"> - <bool>true</bool> - </property> - </widget> - </item> - </layout> + <item row="0" column="1"> + <widget class="QCheckBox" name="shadowBuildCheckBox"> + <property name="text"> + <string/> + </property> + </widget> </item> </layout> </widget> diff --git a/src/plugins/qt4projectmanager/qt4projectmanager.cpp b/src/plugins/qt4projectmanager/qt4projectmanager.cpp index 60fb45588f..d7df4ae73f 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanager.cpp +++ b/src/plugins/qt4projectmanager/qt4projectmanager.cpp @@ -36,7 +36,6 @@ #include "qt4projectmanagerplugin.h" #include "qt4nodes.h" #include "qt4project.h" -#include "qt4target.h" #include "profileeditor.h" #include "qmakestep.h" #include "qt4buildconfiguration.h" @@ -55,11 +54,11 @@ #include <projectexplorer/session.h> #include <projectexplorer/project.h> #include <projectexplorer/projectexplorerconstants.h> -#include <projectexplorer/toolchainmanager.h> -#include <projectexplorer/toolchain.h> +#include <projectexplorer/target.h> #include <utils/qtcassert.h> #include <qtsupport/profilereader.h> #include <qtsupport/baseqtversion.h> +#include <qtsupport/qtprofileinformation.h> #include <qtsupport/qtversionmanager.h> #include <QCoreApplication> @@ -147,12 +146,6 @@ void Qt4Manager::init() tr("Full path to the bin directory of the current project's Qt version.")); connect(vm, SIGNAL(variableUpdateRequested(QByteArray)), this, SLOT(updateVariable(QByteArray))); - - QSettings *settings = Core::ICore::instance()->settings(); - settings->beginGroup(QLatin1String("Qt4ProjectManager")); - m_unConfiguredVersionId = settings->value(QLatin1String("QtVersionId"), -1).toInt(); - m_unconfiguredToolChainId = settings->value(QLatin1String("ToolChainId"), QString()).toString(); - settings->endGroup(); } void Qt4Manager::editorChanged(Core::IEditor *editor) @@ -204,12 +197,10 @@ void Qt4Manager::updateVariable(const QByteArray &variable) } QString value; const QtSupport::BaseQtVersion *qtv = 0; - if (Qt4BaseTarget *t = qt4pro->activeTarget()) { - if (Qt4BuildConfiguration *bc = t->activeQt4BuildConfiguration()) - qtv = bc->qtVersion(); - } else { - qtv = unconfiguredSettings().version; - } + if (ProjectExplorer::Target *t = qt4pro->activeTarget()) + qtv = QtSupport::QtProfileInformation::qtVersion(t->profile()); + else + qtv = QtSupport::QtProfileInformation::qtVersion(ProjectExplorer::ProfileManager::instance()->defaultProfile()); if (qtv) value = qtv->versionInfo().value(QLatin1String("QT_INSTALL_BINS")); @@ -382,11 +373,14 @@ void Qt4Manager::runQMake(ProjectExplorer::Project *p, ProjectExplorer::Node *no !qt4pro->activeTarget()->activeBuildConfiguration()) return; - Qt4BuildConfiguration *bc = qt4pro->activeTarget()->activeQt4BuildConfiguration(); - QMakeStep *qs = bc->qmakeStep(); + Qt4BuildConfiguration *bc = qobject_cast<Qt4BuildConfiguration *>(qt4pro->activeTarget()->activeBuildConfiguration()); + if (!bc) + return; + QMakeStep *qs = bc->qmakeStep(); if (!qs) return; + //found qmakeStep, now use it qs->setForced(true); @@ -429,7 +423,10 @@ void Qt4Manager::handleSubDirContextMenu(Qt4Manager::Action action, bool isFileB if (!m_contextNode || !m_contextFile) isFileBuild = false; - Qt4BuildConfiguration *bc = qt4pro->activeTarget()->activeQt4BuildConfiguration(); + Qt4BuildConfiguration *bc = qobject_cast<Qt4BuildConfiguration *>(qt4pro->activeTarget()->activeBuildConfiguration()); + if (!bc) + return; + if (m_contextNode != 0 && (m_contextNode != qt4pro->rootProjectNode() || isFileBuild)) if (Qt4ProFileNode *profile = qobject_cast<Qt4ProFileNode *>(m_contextNode)) bc->setSubNodeBuild(profile); @@ -478,58 +475,3 @@ QString Qt4Manager::fileTypeId(ProjectExplorer::FileType type) return QString(); } -UnConfiguredSettings Qt4Manager::unconfiguredSettings() const -{ - if (m_unConfiguredVersionId == -1 && m_unconfiguredToolChainId.isEmpty()) { - // Choose a good default qtversion and try to find a toolchain that fit - QtSupport::BaseQtVersion *version = 0; - ProjectExplorer::ToolChain *toolChain = 0; - QList<QtSupport::BaseQtVersion *> versions = QtSupport::QtVersionManager::instance()->validVersions(); - if (!versions.isEmpty()) { - version = versions.first(); - - foreach (ProjectExplorer::ToolChain *tc, ProjectExplorer::ToolChainManager::instance()->toolChains()) { - if (tc->mkspecList().contains(version->mkspec())) { - toolChain = tc; - break; - } - } - if (!toolChain) { - foreach (ProjectExplorer::ToolChain *tc, ProjectExplorer::ToolChainManager::instance()->toolChains()) { - if (version->qtAbis().contains(tc->targetAbi())) { - toolChain = tc; - break; - } - } - } - m_unConfiguredVersionId = version->uniqueId(); - if (toolChain) - m_unconfiguredToolChainId = toolChain->id(); - } - UnConfiguredSettings us; - us.version = version; - us.toolchain = toolChain; - return us; - } - UnConfiguredSettings us; - us.version = QtSupport::QtVersionManager::instance()->version(m_unConfiguredVersionId); - us.toolchain = ProjectExplorer::ToolChainManager::instance()->findToolChain(m_unconfiguredToolChainId); - return us; -} - -void Qt4Manager::setUnconfiguredSettings(const UnConfiguredSettings &setting) -{ - m_unConfiguredVersionId = setting.version ? setting.version->uniqueId() : -1; - m_unconfiguredToolChainId = setting.toolchain ? setting.toolchain->id() : QString(); - - QSettings *settings = Core::ICore::instance()->settings(); - settings->beginGroup(QLatin1String("Qt4ProjectManager")); - settings->setValue(QLatin1String("QtVersionId"), m_unConfiguredVersionId); - settings->setValue(QLatin1String("ToolChainId"), m_unconfiguredToolChainId); - settings->endGroup(); - - foreach (Qt4Project *pro, m_projects) - if (pro->targets().isEmpty()) - pro->scheduleAsyncUpdate(); - emit unconfiguredSettingsChanged(); -} diff --git a/src/plugins/qt4projectmanager/qt4projectmanager.h b/src/plugins/qt4projectmanager/qt4projectmanager.h index 32a12fa80c..d9ff3961bb 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanager.h +++ b/src/plugins/qt4projectmanager/qt4projectmanager.h @@ -38,13 +38,8 @@ #include <projectexplorer/iprojectmanager.h> #include <projectexplorer/projectnodes.h> -namespace Core { - class IEditor; -} - -namespace ExtensionSystem { -class PluginManager; -} +namespace Core { class IEditor; } +namespace ExtensionSystem { class PluginManager; } namespace ProjectExplorer { class Project; @@ -64,14 +59,7 @@ namespace Internal { class Qt4Builder; class ProFileEditorWidget; class Qt4ProjectManagerPlugin; - -class UnConfiguredSettings -{ -public: - QtSupport::BaseQtVersion *version; - ProjectExplorer::ToolChain *toolchain; -}; -} +} // namespace Internal class Qt4Project; @@ -107,13 +95,6 @@ public: enum Action { BUILD, REBUILD, CLEAN }; - /// Settings to use for codemodel if no targets exist - Internal::UnConfiguredSettings unconfiguredSettings() const; - void setUnconfiguredSettings(const Internal::UnConfiguredSettings &setting); - -signals: - void unconfiguredSettingsChanged(); - public slots: void addLibrary(); void addLibraryContextMenu(); @@ -137,8 +118,6 @@ private: void runQMake(ProjectExplorer::Project *p, ProjectExplorer::Node *node); Internal::Qt4ProjectManagerPlugin *m_plugin; - mutable int m_unConfiguredVersionId; - mutable QString m_unconfiguredToolChainId; ProjectExplorer::Node *m_contextNode; ProjectExplorer::Project *m_contextProject; ProjectExplorer::FileNode *m_contextFile; diff --git a/src/plugins/qt4projectmanager/qt4projectmanager.pro b/src/plugins/qt4projectmanager/qt4projectmanager.pro index 2a13afdb98..158e8e001f 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanager.pro +++ b/src/plugins/qt4projectmanager/qt4projectmanager.pro @@ -6,6 +6,9 @@ include(../../qtcreatorplugin.pri) include(qt4projectmanager_dependencies.pri) HEADERS += \ + qmakeprofileinformation.h \ + qmakeprofileconfigwidget.h \ + qmakerunconfigurationfactory.h \ qt4projectmanagerplugin.h \ qt4projectmanager.h \ qt4project.h \ @@ -36,6 +39,7 @@ HEADERS += \ wizards/filespage.h \ wizards/qtwizard.h \ wizards/targetsetuppage.h \ + wizards/importwidget.h \ wizards/qtquickapp.h \ wizards/qtquickappwizard.h \ wizards/qtquickappwizardpages.h \ @@ -54,7 +58,6 @@ HEADERS += \ qtuicodemodelsupport.h \ externaleditors.h \ qt4buildconfiguration.h \ - qt4target.h \ qmakeparser.h \ addlibrarywizard.h \ librarydetailscontroller.h \ @@ -66,11 +69,13 @@ HEADERS += \ winceqtversionfactory.h \ winceqtversion.h \ profilecompletionassist.h \ - qt4basetargetfactory.h \ unconfiguredprojectpanel.h \ - unconfiguredsettingsoptionpage.h -SOURCES += qt4projectmanagerplugin.cpp \ +SOURCES += \ + qmakeprofileconfigwidget.cpp \ + qmakeprofileinformation.cpp \ + qmakerunconfigurationfactory.cpp \ + qt4projectmanagerplugin.cpp \ qt4projectmanager.cpp \ qt4project.cpp \ qt4nodes.cpp \ @@ -100,6 +105,7 @@ SOURCES += qt4projectmanagerplugin.cpp \ wizards/filespage.cpp \ wizards/qtwizard.cpp \ wizards/targetsetuppage.cpp \ + wizards/importwidget.cpp \ wizards/qtquickapp.cpp \ wizards/qtquickappwizard.cpp \ wizards/qtquickappwizardpages.cpp \ @@ -117,17 +123,16 @@ SOURCES += qt4projectmanagerplugin.cpp \ qtuicodemodelsupport.cpp \ externaleditors.cpp \ qt4buildconfiguration.cpp \ - qt4target.cpp \ qmakeparser.cpp \ addlibrarywizard.cpp \ librarydetailscontroller.cpp \ findqt4profiles.cpp \ profilekeywords.cpp \ + qt4targetsetupwidget.cpp \ winceqtversionfactory.cpp \ winceqtversion.cpp \ profilecompletionassist.cpp \ unconfiguredprojectpanel.cpp \ - unconfiguredsettingsoptionpage.cpp FORMS += makestep.ui \ qmakestep.ui \ diff --git a/src/plugins/qt4projectmanager/qt4projectmanager.qbs b/src/plugins/qt4projectmanager/qt4projectmanager.qbs index 3088252695..a14069fc25 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanager.qbs +++ b/src/plugins/qt4projectmanager/qt4projectmanager.qbs @@ -65,10 +65,15 @@ QtcPlugin { "profilekeywords.h", "qmakeparser.cpp", "qmakeparser.h", + "qmakeprofileconfigwidget.cpp", + "qmakeprofileconfigwidget.h", + "qmakeprofileinformation.cpp", + "qmakeprofileinformation.h", + "qmakerunconfigurationfactory.cpp", + "qmakerunconfigurationfactory.h", "qmakestep.cpp", "qmakestep.h", "qmakestep.ui", - "qt4basetargetfactory.h", "qt4buildconfiguration.cpp", "qt4buildconfiguration.h", "qt4nodes.h", @@ -81,13 +86,12 @@ QtcPlugin { "qt4projectmanagerconstants.h", "qt4projectmanagerplugin.cpp", "qt4projectmanagerplugin.h", + "qt4targetsetupwidget.cpp", "qt4targetsetupwidget.h", "qtmodulesinfo.cpp", "qtmodulesinfo.h", "qtuicodemodelsupport.cpp", "qtuicodemodelsupport.h", - "unconfiguredsettingsoptionpage.cpp", - "unconfiguredsettingsoptionpage.h", "unconfiguredprojectpanel.cpp", "unconfiguredprojectpanel.h", "winceqtversion.cpp", @@ -99,8 +103,6 @@ QtcPlugin { "qt4nodes.cpp", "qt4projectmanager.cpp", "qt4projectmanager.h", - "qt4target.cpp", - "qt4target.h", "customwidgetwizard/classdefinition.ui", "customwidgetwizard/customwidgetpluginwizardpage.ui", "customwidgetwizard/customwidgetwidgetswizardpage.ui", @@ -132,16 +134,8 @@ QtcPlugin { "qt-desktop/desktopqtversion.h", "qt-desktop/desktopqtversionfactory.cpp", "qt-desktop/desktopqtversionfactory.h", - "qt-desktop/qt4desktoptarget.cpp", - "qt-desktop/qt4desktoptarget.h", - "qt-desktop/qt4desktoptargetfactory.cpp", - "qt-desktop/qt4desktoptargetfactory.h", "qt-desktop/qt4runconfiguration.cpp", "qt-desktop/qt4runconfiguration.h", - "qt-desktop/qt4simulatortarget.cpp", - "qt-desktop/qt4simulatortarget.h", - "qt-desktop/qt4simulatortargetfactory.cpp", - "qt-desktop/qt4simulatortargetfactory.h", "qt-desktop/simulatorqtversion.cpp", "qt-desktop/simulatorqtversion.h", "qt-desktop/simulatorqtversionfactory.cpp", @@ -155,10 +149,6 @@ QtcPlugin { "qt-s60/gccetoolchain.h", "qt-s60/passphraseforkeydialog.cpp", "qt-s60/passphraseforkeydialog.h", - "qt-s60/qt4symbiantarget.cpp", - "qt-s60/qt4symbiantarget.h", - "qt-s60/qt4symbiantargetfactory.cpp", - "qt-s60/qt4symbiantargetfactory.h", "qt-s60/rvctparser.cpp", "qt-s60/rvctparser.h", "qt-s60/rvcttoolchain.cpp", @@ -201,6 +191,12 @@ QtcPlugin { "qt-s60/s60symbiancertificate.h", "qt-s60/sbsv2parser.cpp", "qt-s60/sbsv2parser.h", + "qt-s60/symbianidevice.cpp", + "qt-s60/symbianidevice.h", + "qt-s60/symbianideviceconfigwidget.cpp", + "qt-s60/symbianideviceconfigwidget.h", + "qt-s60/symbianidevicefactory.cpp", + "qt-s60/symbianidevicefactory.h", "qt-s60/symbianqtversion.cpp", "qt-s60/symbianqtversion.h", "qt-s60/symbianqtversionfactory.cpp", @@ -289,6 +285,8 @@ QtcPlugin { "wizards/subdirsprojectwizarddialog.h", "wizards/targetsetuppage.cpp", "wizards/targetsetuppage.h", + "wizards/importwidget.cpp", + "wizards/importwidget.h", "wizards/testwizard.cpp", "wizards/testwizard.h", "wizards/testwizarddialog.cpp", diff --git a/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h b/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h index 3d6bc7c57e..d919a52fad 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h +++ b/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h @@ -75,15 +75,6 @@ const char PROFILE_EVALUATE[] = "Qt4ProjectManager.ProFileEvaluate"; // Project const char QT4PROJECT_ID[] = "Qt4ProjectManager.Qt4Project"; -// Targets -const char DESKTOP_TARGET_ID[] = "Qt4ProjectManager.Target.DesktopTarget"; -const char S60_DEVICE_TARGET_ID[] = "Qt4ProjectManager.Target.S60DeviceTarget"; -const char MAEMO5_DEVICE_TARGET_ID[] = "Qt4ProjectManager.Target.MaemoDeviceTarget"; -const char HARMATTAN_DEVICE_TARGET_ID[] = "Qt4ProjectManager.Target.HarmattanDeviceTarget"; -const char MEEGO_DEVICE_TARGET_ID[] = "Qt4ProjectManager.Target.MeegoDeviceTarget"; -const char QT_SIMULATOR_TARGET_ID[] = "Qt4ProjectManager.Target.QtSimulatorTarget"; -const char ANDROID_DEVICE_TARGET_ID[] = "Qt4ProjectManager.Target.AndroidDeviceTarget"; - // Target Features const char MOBILE_TARGETFEATURE_ID[] = "Qt4ProjectManager.TargetFeature.Mobile"; const char DESKTOP_TARGETFEATURE_ID[] = "Qt4ProjectManager.TargetFeature.Desktop"; @@ -104,10 +95,6 @@ const char QMAKEVAR_QMLJSDEBUGGER_PATH[] = "QMLJSDEBUGGER_PATH"; const char QMAKEVAR_DECLARATIVE_DEBUG4[] = "CONFIG+=declarative_debug"; const char QMAKEVAR_DECLARATIVE_DEBUG5[] = "CONFIG+=qml_debug"; -// Unconfigured Settings page -const char UNCONFIGURED_SETTINGS_PAGE_ID[] = "R.UnconfiguredSettings"; -const char UNCONFIGURED_SETTINGS_PAGE_NAME[] = QT_TRANSLATE_NOOP("Qt4ProjectManager", "Unconfigured Project"); - // Unconfigured Panel const char UNCONFIGURED_PANEL_PAGE_ID[] = "UnconfiguredPanel"; diff --git a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp index 192de942e5..d414ad0047 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp +++ b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp @@ -36,7 +36,6 @@ #include "qt4nodes.h" #include "qmakestep.h" #include "makestep.h" -#include "qt4target.h" #include "qt4buildconfiguration.h" #include "wizards/consoleappwizard.h" #include "wizards/guiappwizard.h" @@ -56,14 +55,12 @@ #include "externaleditors.h" #include "profilecompletionassist.h" #include "qt-s60/s60manager.h" -#include "qt-desktop/qt4desktoptargetfactory.h" -#include "qt-desktop/qt4simulatortargetfactory.h" #include "qt-desktop/qt4runconfiguration.h" #include "qt-desktop/desktopqtversionfactory.h" #include "qt-desktop/simulatorqtversionfactory.h" #include "winceqtversionfactory.h" #include "unconfiguredprojectpanel.h" -#include "unconfiguredsettingsoptionpage.h" +#include "qmakeprofileinformation.h" #include <coreplugin/id.h> #include <coreplugin/icore.h> @@ -71,9 +68,11 @@ #include <projectexplorer/buildmanager.h> #include <projectexplorer/project.h> #include <projectexplorer/session.h> +#include <projectexplorer/profilemanager.h> #include <projectexplorer/projectexplorer.h> #include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/projectnodes.h> +#include <projectexplorer/target.h> #include <coreplugin/mimedatabase.h> #include <coreplugin/actionmanager/actionmanager.h> #include <coreplugin/actionmanager/actioncontainer.h> @@ -133,6 +132,9 @@ bool Qt4ProjectManagerPlugin::initialize(const QStringList &arguments, QString * | TextEditor::TextEditorActionHandler::JumpToFileUnderCursor); m_proFileEditorFactory = new ProFileEditorFactory(m_qt4ProjectManager, editorHandler); + + ProjectExplorer::ProfileManager::instance()->registerProfileInformation(new QmakeProfileInformation); + addObject(m_proFileEditorFactory); addAutoReleasedObject(new EmptyProjectWizard); @@ -151,8 +153,8 @@ bool Qt4ProjectManagerPlugin::initialize(const QStringList &arguments, QString * addAutoReleasedObject(new QMakeStepFactory); addAutoReleasedObject(new MakeStepFactory); + addAutoReleasedObject(new Qt4BuildConfigurationFactory); addAutoReleasedObject(new Qt4RunConfigurationFactory); - addAutoReleasedObject(new UnConfiguredSettingsOptionPage); #ifdef Q_OS_MAC addAutoReleasedObject(new MacDesignerExternalEditor); @@ -163,9 +165,6 @@ bool Qt4ProjectManagerPlugin::initialize(const QStringList &arguments, QString * addAutoReleasedObject(new S60Manager); - addAutoReleasedObject(new Qt4DesktopTargetFactory); - addAutoReleasedObject(new Qt4SimulatorTargetFactory); - addAutoReleasedObject(new DesktopQtVersionFactory); addAutoReleasedObject(new SimulatorQtVersionFactory); addAutoReleasedObject(new WinCeQtVersionFactory); @@ -308,15 +307,10 @@ bool Qt4ProjectManagerPlugin::initialize(const QStringList &arguments, QString * return true; } -bool Qt4ProjectManagerPlugin::delayedInitialize() -{ - S60Manager::instance()->delayedInitialize(); - return true; -} - void Qt4ProjectManagerPlugin::extensionsInitialized() { m_qt4ProjectManager->init(); + S60Manager::instance()->extensionsInitialize(); } void Qt4ProjectManagerPlugin::startupProjectChanged() @@ -391,7 +385,7 @@ void Qt4ProjectManagerPlugin::updateContextActions(ProjectExplorer::Node *node, m_buildFileAction->setParameter(buildFilePossible ? QFileInfo(fileNode->path()).fileName() : QString()); Qt4BuildConfiguration *buildConfiguration = (qt4Project && qt4Project->activeTarget()) ? - qt4Project->activeTarget()->activeQt4BuildConfiguration() : 0; + qobject_cast<Qt4BuildConfiguration *>(qt4Project->activeTarget()->activeBuildConfiguration()) : 0; bool isProjectNode = qt4Project && proFileNode && buildConfiguration; bool isBuilding = m_projectExplorer->buildManager()->isBuilding(project); bool enabled = subProjectActionsVisible && !isBuilding; diff --git a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.h b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.h index f01806f98b..9cb066d8bb 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.h +++ b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.h @@ -41,9 +41,11 @@ class QAction; QT_END_NAMESPACE namespace ProjectExplorer { - class Project; - class Node; - class ProjectExplorerPlugin; +class Node; +class Project; +class ProjectExplorerPlugin; +class ProfileInformation; +class Target; } namespace Utils { class ParameterAction; } @@ -52,7 +54,6 @@ namespace Qt4ProjectManager { class Qt4Manager; class QtVersionManager; class Qt4Project; -class Qt4BaseTarget; namespace Internal { @@ -67,7 +68,6 @@ public: Qt4ProjectManagerPlugin(); ~Qt4ProjectManagerPlugin(); bool initialize(const QStringList &arguments, QString *errorMessage); - bool delayedInitialize(); void extensionsInitialized(); private slots: @@ -93,7 +93,7 @@ private: ProFileEditorFactory *m_proFileEditorFactory; Qt4Manager *m_qt4ProjectManager; Qt4Project *m_previousStartupProject; - Qt4BaseTarget *m_previousTarget; + ProjectExplorer::Target *m_previousTarget; QAction *m_runQMakeAction; QAction *m_runQMakeActionContextMenu; diff --git a/src/plugins/qt4projectmanager/qt4target.cpp b/src/plugins/qt4projectmanager/qt4target.cpp deleted file mode 100644 index 879c1bbe9c..0000000000 --- a/src/plugins/qt4projectmanager/qt4target.cpp +++ /dev/null @@ -1,1493 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. -** -**************************************************************************/ - -#include "qt4target.h" -#include "buildconfigurationinfo.h" - -#include "makestep.h" -#include "qmakestep.h" -#include "qt4project.h" -#include "qt4basetargetfactory.h" -#include "qt4nodes.h" -#include "qt4projectconfigwidget.h" -#include "qt4projectmanagerconstants.h" -#include "qt4buildconfiguration.h" - -#include <coreplugin/icore.h> -#include <coreplugin/featureprovider.h> -#include <extensionsystem/pluginmanager.h> -#include <projectexplorer/buildsteplist.h> -#include <projectexplorer/runconfiguration.h> -#include <projectexplorer/toolchainmanager.h> -#include <projectexplorer/toolchain.h> -#include <projectexplorer/projectexplorerconstants.h> -#include <projectexplorer/task.h> -#include <qtsupport/customexecutablerunconfiguration.h> -#include <qtsupport/qtversionfactory.h> -#include <qtsupport/baseqtversion.h> -#include <qtsupport/qtversionmanager.h> -#include <utils/pathchooser.h> -#include <utils/detailswidget.h> -#include <utils/qtcprocess.h> - -#include <QCoreApplication> -#include <QPushButton> -#include <QMessageBox> -#include <QCheckBox> -#include <QComboBox> -#include <QHBoxLayout> -#include <QLabel> -#include <QMainWindow> -#include <QVBoxLayout> - -#include <algorithm> -#include <set> - -using namespace Qt4ProjectManager; -using namespace Qt4ProjectManager::Internal; - -// ------------------------------------------------------------------------- -// Qt4BaseTargetFactory -// ------------------------------------------------------------------------- - -Qt4BaseTargetFactory::Qt4BaseTargetFactory(QObject *parent) : - ITargetFactory(parent) -{ - -} - -Qt4BaseTargetFactory::~Qt4BaseTargetFactory() -{ - -} - -Qt4TargetSetupWidget *Qt4BaseTargetFactory::createTargetSetupWidget(const Core::Id id, - const QString &proFilePath, - const QtSupport::QtVersionNumber &minimumQtVersion, - const QtSupport::QtVersionNumber &maximumQtVersion, - const Core::FeatureSet &requiredFeatures, - bool importEnabled, - QList<BuildConfigurationInfo> importInfos) -{ - QList<BuildConfigurationInfo> infos = this->availableBuildConfigurations(id, - proFilePath, - minimumQtVersion, - maximumQtVersion, - requiredFeatures); - if (infos.isEmpty() && importInfos.isEmpty()) - return 0; - const bool supportsShadowBuilds - = targetFeatures(id).contains(QLatin1String(Constants::SHADOWBUILD_TARGETFEATURE_ID)); - Qt4DefaultTargetSetupWidget *widget - = new Qt4DefaultTargetSetupWidget(this, id, proFilePath, infos, - minimumQtVersion, maximumQtVersion, requiredFeatures, - importEnabled && supportsShadowBuilds, importInfos, - (supportsShadowBuilds - ? Qt4DefaultTargetSetupWidget::ENABLE - : Qt4DefaultTargetSetupWidget::DISABLE)); - return widget; -} - -ProjectExplorer::Target *Qt4BaseTargetFactory::create(ProjectExplorer::Project *parent, const Core::Id id, Qt4TargetSetupWidget *widget) -{ - if (!widget->isTargetSelected()) - return 0; - Q_ASSERT(qobject_cast<Qt4DefaultTargetSetupWidget *>(widget)); - Qt4DefaultTargetSetupWidget *w = static_cast<Qt4DefaultTargetSetupWidget *>(widget); - w->storeSettings(); - return create(parent, id, w->buildConfigurationInfos()); -} - -QList<BuildConfigurationInfo> Qt4BaseTargetFactory::availableBuildConfigurations(const Core::Id id, const QString &proFilePath, - const QtSupport::QtVersionNumber &minimumQtVersion, - const QtSupport::QtVersionNumber &maximumQtVersion, - const Core::FeatureSet &requiredFeatures) -{ - QList<BuildConfigurationInfo> infoList; - QList<QtSupport::BaseQtVersion *> knownVersions - = QtSupport::QtVersionManager::instance()->versionsForTargetId(id, minimumQtVersion, maximumQtVersion); - - foreach (QtSupport::BaseQtVersion *version, knownVersions) { - if (!version->isValid() || !version->toolChainAvailable(id)) - continue; - QtSupport::BaseQtVersion::QmakeBuildConfigs config = version->defaultBuildConfig(); - BuildConfigurationInfo info = BuildConfigurationInfo(version->uniqueId(), config, QString(), QString(), false); - info.directory = shadowBuildDirectory(proFilePath, id, msgBuildConfigurationName(info)); - infoList.append(info); - - info.buildConfig = config ^ QtSupport::BaseQtVersion::DebugBuild; - info.directory = shadowBuildDirectory(proFilePath, id, msgBuildConfigurationName(info)); - infoList.append(info); - } - - infoList = BuildConfigurationInfo::filterBuildConfigurationInfos(infoList, requiredFeatures); - - return infoList; -} - -QString sanitize(const QString &input) -{ - QString result; - result.reserve(input.size()); - foreach (const QChar &qc, input) { - const char c = qc.toLatin1(); - if ((c >= 'a' && c <='z') - || (c >= 'A' && c <= 'Z') - || (c >= '0' && c <= '9') - || c == '-' - || c == '_') - result.append(qc); - else - result.append(QLatin1Char('_')); - } - return result; -} - -QString projectDirectory(const QString &proFile) -{ - if (proFile.isEmpty()) - return QString(); - QFileInfo info(proFile); - return info.absoluteDir().path(); -} - -QString Qt4BaseTargetFactory::shadowBuildDirectory(const QString &profilePath, const Core::Id id, const QString &suffix) -{ - if (profilePath.isEmpty()) - return QString(); - QFileInfo info(profilePath); - - QString base = QDir::cleanPath(projectDirectory(profilePath) + QLatin1String("/../") + info.baseName() + QLatin1String("-build-")); - return base + buildNameForId(id) + QLatin1String("-") + sanitize(suffix); -} - -QString Qt4BaseTargetFactory::buildNameForId(Core::Id id) const -{ - Q_UNUSED(id); - return QString(); -} - -Qt4BaseTargetFactory *Qt4BaseTargetFactory::qt4BaseTargetFactoryForId(const Core::Id id) -{ - QList<Qt4BaseTargetFactory *> factories = ExtensionSystem::PluginManager::getObjects<Qt4BaseTargetFactory>(); - foreach (Qt4BaseTargetFactory *fac, factories) { - if (fac->supportsTargetId(id)) - return fac; - } - return 0; -} - -QList<Qt4BaseTargetFactory *> Qt4BaseTargetFactory::qt4BaseTargetFactoriesForIds(const QList<Core::Id> &ids) -{ - QList<Qt4BaseTargetFactory *> factories; - foreach (Core::Id id, ids) - if (Qt4BaseTargetFactory *factory = qt4BaseTargetFactoryForId(id)) - factories << factory; - - qSort(factories); - factories.erase(std::unique(factories.begin(), factories.end()), factories.end()); - return factories; -} - -// Return name of a build configuration. -QString Qt4BaseTargetFactory::msgBuildConfigurationName(const BuildConfigurationInfo &info) -{ - const QString qtVersionName = info.version()->displayName(); - return (info.buildConfig & QtSupport::BaseQtVersion::DebugBuild) ? - //: Name of a debug build configuration to created by a project wizard, %1 being the Qt version name. We recommend not translating it. - tr("%1 Debug").arg(qtVersionName) : - //: Name of a release build configuration to be created by a project wizard, %1 being the Qt version name. We recommend not translating it. - tr("%1 Release").arg(qtVersionName); -} - -QList<ProjectExplorer::Task> Qt4BaseTargetFactory::reportIssues(const QString &proFile) -{ - Q_UNUSED(proFile); - return QList<ProjectExplorer::Task>(); -} - -bool Qt4BaseTargetFactory::selectByDefault(const Core::Id id) const -{ - Q_UNUSED(id); - return true; -} - -// ------------------------------------------------------------------------- -// Qt4BaseTarget -// ------------------------------------------------------------------------- - -Qt4BaseTarget::Qt4BaseTarget(Qt4Project *parent, const Core::Id id) : - ProjectExplorer::Target(parent, id) -{ - connect(this, SIGNAL(activeBuildConfigurationChanged(ProjectExplorer::BuildConfiguration*)), - this, SLOT(emitProFileEvaluateNeeded())); - connect(this, SIGNAL(activeBuildConfigurationChanged(ProjectExplorer::BuildConfiguration*)), - this, SIGNAL(environmentChanged())); - connect(this, SIGNAL(addedBuildConfiguration(ProjectExplorer::BuildConfiguration*)), - this, SLOT(onAddedBuildConfiguration(ProjectExplorer::BuildConfiguration*))); -} - -Qt4BaseTarget::~Qt4BaseTarget() -{ -} - -ProjectExplorer::BuildConfigWidget *Qt4BaseTarget::createConfigWidget() -{ - return new Qt4ProjectConfigWidget(this); -} - -Qt4BuildConfiguration *Qt4BaseTarget::activeQt4BuildConfiguration() const -{ - return static_cast<Qt4BuildConfiguration *>(Target::activeBuildConfiguration()); -} - -Qt4Project *Qt4BaseTarget::qt4Project() const -{ - return static_cast<Qt4Project *>(project()); -} - -QList<ProjectExplorer::ToolChain *> Qt4BaseTarget::possibleToolChains(ProjectExplorer::BuildConfiguration *bc) const -{ - QList<ProjectExplorer::ToolChain *> tmp; - QList<ProjectExplorer::ToolChain *> result; - - Qt4BuildConfiguration *qt4bc = qobject_cast<Qt4BuildConfiguration *>(bc); - if (!qt4bc || !qt4bc->qtVersion()) - return tmp; - - QList<Qt4ProFileNode *> profiles = qt4Project()->allProFiles(); - bool qtUsed = false; - foreach (Qt4ProFileNode *pro, profiles) { - if (pro->variableValue(ConfigVar).contains(QLatin1String("qt")) && !pro->variableValue(QtVar).isEmpty()) { - qtUsed = true; - break; - } - } - - if (!qtUsed || !qt4bc->qtVersion()->isValid()) - return ProjectExplorer::ToolChainManager::instance()->toolChains(); - - QList<ProjectExplorer::Abi> abiList = qt4bc->qtVersion()->qtAbis(); - foreach (const ProjectExplorer::Abi &abi, abiList) - tmp.append(ProjectExplorer::ToolChainManager::instance()->findToolChains(abi)); - - foreach (ProjectExplorer::ToolChain *tc, tmp) { - if (result.contains(tc)) - continue; - if (tc->restrictedToTargets().isEmpty() || tc->restrictedToTargets().contains(id())) - result.append(tc); - } - return result; -} - -ProjectExplorer::ToolChain *Qt4BaseTarget::preferredToolChain(ProjectExplorer::BuildConfiguration *bc) const -{ - Qt4BuildConfiguration *qtBc = qobject_cast<Qt4BuildConfiguration *>(bc); - if (!qtBc || !qtBc->qtVersion()) - return Target::preferredToolChain(bc); - - QList<ProjectExplorer::ToolChain *> tcs = possibleToolChains(bc); - const Utils::FileName mkspec = qtBc->qtVersion()->mkspec(); - foreach (ProjectExplorer::ToolChain *tc, tcs) - if (tc->mkspecList().contains(mkspec)) - return tc; - return tcs.isEmpty() ? 0 : tcs.at(0); -} - -Utils::FileName Qt4BaseTarget::mkspec(const Qt4BuildConfiguration *bc) const -{ - QtSupport::BaseQtVersion *version = bc->qtVersion(); - // We do not know which abi the Qt version has, so let's stick with the defaults - if (version && version->qtAbis().count() == 1 && version->qtAbis().first().isNull()) - return Utils::FileName(); - - const QList<Utils::FileName> tcSpecList - = bc->toolChain() ? bc->toolChain()->mkspecList() : QList<Utils::FileName>(); - if (!version) - return Utils::FileName(); // No Qt version, so no qmake either... - foreach (const Utils::FileName &tcSpec, tcSpecList) { - if (version->hasMkspec(tcSpec)) - return tcSpec; - } - return version->mkspec(); -} - -void Qt4BaseTarget::removeUnconfiguredCustomExectutableRunConfigurations() -{ - if (runConfigurations().count()) { - // Remove all run configurations which the new project wizard created - QList<ProjectExplorer::RunConfiguration*> toRemove; - foreach (ProjectExplorer::RunConfiguration * rc, runConfigurations()) { - QtSupport::CustomExecutableRunConfiguration *cerc - = qobject_cast<QtSupport::CustomExecutableRunConfiguration *>(rc); - if (cerc && !cerc->isConfigured()) - toRemove.append(rc); - } - foreach (ProjectExplorer::RunConfiguration *rc, toRemove) - removeRunConfiguration(rc); - } -} - -Qt4BuildConfiguration *Qt4BaseTarget::addQt4BuildConfiguration(QString defaultDisplayName, - QString displayName, QtSupport::BaseQtVersion *qtversion, - QtSupport::BaseQtVersion::QmakeBuildConfigs qmakeBuildConfiguration, - QString additionalArguments, - QString directory, - bool importing) -{ - Q_ASSERT(qtversion); - bool debug = qmakeBuildConfiguration & QtSupport::BaseQtVersion::DebugBuild; - - // Add the buildconfiguration - Qt4BuildConfiguration *bc = new Qt4BuildConfiguration(this); - bc->setDefaultDisplayName(defaultDisplayName); - bc->setDisplayName(displayName); - - ProjectExplorer::BuildStepList *buildSteps = - bc->stepList(Core::Id(ProjectExplorer::Constants::BUILDSTEPS_BUILD)); - ProjectExplorer::BuildStepList *cleanSteps = - bc->stepList(Core::Id(ProjectExplorer::Constants::BUILDSTEPS_CLEAN)); - Q_ASSERT(buildSteps); - Q_ASSERT(cleanSteps); - - QMakeStep *qmakeStep = new QMakeStep(buildSteps); - buildSteps->insertStep(0, qmakeStep); - - MakeStep *makeStep = new MakeStep(buildSteps); - buildSteps->insertStep(1, makeStep); - - MakeStep* cleanStep = new MakeStep(cleanSteps); - cleanStep->setClean(true); - cleanStep->setUserArguments(QLatin1String("clean")); - cleanSteps->insertStep(0, cleanStep); - - bool enableQmlDebugger - = Qt4BuildConfiguration::removeQMLInspectorFromArguments(&additionalArguments); - if (!additionalArguments.isEmpty()) - qmakeStep->setUserArguments(additionalArguments); - if (importing) - qmakeStep->setLinkQmlDebuggingLibrary(enableQmlDebugger); - - // set some options for qmake and make - if (qmakeBuildConfiguration & QtSupport::BaseQtVersion::BuildAll) // debug_and_release => explicit targets - makeStep->setUserArguments(debug ? QLatin1String("debug") : QLatin1String("release")); - - bc->setQMakeBuildConfiguration(qmakeBuildConfiguration); - - // Finally set the qt version & tool chain - bc->setQtVersion(qtversion); - if (!directory.isEmpty()) - bc->setShadowBuildAndDirectory(directory != project()->projectDirectory(), directory); - - addBuildConfiguration(bc); - - Utils::FileName extractedMkspec - = Qt4BuildConfiguration::extractSpecFromArguments(&additionalArguments, - directory, qtversion); - // Find a good tool chain for the mkspec we extracted from the build (rely on default behavior - // if no -spec argument was given or it is the default). - if (!extractedMkspec.isEmpty() - && extractedMkspec != Utils::FileName::fromString(QLatin1String("default")) - && extractedMkspec != qtversion->mkspec()) { - QList<ProjectExplorer::ToolChain *> tcList = bc->target()->possibleToolChains(bc); - foreach (ProjectExplorer::ToolChain *tc, tcList) { - if (tc->mkspecList().contains(extractedMkspec)) { - bc->setToolChain(tc); - qmakeStep->setUserArguments(additionalArguments); // remove unnecessary -spec - } - } - } - - return bc; -} - -void Qt4BaseTarget::onAddedBuildConfiguration(ProjectExplorer::BuildConfiguration *bc) -{ - Q_ASSERT(bc); - Qt4BuildConfiguration *qt4bc = qobject_cast<Qt4BuildConfiguration *>(bc); - Q_ASSERT(qt4bc); - connect(qt4bc, SIGNAL(buildDirectoryInitialized()), - this, SIGNAL(buildDirectoryInitialized())); - connect(qt4bc, SIGNAL(proFileEvaluateNeeded(Qt4ProjectManager::Qt4BuildConfiguration*)), - this, SLOT(onProFileEvaluateNeeded(Qt4ProjectManager::Qt4BuildConfiguration*))); -} - -void Qt4BaseTarget::onProFileEvaluateNeeded(Qt4ProjectManager::Qt4BuildConfiguration *bc) -{ - if (bc && bc == activeBuildConfiguration()) - emit proFileEvaluateNeeded(this); -} - -void Qt4BaseTarget::emitProFileEvaluateNeeded() -{ - emit proFileEvaluateNeeded(this); -} - -// ------------------------------------------------------------------------- -// Qt4TargetSetupWidget -// ------------------------------------------------------------------------- - -Qt4TargetSetupWidget::Qt4TargetSetupWidget(QWidget *parent) - : QWidget(parent) -{ - -} - -Qt4TargetSetupWidget::~Qt4TargetSetupWidget() -{ - -} - -// ------------------------------------------------------------------------- -// Qt4DefaultTargetSetupWidget -// ------------------------------------------------------------------------- - -QString issuesListToString(const QList<ProjectExplorer::Task> &issues) -{ - QStringList lines; - foreach (const ProjectExplorer::Task &t, issues) { - // set severity: - QString severity; - if (t.type == ProjectExplorer::Task::Error) - severity = QCoreApplication::translate("Qt4DefaultTargetSetupWidget", "<b>Error:</b> ", "Severity is Task::Error"); - else if (t.type == ProjectExplorer::Task::Warning) - severity = QCoreApplication::translate("Qt4DefaultTargetSetupWidget", "<b>Warning:</b> ", "Severity is Task::Warning"); - lines.append(severity + t.description); - } - return lines.join(QLatin1String("<br>")); -} - -Qt4DefaultTargetSetupWidget::Qt4DefaultTargetSetupWidget(Qt4BaseTargetFactory *factory, - Core::Id id, - const QString &proFilePath, - const QList<BuildConfigurationInfo> &infos, - const QtSupport::QtVersionNumber &minimumQtVersion, - const QtSupport::QtVersionNumber &maximumQtVersion, - const Core::FeatureSet &requiredFeatures, - bool importEnabled, - const QList<BuildConfigurationInfo> &importInfos, - ShadowBuildOption shadowBuild) - : Qt4TargetSetupWidget(), - m_id(id), - m_factory(factory), - m_proFilePath(proFilePath), - m_minimumQtVersion(minimumQtVersion), - m_maximumQtVersion(maximumQtVersion), - m_requiredFeatures(requiredFeatures), - m_importInfos(importInfos), - m_directoriesEnabled(true), - m_hasInSourceBuild(false), - m_ignoreChange(false), - m_showImport(importEnabled), - m_buildConfigurationTemplateUnchanged(true), - m_shadowBuildCheckBoxVisible(false), - m_selected(0) -{ - QSettings *s = Core::ICore::settings(); - QString sourceDir = QFileInfo(m_proFilePath).absolutePath(); - - setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); - QVBoxLayout *vboxLayout = new QVBoxLayout(); - setLayout(vboxLayout); - vboxLayout->setContentsMargins(0, 0, 0, 0); - m_detailsWidget = new Utils::DetailsWidget(this); - m_detailsWidget->setUseCheckBox(true); - m_detailsWidget->setSummaryText(factory->displayNameForId(id)); - m_detailsWidget->setChecked(false); - m_detailsWidget->setSummaryFontBold(true); - m_detailsWidget->setIcon(factory->iconForId(id)); - m_detailsWidget->setAdditionalSummaryText(issuesListToString(factory->reportIssues(m_proFilePath))); - vboxLayout->addWidget(m_detailsWidget); - - QWidget *widget = new QWidget; - QVBoxLayout *layout = new QVBoxLayout; - widget->setLayout(layout); - layout->setContentsMargins(0, 0, 0, 0); - - QWidget *w = new QWidget; - m_importLayout = new QGridLayout; - m_importLayout->setMargin(0); - w->setLayout(m_importLayout); - layout->addWidget(w); - - w = new QWidget; - m_importLineLayout = new QHBoxLayout(); - m_importLineLayout->setContentsMargins(0, 0, 0, 0); - w->setLayout(m_importLineLayout); - m_importLineLabel = new QLabel(); - m_importLineLabel->setText(tr("Add build from:")); - m_importLineLayout->addWidget(m_importLineLabel); - - m_importLinePath = new Utils::PathChooser(); - m_importLinePath->setExpectedKind(Utils::PathChooser::ExistingDirectory); - m_importLinePath->setPath(sourceDir); - m_importLinePath->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - m_importLineLayout->addWidget(m_importLinePath); - - m_importLineButton = new QPushButton; - m_importLineButton->setText(tr("Add Build")); - m_importLineButton->setAttribute(Qt::WA_MacSmallSize); - // make it in line with import path chooser button on mac - m_importLineButton->setAttribute(Qt::WA_LayoutUsesWidgetRect); - m_importLineLayout->addWidget(m_importLineButton); - m_importLineStretch = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Fixed); - m_importLineLayout->addSpacerItem(m_importLineStretch); - m_importLinePath->installEventFilter(this); - layout->addWidget(w); - - m_importLineLabel->setVisible(false); - m_importLinePath->setVisible(false); - m_importLineButton->setVisible(m_showImport); - - m_buildConfigurationLabel = new QLabel; - m_buildConfigurationLabel->setText(tr("Create build configurations:")); - m_buildConfigurationLabel->setVisible(false); - - m_buildConfigurationComboBox = new QComboBox; - m_buildConfigurationComboBox->addItem(tr("For Each Qt Version One Debug And One Release"), PERQT); - m_buildConfigurationComboBox->addItem(tr("For One Qt Version One Debug And One Release"), ONEQT); - m_buildConfigurationComboBox->addItem(tr("Manually"), MANUALLY); - m_buildConfigurationComboBox->addItem(tr("None"), NONE); - - if (m_importInfos.isEmpty()) - m_buildConfigurationComboBox->setCurrentIndex(s->value(QLatin1String("Qt4ProjectManager.TargetSetupPage.BuildTemplate"), 0).toInt()); - else - m_buildConfigurationComboBox->setCurrentIndex(3); // NONE - - m_buildConfigurationComboBox->setVisible(false); - - QHBoxLayout *hbox = new QHBoxLayout(); - hbox->addWidget(m_buildConfigurationLabel); - hbox->addWidget(m_buildConfigurationComboBox); - hbox->addStretch(); - layout->addLayout(hbox); - - m_shadowBuildEnabled = new QCheckBox; - m_shadowBuildEnabled->setText(tr("Shadow build")); - m_shadowBuildCheckBoxVisible = shadowBuild == USER; - - layout->addWidget(m_shadowBuildEnabled); - m_shadowBuildEnabled->setVisible(m_shadowBuildCheckBoxVisible); - - m_versionLabel = new QLabel; - m_versionLabel->setText(tr("Qt version:")); - m_versionLabel->setVisible(false); - m_versionComboBox = new QComboBox; - m_versionComboBox->setVisible(false); - hbox = new QHBoxLayout(); - hbox->addWidget(m_versionLabel); - hbox->addWidget(m_versionComboBox); - hbox->addStretch(); - layout->addLayout(hbox); - - w = new QWidget; - m_newBuildsLayout = new QGridLayout; - m_newBuildsLayout->setMargin(0); -#ifdef Q_OS_MAC - m_newBuildsLayout->setSpacing(0); -#endif - w->setLayout(m_newBuildsLayout); - layout->addWidget(w); - - widget->setEnabled(false); - m_detailsWidget->setWidget(widget); - - for (int i = 0; i < m_importInfos.size(); ++i) { - if (m_importInfos.at(i).directory == sourceDir) - m_hasInSourceBuild = true; - m_importEnabled << true; - } - - if (m_hasInSourceBuild || shadowBuild == DISABLE) { - m_shadowBuildEnabled->setChecked(false); - m_directoriesEnabled = false; - } else if (shadowBuild == ENABLE) { - m_shadowBuildEnabled->setChecked(true); - m_directoriesEnabled = true; - } else { - m_directoriesEnabled = s->value(QLatin1String("Qt4ProjectManager.TargetSetupPage.ShadowBuilding"), true).toBool(); - m_shadowBuildEnabled->setChecked(m_directoriesEnabled); - } - - m_selected += m_importInfos.size(); - - setupImportWidgets(); - - setBuildConfigurationInfos(infos, false); - - int qtVersionId = s->value(QLatin1String("Qt4ProjectManager.TargetSetupPage.QtVersionId"), -1).toInt(); - int index = m_versionComboBox->findData(qtVersionId); - if (index != -1) - m_versionComboBox->setCurrentIndex(index); - updateOneQtVisible(); - - if (!m_importInfos.isEmpty()) - m_detailsWidget->setState(Utils::DetailsWidget::Expanded); - - connect(m_importLineButton, SIGNAL(clicked()), - this, SLOT(addImportClicked())); - - connect(m_detailsWidget, SIGNAL(checked(bool)), - this, SLOT(targetCheckBoxToggled(bool))); - connect(m_shadowBuildEnabled, SIGNAL(toggled(bool)), - this, SLOT(shadowBuildingToggled())); - connect(m_buildConfigurationComboBox, SIGNAL(currentIndexChanged(int)), - this, SLOT(buildConfigurationComboBoxChanged())); - connect(m_versionComboBox, SIGNAL(currentIndexChanged(int)), - this, SLOT(updateOneQtVisible())); -} - -Qt4DefaultTargetSetupWidget::~Qt4DefaultTargetSetupWidget() -{ - -} - -bool Qt4DefaultTargetSetupWidget::isTargetSelected() const -{ - if (!m_detailsWidget->isChecked()) - return false; - - return !buildConfigurationInfos().isEmpty(); -} - -void Qt4DefaultTargetSetupWidget::setTargetSelected(bool b) -{ - // Only check target if there are build configurations possible - b &= !buildConfigurationInfos().isEmpty(); - m_ignoreChange = true; - m_detailsWidget->setChecked(b); - m_detailsWidget->widget()->setEnabled(b); - m_ignoreChange = false; - // We want the shadow build option to be visible - if (b && (m_shadowBuildEnabled->isVisibleTo(m_shadowBuildEnabled->parentWidget()) - || m_buildConfigurationComboBox->isVisibleTo(m_buildConfigurationComboBox->parentWidget()))) - m_detailsWidget->setState(Utils::DetailsWidget::Expanded); -} - -void Qt4DefaultTargetSetupWidget::updateBuildConfigurationInfos(const QList<BuildConfigurationInfo> &infos) -{ - setBuildConfigurationInfos(infos, false); -} - -void Qt4DefaultTargetSetupWidget::targetCheckBoxToggled(bool b) -{ - if (m_ignoreChange) - return; - m_detailsWidget->widget()->setEnabled(b); - if (b) { - foreach (bool error, m_issues) { - if (error) { - m_detailsWidget->setState(Utils::DetailsWidget::Expanded); - break; - } - } - } - emit selectedToggled(); -} - -QString Qt4DefaultTargetSetupWidget::displayNameFrom(const BuildConfigurationInfo &info) -{ - QString buildType; - if ((info.buildConfig & QtSupport::BaseQtVersion::BuildAll) == 0) { - if (info.buildConfig & QtSupport::BaseQtVersion::DebugBuild) - //: Debug build - buildType = tr("debug"); - else - //: release build - buildType = tr("release"); - } - return info.version()->displayName() + QLatin1Char(' ') + buildType; -} - -void Qt4DefaultTargetSetupWidget::setProFilePath(const QString &proFilePath) -{ - m_proFilePath = proFilePath; - m_detailsWidget->setAdditionalSummaryText(issuesListToString(m_factory->reportIssues(m_proFilePath))); - setBuildConfigurationInfos(m_factory->availableBuildConfigurations(m_id, - proFilePath, - m_minimumQtVersion, - m_maximumQtVersion, - m_requiredFeatures), - true); -} - -void Qt4DefaultTargetSetupWidget::setBuildConfiguraionComboBoxVisible(bool b) -{ - m_buildConfigurationLabel->setVisible(b); - m_buildConfigurationComboBox->setVisible(b); - updateWidgetVisibility(); -} - - -Qt4DefaultTargetSetupWidget::BuildConfigurationTemplate Qt4DefaultTargetSetupWidget::buildConfigurationTemplate() const -{ - if (!m_buildConfigurationComboBox->isVisibleTo(m_buildConfigurationComboBox->parentWidget())) - return MANUALLY; // the default - return static_cast<BuildConfigurationTemplate>(m_buildConfigurationComboBox->itemData(m_buildConfigurationComboBox->currentIndex()).toInt()); -} - -void Qt4DefaultTargetSetupWidget::setBuildConfigurationTemplate(Qt4DefaultTargetSetupWidget::BuildConfigurationTemplate value) -{ - int index = m_buildConfigurationComboBox->findData(QVariant::fromValue(int(value))); - m_buildConfigurationComboBox->setCurrentIndex(index); -} - -void Qt4DefaultTargetSetupWidget::storeSettings() const -{ - bool importing = false; - for (int i=0; i < m_importEnabled.size(); ++i) { - if (m_importEnabled.at(i)) { - importing = true; - break; - } - } - - QSettings *s = Core::ICore::settings(); - s->setValue(QLatin1String("Qt4ProjectManager.TargetSetupPage.ShadowBuilding"), m_shadowBuildEnabled->isChecked()); - int id = -1; - int ci = m_versionComboBox->currentIndex(); - if (ci != -1) - id = m_versionComboBox->itemData(ci).toInt(); - s->setValue(QLatin1String("Qt4ProjectManager.TargetSetupPage.QtVersionId"), id); - - // if we are importing we don't save the template setting - // essentially we assume that the settings apply for the new project case - // and for the importing case "None" is likely the most sensible - if (!importing) - s->setValue(QLatin1String("Qt4ProjectManager.TargetSetupPage.BuildTemplate"), m_buildConfigurationComboBox->currentIndex()); -} - -bool Qt4DefaultTargetSetupWidget::eventFilter(QObject *obj, QEvent *event) -{ - if (obj == m_importLinePath) { - if (event->type() == QEvent::KeyPress || event->type() == QEvent::KeyRelease) { - QKeyEvent *ke = static_cast<QKeyEvent *>(event); - if (ke->key() == Qt::Key_Return || ke->key() == Qt::Key_Enter) { - if (event->type() == QEvent::KeyPress) - addImportClicked(); - return true; - } - } - } - return false; -} - -QList<BuildConfigurationInfo> Qt4DefaultTargetSetupWidget::buildConfigurationInfos() const -{ - QList<BuildConfigurationInfo> infos; - for (int i = 0; i < m_importInfos.size(); ++i) { - if (m_importEnabled.at(i)) - infos << m_importInfos.at(i); - } - - BuildConfigurationTemplate state = buildConfigurationTemplate(); - if (state == NONE) - return infos; - - int qtVersionId = -1; - if (state == ONEQT && m_versionComboBox->currentIndex() != -1) - qtVersionId = m_versionComboBox->itemData(m_versionComboBox->currentIndex()).toInt(); - - QString sourceDir = QFileInfo(m_proFilePath).absolutePath(); - int size = m_infos.size(); - for (int i=0; i < size; ++i) { - if (state == PERQT || (m_enabled.at(i) && (state == MANUALLY || (state == ONEQT && m_infos.at(i).version()->uniqueId() == qtVersionId)))) { - BuildConfigurationInfo info = m_infos.at(i); - if (!m_shadowBuildEnabled->isChecked()) - info.directory = sourceDir; - infos << info; - } - } - return infos; -} - -void Qt4DefaultTargetSetupWidget::addImportClicked() -{ - if (!m_importLineLabel->isVisible()) { - m_importLineLabel->setVisible(true); - m_importLinePath->setVisible(true); - m_importLineButton->setAttribute(Qt::WA_MacNormalSize); - m_importLineStretch->changeSize(0,0, QSizePolicy::Fixed, QSizePolicy::Fixed); - m_importLineLayout->invalidate(); - return; - } - - QList<BuildConfigurationInfo> infos = BuildConfigurationInfo::checkForBuild(m_importLinePath->path(), m_proFilePath); - if (infos.isEmpty()) { - QMessageBox::critical(this, - tr("No Build Found"), - tr("No build found in %1 matching project %2.").arg(m_importLinePath->path()).arg(m_proFilePath)); - return; - } - - QList<BuildConfigurationInfo> filterdInfos; - bool filtered = false; - foreach (const BuildConfigurationInfo &info, infos) { - if (info.version()->supportsTargetId(m_id)) - filterdInfos << info; - else - filtered = true; - } - - if (filtered) { - if (filterdInfos.isEmpty()) { - QMessageBox::critical(this, - tr("Incompatible Build Found"), - tr("The build found in %1 is incompatible with this target.").arg(m_importLinePath->path())); - return; - } - // show something if we found incompatible builds? - } - - // Filter out already imported builds - infos = filterdInfos; - filterdInfos.clear(); - foreach (const BuildConfigurationInfo &info, infos) { - bool alreadyImported = false; - foreach (const BuildConfigurationInfo &existingImport, m_importInfos) { - if (info == existingImport) { - alreadyImported = true; - break; - } - } - if (!alreadyImported) - filterdInfos << info; - } - - if (filterdInfos.isEmpty() && !infos.isEmpty()) { - QMessageBox::critical(this, - tr("Already Imported Build"), - tr("The build found in %1 is already imported.").arg(m_importLinePath->path())); - return; - } - - // We switch from to "NONE" on importing if the user has not changed it - if (m_buildConfigurationTemplateUnchanged) - setBuildConfigurationTemplate(NONE); - - foreach (const BuildConfigurationInfo &info, filterdInfos) { - ++m_selected; - m_importEnabled << true; - - m_importInfos << info; - - createImportWidget(info, m_importEnabled.size() - 1); - emit newImportBuildConfiguration(info); - } - emit selectedToggled(); -} - -QList<QtSupport::BaseQtVersion *> Qt4DefaultTargetSetupWidget::usedTemporaryQtVersions() -{ - QList<QtSupport::BaseQtVersion *> versions; - for (int i = 0; i < m_importInfos.size(); ++i) { - if (m_importEnabled.at(i) && m_importInfos.at(i).temporaryQtVersion) - versions << m_importInfos.at(i).temporaryQtVersion; - } - return versions; -} - -void Qt4DefaultTargetSetupWidget::replaceQtVersionWithQtVersion(int oldId, int newId) -{ - QList<BuildConfigurationInfo>::iterator it, end; - it = m_importInfos.begin(); - end = m_importInfos.end(); - for ( ; it != end; ++it) { - BuildConfigurationInfo &info = *it; - if (info.qtVersionId == oldId) { - info.qtVersionId = newId; - } - } -} - -void Qt4DefaultTargetSetupWidget::replaceTemporaryQtVersionWithQtVersion(QtSupport::BaseQtVersion *version, int id) -{ - QList<BuildConfigurationInfo>::iterator it, end; - it = m_importInfos.begin(); - end = m_importInfos.end(); - for ( ; it != end; ++it) { - BuildConfigurationInfo &info = *it; - if (info.temporaryQtVersion == version) { - info.temporaryQtVersion = 0; - info.qtVersionId = id; - } - } -} - -void Qt4DefaultTargetSetupWidget::replaceQtVersionWithTemporaryQtVersion(int id, QtSupport::BaseQtVersion *version) -{ - QList<BuildConfigurationInfo>::iterator it, end; - it = m_importInfos.begin(); - end = m_importInfos.end(); - for ( ; it != end; ++it) { - BuildConfigurationInfo &info = *it; - if (info.qtVersionId == id) { - info.temporaryQtVersion = version; - info.qtVersionId = -1; - } - } -} - -namespace { -class BuildConfigurationInfoCompare -{ -public: - bool operator()(const BuildConfigurationInfo &a, const BuildConfigurationInfo &b) const - { - if (a.qtVersionId < b.qtVersionId) - return true; - if (a.qtVersionId > b.qtVersionId) - return false; - - if (a.buildConfig != b.buildConfig) { - QtSupport::BaseQtVersion *version = a.version(); - QtSupport::BaseQtVersion::QmakeBuildConfigs defaultBuildConfigs = QtSupport::BaseQtVersion::DebugBuild; - if (version) - defaultBuildConfigs = version->defaultBuildConfig(); - - bool adebug = a.buildConfig & QtSupport::BaseQtVersion::DebugBuild; - bool bdebug = b.buildConfig & QtSupport::BaseQtVersion::DebugBuild; - bool defaultdebug = defaultBuildConfigs & QtSupport::BaseQtVersion::DebugBuild; - - if (adebug != bdebug) - return (adebug == defaultdebug); - - bool abuildall = a.buildConfig & QtSupport::BaseQtVersion::BuildAll; - bool bbuildall = b.buildConfig & QtSupport::BaseQtVersion::BuildAll; - bool defaultbuildall = defaultBuildConfigs & QtSupport::BaseQtVersion::BuildAll; - - if (abuildall != bbuildall) - return (abuildall == defaultbuildall); - - // Those cases can't happen - if (a.buildConfig < b.buildConfig) - return true; - if (a.buildConfig > b.buildConfig) - return false; - } - if (a.additionalArguments < b.additionalArguments) - return true; - if (a.additionalArguments > b.additionalArguments) - return false; - // Equal - return false; - } -}; - -} - -void Qt4DefaultTargetSetupWidget::setBuildConfigurationInfos(QList<BuildConfigurationInfo> infos, bool resetDirectories) -{ - // We need to preserve the ordering of infos, so we jump through some hops - // to figure out which infos are newly added and which are deleted - std::set<BuildConfigurationInfo, BuildConfigurationInfoCompare> added; - std::set<BuildConfigurationInfo, BuildConfigurationInfoCompare> removed; - { // Figure out differences - std::set<BuildConfigurationInfo, BuildConfigurationInfoCompare> oldInfos; - std::set<BuildConfigurationInfo, BuildConfigurationInfoCompare> newInfos; - - oldInfos.insert(m_infos.constBegin(), m_infos.constEnd()); - newInfos.insert(infos.constBegin(), infos.constEnd()); - - BuildConfigurationInfoCompare comp; - std::set_difference(newInfos.begin(), newInfos.end(), - oldInfos.begin(), oldInfos.end(), - std::inserter(added, added.begin()), - comp); - std::set_difference(oldInfos.begin(), oldInfos.end(), - newInfos.begin(), newInfos.end(), - std::inserter(removed, removed.begin()), - comp); - } - - // Existing builds, to figure out which newly added - // buildconfigurations should be en/disabled - QStringList existingBuilds; - for (int i = 0; i < m_importInfos.size(); ++i) { - const BuildConfigurationInfo &info = m_importInfos.at(i); - existingBuilds << info.directory; - } - - // Iterate over old/new infos to get the correct - // m_selected and m_enabled state - QList<BuildConfigurationInfo>::const_iterator oldit, oend; - oldit = m_infos.constBegin(); - oend = m_infos.constEnd(); - - QList<BuildConfigurationInfo>::iterator newit, nend; - newit = infos.begin(); - nend = infos.end(); - - QList<bool>::const_iterator enabledIt = m_enabled.constBegin(); - QList<bool> enabled; - while (oldit != oend && newit != nend) { - if (removed.find(*oldit) != removed.end()) { - // Deleted qt version - if (*enabledIt) - --m_selected; - ++oldit; - ++enabledIt; - } else if (added.find(*newit) != added.end()) { - // new info, check if we have a import build for that directory already - // then disable this build - if (existingBuilds.contains(newit->directory) || m_hasInSourceBuild) { - enabled << false; - } else { - enabled << true; - ++m_selected; - } - - ++newit; - } else { - // updated - if (!resetDirectories) - newit->directory = oldit->directory; - enabled << *enabledIt; - - ++oldit; - ++enabledIt; - ++newit; - } - } - - while (oldit != oend) { - if (*enabledIt) - --m_selected; - ++oldit; - ++enabledIt; - } - - while (newit != nend) { - if (existingBuilds.contains(newit->directory) || m_hasInSourceBuild) { - enabled << false; - } else { - enabled << true; - ++m_selected; - } - - ++newit; - } - - m_infos = infos; - m_enabled = enabled; - - // Recreate widgets - clearWidgets(); - setupWidgets(); - - // update version combobox - int oldQtVersionId = -1; - if (m_versionComboBox->currentIndex() != -1) - oldQtVersionId = m_versionComboBox->itemData(m_versionComboBox->currentIndex()).toInt(); - QList<QtSupport::BaseQtVersion *> list; - foreach (const BuildConfigurationInfo &info, m_infos) { - if (!list.contains(info.version())) - list << info.version(); - } - m_ignoreChange = true; - m_versionComboBox->clear(); - foreach (QtSupport::BaseQtVersion *v, list) { - m_versionComboBox->addItem(v->displayName(), v->uniqueId()); - if (v->uniqueId() == oldQtVersionId) - m_versionComboBox->setCurrentIndex(m_versionComboBox->count() - 1); - } - m_ignoreChange = false; - updateWidgetVisibility(); - - emit selectedToggled(); -} - -void Qt4DefaultTargetSetupWidget::setupImportWidgets() -{ - for (int i = 0; i < m_importInfos.size(); ++i) - createImportWidget(m_importInfos.at(i), i); -} - -void Qt4DefaultTargetSetupWidget::createImportWidget(const BuildConfigurationInfo &info, int pos) -{ - QCheckBox *checkBox = new QCheckBox; - checkBox->setText(tr("Import build from %1.").arg(QDir::toNativeSeparators(info.directory))); - checkBox->setChecked(m_importEnabled.at(pos)); - if (info.version()) - checkBox->setToolTip(info.version()->toHtml(false)); - m_importLayout->addWidget(checkBox, pos, 0, 1, 2); - - connect(checkBox, SIGNAL(toggled(bool)), - this, SLOT(importCheckBoxToggled(bool))); - - m_importCheckBoxes.append(checkBox); -} - -void Qt4DefaultTargetSetupWidget::setupWidgets() -{ - m_ignoreChange = true; - QString sourceDir = QFileInfo(m_proFilePath).absolutePath(); - bool foundIssues = false; - for (int i = 0; i < m_infos.size(); ++i) { - const BuildConfigurationInfo &info = m_infos.at(i); - QCheckBox *checkbox = new QCheckBox; - checkbox->setText(displayNameFrom(info)); - checkbox->setChecked(m_enabled.at(i)); - checkbox->setAttribute(Qt::WA_LayoutUsesWidgetRect); - if (info.version()) - checkbox->setToolTip(info.version()->toHtml(false)); - m_newBuildsLayout->addWidget(checkbox, i * 2, 0); - - Utils::PathChooser *pathChooser = new Utils::PathChooser(); - pathChooser->setExpectedKind(Utils::PathChooser::Directory); - if (m_shadowBuildEnabled->isChecked()) - pathChooser->setPath(info.directory); - else - pathChooser->setPath(sourceDir); - pathChooser->setReadOnly(!m_directoriesEnabled); - m_newBuildsLayout->addWidget(pathChooser, i * 2, 1); - - QLabel *reportIssuesLabel = new QLabel; - reportIssuesLabel->setIndent(32); - m_newBuildsLayout->addWidget(reportIssuesLabel, i * 2 + 1, 0, 1, 2); - reportIssuesLabel->setVisible(false); - - connect(checkbox, SIGNAL(toggled(bool)), - this, SLOT(checkBoxToggled(bool))); - - connect(pathChooser, SIGNAL(changed(QString)), - this, SLOT(pathChanged())); - - m_checkboxes.append(checkbox); - m_pathChoosers.append(pathChooser); - m_reportIssuesLabels.append(reportIssuesLabel); - m_issues.append(false); - bool issue = reportIssues(i); - foundIssues |= issue; - } - if (foundIssues && isTargetSelected()) - m_detailsWidget->setState(Utils::DetailsWidget::Expanded); - m_ignoreChange = false; -} - -void Qt4DefaultTargetSetupWidget::clearWidgets() -{ - qDeleteAll(m_checkboxes); - m_checkboxes.clear(); - qDeleteAll(m_pathChoosers); - m_pathChoosers.clear(); - qDeleteAll(m_reportIssuesLabels); - m_reportIssuesLabels.clear(); - m_issues.clear(); -} - -void Qt4DefaultTargetSetupWidget::checkBoxToggled(bool b) -{ - QCheckBox *box = qobject_cast<QCheckBox *>(sender()); - if (!box) - return; - int index = m_checkboxes.indexOf(box); - if (index == -1) - return; - if (m_enabled[index] == b) - return; - m_selected += b ? 1 : -1; - m_enabled[index] = b; - if ((m_selected == 0 && !b) || (m_selected == 1 && b)) - emit selectedToggled(); -} - -void Qt4DefaultTargetSetupWidget::importCheckBoxToggled(bool b) -{ - QCheckBox *box = qobject_cast<QCheckBox *>(sender()); - if (!box) - return; - int index = m_importCheckBoxes.indexOf(box); - if (index == -1) - return; - if (m_importEnabled[index] == b) - return; - m_selected += b ? 1 : -1; - m_importEnabled[index] = b; - if ((m_selected == 0 && !b) || (m_selected == 1 && b)) - emit selectedToggled(); -} - -void Qt4DefaultTargetSetupWidget::pathChanged() -{ - if (m_ignoreChange) - return; - Utils::PathChooser *pathChooser = qobject_cast<Utils::PathChooser *>(sender()); - if (!pathChooser) - return; - int index = m_pathChoosers.indexOf(pathChooser); - if (index == -1) - return; - m_infos[index].directory = pathChooser->path(); - reportIssues(index); -} - -void Qt4DefaultTargetSetupWidget::shadowBuildingToggled() -{ - m_ignoreChange = true; - bool b = m_shadowBuildEnabled->isChecked(); - if (m_directoriesEnabled == b) - return; - m_directoriesEnabled = b; - QString sourceDir = QFileInfo(m_proFilePath).absolutePath(); - for (int i = 0; i < m_pathChoosers.size(); ++i) { - Utils::PathChooser *pathChooser = m_pathChoosers.at(i); - pathChooser->setReadOnly(!b); - if (b) - pathChooser->setPath(m_infos.at(i).directory); - else - pathChooser->setPath(sourceDir); - reportIssues(i); - } - m_ignoreChange = false; -} - -void Qt4DefaultTargetSetupWidget::buildConfigurationComboBoxChanged() -{ - m_buildConfigurationTemplateUnchanged = false; - updateWidgetVisibility(); -} - -void Qt4DefaultTargetSetupWidget::updateWidgetVisibility() -{ - m_versionLabel->setVisible(false); - m_versionComboBox->setVisible(false); - BuildConfigurationTemplate state = buildConfigurationTemplate(); - if (state == NONE || state == PERQT) { - foreach (QCheckBox *cb, m_checkboxes) - cb->setVisible(false); - foreach (Utils::PathChooser *pc, m_pathChoosers) - pc->setVisible(false); - foreach (QLabel *label, m_reportIssuesLabels) - label->setVisible(false); - } else if (state == MANUALLY) { - foreach (QCheckBox *cb, m_checkboxes) - cb->setVisible(true); - foreach (Utils::PathChooser *pc, m_pathChoosers) - pc->setVisible(true); - for (int i = 0; i < m_reportIssuesLabels.count(); ++i) - m_reportIssuesLabels.at(i)->setVisible(m_issues.at(i)); - } else if (state == ONEQT) { - m_versionLabel->setVisible(true); - m_versionComboBox->setVisible(true); - updateOneQtVisible(); - } - m_shadowBuildEnabled->setVisible(m_shadowBuildCheckBoxVisible && (state != NONE)); - emit selectedToggled(); -} - -void Qt4DefaultTargetSetupWidget::updateOneQtVisible() -{ - if (m_ignoreChange) - return; - int id = -1; - if (m_versionComboBox->currentIndex() != -1) - id = m_versionComboBox->itemData(m_versionComboBox->currentIndex()).toInt(); - if (buildConfigurationTemplate() != ONEQT) - return; - for (int i = 0; i < m_infos.size(); ++i) { - bool visible = m_infos.at(i).version()->uniqueId() == id; - m_checkboxes.at(i)->setVisible(visible); - m_pathChoosers.at(i)->setVisible(visible); - m_reportIssuesLabels.at(i)->setVisible(m_issues.at(i)); - } -} - -bool Qt4DefaultTargetSetupWidget::reportIssues(int index) -{ - QPair<ProjectExplorer::Task::TaskType, QString> issues = findIssues(m_infos.at(index)); - QLabel *reportIssuesLabel = m_reportIssuesLabels.at(index); - reportIssuesLabel->setText(issues.second); - bool error = issues.first != ProjectExplorer::Task::Unknown; - reportIssuesLabel->setVisible(error); - m_issues[index] = error; - return error; -} - -QPair<ProjectExplorer::Task::TaskType, QString> Qt4DefaultTargetSetupWidget::findIssues(const BuildConfigurationInfo &info) -{ - if (m_proFilePath.isEmpty()) - return qMakePair(ProjectExplorer::Task::Unknown, QString()); - - QString buildDir = info.directory; - if (!m_shadowBuildEnabled->isChecked()) - buildDir = QFileInfo(m_proFilePath).absolutePath(); - QtSupport::BaseQtVersion *version = info.version(); - - QList<ProjectExplorer::Task> issues = version->reportIssues(m_proFilePath, buildDir); - - QString text; - ProjectExplorer::Task::TaskType highestType = ProjectExplorer::Task::Unknown; - foreach (const ProjectExplorer::Task &t, issues) { - if (!text.isEmpty()) - text.append(QLatin1String("<br>")); - // set severity: - QString severity; - if (t.type == ProjectExplorer::Task::Error) { - highestType = ProjectExplorer::Task::Error; - severity = tr("<b>Error:</b> ", "Severity is Task::Error"); - } else if (t.type == ProjectExplorer::Task::Warning) { - if (highestType == ProjectExplorer::Task::Unknown) - highestType = ProjectExplorer::Task::Warning; - severity = tr("<b>Warning:</b> ", "Severity is Task::Warning"); - } - text.append(severity + t.description); - } - if (!text.isEmpty()) - text = QLatin1String("<nobr>") + text; - return qMakePair(highestType, text); -} - -// ----------------------- -// BuildConfigurationInfo -// ----------------------- - -QList<BuildConfigurationInfo> BuildConfigurationInfo::filterBuildConfigurationInfos(const QList<BuildConfigurationInfo> &infos, Core::Id id) -{ - QList<BuildConfigurationInfo> result; - foreach (const BuildConfigurationInfo &info, infos) - if (info.version()->supportsTargetId(id)) - result.append(info); - return result; -} - -QList<BuildConfigurationInfo> BuildConfigurationInfo::filterBuildConfigurationInfosByPlatform(const QList<BuildConfigurationInfo> &infos, - const QString &platform) -{ - if (platform.isEmpty()) // empty target == target independent - return infos; - QList<BuildConfigurationInfo> result; - foreach (const BuildConfigurationInfo &info, infos) - if (info.version()->supportsPlatform(platform)) - result.append(info); - return result; -} - -QList<BuildConfigurationInfo> BuildConfigurationInfo::filterBuildConfigurationInfos(const QList<BuildConfigurationInfo> &infos, Core::FeatureSet features) -{ - QList<BuildConfigurationInfo> result; - foreach (const BuildConfigurationInfo &info, infos) - if (info.version()->availableFeatures().contains(features)) - result.append(info); - return result; -} - -QtSupport::BaseQtVersion *BuildConfigurationInfo::version() const -{ - if (temporaryQtVersion) - return temporaryQtVersion; - QtSupport::QtVersionManager *manager = QtSupport::QtVersionManager::instance(); - return manager->version(qtVersionId); -} - -QList<BuildConfigurationInfo> BuildConfigurationInfo::importBuildConfigurations(const QString &proFilePath) -{ - QList<BuildConfigurationInfo> result; - - // Check for in source build first - QString sourceDir = QFileInfo(proFilePath).absolutePath(); - QList<BuildConfigurationInfo> infos = checkForBuild(sourceDir, proFilePath); - if (!infos.isEmpty()) - result.append(infos); - - // If we found a in source build, we do not search for out of source builds - if (!result.isEmpty()) - return result; - - // Check for builds in build directory - QList<Qt4BaseTargetFactory *> factories = - ExtensionSystem::PluginManager::getObjects<Qt4BaseTargetFactory>(); - foreach (Qt4BaseTargetFactory *factory, factories) { - foreach (const Core::Id id, factory->supportedTargetIds()) { - QString expectedBuildprefix = factory->shadowBuildDirectory(proFilePath, id, QString()); - QString baseDir = QFileInfo(expectedBuildprefix).absolutePath(); - foreach (const QString &dir, QDir(baseDir).entryList()) { - if (dir.startsWith(expectedBuildprefix)) { - QList<BuildConfigurationInfo> infos = checkForBuild(dir, proFilePath); - if (infos.isEmpty()) - result.append(infos); - } - } - } - } - return result; -} - -QList<BuildConfigurationInfo> BuildConfigurationInfo::checkForBuild(const QString &directory, const QString &proFilePath) -{ - QStringList makefiles = QDir(directory).entryList(QStringList(QLatin1String("Makefile*"))); - QList<BuildConfigurationInfo> infos; - foreach (const QString &file, makefiles) { - QString makefile = directory + QLatin1Char('/') + file; - Utils::FileName qmakeBinary = QtSupport::QtVersionManager::findQMakeBinaryFromMakefile(makefile); - if (qmakeBinary.isEmpty()) - continue; - if (QtSupport::QtVersionManager::makefileIsFor(makefile, proFilePath) != QtSupport::QtVersionManager::SameProject) - continue; - - bool temporaryQtVersion = false; - QtSupport::BaseQtVersion *version = QtSupport::QtVersionManager::instance()->qtVersionForQMakeBinary(qmakeBinary); - if (!version) { - version = QtSupport::QtVersionFactory::createQtVersionFromQMakePath(qmakeBinary); - temporaryQtVersion = true; - if (!version) - continue; - } - - QPair<QtSupport::BaseQtVersion::QmakeBuildConfigs, QString> makefileBuildConfig = - QtSupport::QtVersionManager::scanMakeFile(makefile, version->defaultBuildConfig()); - - QString additionalArguments = makefileBuildConfig.second; - Utils::FileName parsedSpec = Qt4BuildConfiguration::extractSpecFromArguments(&additionalArguments, directory, version); - Utils::FileName versionSpec = version->mkspec(); - - QString specArgument; - // Compare mkspecs and add to additional arguments - if (parsedSpec.isEmpty() || parsedSpec == versionSpec - || parsedSpec == Utils::FileName::fromString(QLatin1String("default"))) { - // using the default spec, don't modify additional arguments - } else { - specArgument = QLatin1String("-spec ") + Utils::QtcProcess::quoteArg(parsedSpec.toUserOutput()); - } - Utils::QtcProcess::addArgs(&specArgument, additionalArguments); - - BuildConfigurationInfo info = BuildConfigurationInfo(version->uniqueId(), - makefileBuildConfig.first, - specArgument, - directory, - true, - temporaryQtVersion ? version : 0, - file); - infos.append(info); - } - return infos; -} diff --git a/src/plugins/qt4projectmanager/qt4target.h b/src/plugins/qt4projectmanager/qt4target.h deleted file mode 100644 index 2a18e84f95..0000000000 --- a/src/plugins/qt4projectmanager/qt4target.h +++ /dev/null @@ -1,225 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. -** -**************************************************************************/ - -#ifndef QT4TARGET_H -#define QT4TARGET_H - -#include "qt4targetsetupwidget.h" - -#include <qtsupport/baseqtversion.h> -#include <projectexplorer/target.h> -#include <projectexplorer/task.h> - -#include <QSpacerItem> - -namespace Utils { -class DetailsWidget; -class PathChooser; -} - -QT_BEGIN_NAMESPACE -class QCheckBox; -class QHBoxLayout; -class QGridLayout; -class QLabel; -class QComboBox; -class QPushButton; -QT_END_NAMESPACE - -namespace ProjectExplorer { -class Node; -} - -namespace Qt4ProjectManager { -class Qt4Project; -class Qt4BaseTargetFactory; -class Qt4ProFileNode; -class Qt4BuildConfiguration; - -class QT4PROJECTMANAGER_EXPORT Qt4BaseTarget : public ProjectExplorer::Target -{ - Q_OBJECT -public: - Qt4BaseTarget(Qt4Project *parent, const Core::Id id); - virtual ~Qt4BaseTarget(); - - ProjectExplorer::BuildConfigWidget *createConfigWidget(); - - Qt4BuildConfiguration *activeQt4BuildConfiguration() const; - Qt4ProjectManager::Qt4Project *qt4Project() const; - - // This is the same for almost all Qt4Targets - // so for now offer a convience function - Qt4BuildConfiguration *addQt4BuildConfiguration(QString defaultDisplayName, - QString displayName, - QtSupport::BaseQtVersion *qtversion, - QtSupport::BaseQtVersion::QmakeBuildConfigs qmakeBuildConfiguration, - QString additionalArguments, - QString directory, - bool importing); - - virtual void createApplicationProFiles(bool reparse) = 0; - - virtual QList<ProjectExplorer::RunConfiguration *> runConfigurationsForNode(ProjectExplorer::Node *n) = 0; - - QList<ProjectExplorer::ToolChain *> possibleToolChains(ProjectExplorer::BuildConfiguration *bc) const; - ProjectExplorer::ToolChain *preferredToolChain(ProjectExplorer::BuildConfiguration *) const; - - virtual Utils::FileName mkspec(const Qt4BuildConfiguration *bc) const; - -signals: - void buildDirectoryInitialized(); - /// emitted if the build configuration changed in a way that - /// should trigger a reevaluation of all .pro files - void proFileEvaluateNeeded(Qt4ProjectManager::Qt4BaseTarget *); - -protected: - void removeUnconfiguredCustomExectutableRunConfigurations(); - -private slots: - void onAddedBuildConfiguration(ProjectExplorer::BuildConfiguration *bc); - void onProFileEvaluateNeeded(Qt4ProjectManager::Qt4BuildConfiguration *bc); - void emitProFileEvaluateNeeded(); -}; - -// TODO handle the user deleting/creating qt versions correctly -// Update list of buildconfigurations on adding/removing -// Do advanced magic for importing cases: -// - If the qt version that would be imported was created in the mean time -// delete the temporary qt version and set the versionId to the newly created version -// - If the qt version that a import configuration uses was deleted from the qt versions -// create a new temporary qt version and use that -// For greatness! -class Qt4DefaultTargetSetupWidget : public Qt4TargetSetupWidget -{ - Q_OBJECT -public: - enum ShadowBuildOption { DISABLE, ENABLE, USER }; - Qt4DefaultTargetSetupWidget(Qt4BaseTargetFactory *factory, - const Core::Id id, - const QString &proFilePath, - const QList<BuildConfigurationInfo> &info, - const QtSupport::QtVersionNumber &minimumQtVersion, - const QtSupport::QtVersionNumber &maximumQtVersion, - const Core::FeatureSet &requiredFeatures, - bool importEnabled, - const QList<BuildConfigurationInfo> &importInfos, - ShadowBuildOption shadowBuild); - ~Qt4DefaultTargetSetupWidget(); - bool isTargetSelected() const; - void setTargetSelected(bool b); - - void updateBuildConfigurationInfos(const QList<BuildConfigurationInfo> &infos); - QList<QtSupport::BaseQtVersion *> usedTemporaryQtVersions(); - void replaceQtVersionWithQtVersion(int oldId, int newId); - void replaceTemporaryQtVersionWithQtVersion(QtSupport::BaseQtVersion *version, int id); - void replaceQtVersionWithTemporaryQtVersion(int id, QtSupport::BaseQtVersion *version); - - QList<BuildConfigurationInfo> buildConfigurationInfos() const; - void setProFilePath(const QString &proFilePath); - - void setBuildConfiguraionComboBoxVisible(bool b); - - enum BuildConfigurationTemplate { PERQT = 0, - ONEQT = 1, - MANUALLY = 2, - NONE = 3 }; - BuildConfigurationTemplate buildConfigurationTemplate() const; - void setBuildConfigurationTemplate(BuildConfigurationTemplate value); - - void storeSettings() const; -protected: - bool eventFilter(QObject *, QEvent *); -private slots: - void addImportClicked(); - void checkBoxToggled(bool b); - void importCheckBoxToggled(bool b); - void pathChanged(); - void shadowBuildingToggled(); - void buildConfigurationComboBoxChanged(); - void updateOneQtVisible(); - void targetCheckBoxToggled(bool b); - -private: - void updateWidgetVisibility(); - void setBuildConfigurationInfos(QList<BuildConfigurationInfo> list, bool resetDirectories); - bool reportIssues(int index); - QPair<ProjectExplorer::Task::TaskType, QString> findIssues(const BuildConfigurationInfo &info); - void createImportWidget(const BuildConfigurationInfo &info, int pos); - - Core::Id m_id; - Qt4BaseTargetFactory *m_factory; - QString m_proFilePath; - QtSupport::QtVersionNumber m_minimumQtVersion; - QtSupport::QtVersionNumber m_maximumQtVersion; - Core::FeatureSet m_requiredFeatures; - Utils::DetailsWidget *m_detailsWidget; - QGridLayout *m_importLayout; - QGridLayout *m_newBuildsLayout; - QCheckBox *m_shadowBuildEnabled; - QLabel *m_buildConfigurationLabel; - QComboBox *m_buildConfigurationComboBox; - QLabel *m_versionLabel; - QComboBox *m_versionComboBox; - - // import line widgets - QHBoxLayout *m_importLineLayout; - QLabel *m_importLineLabel; - Utils::PathChooser *m_importLinePath; - QPushButton *m_importLineButton; - QSpacerItem *m_importLineStretch; - - void setupWidgets(); - void clearWidgets(); - void setupImportWidgets(); - QString displayNameFrom(const BuildConfigurationInfo &info); - QList<QCheckBox *> m_checkboxes; - QList<Utils::PathChooser *> m_pathChoosers; - QList<BuildConfigurationInfo> m_infos; - QList<bool> m_enabled; - QList<QCheckBox *> m_importCheckBoxes; - QList<BuildConfigurationInfo> m_importInfos; - QList<bool> m_importEnabled; - QList<QLabel *> m_reportIssuesLabels; - QList<bool> m_issues; - bool m_directoriesEnabled; - bool m_hasInSourceBuild; - bool m_ignoreChange; - bool m_showImport; - bool m_buildConfigurationTemplateUnchanged; - bool m_shadowBuildCheckBoxVisible; - int m_selected; // Number of selected buildconfiguartions -}; - -} // namespace Qt4ProjectManager - -#endif // QT4TARGET_H diff --git a/src/plugins/qt4projectmanager/qt4targetsetupwidget.cpp b/src/plugins/qt4projectmanager/qt4targetsetupwidget.cpp new file mode 100644 index 0000000000..16b1a5a092 --- /dev/null +++ b/src/plugins/qt4projectmanager/qt4targetsetupwidget.cpp @@ -0,0 +1,358 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. +** +**************************************************************************/ + +#include "qt4targetsetupwidget.h" + +#include "buildconfigurationinfo.h" +#include "qt4buildconfiguration.h" + +#include <coreplugin/icore.h> +#include <extensionsystem/pluginmanager.h> +#include <projectexplorer/profile.h> +#include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/profileoptionspage.h> +#include <qtsupport/qtprofileinformation.h> + +#include <utils/detailsbutton.h> +#include <utils/detailswidget.h> +#include <utils/pathchooser.h> + +#include <QCheckBox> +#include <QHBoxLayout> +#include <QGridLayout> +#include <QLabel> +#include <QPushButton> + +namespace Qt4ProjectManager { + +// ------------------------------------------------------------------------- +// Qt4TargetSetupWidget +// ------------------------------------------------------------------------- + +Qt4TargetSetupWidget::Qt4TargetSetupWidget(ProjectExplorer::Profile *p, + const QString &proFilePath, + const QList<BuildConfigurationInfo> &infoList) : + m_profile(p), + m_haveImported(false), + m_ignoreChange(false), + m_selected(0) +{ + setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); + QVBoxLayout *vboxLayout = new QVBoxLayout(); + setLayout(vboxLayout); + vboxLayout->setContentsMargins(0, 0, 0, 0); + m_detailsWidget = new Utils::DetailsWidget(this); + m_detailsWidget->setUseCheckBox(true); + m_detailsWidget->setChecked(false); + m_detailsWidget->setSummaryFontBold(true); + m_detailsWidget->setToolTip(m_profile->toHtml()); + vboxLayout->addWidget(m_detailsWidget); + + Utils::FadingWidget *panel = new Utils::FadingWidget(m_detailsWidget); + QHBoxLayout *panelLayout = new QHBoxLayout(panel); + m_manageButton = new QPushButton(tr("Manage...")); + panelLayout->addWidget(m_manageButton); + m_detailsWidget->setToolWidget(panel); + + handleProfileUpdate(m_profile); + + QWidget *widget = new QWidget; + QVBoxLayout *layout = new QVBoxLayout; + widget->setLayout(layout); + layout->setContentsMargins(0, 0, 0, 0); + + QWidget *w = new QWidget; + m_newBuildsLayout = new QGridLayout; + m_newBuildsLayout->setMargin(0); +#ifdef Q_OS_MAC + m_newBuildsLayout->setSpacing(0); +#endif + w->setLayout(m_newBuildsLayout); + layout->addWidget(w); + + widget->setEnabled(false); + m_detailsWidget->setWidget(widget); + + foreach (const BuildConfigurationInfo &info, infoList) + addBuildConfigurationInfo(info); + + setProFilePath(proFilePath); + + connect(m_detailsWidget, SIGNAL(checked(bool)), + this, SLOT(targetCheckBoxToggled(bool))); + + connect(ProjectExplorer::ProfileManager::instance(), SIGNAL(profileUpdated(ProjectExplorer::Profile*)), + this, SLOT(handleProfileUpdate(ProjectExplorer::Profile*))); + + connect(m_manageButton, SIGNAL(clicked()), this, SLOT(manageProfile())); +} + +Qt4TargetSetupWidget::~Qt4TargetSetupWidget() +{ } + +ProjectExplorer::Profile *Qt4TargetSetupWidget::profile() +{ + return m_profile; +} + +bool Qt4TargetSetupWidget::isTargetSelected() const +{ + if (!m_detailsWidget->isChecked()) + return false; + + return !selectedBuildConfigurationInfoList().isEmpty(); +} + +void Qt4TargetSetupWidget::setTargetSelected(bool b) +{ + // Only check target if there are build configurations possible + b &= !selectedBuildConfigurationInfoList().isEmpty(); + m_ignoreChange = true; + m_detailsWidget->setChecked(b); + m_detailsWidget->widget()->setEnabled(b); + m_ignoreChange = false; + + m_detailsWidget->setState(b ? Utils::DetailsWidget::Expanded : Utils::DetailsWidget::Collapsed); +} + +void Qt4TargetSetupWidget::addBuildConfigurationInfo(const BuildConfigurationInfo &info, bool importing) +{ + if (importing) { + if (!m_haveImported) { + // disable everything on first import + for (int i = 0; i < m_enabled.count(); ++i) { + m_enabled[i] = false; + m_checkboxes[i]->setChecked(false); + } + m_selected = 0; + } + + m_haveImported = true; + } + int pos = m_pathChoosers.count(); + m_enabled.append(true); + ++m_selected; + + m_infoList.append(info); + + QCheckBox *checkbox = new QCheckBox; + checkbox->setText(Qt4BuildConfigurationFactory::buildConfigurationDisplayName(info)); + checkbox->setChecked(m_enabled.at(pos)); + checkbox->setAttribute(Qt::WA_LayoutUsesWidgetRect); + m_newBuildsLayout->addWidget(checkbox, pos * 2, 0); + + Utils::PathChooser *pathChooser = new Utils::PathChooser(); + pathChooser->setExpectedKind(Utils::PathChooser::Directory); + pathChooser->setPath(info.directory); + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(m_profile); + Q_ASSERT(version); + pathChooser->setReadOnly(!version->supportsShadowBuilds() || importing); + m_newBuildsLayout->addWidget(pathChooser, pos * 2, 1); + + QLabel *reportIssuesLabel = new QLabel; + reportIssuesLabel->setIndent(32); + m_newBuildsLayout->addWidget(reportIssuesLabel, pos * 2 + 1, 0, 1, 2); + reportIssuesLabel->setVisible(false); + + connect(checkbox, SIGNAL(toggled(bool)), + this, SLOT(checkBoxToggled(bool))); + + connect(pathChooser, SIGNAL(changed(QString)), + this, SLOT(pathChanged())); + + m_checkboxes.append(checkbox); + m_pathChoosers.append(pathChooser); + m_reportIssuesLabels.append(reportIssuesLabel); + + m_issues.append(false); + reportIssues(pos); + + emit selectedToggled(); +} + +void Qt4TargetSetupWidget::targetCheckBoxToggled(bool b) +{ + if (m_ignoreChange) + return; + m_detailsWidget->widget()->setEnabled(b); + if (b) { + foreach (bool error, m_issues) { + if (error) { + m_detailsWidget->setState(Utils::DetailsWidget::Expanded); + break; + } + } + } + emit selectedToggled(); +} + +void Qt4TargetSetupWidget::manageProfile() +{ + ProjectExplorer::ProfileOptionsPage *page = + ExtensionSystem::PluginManager::instance()->getObject<ProjectExplorer::ProfileOptionsPage>(); + if (!page) + return; + + page->showProfile(m_profile); + Core::ICore::showOptionsDialog(QLatin1String(ProjectExplorer::Constants::PROJECTEXPLORER_SETTINGS_CATEGORY), + QLatin1String(ProjectExplorer::Constants::PROFILE_SETTINGS_PAGE_ID)); +} + +void Qt4TargetSetupWidget::setProFilePath(const QString &proFilePath) +{ + m_proFilePath = proFilePath; + + clear(); + + QList<BuildConfigurationInfo> infoList + = Qt4BuildConfigurationFactory::availableBuildConfigurations(m_profile, proFilePath); + foreach (const BuildConfigurationInfo &info, infoList) + addBuildConfigurationInfo(info); +} + +void Qt4TargetSetupWidget::handleProfileUpdate(ProjectExplorer::Profile *p) +{ + if (p != m_profile) + return; + + m_detailsWidget->setIcon(p->icon()); + m_detailsWidget->setSummaryText(p->displayName()); +} + +QList<BuildConfigurationInfo> Qt4TargetSetupWidget::selectedBuildConfigurationInfoList() const +{ + QList<BuildConfigurationInfo> result; + for (int i = 0; i < m_infoList.count(); ++i) { + if (m_enabled.at(i)) + result.append(m_infoList.at(i)); + } + return result; +} + +QList<BuildConfigurationInfo> Qt4TargetSetupWidget::allBuildConfigurationInfoList() const +{ + return m_infoList; +} + +void Qt4TargetSetupWidget::clear() +{ + qDeleteAll(m_checkboxes); + m_checkboxes.clear(); + qDeleteAll(m_pathChoosers); + m_pathChoosers.clear(); + qDeleteAll(m_reportIssuesLabels); + m_reportIssuesLabels.clear(); + + m_infoList.clear(); + m_issues.clear(); + m_enabled.clear(); + m_selected = 0; + m_haveImported = false; + + emit selectedToggled(); +} + +void Qt4TargetSetupWidget::checkBoxToggled(bool b) +{ + QCheckBox *box = qobject_cast<QCheckBox *>(sender()); + if (!box) + return; + int index = m_checkboxes.indexOf(box); + if (index == -1) + return; + if (m_enabled[index] == b) + return; + m_selected += b ? 1 : -1; + m_enabled[index] = b; + if ((m_selected == 0 && !b) || (m_selected == 1 && b)) { + emit selectedToggled(); + m_detailsWidget->setChecked(b); + } +} + +void Qt4TargetSetupWidget::pathChanged() +{ + if (m_ignoreChange) + return; + Utils::PathChooser *pathChooser = qobject_cast<Utils::PathChooser *>(sender()); + if (!pathChooser) + return; + int index = m_pathChoosers.indexOf(pathChooser); + if (index == -1) + return; + m_infoList[index].directory = pathChooser->path(); + reportIssues(index); +} + +void Qt4TargetSetupWidget::reportIssues(int index) +{ + QPair<ProjectExplorer::Task::TaskType, QString> issues = findIssues(m_infoList.at(index)); + QLabel *reportIssuesLabel = m_reportIssuesLabels.at(index); + reportIssuesLabel->setText(issues.second); + bool error = issues.first != ProjectExplorer::Task::Unknown; + reportIssuesLabel->setVisible(error); + m_issues[index] = error; +} + +QPair<ProjectExplorer::Task::TaskType, QString> Qt4TargetSetupWidget::findIssues(const BuildConfigurationInfo &info) +{ + if (m_proFilePath.isEmpty()) + return qMakePair(ProjectExplorer::Task::Unknown, QString()); + + QString buildDir = info.directory; + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(m_profile); + + QList<ProjectExplorer::Task> issues = version->reportIssues(m_proFilePath, buildDir); + + QString text; + ProjectExplorer::Task::TaskType highestType = ProjectExplorer::Task::Unknown; + foreach (const ProjectExplorer::Task &t, issues) { + if (!text.isEmpty()) + text.append(QLatin1String("<br>")); + // set severity: + QString severity; + if (t.type == ProjectExplorer::Task::Error) { + highestType = ProjectExplorer::Task::Error; + severity = tr("<b>Error:</b> ", "Severity is Task::Error"); + } else if (t.type == ProjectExplorer::Task::Warning) { + if (highestType == ProjectExplorer::Task::Unknown) + highestType = ProjectExplorer::Task::Warning; + severity = tr("<b>Warning:</b> ", "Severity is Task::Warning"); + } + text.append(severity + t.description); + } + if (!text.isEmpty()) + text = QLatin1String("<nobr>") + text; + return qMakePair(highestType, text); +} + +} // namespace Qt4ProjectManager diff --git a/src/plugins/qt4projectmanager/qt4targetsetupwidget.h b/src/plugins/qt4projectmanager/qt4targetsetupwidget.h index be1679928e..8fb7fe12cf 100644 --- a/src/plugins/qt4projectmanager/qt4targetsetupwidget.h +++ b/src/plugins/qt4projectmanager/qt4targetsetupwidget.h @@ -35,35 +35,81 @@ #include "qt4projectmanager_global.h" +#include <projectexplorer/task.h> + #include <QWidget> +QT_BEGIN_NAMESPACE +class QCheckBox; +class QHBoxLayout; +class QGridLayout; +class QLabel; +class QPushButton; +class QSpacerItem; +QT_END_NAMESPACE + +namespace ProjectExplorer { class Profile; } namespace QtSupport { class BaseQtVersion; -} +} // namespace QtSupport +namespace Utils { +class DetailsWidget; +class PathChooser; +} // namespace Utils namespace Qt4ProjectManager { -struct BuildConfigurationInfo; +class BuildConfigurationInfo; class QT4PROJECTMANAGER_EXPORT Qt4TargetSetupWidget : public QWidget { Q_OBJECT public: - explicit Qt4TargetSetupWidget(QWidget *parent = 0); + Qt4TargetSetupWidget(ProjectExplorer::Profile *p, + const QString &proFilePath, + const QList<BuildConfigurationInfo> &infoList); ~Qt4TargetSetupWidget(); - virtual bool isTargetSelected() const = 0; - virtual void setTargetSelected(bool b) = 0; - virtual void setProFilePath(const QString &proFilePath) = 0; - virtual void updateBuildConfigurationInfos(const QList<BuildConfigurationInfo> &infos) = 0; + ProjectExplorer::Profile *profile(); + + bool isTargetSelected() const; + void setTargetSelected(bool b); + + void addBuildConfigurationInfo(const BuildConfigurationInfo &info, bool importing = false); - virtual QList<QtSupport::BaseQtVersion *> usedTemporaryQtVersions() = 0; - virtual void replaceQtVersionWithQtVersion(int oldId, int newId) = 0; - virtual void replaceTemporaryQtVersionWithQtVersion(QtSupport::BaseQtVersion *version, int id) = 0; - virtual void replaceQtVersionWithTemporaryQtVersion(int id, QtSupport::BaseQtVersion *version) = 0; + QList<BuildConfigurationInfo> selectedBuildConfigurationInfoList() const; + QList<BuildConfigurationInfo> allBuildConfigurationInfoList() const; + void setProFilePath(const QString &proFilePath); signals: void selectedToggled() const; - void newImportBuildConfiguration(const BuildConfigurationInfo &info); + +private slots: + void handleProfileUpdate(ProjectExplorer::Profile *p); + + void checkBoxToggled(bool b); + void pathChanged(); + void targetCheckBoxToggled(bool b); + void manageProfile(); + +private: + void reportIssues(int index); + QPair<ProjectExplorer::Task::TaskType, QString> findIssues(const BuildConfigurationInfo &info); + void clear(); + + ProjectExplorer::Profile *m_profile; + QString m_proFilePath; + bool m_haveImported; + Utils::DetailsWidget *m_detailsWidget; + QPushButton *m_manageButton; + QGridLayout *m_newBuildsLayout; + QList<QCheckBox *> m_checkboxes; + QList<Utils::PathChooser *> m_pathChoosers; + QList<BuildConfigurationInfo> m_infoList; + QList<bool> m_enabled; + QList<QLabel *> m_reportIssuesLabels; + QList<bool> m_issues; + bool m_ignoreChange; + int m_selected; // Number of selected buildconfiguartions }; } // namespace Qt4ProjectManager diff --git a/src/plugins/qt4projectmanager/qtuicodemodelsupport.cpp b/src/plugins/qt4projectmanager/qtuicodemodelsupport.cpp index 05a8cd819f..5f89ca6cec 100644 --- a/src/plugins/qt4projectmanager/qtuicodemodelsupport.cpp +++ b/src/plugins/qt4projectmanager/qtuicodemodelsupport.cpp @@ -35,8 +35,9 @@ #include "qt4project.h" #include "qt4projectmanager.h" -#include "qt4target.h" +#include <projectexplorer/target.h> #include <qtsupport/baseqtversion.h> +#include <qtsupport/qtprofileinformation.h> using namespace Qt4ProjectManager; using namespace Internal; @@ -47,30 +48,21 @@ Qt4UiCodeModelSupport::Qt4UiCodeModelSupport(CPlusPlus::CppModelManagerInterface const QString &uiHeaderFile) : CppTools::UiCodeModelSupport(modelmanager, source, uiHeaderFile), m_project(project) -{ - -} +{ } Qt4UiCodeModelSupport::~Qt4UiCodeModelSupport() -{ - -} +{ } QString Qt4UiCodeModelSupport::uicCommand() const { + QtSupport::BaseQtVersion *version; if (m_project->needsConfiguration()) { - UnConfiguredSettings us = m_project->qt4ProjectManager()->unconfiguredSettings(); - if (!us.version) - return QString(); - return us.version->uicCommand(); + version = QtSupport::QtProfileInformation::qtVersion(ProjectExplorer::ProfileManager::instance()->defaultProfile()); } else { - Qt4BaseTarget *target = m_project->activeTarget(); - Qt4BuildConfiguration *qt4bc = target->activeQt4BuildConfiguration(); - if (!qt4bc->qtVersion()) - return QString(); - return qt4bc->qtVersion()->uicCommand(); + ProjectExplorer::Target *target = m_project->activeTarget(); + version = QtSupport::QtProfileInformation::qtVersion(target->profile()); } - return QString(); + return version ? version->uicCommand() : QString(); } QStringList Qt4UiCodeModelSupport::environment() const @@ -78,8 +70,10 @@ QStringList Qt4UiCodeModelSupport::environment() const if (m_project->needsConfiguration()) { return Utils::Environment::systemEnvironment().toStringList(); } else { - Qt4BaseTarget *target = m_project->activeTarget(); - Qt4BuildConfiguration *qt4bc = target->activeQt4BuildConfiguration(); - return qt4bc->environment().toStringList(); + ProjectExplorer::Target *target = m_project->activeTarget(); + if (!target) + return QStringList(); + ProjectExplorer::BuildConfiguration *bc = target->activeBuildConfiguration(); + return bc ? bc->environment().toStringList() : QStringList(); } } diff --git a/src/plugins/qt4projectmanager/unconfiguredprojectpanel.cpp b/src/plugins/qt4projectmanager/unconfiguredprojectpanel.cpp index bdf921dd50..b9490d8a45 100644 --- a/src/plugins/qt4projectmanager/unconfiguredprojectpanel.cpp +++ b/src/plugins/qt4projectmanager/unconfiguredprojectpanel.cpp @@ -42,9 +42,10 @@ #include <coreplugin/modemanager.h> #include <coreplugin/coreconstants.h> +#include <projectexplorer/profile.h> +#include <projectexplorer/profilemanager.h> #include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/projectexplorer.h> -#include <projectexplorer/toolchain.h> #include <QLabel> #include <QVBoxLayout> @@ -131,39 +132,38 @@ TargetSetupPageWrapper::TargetSetupPageWrapper(ProjectExplorer::Project *project this, SLOT(noteTextLinkActivated())); connect(m_targetSetupPage, SIGNAL(completeChanged()), this, SLOT(completeChanged())); - connect(m_project->qt4ProjectManager(), SIGNAL(unconfiguredSettingsChanged()), + connect(ProjectExplorer::ProfileManager::instance(), SIGNAL(defaultProfileChanged()), this, SLOT(updateNoteText())); + connect(ProjectExplorer::ProfileManager::instance(), SIGNAL(profileUpdated(ProjectExplorer::Profile*)), + this, SLOT(profileUpdated(ProjectExplorer::Profile*))); +} + +void TargetSetupPageWrapper::profileUpdated(ProjectExplorer::Profile *profile) +{ + if (profile == ProjectExplorer::ProfileManager::instance()->defaultProfile()) + updateNoteText(); } void TargetSetupPageWrapper::updateNoteText() { - UnConfiguredSettings us = m_project->qt4ProjectManager()->unconfiguredSettings(); + ProjectExplorer::Profile *p = ProjectExplorer::ProfileManager::instance()->defaultProfile(); QString text; - if (us.version && us.toolchain) - text = tr("<p>The project <b>%1</b> is not yet configured.</p><p>Qt Creator uses the Qt version: <b>%2</b> " - "and the tool chain: <b>%3</b> to parse the project. You can edit " - "these in the <b><a href=\"edit\">options.</a></b></p>") - .arg(m_project->displayName()) - .arg(us.version->displayName()) - .arg(us.toolchain->displayName()); - else if (us.version) - text = tr("<p>The project <b>%1</b> is not yet configured.</p><p>Qt Creator uses the Qt version: <b>%2</b> " - "and <b>no tool chain</b> to parse the project. You can edit " - "these in the <b><a href=\"edit\">settings</a></b></p>") + if (p->isValid()) + text = tr("<p>The project <b>%1</b> is not yet configured.</p>" + "<p>Qt Creator uses the profile: <b>%2</b> " + "to parse the project. You can edit " + "these in the <b><a href=\"edit\">settings.</a></b></p>") .arg(m_project->displayName()) - .arg(us.version->displayName()); - else if (us.toolchain) - text = tr("<p>The project <b>%1</b> is not yet configured.</p><p>Qt Creator uses <b>no Qt version</b> " - "and the tool chain: <b>%2</b> to parse the project. You can edit " - "these in the <b><a href=\"edit\">settings</a></b></p>") - .arg(m_project->displayName()) - .arg(us.toolchain->displayName()); + .arg(p->displayName()); else - text = tr("<p>The project <b>%1</b> is not yet configured.</p><p>Qt Creator uses <b>no Qt version</b> " - "and <b>no tool chain</b> to parse the project. You can edit " + text = tr("<p>The project <b>%1</b> is not yet configured.</p>" + "<p>Qt Creator uses the <b>invalid</b> profile: <b>%2</b> " + "to parse the project. You can edit " "these in the <b><a href=\"edit\">settings</a></b></p>") - .arg(m_project->displayName()); + .arg(m_project->displayName()) + .arg(p->displayName()); + m_targetSetupPage->setNoteText(text); } @@ -193,7 +193,7 @@ void TargetSetupPageWrapper::done() void TargetSetupPageWrapper::noteTextLinkActivated() { Core::ICore::instance()->showOptionsDialog(QLatin1String(ProjectExplorer::Constants::PROJECTEXPLORER_SETTINGS_CATEGORY), - QLatin1String(Constants::UNCONFIGURED_SETTINGS_PAGE_ID)); + QLatin1String(ProjectExplorer::Constants::PROFILE_SETTINGS_PAGE_ID)); } void TargetSetupPageWrapper::completeChanged() diff --git a/src/plugins/qt4projectmanager/unconfiguredprojectpanel.h b/src/plugins/qt4projectmanager/unconfiguredprojectpanel.h index 6466108f3e..70616a99bb 100644 --- a/src/plugins/qt4projectmanager/unconfiguredprojectpanel.h +++ b/src/plugins/qt4projectmanager/unconfiguredprojectpanel.h @@ -39,6 +39,8 @@ QT_FORWARD_DECLARE_CLASS(QPushButton) +namespace ProjectExplorer { class Profile; } + namespace Qt4ProjectManager { class TargetSetupPage; class Qt4Project; @@ -68,6 +70,7 @@ protected: private slots: void done(); void noteTextLinkActivated(); + void profileUpdated(ProjectExplorer::Profile *profile); void updateNoteText(); void completeChanged(); diff --git a/src/plugins/qt4projectmanager/unconfiguredsettingsoptionpage.h b/src/plugins/qt4projectmanager/unconfiguredsettingsoptionpage.h deleted file mode 100644 index b97472351f..0000000000 --- a/src/plugins/qt4projectmanager/unconfiguredsettingsoptionpage.h +++ /dev/null @@ -1,77 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. -** -**************************************************************************/ - -#ifndef UNCONFIGUREDSETTINGSOPTIONPAGE_H -#define UNCONFIGUREDSETTINGSOPTIONPAGE_H - -#include <coreplugin/dialogs/ioptionspage.h> -#include <QWidget> - -QT_BEGIN_NAMESPACE -class QComboBox; -class QCheckBox; -QT_END_NAMESPACE - -namespace Qt4ProjectManager { -namespace Internal { - -class UnConfiguredSettingsWidget : public QWidget -{ - Q_OBJECT -public: - UnConfiguredSettingsWidget(QWidget *parent); - void apply(); - bool matches(const QString &searchKeyword); -private: - QComboBox *m_qtVersionComboBox; - QComboBox *m_toolchainComboBox; - QCheckBox *m_alwaysSkipCheckBox; -}; - -class UnConfiguredSettingsOptionPage : public Core::IOptionsPage -{ -public: - UnConfiguredSettingsOptionPage(); - - bool matches(const QString &searcKeyword) const; - QWidget *createPage(QWidget *parent); - void apply(); - void finish(); - -private: - UnConfiguredSettingsWidget *m_widget; -}; - -} // namespace Internal -} // namespace Qt4ProjectManager - -#endif // UNCONFIGUREDSETTINGSOPTIONPAGE_H diff --git a/src/plugins/qt4projectmanager/winceqtversion.cpp b/src/plugins/qt4projectmanager/winceqtversion.cpp index f752b4dfd7..9a5671db14 100644 --- a/src/plugins/qt4projectmanager/winceqtversion.cpp +++ b/src/plugins/qt4projectmanager/winceqtversion.cpp @@ -79,16 +79,6 @@ QList<ProjectExplorer::Abi> WinCeQtVersion::detectQtAbis() const false); } -bool WinCeQtVersion::supportsTargetId(const Core::Id id) const -{ - return id == Core::Id(Constants::DESKTOP_TARGET_ID); -} - -QSet<Core::Id> WinCeQtVersion::supportedTargetIds() const -{ - return QSet<Core::Id>() << Core::Id(Constants::DESKTOP_TARGET_ID); -} - QString WinCeQtVersion::description() const { return QCoreApplication::translate("QtVersion", diff --git a/src/plugins/qt4projectmanager/winceqtversion.h b/src/plugins/qt4projectmanager/winceqtversion.h index e65d906aac..9853f00315 100644 --- a/src/plugins/qt4projectmanager/winceqtversion.h +++ b/src/plugins/qt4projectmanager/winceqtversion.h @@ -51,9 +51,6 @@ public: QList<ProjectExplorer::Abi> detectQtAbis() const; - bool supportsTargetId(const Core::Id id) const; - QSet<Core::Id> supportedTargetIds() const; - QString description() const; virtual QVariantMap toMap() const; diff --git a/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.cpp b/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.cpp index 5f6bbed288..f0e63cd78d 100644 --- a/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.cpp +++ b/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.cpp @@ -40,6 +40,8 @@ #include <qt4projectmanager/qt4project.h> #include <qt4projectmanager/qt4projectmanager.h> #include <qt4projectmanager/qt4projectmanagerconstants.h> +#include <qtsupport/qtsupportconstants.h> +#include <qtsupport/qtprofileinformation.h> #include <projectexplorer/projectexplorer.h> #include <projectexplorer/customwizard/customwizard.h> #include <coreplugin/editormanager/editormanager.h> @@ -67,11 +69,10 @@ AbstractMobileAppWizardDialog::AbstractMobileAppWizardDialog(QWidget *parent, , m_harmattanItem(0) { m_targetsPage = new TargetSetupPage; - m_targetsPage->setPreferredFeatures(QSet<QString>() << QLatin1String(Constants::MOBILE_TARGETFEATURE_ID)); - m_targetsPage->setMinimumQtVersion(minimumQtVersionNumber); - m_targetsPage->setMaximumQtVersion(maximumQtVersionNumber); - m_targetsPage->setSelectedPlatform(selectedPlatform()); - m_targetsPage->setRequiredQtFeatures(requiredFeatures()); + m_targetsPage->setPreferredProfileMatcher(new QtSupport::QtPlatformProfileMatcher(selectedPlatform())); + m_targetsPage->setRequiredProfileMatcher(new QtSupport::QtVersionProfileMatcher(requiredFeatures(), + minimumQtVersionNumber, + maximumQtVersionNumber)); resize(900, 450); m_genericOptionsPage = new Internal::MobileAppWizardGenericOptionsPage; @@ -117,33 +118,36 @@ int AbstractMobileAppWizardDialog::addPageWithTitle(QWizardPage *page, const QSt int AbstractMobileAppWizardDialog::nextId() const { if (currentPage() == m_targetsPage) { - if ((isSymbianTargetSelected() && !m_ignoreGeneralOptions) || isFremantleTargetSelected()) + if ((isQtPlatformSelected(QtSupport::Constants::SYMBIAN_PLATFORM) && !m_ignoreGeneralOptions) || + isQtPlatformSelected(QtSupport::Constants::MAEMO_FREMANTLE_PLATFORM)) return m_genericOptionsPageId; // If Symbian target and Qt Quick components for Symbian, skip the mobile options page. - else if (isSymbianTargetSelected() && m_ignoreGeneralOptions) + else if (isQtPlatformSelected(QtSupport::Constants::SYMBIAN_PLATFORM) && m_ignoreGeneralOptions) return m_symbianOptionsPageId; - else if (isMeegoTargetSelected()) + else if (isQtPlatformSelected(QtSupport::Constants::MAEMO_FREMANTLE_PLATFORM)) return m_maemoOptionsPageId; - else if (isHarmattanTargetSelected()) + else if (isQtPlatformSelected(QtSupport::Constants::MEEGO_HARMATTAN_PLATFORM)) return m_harmattanOptionsPageId; else return idOfNextGenericPage(); } else if (currentPage() == m_genericOptionsPage) { - if (isSymbianTargetSelected()) + if (isQtPlatformSelected(QtSupport::Constants::SYMBIAN_PLATFORM)) return m_symbianOptionsPageId; - else if (isFremantleTargetSelected() || isMeegoTargetSelected()) + else if (isQtPlatformSelected(QtSupport::Constants::MAEMO_FREMANTLE_PLATFORM) + || isQtPlatformSelected(QtSupport::Constants::MEEGO_PLATFORM)) return m_maemoOptionsPageId; else return m_harmattanOptionsPageId; } else if (currentPage() == m_symbianOptionsPage) { - if (isFremantleTargetSelected() || isMeegoTargetSelected()) + if (isQtPlatformSelected(QtSupport::Constants::MAEMO_FREMANTLE_PLATFORM) + || isQtPlatformSelected(QtSupport::Constants::MEEGO_PLATFORM)) return m_maemoOptionsPageId; - else if (isHarmattanTargetSelected()) + else if (isQtPlatformSelected(QtSupport::Constants::MEEGO_HARMATTAN_PLATFORM)) return m_harmattanOptionsPageId; else return idOfNextGenericPage(); } else if (currentPage() == m_maemoOptionsPage) { - if (isHarmattanTargetSelected()) + if (isQtPlatformSelected(QtSupport::Constants::MEEGO_HARMATTAN_PLATFORM)) return m_harmattanOptionsPageId; else return idOfNextGenericPage(); @@ -168,11 +172,12 @@ void AbstractMobileAppWizardDialog::initializePage(int id) || id == m_maemoOptionsPageId) { QList<Utils::WizardProgressItem *> order; order << m_genericItem; - if (isSymbianTargetSelected()) + if (isQtPlatformSelected(QtSupport::Constants::SYMBIAN_PLATFORM)) order << m_symbianItem; - if (isFremantleTargetSelected() || isMeegoTargetSelected()) + if (isQtPlatformSelected(QtSupport::Constants::MAEMO_FREMANTLE_PLATFORM) + || isQtPlatformSelected(QtSupport::Constants::MEEGO_PLATFORM)) order << m_maemoItem; - if (isHarmattanTargetSelected()) + if (isQtPlatformSelected(QtSupport::Constants::MEEGO_HARMATTAN_PLATFORM)) order << m_harmattanItem; order << itemOfNextGenericPage(); @@ -202,31 +207,14 @@ Utils::WizardProgressItem *AbstractMobileAppWizardDialog::itemOfNextGenericPage( return wizardProgress()->item(idOfNextGenericPage()); } -bool AbstractMobileAppWizardDialog::isSymbianTargetSelected() const +bool AbstractMobileAppWizardDialog::isQtPlatformSelected(const QString &platform) const { - return m_targetsPage->isTargetSelected(Core::Id(Constants::S60_DEVICE_TARGET_ID)); + return m_targetsPage->isQtPlatformSelected(platform); } -bool AbstractMobileAppWizardDialog::isFremantleTargetSelected() const -{ - return m_targetsPage->isTargetSelected(Core::Id(Constants::MAEMO5_DEVICE_TARGET_ID)); -} - -bool AbstractMobileAppWizardDialog::isHarmattanTargetSelected() const -{ - return m_targetsPage->isTargetSelected(Core::Id(Constants::HARMATTAN_DEVICE_TARGET_ID)); -} - -bool AbstractMobileAppWizardDialog::isMeegoTargetSelected() const -{ - return m_targetsPage->isTargetSelected(Core::Id(Constants::MEEGO_DEVICE_TARGET_ID)); -} - - AbstractMobileAppWizard::AbstractMobileAppWizard(const Core::BaseFileWizardParameters ¶ms, QObject *parent) : Core::BaseFileWizard(params, parent) -{ -} +{ } QWizard *AbstractMobileAppWizard::createWizardDialog(QWidget *parent, const Core::WizardDialogParameters &wizardDialogParameters) const @@ -258,9 +246,8 @@ Core::GeneratedFiles AbstractMobileAppWizard::generateFiles(const QWizard *wizar app()->setNetworkEnabled(wdlg->m_symbianOptionsPage->networkEnabled()); app()->setPngIcon64(wdlg->m_maemoOptionsPage->pngIcon()); app()->setPngIcon80(wdlg->m_harmattanOptionsPage->pngIcon()); - if (wdlg->isHarmattanTargetSelected()) - app()->setSupportsMeegoBooster(wdlg->isHarmattanTargetSelected() - && wdlg->m_harmattanOptionsPage->supportsBooster()); + if (wdlg->isQtPlatformSelected(QtSupport::Constants::MEEGO_HARMATTAN_PLATFORM)) + app()->setSupportsMeegoBooster(wdlg->m_harmattanOptionsPage->supportsBooster()); prepareGenerateFiles(wizard, errorMessage); return app()->generateFiles(errorMessage); } diff --git a/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.h b/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.h index 759efa0017..77a32779e2 100644 --- a/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.h +++ b/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.h @@ -76,10 +76,7 @@ protected: private: int idOfNextGenericPage() const; Utils::WizardProgressItem *itemOfNextGenericPage() const; - bool isSymbianTargetSelected() const; - bool isFremantleTargetSelected() const; - bool isHarmattanTargetSelected() const; - bool isMeegoTargetSelected() const; + bool isQtPlatformSelected(const QString &platform) const; Internal::MobileAppWizardGenericOptionsPage *m_genericOptionsPage; Internal::MobileAppWizardSymbianOptionsPage *m_symbianOptionsPage; diff --git a/src/plugins/qt4projectmanager/wizards/guiappwizarddialog.cpp b/src/plugins/qt4projectmanager/wizards/guiappwizarddialog.cpp index 5eac1936c3..d6a581ce34 100644 --- a/src/plugins/qt4projectmanager/wizards/guiappwizarddialog.cpp +++ b/src/plugins/qt4projectmanager/wizards/guiappwizarddialog.cpp @@ -33,9 +33,9 @@ #include "guiappwizarddialog.h" #include "filespage.h" -#include "qt4target.h" #include "qtprojectparameters.h" -#include "qt4projectmanagerconstants.h" + +#include <qtsupport/qtsupportconstants.h> #include <QSet> @@ -66,7 +66,7 @@ GuiAppWizardDialog::GuiAppWizardDialog(const QString &templateName, "and includes an empty widget.")); addModulesPage(); - addTargetSetupPage(QSet<QString>(), isMobile); + addTargetSetupPage(isMobile); m_filesPage->setFormInputCheckable(true); m_filesPage->setClassTypeComboVisible(false); @@ -115,13 +115,13 @@ GuiAppParameters GuiAppWizardDialog::parameters() const rc.formFileName = m_filesPage->formFileName(); rc.designerForm = m_filesPage->formInputChecked(); rc.isMobileApplication = true; - if (isTargetSelected(Core::Id(Constants::MAEMO5_DEVICE_TARGET_ID)) - || isTargetSelected(Core::Id(Constants::HARMATTAN_DEVICE_TARGET_ID)) - || isTargetSelected(Core::Id(Constants::MEEGO_DEVICE_TARGET_ID)) - || isTargetSelected(Core::Id(Constants::ANDROID_DEVICE_TARGET_ID))) { + if (isQtPlatformSelected(QLatin1String(QtSupport::Constants::MAEMO_FREMANTLE_PLATFORM)) + || isQtPlatformSelected(QLatin1String(QtSupport::Constants::MEEGO_HARMATTAN_PLATFORM)) + || isQtPlatformSelected(QLatin1String(QtSupport::Constants::MEEGO_PLATFORM)) + || isQtPlatformSelected(QLatin1String(QtSupport::Constants::ANDROID_PLATFORM))) { rc.widgetWidth = 800; rc.widgetHeight = 480; - } else if (isTargetSelected(Core::Id(Constants::S60_DEVICE_TARGET_ID))) { + } else if (isQtPlatformSelected(QtSupport::Constants::SYMBIAN_PLATFORM)) { rc.widgetWidth = 360; rc.widgetHeight = 640; } else { diff --git a/src/plugins/qt4projectmanager/wizards/importwidget.cpp b/src/plugins/qt4projectmanager/wizards/importwidget.cpp new file mode 100644 index 0000000000..4a3b8393e4 --- /dev/null +++ b/src/plugins/qt4projectmanager/wizards/importwidget.cpp @@ -0,0 +1,93 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. +** +**************************************************************************/ + +#include "importwidget.h" + +#include <utils/detailswidget.h> +#include <utils/pathchooser.h> + +#include <QFileInfo> + +#include <QPushButton> +#include <QVBoxLayout> + +namespace Qt4ProjectManager { +namespace Internal { + +ImportWidget::ImportWidget(QWidget *parent) : + QWidget(parent), + m_pathChooser(new Utils::PathChooser) +{ + setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); + QVBoxLayout *vboxLayout = new QVBoxLayout(); + setLayout(vboxLayout); + vboxLayout->setContentsMargins(0, 0, 0, 0); + Utils::DetailsWidget *detailsWidget = new Utils::DetailsWidget(this); + detailsWidget->setUseCheckBox(false); + detailsWidget->setSummaryText(tr("Import Build from...")); + detailsWidget->setSummaryFontBold(true); + // m_detailsWidget->setIcon(); // FIXME: Set icon! + vboxLayout->addWidget(detailsWidget); + + QWidget *widget = new QWidget; + QVBoxLayout *layout = new QVBoxLayout(widget); + layout->setContentsMargins(0, 0, 0, 0); + layout->addWidget(m_pathChooser); + + m_pathChooser->setExpectedKind(Utils::PathChooser::ExistingDirectory); + QPushButton *importButton = new QPushButton(tr("Import"), widget); + layout->addWidget(importButton); + + connect(importButton, SIGNAL(clicked()), this, SLOT(handleImportRequest())); + + detailsWidget->setWidget(widget); +} + +ImportWidget::~ImportWidget() +{ } + +void ImportWidget::setCurrentDirectory(const Utils::FileName &dir) +{ + m_pathChooser->setBaseFileName(dir); + m_pathChooser->setFileName(dir); +} + +void ImportWidget::handleImportRequest() +{ + Utils::FileName dir = m_pathChooser->fileName(); + emit importFrom(dir); + + m_pathChooser->setFileName(m_pathChooser->baseFileName()); +} + +} // namespace Internal +} // namespace Qt4ProjectManager diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptarget.h b/src/plugins/qt4projectmanager/wizards/importwidget.h index e572c979df..be7f71f78e 100644 --- a/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptarget.h +++ b/src/plugins/qt4projectmanager/wizards/importwidget.h @@ -30,36 +30,39 @@ ** **************************************************************************/ -#ifndef QT4DESKTOPTARGET_H -#define QT4DESKTOPTARGET_H +#ifndef IMPORTWIDGET_H +#define IMPORTWIDGET_H -#include "qt4target.h" +#include <QWidget> -namespace Qt4ProjectManager { +#include <utils/fileutils.h> -class Qt4Project; -class Qt4BuildConfigurationFactory; +namespace Utils { class PathChooser; } +namespace Qt4ProjectManager { namespace Internal { -class Qt4DesktopTarget : public Qt4BaseTarget +class ImportWidget : public QWidget { - friend class Qt4DesktopTargetFactory; Q_OBJECT + public: - Qt4DesktopTarget(Qt4Project *parent, const Core::Id id); - ~Qt4DesktopTarget(); + explicit ImportWidget(QWidget *parent = 0); + ~ImportWidget(); - static QString defaultDisplayName(); - ProjectExplorer::IBuildConfigurationFactory *buildConfigurationFactory() const; + void setCurrentDirectory(const Utils::FileName &dir); - void createApplicationProFiles(bool reparse); - QList<ProjectExplorer::RunConfiguration *> runConfigurationsForNode(ProjectExplorer::Node *n); +signals: + void importFrom(const Utils::FileName &dir); + +private slots: + void handleImportRequest(); private: - Qt4BuildConfigurationFactory *m_buildConfigurationFactory; + Utils::PathChooser *m_pathChooser; }; } // namespace Internal } // namespace Qt4ProjectManager -#endif // QT4DESKTOPTARGET_H + +#endif // IMPORTWIDGET_H diff --git a/src/plugins/qt4projectmanager/wizards/librarywizarddialog.cpp b/src/plugins/qt4projectmanager/wizards/librarywizarddialog.cpp index 02927a41fd..62e8ff464f 100644 --- a/src/plugins/qt4projectmanager/wizards/librarywizarddialog.cpp +++ b/src/plugins/qt4projectmanager/wizards/librarywizarddialog.cpp @@ -39,6 +39,8 @@ #include "abstractmobileapp.h" #include "qt4projectmanagerconstants.h" +#include <qtsupport/qtsupportconstants.h> + #include <utils/projectintropage.h> #include <QDebug> @@ -235,7 +237,7 @@ int LibraryWizardDialog::nextId() const int next = m_modulesPageId; - const bool symbianTargetEnabled = isTargetSelected(Core::Id(Constants::S60_DEVICE_TARGET_ID)); + const bool symbianTargetEnabled = isQtPlatformSelected(QtSupport::Constants::SYMBIAN_PLATFORM); // If there was no Symbian target defined we omit "Symbian specific" step // We also omit this step if the library type is not dll diff --git a/src/plugins/qt4projectmanager/wizards/qtwizard.cpp b/src/plugins/qt4projectmanager/wizards/qtwizard.cpp index 511e6e13fd..c2b8e78363 100644 --- a/src/plugins/qt4projectmanager/wizards/qtwizard.cpp +++ b/src/plugins/qt4projectmanager/wizards/qtwizard.cpp @@ -35,7 +35,6 @@ #include "qt4project.h" #include "qt4projectmanager.h" #include "qt4projectmanagerconstants.h" -#include "qt4target.h" #include "modulespage.h" #include "targetsetuppage.h" @@ -44,8 +43,11 @@ #include <cpptools/cpptoolsconstants.h> +#include <projectexplorer/profile.h> #include <projectexplorer/projectexplorer.h> #include <projectexplorer/task.h> +#include <qtsupport/qtprofileinformation.h> +#include <qtsupport/qtsupportconstants.h> #include <extensionsystem/pluginmanager.h> @@ -172,7 +174,7 @@ CustomQt4ProjectWizard::CustomQt4ProjectWizard(const Core::BaseFileWizardParamet initProjectWizardDialog(wizard, wizardDialogParameters.defaultPath(), wizardDialogParameters.extensionPages()); if (wizard->pageIds().contains(targetPageId)) qWarning("CustomQt4ProjectWizard: Unable to insert target page at %d", int(targetPageId)); - wizard->addTargetSetupPage(QSet<QString>(), false, targetPageId); + wizard->addTargetSetupPage(false, targetPageId); return wizard; } @@ -237,19 +239,20 @@ int BaseQt4ProjectWizardDialog::addModulesPage(int id) return newId; } -int BaseQt4ProjectWizardDialog::addTargetSetupPage(QSet<QString> targets, bool mobile, int id) +int BaseQt4ProjectWizardDialog::addTargetSetupPage(bool mobile, int id) { m_targetSetupPage = new TargetSetupPage; - m_targetSetupPage->setSelectedPlatform(selectedPlatform()); - m_targetSetupPage->setRequiredQtFeatures(requiredFeatures()); - m_targets = targets; - resize(900, 450); + const QString platform = selectedPlatform(); + Core::FeatureSet features = mobile ? Core::FeatureSet(QtSupport::Constants::FEATURE_MOBILE) + : Core::FeatureSet(QtSupport::Constants::FEATURE_DESKTOP); + if (platform.isEmpty()) + m_targetSetupPage->setPreferredProfileMatcher(new QtSupport::QtVersionProfileMatcher(features)); + else + m_targetSetupPage->setPreferredProfileMatcher(new QtSupport::QtPlatformProfileMatcher(platform)); - if (mobile) { - m_targetSetupPage->setPreferredFeatures(QSet<QString>() << QLatin1String(Constants::MOBILE_TARGETFEATURE_ID)); - } else { - m_targetSetupPage->setPreferredFeatures(QSet<QString>() << QLatin1String(Constants::DESKTOP_TARGETFEATURE_ID)); - } + m_targetSetupPage->setRequiredProfileMatcher(new QtSupport::QtVersionProfileMatcher(requiredFeatures())); + + resize(900, 450); if (id >= 0) setPage(id, m_targetSetupPage); @@ -315,9 +318,9 @@ bool BaseQt4ProjectWizardDialog::setupProject(Qt4Project *project) const return m_targetSetupPage->setupProject(project); } -bool BaseQt4ProjectWizardDialog::isTargetSelected(Core::Id targetid) const +bool BaseQt4ProjectWizardDialog::isQtPlatformSelected(const QString &platform) const { - return m_targetSetupPage->isTargetSelected(targetid); + return m_targetSetupPage->isQtPlatformSelected(platform); } void BaseQt4ProjectWizardDialog::addExtensionPages(const QList<QWizardPage *> &wizardPageList) @@ -333,10 +336,3 @@ void BaseQt4ProjectWizardDialog::generateProfileName(const QString &name, const + name + QLatin1String(".pro")); m_targetSetupPage->setProFilePath(proFile); } - -QSet<QString> BaseQt4ProjectWizardDialog::desktopTarget() -{ - QSet<QString> rc; - rc.insert(QLatin1String(Constants::DESKTOP_TARGET_ID)); - return rc; -} diff --git a/src/plugins/qt4projectmanager/wizards/qtwizard.h b/src/plugins/qt4projectmanager/wizards/qtwizard.h index e1f5aac2e3..1882fc98e3 100644 --- a/src/plugins/qt4projectmanager/wizards/qtwizard.h +++ b/src/plugins/qt4projectmanager/wizards/qtwizard.h @@ -41,6 +41,8 @@ #include <QSet> +namespace ProjectExplorer { class Profile; } + namespace Qt4ProjectManager { class Qt4Project; @@ -130,9 +132,7 @@ public: virtual ~BaseQt4ProjectWizardDialog(); int addModulesPage(int id = -1); - int addTargetSetupPage(QSet<QString> targets = QSet<QString>(), bool mobile = false, int id = -1); - - static QSet<QString> desktopTarget(); + int addTargetSetupPage(bool mobile = false, int id = -1); QStringList selectedModulesList() const; void setSelectedModules(const QString &, bool lock = false); @@ -142,7 +142,7 @@ public: bool writeUserFile(const QString &proFileName) const; bool setupProject(Qt4Project *project) const; - bool isTargetSelected(Core::Id targetid) const; + bool isQtPlatformSelected(const QString &platform) const; void addExtensionPages(const QList<QWizardPage *> &wizardPageList); @@ -156,7 +156,6 @@ private: TargetSetupPage *m_targetSetupPage; QStringList m_selectedModules; QStringList m_deselectedModules; - QSet<QString> m_targets; }; } // namespace Internal diff --git a/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp b/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp index 1706cd37e3..96865f4e2b 100644 --- a/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp +++ b/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp @@ -31,212 +31,170 @@ **************************************************************************/ #include "targetsetuppage.h" +#include "importwidget.h" #include "ui_targetsetuppage.h" #include "buildconfigurationinfo.h" +#include "qt4buildconfiguration.h" #include "qt4project.h" -#include "qt4projectmanager.h" #include "qt4projectmanagerconstants.h" -#include "qt4target.h" -#include "qt4basetargetfactory.h" +#include "qmakeprofileinformation.h" -#include <extensionsystem/pluginmanager.h> -#include <projectexplorer/task.h> -#include <projectexplorer/taskhub.h> -#include <projectexplorer/toolchainmanager.h> +#include <projectexplorer/target.h> #include <projectexplorer/toolchain.h> +#include <qtsupport/qtprofileinformation.h> +#include <qtsupport/qtsupportconstants.h> #include <qtsupport/qtversionfactory.h> -#include <utils/qtcassert.h> #include <utils/qtcprocess.h> #include <QLabel> -#include <QLayout> +#include <QMessageBox> using namespace Qt4ProjectManager; +static const Core::Id QT_IS_TEMPORARY("Qt4PM.TempQt"); +static const Core::Id PROFILE_IS_TEMPORARY("Qt4PM.TempProfile"); +static const Core::Id TEMPORARY_OF_PROJECTS("Qt4PM.TempProject"); + TargetSetupPage::TargetSetupPage(QWidget *parent) : QWizardPage(parent), + m_requiredMatcher(0), + m_preferredMatcher(0), + m_baseLayout(0), m_importSearch(false), - m_useScrollArea(true), - m_maximumQtVersionNumber(INT_MAX, INT_MAX, INT_MAX), - m_spacer(new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding)), - m_ignoreQtVersionChange(false), - m_ui(new Internal::Ui::TargetSetupPage) + m_firstWidget(0), + m_ui(new Internal::Ui::TargetSetupPage), + m_importWidget(new Internal::ImportWidget), + m_spacer(new QSpacerItem(0,0, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding)) { + setObjectName(QLatin1String("TargetSetupPage")); m_ui->setupUi(this); + QWidget *centralWidget = new QWidget(this); m_ui->scrollArea->setWidget(centralWidget); centralWidget->setLayout(new QVBoxLayout); m_ui->centralWidget->setLayout(new QVBoxLayout); m_ui->centralWidget->layout()->setMargin(0); + setUseScrollArea(true); + setImportSearch(false); + setTitle(tr("Target Setup")); connect(m_ui->descriptionLabel, SIGNAL(linkActivated(QString)), this, SIGNAL(noteTextLinkActivated())); - connect(QtSupport::QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>,QList<int>,QList<int>)), - this, SLOT(qtVersionsChanged(QList<int>,QList<int>,QList<int>))); + ProjectExplorer::ProfileManager *sm = ProjectExplorer::ProfileManager::instance(); + connect(sm, SIGNAL(profileAdded(ProjectExplorer::Profile*)), + this, SLOT(handleProfileAddition(ProjectExplorer::Profile*))); + connect(sm, SIGNAL(profileRemoved(ProjectExplorer::Profile*)), + this, SLOT(handleProfileRemoval(ProjectExplorer::Profile*))); + connect(sm, SIGNAL(profileUpdated(ProjectExplorer::Profile*)), + this, SLOT(handleProfileUpdate(ProjectExplorer::Profile*))); + connect(m_importWidget, SIGNAL(importFrom(Utils::FileName)), + this, SLOT(import(Utils::FileName))); } void TargetSetupPage::initializePage() { - cleanupImportInfos(); - deleteWidgets(); + reset(); - setupImportInfos(); setupWidgets(); + setupImports(); + selectAtLeastOneTarget(); } -TargetSetupPage::~TargetSetupPage() +void TargetSetupPage::setRequiredProfileMatcher(ProjectExplorer::ProfileMatcher *matcher) { - deleteWidgets(); - delete m_ui; - cleanupImportInfos(); + m_requiredMatcher = matcher; } -bool TargetSetupPage::isTargetSelected(Core::Id id) const +void TargetSetupPage::setPreferredProfileMatcher(ProjectExplorer::ProfileMatcher *matcher) { - Qt4TargetSetupWidget *widget = m_widgets.value(id); - return widget && widget->isTargetSelected(); + m_preferredMatcher = matcher; } -bool TargetSetupPage::isComplete() const -{ - foreach (Qt4TargetSetupWidget *widget, m_widgets) - if (widget->isTargetSelected()) - return true; - return false; -} - -void TargetSetupPage::setPreferredFeatures(const QSet<QString> &featureIds) -{ - m_preferredFeatures = featureIds; -} - -void TargetSetupPage::setRequiredTargetFeatures(const QSet<QString> &featureIds) +TargetSetupPage::~TargetSetupPage() { - m_requiredTargetFeatures = featureIds; + reset(); + delete m_ui; + delete m_preferredMatcher; + delete m_requiredMatcher; } -void TargetSetupPage::setRequiredQtFeatures(const Core::FeatureSet &features) +bool TargetSetupPage::isProfileSelected(Core::Id id) const { - m_requiredQtFeatures = features; + Qt4TargetSetupWidget *widget = m_widgets.value(id); + return widget && widget->isTargetSelected(); } -void TargetSetupPage::setSelectedPlatform(const QString &platform) +void TargetSetupPage::setProfileSelected(Core::Id id, bool selected) { - m_selectedPlatform = platform; + Qt4TargetSetupWidget *widget = m_widgets.value(id); + if (widget) + widget->setTargetSelected(selected); } -void TargetSetupPage::setMinimumQtVersion(const QtSupport::QtVersionNumber &number) +bool TargetSetupPage::isQtPlatformSelected(const QString &platform) const { - m_minimumQtVersionNumber = number; + QtSupport::QtPlatformProfileMatcher matcher(platform); + QList<ProjectExplorer::Profile *> profileList = ProjectExplorer::ProfileManager::instance()->profiles(&matcher); + foreach (ProjectExplorer::Profile *p, profileList) { + if (isProfileSelected(p->id())) + return true; + } + return false; } -void TargetSetupPage::setMaximumQtVersion(const QtSupport::QtVersionNumber &number) +bool TargetSetupPage::isComplete() const { - m_maximumQtVersionNumber = number; + foreach (Qt4TargetSetupWidget *widget, m_widgets.values()) + if (widget->isTargetSelected()) + return true; + return false; } void TargetSetupPage::setImportSearch(bool b) { m_importSearch = b; + m_importWidget->setVisible(b); } void TargetSetupPage::setupWidgets() { - QLayout *layout = 0; - if (m_useScrollArea) - layout = m_ui->scrollArea->widget()->layout(); - else - layout = m_ui->centralWidget->layout(); - - // Target Page setup - QList<Qt4BaseTargetFactory *> factories = ExtensionSystem::PluginManager::getObjects<Qt4BaseTargetFactory>(); - bool atLeastOneTargetSelected = false; - foreach (Qt4BaseTargetFactory *factory, factories) { - QList<Core::Id> ids = factory->supportedTargetIds(); - foreach (Core::Id id, ids) { - if (!factory->targetFeatures(id).contains(m_requiredTargetFeatures)) - continue; + // Known profiles: + foreach (ProjectExplorer::Profile *p, ProjectExplorer::ProfileManager::instance()->profiles(m_requiredMatcher)) + addWidget(p); + + // Setup import widget: + m_baseLayout->addWidget(m_importWidget); + Utils::FileName path = Utils::FileName::fromString(m_proFilePath); + path = path.parentDir(); // base dir + path = path.parentDir(); // parent dir + m_importWidget->setCurrentDirectory(path); + + updateVisibility(); +} - QList<BuildConfigurationInfo> infos = BuildConfigurationInfo::filterBuildConfigurationInfos(m_importInfos, id); - const QList<BuildConfigurationInfo> platformFilteredInfos = - BuildConfigurationInfo::filterBuildConfigurationInfosByPlatform(factory->availableBuildConfigurations(id, - m_proFilePath, - m_minimumQtVersionNumber, - m_maximumQtVersionNumber, - m_requiredQtFeatures), - m_selectedPlatform); - - - Qt4TargetSetupWidget *widget = - factory->createTargetSetupWidget(id, m_proFilePath, - m_minimumQtVersionNumber, - m_maximumQtVersionNumber, - m_requiredQtFeatures, - m_importSearch, infos); - if (widget) { - bool selectTarget = false; - if (!m_importInfos.isEmpty()) { - selectTarget = !infos.isEmpty(); - } else { - if (!m_preferredFeatures.isEmpty()) { - selectTarget = factory->targetFeatures(id).contains(m_preferredFeatures) - && factory->selectByDefault(id); - } - if (!m_selectedPlatform.isEmpty()) { - selectTarget = !platformFilteredInfos.isEmpty(); - } - } - widget->setTargetSelected(selectTarget); - atLeastOneTargetSelected |= selectTarget; - m_widgets.insert(id, widget); - m_factories.insert(widget, factory); - layout->addWidget(widget); - connect(widget, SIGNAL(selectedToggled()), - this, SIGNAL(completeChanged())); - connect(widget, SIGNAL(newImportBuildConfiguration(BuildConfigurationInfo)), - this, SLOT(newImportBuildConfiguration(BuildConfigurationInfo))); +void TargetSetupPage::reset() +{ + foreach (Qt4TargetSetupWidget *widget, m_widgets.values()) { + ProjectExplorer::Profile *p = widget->profile(); + Q_ASSERT(p); + if (p->hasValue(PROFILE_IS_TEMPORARY) && !m_proFilePath.isEmpty()) { + QStringList projects = p->value(TEMPORARY_OF_PROJECTS, QStringList()).toStringList(); + if (projects.contains(m_proFilePath)) { + projects.removeOne(m_proFilePath); + p->setValue(TEMPORARY_OF_PROJECTS, projects); + if (projects.isEmpty()) + ProjectExplorer::ProfileManager::instance()->deregisterProfile(p); } } + delete widget; } - if (!atLeastOneTargetSelected) { - Qt4TargetSetupWidget *widget = m_widgets.value(Core::Id(Constants::DESKTOP_TARGET_ID)); - if (widget) - widget->setTargetSelected(true); - } - - if (m_useScrollArea) - layout->addItem(m_spacer); - if (m_widgets.isEmpty()) { - // Oh no one can create any targets - m_ui->scrollArea->setVisible(false); - m_ui->centralWidget->setVisible(false); - m_ui->descriptionLabel->setVisible(false); - m_ui->noValidQtVersionsLabel->setVisible(true); - } else { - m_ui->scrollArea->setVisible(m_useScrollArea); - m_ui->centralWidget->setVisible(!m_useScrollArea); - m_ui->descriptionLabel->setVisible(true); - m_ui->noValidQtVersionsLabel->setVisible(false); - } -} -void TargetSetupPage::deleteWidgets() -{ - QLayout *layout = 0; - if (m_useScrollArea) - layout = m_ui->scrollArea->widget()->layout(); - else - layout = m_ui->centralWidget->layout(); - foreach (Qt4TargetSetupWidget *widget, m_widgets) - delete widget; m_widgets.clear(); - m_factories.clear(); - if (m_useScrollArea) - layout->removeItem(m_spacer); + m_firstWidget = 0; } void TargetSetupPage::setProFilePath(const QString &path) @@ -247,7 +205,7 @@ void TargetSetupPage::setProFilePath(const QString &path) "%1: Project name").arg(QFileInfo(m_proFilePath).baseName())); } - deleteWidgets(); + reset(); setupWidgets(); } @@ -256,153 +214,290 @@ void TargetSetupPage::setNoteText(const QString &text) m_ui->descriptionLabel->setText(text); } -void TargetSetupPage::setupImportInfos() +void TargetSetupPage::import(const Utils::FileName &path) { - if (m_importSearch) - m_importInfos = BuildConfigurationInfo::importBuildConfigurations(m_proFilePath); + import(path, false); } -void TargetSetupPage::cleanupImportInfos() +void TargetSetupPage::import(const Utils::FileName &path, const bool silent) { - // The same qt version can be twice in the list, for the following case - // A Project with two import build using the same already existing qt version - // If that qt version is deleted, it is replaced by ONE temporary qt version - // So two entries in m_importInfos refer to the same qt version - QSet<QtSupport::BaseQtVersion *> alreadyDeleted; - foreach (const BuildConfigurationInfo &info, m_importInfos) { - if (info.temporaryQtVersion) { - if (!alreadyDeleted.contains(info.temporaryQtVersion)) { - alreadyDeleted << info.temporaryQtVersion; - delete info.temporaryQtVersion; + QFileInfo fi = path.toFileInfo(); + if (!fi.exists() && !fi.isDir()) + return; + + QStringList makefiles = QDir(path.toString()).entryList(QStringList(QLatin1String("Makefile*"))); + + QtSupport::BaseQtVersion *version = 0; + bool temporaryVersion = false; + ProjectExplorer::Profile *profile = 0; + + QtSupport::QtVersionManager *vm = QtSupport::QtVersionManager::instance(); + ProjectExplorer::ProfileManager *pm = ProjectExplorer::ProfileManager::instance(); + bool found = false; + + foreach (const QString &file, makefiles) { + // find interesting makefiles + QString makefile = path.toString() + QLatin1Char('/') + file; + Utils::FileName qmakeBinary = QtSupport::QtVersionManager::findQMakeBinaryFromMakefile(makefile); + if (qmakeBinary.isEmpty()) + continue; + if (QtSupport::QtVersionManager::makefileIsFor(makefile, m_proFilePath) != QtSupport::QtVersionManager::SameProject) + continue; + + // Find version: + version = vm->qtVersionForQMakeBinary(qmakeBinary); + if (!version) { + version = QtSupport::QtVersionFactory::createQtVersionFromQMakePath(qmakeBinary); + if (!version) + continue; + + vm->addVersion(version); + temporaryVersion = true; + } + + // find qmake arguments and mkspec + QPair<QtSupport::BaseQtVersion::QmakeBuildConfigs, QString> makefileBuildConfig = + QtSupport::QtVersionManager::scanMakeFile(makefile, version->defaultBuildConfig()); + + QString additionalArguments = makefileBuildConfig.second; + Utils::FileName parsedSpec = + Qt4BuildConfiguration::extractSpecFromArguments(&additionalArguments, path.toString(), version); + Utils::FileName versionSpec = version->mkspec(); + + QString specArgument; + // Compare mkspecs and add to additional arguments + if (parsedSpec.isEmpty() || parsedSpec == versionSpec + || parsedSpec == Utils::FileName::fromString(QLatin1String("default"))) { + // using the default spec, don't modify additional arguments + } else { + specArgument = QLatin1String("-spec ") + Utils::QtcProcess::quoteArg(parsedSpec.toUserOutput()); + } + Utils::QtcProcess::addArgs(&specArgument, additionalArguments); + + // Find profile: + foreach (ProjectExplorer::Profile *p, pm->profiles()) { + QtSupport::BaseQtVersion *profileVersion = QtSupport::QtProfileInformation::qtVersion(p); + Utils::FileName profileSpec = QmakeProfileInformation::mkspec(p); + if (profileVersion == version + && profileSpec == parsedSpec) { + Q_ASSERT(!temporaryVersion); + profile = p; } } + if (!profile) { + profile = new ProjectExplorer::Profile; + profile->setDisplayName(version->displayName()); + QtSupport::QtProfileInformation::setQtVersion(profile, version); + QmakeProfileInformation::setMkspec(profile, parsedSpec); + ProjectExplorer::ToolChainProfileInformation::setToolChain(profile, + version->preferredToolChain(parsedSpec)); + + profile->setValue(PROFILE_IS_TEMPORARY, true); + profile->setValue(TEMPORARY_OF_PROJECTS, QStringList() << m_proFilePath); + if (temporaryVersion) + profile->setValue(QT_IS_TEMPORARY, version->uniqueId()); + + pm->registerProfile(profile); + } else if (profile->hasValue(PROFILE_IS_TEMPORARY)) { + QStringList profiles = profile->value(TEMPORARY_OF_PROJECTS, QStringList()).toStringList(); + Q_ASSERT(!profiles.contains(m_proFilePath)); + profiles.append(m_proFilePath); + profile->setValue(PROFILE_IS_TEMPORARY, profiles); + } + + // Create widget: + Qt4TargetSetupWidget *widget = m_widgets.value(profile->id(), 0); + if (!widget) + addWidget(profile); + widget = m_widgets.value(profile->id(), 0); + if (!widget) + continue; + + // create info: + BuildConfigurationInfo info = BuildConfigurationInfo(makefileBuildConfig.first, + specArgument, + path.toString(), + true, + file); + + widget->addBuildConfigurationInfo(info, true); + widget->setTargetSelected(true); + found = true; } - m_importInfos.clear(); + + updateVisibility(); + + if (!found && !silent) + QMessageBox::critical(this, + tr("No Build Found"), + tr("No build found in %1 matching project %2.").arg(path.toUserOutput()).arg(m_proFilePath)); } -void TargetSetupPage::newImportBuildConfiguration(const BuildConfigurationInfo &info) +void TargetSetupPage::handleQtUpdate(const QList<int> &add, const QList<int> &rm, const QList<int> &mod) { - m_importInfos.append(info); + Q_UNUSED(add); + // Update Profile to no longer claim a Qt version is temporary once it is modified/removed. + foreach (ProjectExplorer::Profile *p, ProjectExplorer::ProfileManager::instance()->profiles()) { + if (!p->hasValue(QT_IS_TEMPORARY)) + continue; + int qtVersion = p->value(QT_IS_TEMPORARY, -1).toInt(); + if (rm.contains(qtVersion) || mod.contains(qtVersion)) + p->removeKey(QT_IS_TEMPORARY); + } } -void TargetSetupPage::qtVersionsChanged(const QList<int> &added, const QList<int> &removed, const QList<int> &changed) +void TargetSetupPage::setupImports() { - Q_UNUSED(added) - if (m_ignoreQtVersionChange) + if (!m_importSearch || m_proFilePath.isEmpty()) return; - QMap<Core::Id, Qt4TargetSetupWidget *>::iterator it, end; - end = m_widgets.end(); - it = m_widgets.begin(); - for ( ; it != end; ++it) { - Qt4BaseTargetFactory *factory = m_factories.value(it.value()); - it.value()->updateBuildConfigurationInfos(factory->availableBuildConfigurations(it.key(), - m_proFilePath, - m_minimumQtVersionNumber, - m_maximumQtVersionNumber, - m_requiredQtFeatures)); - } - QtSupport::QtVersionManager *mgr = QtSupport::QtVersionManager::instance(); - for (int i = 0; i < m_importInfos.size(); ++i) { - if (QtSupport::BaseQtVersion *tmpVersion = m_importInfos[i].temporaryQtVersion) { - // Check whether we have a qt version now - QtSupport::BaseQtVersion *version = - mgr->qtVersionForQMakeBinary(tmpVersion->qmakeCommand()); - if (version) - replaceTemporaryQtVersion(tmpVersion, version->uniqueId()); - } else { - // Check whether we need to replace the qt version id - int oldId = m_importInfos[i].qtVersionId; - if (removed.contains(oldId) || changed.contains(oldId)) { - QString makefile = m_importInfos[i].directory + QLatin1Char('/') + m_importInfos[i].makefile; - Utils::FileName qmakeBinary = QtSupport::QtVersionManager::findQMakeBinaryFromMakefile(makefile); - QtSupport::BaseQtVersion *version = QtSupport::QtVersionManager::instance()->qtVersionForQMakeBinary(qmakeBinary); - if (version) { - replaceQtVersionWithQtVersion(oldId, version->uniqueId()); - } else { - version = QtSupport::QtVersionFactory::createQtVersionFromQMakePath(qmakeBinary); - replaceQtVersionWithTemporaryQtVersion(oldId, version); - } - } + QString sourceDir = QFileInfo(m_proFilePath).absolutePath(); + import(Utils::FileName::fromString(sourceDir), true); + + QList<ProjectExplorer::Profile *> profiles = ProjectExplorer::ProfileManager::instance()->profiles(); + foreach (ProjectExplorer::Profile *p, profiles) { + QFileInfo fi(Qt4Project::shadowBuildDirectory(m_proFilePath, p, QString())); + const QString baseDir = fi.absolutePath(); + const QString prefix = fi.baseName(); + + foreach (const QString &dir, QDir(baseDir).entryList()) { + if (dir.startsWith(prefix)) + import(Utils::FileName::fromString(baseDir + QLatin1Char('/') + dir), true); } } } -void TargetSetupPage::replaceQtVersionWithQtVersion(int oldId, int newId) +void TargetSetupPage::handleProfileAddition(ProjectExplorer::Profile *p) { - for (int i = 0; i < m_importInfos.size(); ++i) { - if (m_importInfos[i].qtVersionId == oldId) { - m_importInfos[i].qtVersionId = newId; - } - } - QMap<Core::Id, Qt4TargetSetupWidget *>::const_iterator it, end; - it = m_widgets.constBegin(); - end = m_widgets.constEnd(); - for ( ; it != end; ++it) - (*it)->replaceQtVersionWithQtVersion(oldId, newId); + Q_ASSERT(!m_widgets.contains(p->id())); + addWidget(p); + updateVisibility(); } -void TargetSetupPage::replaceQtVersionWithTemporaryQtVersion(int id, QtSupport::BaseQtVersion *version) +void TargetSetupPage::handleProfileRemoval(ProjectExplorer::Profile *p) { - for (int i = 0; i < m_importInfos.size(); ++i) { - if (m_importInfos[i].qtVersionId == id) { - m_importInfos[i].temporaryQtVersion = version; - m_importInfos[i].qtVersionId = -1; + QtSupport::QtVersionManager *vm = QtSupport::QtVersionManager::instance(); + QtSupport::BaseQtVersion *version = vm->version(p->value(QT_IS_TEMPORARY, -1).toInt()); + if (version) + vm->removeVersion(version); + + removeWidget(p); + updateVisibility(); +} + +void TargetSetupPage::handleProfileUpdate(ProjectExplorer::Profile *p) +{ + p->removeKey(PROFILE_IS_TEMPORARY); + p->removeKey(QT_IS_TEMPORARY); + p->removeKey(TEMPORARY_OF_PROJECTS); + + Qt4TargetSetupWidget *widget = m_widgets.value(p->id()); + + bool acceptable = true; + if (m_requiredMatcher && !m_requiredMatcher->matches(p)) + acceptable = false; + + if (widget && !acceptable) + removeWidget(p); + else if (!widget && acceptable) + addWidget(p); + + updateVisibility(); +} + +void TargetSetupPage::selectAtLeastOneTarget() +{ + bool atLeastOneTargetSelected = false; + foreach (Qt4TargetSetupWidget *w, m_widgets.values()) { + if (w->isTargetSelected()) { + atLeastOneTargetSelected = true; + break; } } - QMap<Core::Id, Qt4TargetSetupWidget *>::const_iterator it, end; - it = m_widgets.constBegin(); - end = m_widgets.constEnd(); - for ( ; it != end; ++it) - (*it)->replaceQtVersionWithTemporaryQtVersion(id, version); + + if (!atLeastOneTargetSelected) { + Qt4TargetSetupWidget *widget = m_firstWidget; + ProjectExplorer::Profile *defaultProfile = ProjectExplorer::ProfileManager::instance()->defaultProfile(); + widget = m_widgets.value(defaultProfile->id(), m_firstWidget); + if (widget) + widget->setTargetSelected(true); + m_firstWidget = 0; + } + emit completeChanged(); // Is this necessary? } -void TargetSetupPage::replaceTemporaryQtVersion(QtSupport::BaseQtVersion *version, int id) +void TargetSetupPage::updateVisibility() { - for (int i = 0; i < m_importInfos.size(); ++i) { - if (m_importInfos[i].temporaryQtVersion == version) { - m_importInfos[i].temporaryQtVersion = 0; - m_importInfos[i].qtVersionId = id; - } + if (m_widgets.isEmpty()) { + // Oh no one can create any targets + m_ui->scrollAreaWidget->setVisible(false); + m_ui->centralWidget->setVisible(false); + m_ui->descriptionLabel->setVisible(false); + m_ui->noValidProfileLabel->setVisible(true); + } else { + m_ui->scrollAreaWidget->setVisible(m_baseLayout == m_ui->scrollArea->widget()->layout()); + m_ui->centralWidget->setVisible(m_baseLayout == m_ui->centralWidget->layout()); + m_ui->descriptionLabel->setVisible(true); + m_ui->noValidProfileLabel->setVisible(false); } - QMap<Core::Id, Qt4TargetSetupWidget *>::const_iterator it, end; - it = m_widgets.constBegin(); - end = m_widgets.constEnd(); - for ( ; it != end; ++it) - (*it)->replaceTemporaryQtVersionWithQtVersion(version, id); + + emit completeChanged(); +} + +void TargetSetupPage::removeWidget(ProjectExplorer::Profile *p) +{ + Qt4TargetSetupWidget *widget = m_widgets.value(p->id()); + if (!widget) + return; + if (widget == m_firstWidget) + m_firstWidget = 0; + widget->deleteLater(); + m_widgets.remove(p->id()); +} + +Qt4TargetSetupWidget *TargetSetupPage::addWidget(ProjectExplorer::Profile *p) +{ + if (m_requiredMatcher && !m_requiredMatcher->matches(p)) + return 0; + + QList<BuildConfigurationInfo> infoList = Qt4BuildConfigurationFactory::availableBuildConfigurations(p, m_proFilePath); + Qt4TargetSetupWidget *widget = infoList.isEmpty() ? 0 : new Qt4TargetSetupWidget(p, m_proFilePath, infoList); + if (!widget) + return 0; + + m_baseLayout->removeWidget(m_importWidget); + m_baseLayout->removeItem(m_spacer); + + widget->setTargetSelected(m_preferredMatcher && m_preferredMatcher->matches(p)); + m_widgets.insert(p->id(), widget); + m_baseLayout->addWidget(widget); + + m_baseLayout->addWidget(m_importWidget); + m_baseLayout->addItem(m_spacer); + + connect(widget, SIGNAL(selectedToggled()), + this, SIGNAL(completeChanged())); + + if (!m_firstWidget) + m_firstWidget = widget; + + return widget; } bool TargetSetupPage::setupProject(Qt4ProjectManager::Qt4Project *project) { - m_ignoreQtVersionChange = true; - QtSupport::QtVersionManager *mgr = QtSupport::QtVersionManager::instance(); - QMap<Core::Id, Qt4TargetSetupWidget *>::const_iterator it, end; - end = m_widgets.constEnd(); - it = m_widgets.constBegin(); - - QSet<QtSupport::BaseQtVersion *> temporaryQtVersions; - for ( ; it != end; ++it) - foreach (QtSupport::BaseQtVersion *tempVersion, it.value()->usedTemporaryQtVersions()) - temporaryQtVersions.insert(tempVersion); - - foreach (QtSupport::BaseQtVersion *tempVersion, temporaryQtVersions) { - QtSupport::BaseQtVersion *version = mgr->qtVersionForQMakeBinary(tempVersion->qmakeCommand()); - if (version) { - replaceTemporaryQtVersion(tempVersion, version->uniqueId()); - delete tempVersion; - } else { - mgr->addVersion(tempVersion); - replaceTemporaryQtVersion(tempVersion, tempVersion->uniqueId()); - } - } + foreach (Qt4TargetSetupWidget *widget, m_widgets.values()) { + if (!widget->isTargetSelected()) + continue; + + ProjectExplorer::Profile *p = widget->profile(); - m_ignoreQtVersionChange = false; + // Persist profile: + p->removeKey(PROFILE_IS_TEMPORARY); + p->removeKey(QT_IS_TEMPORARY); + p->removeKey(TEMPORARY_OF_PROJECTS); - it = m_widgets.constBegin(); - for ( ; it != end; ++it) { - Qt4BaseTargetFactory *factory = m_factories.value(it.value()); - if (ProjectExplorer::Target *target = factory->create(project, it.key(), it.value())) - project->addTarget(target); + project->addTarget(project->createTarget(p, widget->selectedBuildConfigurationInfoList())); } // Select active target @@ -412,9 +507,10 @@ bool TargetSetupPage::setupProject(Qt4ProjectManager::Qt4Project *project) ProjectExplorer::Target *activeTarget = 0; QList<ProjectExplorer::Target *> targets = project->targets(); foreach (ProjectExplorer::Target *t, targets) { - if (t->id() == Core::Id(Constants::QT_SIMULATOR_TARGET_ID)) + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(t->profile()); + if (version && version->type() == QLatin1String(QtSupport::Constants::SIMULATORQT)) activeTarget = t; - else if (!activeTarget && t->id() == Core::Id(Constants::DESKTOP_TARGET_ID)) + else if (!activeTarget && version && version->type() == QLatin1String(QtSupport::Constants::DESKTOPQT)) activeTarget = t; } if (!activeTarget && !targets.isEmpty()) @@ -427,5 +523,7 @@ bool TargetSetupPage::setupProject(Qt4ProjectManager::Qt4Project *project) void TargetSetupPage::setUseScrollArea(bool b) { - m_useScrollArea = b; + m_baseLayout = b ? m_ui->scrollArea->widget()->layout() : m_ui->centralWidget->layout(); + m_ui->scrollAreaWidget->setVisible(b); + m_ui->centralWidget->setVisible(!b); } diff --git a/src/plugins/qt4projectmanager/wizards/targetsetuppage.h b/src/plugins/qt4projectmanager/wizards/targetsetuppage.h index 1ff858eb79..6658fd4d47 100644 --- a/src/plugins/qt4projectmanager/wizards/targetsetuppage.h +++ b/src/plugins/qt4projectmanager/wizards/targetsetuppage.h @@ -33,33 +33,26 @@ #ifndef TARGETSETUPPAGE_H #define TARGETSETUPPAGE_H -#include "../qt4target.h" #include "../qt4projectmanager_global.h" -#include <qtsupport/qtversionmanager.h> +#include "../qt4targetsetupwidget.h" + #include <coreplugin/featureprovider.h> +#include <projectexplorer/profilemanager.h> +#include <qtsupport/qtversionmanager.h> #include <QString> -#include <QWizard> - - -QT_BEGIN_NAMESPACE -class QLabel; -class QMenu; -class QPushButton; -class QSpacerItem; -class QTreeWidget; -class QTreeWidgetItem; -class QVBoxLayout; -QT_END_NAMESPACE +#include <QWizardPage> namespace Qt4ProjectManager { class Qt4Project; namespace Internal { +class ImportWidget; + namespace Ui { class TargetSetupPage; -} -} +} // namespace Ui +} // namespace Internal /// \internal class QT4PROJECTMANAGER_EXPORT TargetSetupPage : public QWizardPage @@ -73,25 +66,10 @@ public: /// Initializes the TargetSetupPage /// \note The import information is gathered in initializePage(), make sure that the right proFilePath is set before void initializePage(); - /// Changes the default set of checked targets. - /// call this before \sa initializePage() - void setPreferredFeatures(const QSet<QString> &featureIds); - /// Sets the features a target must support - /// call this before \sa initializePage() - void setRequiredTargetFeatures(const QSet<QString> &featureIds); - /// Sets the features a qt version must support - /// call this before \sa initializePage() - void setRequiredQtFeatures(const Core::FeatureSet &features); - /// Sets the platform that was selected in the wizard - void setSelectedPlatform(const QString &platform); - /// Sets the minimum qt version - /// calls this before \sa initializePage() - void setMinimumQtVersion(const QtSupport::QtVersionNumber &number); - /// Sets the maximum qt version - /// calls this before \sa initializePage() - void setMaximumQtVersion(const QtSupport::QtVersionNumber &number); - /// Sets whether the TargetSetupPage looks on disk for builds of this project - /// call this before \sa initializePage() + + // Call these before initializePage! + void setRequiredProfileMatcher(ProjectExplorer::ProfileMatcher *matcher); + void setPreferredProfileMatcher(ProjectExplorer::ProfileMatcher *matcher); void setImportSearch(bool b); /// Sets whether the targetsetupage uses a scrollarea @@ -101,7 +79,9 @@ public: bool isComplete() const; bool setupProject(Qt4ProjectManager::Qt4Project *project); - bool isTargetSelected(Core::Id id) const; + bool isProfileSelected(Core::Id id) const; + void setProfileSelected(Core::Id id, bool selected); + bool isQtPlatformSelected(const QString &type) const; void setProFilePath(const QString &dir); /// Overrides the summary text of the targetsetuppage @@ -110,35 +90,38 @@ signals: void noteTextLinkActivated(); private slots: - void newImportBuildConfiguration(const BuildConfigurationInfo &info); - void qtVersionsChanged(const QList<int> &added, const QList<int> &removed, const QList<int> &changed); + void import(const Utils::FileName &path); + void handleQtUpdate(const QList<int> &add, const QList<int> &rm, const QList<int> &mod); + void handleProfileAddition(ProjectExplorer::Profile *p); + void handleProfileRemoval(ProjectExplorer::Profile *p); + void handleProfileUpdate(ProjectExplorer::Profile *p); + void updateVisibility(); private: - void setupImportInfos(); - void cleanupImportInfos(); - void replaceQtVersionWithQtVersion(int oldId, int newId); - void replaceTemporaryQtVersion(QtSupport::BaseQtVersion *version, int id); - void replaceQtVersionWithTemporaryQtVersion(int id, QtSupport::BaseQtVersion *version); + void selectAtLeastOneTarget(); + void import(const Utils::FileName &path, const bool silent); + void removeWidget(ProjectExplorer::Profile *p); + Qt4TargetSetupWidget *addWidget(ProjectExplorer::Profile *p); + + void setupImports(); + void setupWidgets(); - void deleteWidgets(); + void reset(); - QSet<QString> m_preferredFeatures; - QSet<QString> m_requiredTargetFeatures; - Core::FeatureSet m_requiredQtFeatures; - QString m_selectedPlatform; + ProjectExplorer::ProfileMatcher *m_requiredMatcher; + ProjectExplorer::ProfileMatcher *m_preferredMatcher; + QLayout *m_baseLayout; bool m_importSearch; bool m_useScrollArea; - QtSupport::QtVersionNumber m_minimumQtVersionNumber; - QtSupport::QtVersionNumber m_maximumQtVersionNumber; QString m_proFilePath; QString m_defaultShadowBuildLocation; QMap<Core::Id, Qt4TargetSetupWidget *> m_widgets; - QHash<Qt4TargetSetupWidget *, Qt4BaseTargetFactory *> m_factories; + Qt4TargetSetupWidget *m_firstWidget; - QSpacerItem *m_spacer; - bool m_ignoreQtVersionChange; Internal::Ui::TargetSetupPage *m_ui; - QList<BuildConfigurationInfo> m_importInfos; // This owns the temporary qt versions + + Internal::ImportWidget *m_importWidget; + QSpacerItem *m_spacer; }; } // namespace Qt4ProjectManager diff --git a/src/plugins/qt4projectmanager/wizards/targetsetuppage.ui b/src/plugins/qt4projectmanager/wizards/targetsetuppage.ui index 5a47515cce..b1f9009f57 100644 --- a/src/plugins/qt4projectmanager/wizards/targetsetuppage.ui +++ b/src/plugins/qt4projectmanager/wizards/targetsetuppage.ui @@ -6,8 +6,8 @@ <rect> <x>0</x> <y>0</y> - <width>230</width> - <height>218</height> + <width>256</width> + <height>297</height> </rect> </property> <property name="sizePolicy"> @@ -20,15 +20,18 @@ <string>Set up Targets for Your Project</string> </property> <layout class="QVBoxLayout" name="verticalLayout_3"> - <property name="margin"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> <number>0</number> </property> <item> <widget class="QWidget" name="setupTargetPage" native="true"> - <layout class="QVBoxLayout" name="verticalLayout"> - <property name="margin"> - <number>0</number> - </property> + <layout class="QVBoxLayout" name="verticalLayout_2"> <item> <widget class="QLabel" name="descriptionLabel"> <property name="sizePolicy"> @@ -49,9 +52,9 @@ </widget> </item> <item> - <widget class="QLabel" name="noValidQtVersionsLabel"> + <widget class="QLabel" name="noValidProfileLabel"> <property name="text"> - <string><html><head/><body><p><span style=" font-weight:600;">No valid Qt versions found.</span></p><p>Please add a Qt version in <span style=" font-style:italic;">Tools &gt; Options &gt; Build &amp; Run</span> (<span style=" font-style:italic;">Qt Creator &gt; Preferences &gt; Build &amp; Run</span> on Mac OS) or via the maintenance tool of the SDK.</p></body></html></string> + <string><html><head/><body><p><span style=" font-weight:600;">No valid Profiles found.</span></p><p>Please add a profile in <span style=" font-style:italic;">Tools &gt; Options &gt; Build &amp; Run</span> (<span style=" font-style:italic;">Qt Creator &gt; Preferences &gt; Build &amp; Run</span> on Mac OS) or via the maintenance tool of the SDK.</p></body></html></string> </property> <property name="wordWrap"> <bool>true</bool> @@ -69,20 +72,32 @@ </widget> </item> <item> - <widget class="QScrollArea" name="scrollArea"> - <property name="widgetResizable"> - <bool>true</bool> - </property> - <widget class="QWidget" name="scrollAreaWidgetContents"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>224</width> - <height>66</height> - </rect> + <widget class="QWidget" name="scrollAreaWidget" native="true"> + <layout class="QVBoxLayout" name="verticalLayout"> + <property name="spacing"> + <number>0</number> + </property> + <property name="margin"> + <number>0</number> </property> - </widget> + <item> + <widget class="QScrollArea" name="scrollArea"> + <property name="widgetResizable"> + <bool>true</bool> + </property> + <widget class="QWidget" name="scrollAreaWidgetContents"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>242</width> + <height>147</height> + </rect> + </property> + </widget> + </widget> + </item> + </layout> </widget> </item> </layout> diff --git a/src/plugins/qtsupport/baseqtversion.cpp b/src/plugins/qtsupport/baseqtversion.cpp index 5fdcb0241a..751436eb36 100644 --- a/src/plugins/qtsupport/baseqtversion.cpp +++ b/src/plugins/qtsupport/baseqtversion.cpp @@ -34,12 +34,14 @@ #include "qmlobservertool.h" #include "qmldumptool.h" #include "qmldebugginglibrary.h" +#include "qtprofileinformation.h" #include "qtversionmanager.h" #include "profilereader.h" #include <projectexplorer/toolchainmanager.h> #include <projectexplorer/toolchain.h> #include <projectexplorer/gnumakeparser.h> +#include <projectexplorer/profileinformation.h> #include <projectexplorer/projectexplorer.h> #include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/toolchainmanager.h> @@ -292,6 +294,28 @@ bool BaseQtVersion::supportsPlatform(const QString &platform) const return platform == platformName(); } +QList<ProjectExplorer::Task> BaseQtVersion::validateProfile(const ProjectExplorer::Profile *p) +{ + QList<ProjectExplorer::Task> result; + + BaseQtVersion *version = QtProfileInformation::qtVersion(p); + Q_ASSERT(version == this); + + ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(p); + if (!tc) + result << ProjectExplorer::Task(ProjectExplorer::Task::Error, + QCoreApplication::translate("BaseQtVersion", "No tool chain set up in profile."), + Utils::FileName(), -1, + Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM)); + + if (tc && !version->qtAbis().contains(tc->targetAbi())) + result << ProjectExplorer::Task(ProjectExplorer::Task::Error, + QCoreApplication::translate("BaseQtVersion", "Tool chain can not produce code for the Qt version."), + Utils::FileName(), -1, + Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM)); + return result; +} + void BaseQtVersion::setId(int id) { m_id = id; @@ -366,20 +390,24 @@ QString BaseQtVersion::warningReason() const return QString(); } -Utils::FileName BaseQtVersion::qmakeCommand() const +ProjectExplorer::ToolChain *BaseQtVersion::preferredToolChain(const Utils::FileName &ms) const { - return m_qmakeCommand; + const Utils::FileName spec = ms.isEmpty() ? mkspec() : ms; + QList<ProjectExplorer::ToolChain *> tcList = ProjectExplorer::ToolChainManager::instance()->toolChains(); + ProjectExplorer::ToolChain *possibleTc = 0; + foreach (ProjectExplorer::ToolChain *tc, tcList) { + if (!qtAbis().contains(tc->targetAbi())) + continue; + if (tc->suggestedMkspecList().contains(spec)) + return tc; // perfect match + possibleTc = tc; // possible match + } + return possibleTc; } -bool BaseQtVersion::toolChainAvailable(const Core::Id id) const +Utils::FileName BaseQtVersion::qmakeCommand() const { - Q_UNUSED(id) - if (!isValid()) - return false; - foreach (const ProjectExplorer::Abi &abi, qtAbis()) - if (!ProjectExplorer::ToolChainManager::instance()->findToolChains(abi).isEmpty()) - return true; - return false; + return m_qmakeCommand; } QList<ProjectExplorer::Abi> BaseQtVersion::qtAbis() const @@ -655,11 +683,6 @@ QString BaseQtVersion::uicCommand() const return m_uicCommand; } -QString BaseQtVersion::systemRoot() const -{ - return QString(); -} - void BaseQtVersion::updateMkspec() const { if (uniqueId() == -1 || m_mkspecUpToDate) @@ -906,15 +929,17 @@ QString BaseQtVersion::examplesPath() const return m_versionInfo.value(QLatin1String("QT_INSTALL_EXAMPLES")); } -QList<ProjectExplorer::HeaderPath> BaseQtVersion::systemHeaderPathes() const +QList<ProjectExplorer::HeaderPath> BaseQtVersion::systemHeaderPathes(const ProjectExplorer::Profile *p) const { + Q_UNUSED(p); QList<ProjectExplorer::HeaderPath> result; result.append(ProjectExplorer::HeaderPath(mkspecPath().toString(), ProjectExplorer::HeaderPath::GlobalHeaderPath)); return result; } -void BaseQtVersion::addToEnvironment(Utils::Environment &env) const +void BaseQtVersion::addToEnvironment(const ProjectExplorer::Profile *p, Utils::Environment &env) const { + Q_UNUSED(p); env.set(QLatin1String("QTDIR"), QDir::toNativeSeparators(versionInfo().value(QLatin1String("QT_INSTALL_DATA")))); env.prependOrSetPath(versionInfo().value(QLatin1String("QT_INSTALL_BINS"))); } @@ -960,7 +985,9 @@ Utils::Environment BaseQtVersion::qmlToolsEnvironment() const { // FIXME: This seems broken! Utils::Environment environment = Utils::Environment::systemEnvironment(); +#if 0 // FIXME: Fix this! addToEnvironment(environment); +#endif // add preferred tool chain, as that is how the tools are built, compare QtVersion::buildDebuggingHelperLibrary if (!qtAbis().isEmpty()) { @@ -1032,7 +1059,7 @@ bool BaseQtVersion::supportsShadowBuilds() const return true; } -QList<ProjectExplorer::Task> BaseQtVersion::reportIssuesImpl(const QString &proFile, const QString &buildDir) +QList<ProjectExplorer::Task> BaseQtVersion::reportIssuesImpl(const QString &proFile, const QString &buildDir) const { QList<ProjectExplorer::Task> results; @@ -1078,7 +1105,7 @@ QList<ProjectExplorer::Task> BaseQtVersion::reportIssuesImpl(const QString &proF } QList<ProjectExplorer::Task> -BaseQtVersion::reportIssues(const QString &proFile, const QString &buildDir) +BaseQtVersion::reportIssues(const QString &proFile, const QString &buildDir) const { QList<ProjectExplorer::Task> results = reportIssuesImpl(proFile, buildDir); qSort(results); diff --git a/src/plugins/qtsupport/baseqtversion.h b/src/plugins/qtsupport/baseqtversion.h index 049b842c8e..1606fd8963 100644 --- a/src/plugins/qtsupport/baseqtversion.h +++ b/src/plugins/qtsupport/baseqtversion.h @@ -51,6 +51,8 @@ class Environment; namespace ProjectExplorer { class IOutputParser; +class Profile; +class ToolChain; } // namespace ProjectExplorer QT_BEGIN_NAMESPACE @@ -121,19 +123,17 @@ public: virtual QString invalidReason() const; virtual QString warningReason() const; - virtual bool toolChainAvailable(const Core::Id id) const; + virtual ProjectExplorer::ToolChain *preferredToolChain(const Utils::FileName &ms) const; virtual QString description() const = 0; virtual QString toHtml(bool verbose) const; - virtual bool supportsTargetId(const Core::Id id) const = 0; - virtual QSet<Core::Id> supportedTargetIds() const = 0; QList<ProjectExplorer::Abi> qtAbis() const; virtual QList<ProjectExplorer::Abi> detectQtAbis() const = 0; // Returns the PREFIX, BINPREFIX, DOCPREFIX and similar information virtual QHash<QString,QString> versionInfo() const; - virtual void addToEnvironment(Utils::Environment &env) const; + virtual void addToEnvironment(const ProjectExplorer::Profile *p, Utils::Environment &env) const; virtual Utils::FileName sourcePath() const; // used by QtUiCodeModelSupport @@ -154,12 +154,11 @@ public: bool hasDemos() const; QString demosPath() const; - virtual QList<ProjectExplorer::HeaderPath> systemHeaderPathes() const; + virtual QList<ProjectExplorer::HeaderPath> systemHeaderPathes(const ProjectExplorer::Profile *p) const; virtual QString frameworkInstallPath() const; // former local functions Utils::FileName qmakeCommand() const; - virtual QString systemRoot() const; /// @returns the name of the mkspec Utils::FileName mkspec() const; @@ -185,7 +184,7 @@ public: /// Check a .pro-file/Qt version combination on possible issues /// @return a list of tasks, ordered on severity (errors first, then /// warnings and finally info items. - QList<ProjectExplorer::Task> reportIssues(const QString &proFile, const QString &buildDir); + QList<ProjectExplorer::Task> reportIssues(const QString &proFile, const QString &buildDir) const; virtual ProjectExplorer::IOutputParser *createOutputParser() const; @@ -221,11 +220,13 @@ public: virtual QString platformDisplayName() const; virtual bool supportsPlatform(const QString &platformName) const; + virtual QList<ProjectExplorer::Task> validateProfile(const ProjectExplorer::Profile *p); + protected: BaseQtVersion(); BaseQtVersion(const Utils::FileName &path, bool isAutodetected = false, const QString &autodetectionSource = QString()); - virtual QList<ProjectExplorer::Task> reportIssuesImpl(const QString &proFile, const QString &buildDir); + virtual QList<ProjectExplorer::Task> reportIssuesImpl(const QString &proFile, const QString &buildDir) const; // helper function for desktop and simulator to figure out the supported abis based on the libraries static Utils::FileName qtCorePath(const QHash<QString,QString> &versionInfo, const QString &versionString); diff --git a/src/plugins/qtsupport/customexecutablerunconfiguration.cpp b/src/plugins/qtsupport/customexecutablerunconfiguration.cpp index ddd678155c..bca770ac66 100644 --- a/src/plugins/qtsupport/customexecutablerunconfiguration.cpp +++ b/src/plugins/qtsupport/customexecutablerunconfiguration.cpp @@ -35,6 +35,7 @@ #include "debugginghelper.h" #include <projectexplorer/buildconfiguration.h> +#include <projectexplorer/project.h> #include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/target.h> #include <projectexplorer/abi.h> @@ -352,18 +353,16 @@ ProjectExplorer::Abi CustomExecutableRunConfiguration::abi() const CustomExecutableRunConfigurationFactory::CustomExecutableRunConfigurationFactory(QObject *parent) : ProjectExplorer::IRunConfigurationFactory(parent) -{ -} +{ setObjectName(QLatin1String("CustomExecutableRunConfigurationFactory")); } CustomExecutableRunConfigurationFactory::~CustomExecutableRunConfigurationFactory() -{ - -} +{ } bool CustomExecutableRunConfigurationFactory::canCreate(ProjectExplorer::Target *parent, const Core::Id id) const { - Q_UNUSED(parent); + if (!canHandle(parent)) + return false; return id == Core::Id(CUSTOM_EXECUTABLE_ID); } @@ -379,6 +378,8 @@ CustomExecutableRunConfigurationFactory::create(ProjectExplorer::Target *parent, bool CustomExecutableRunConfigurationFactory::canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const { + if (!canHandle(parent)) + return false; Core::Id id(ProjectExplorer::idFromMap(map)); return canCreate(parent, id); } @@ -410,9 +411,15 @@ CustomExecutableRunConfigurationFactory::clone(ProjectExplorer::Target *parent, return new CustomExecutableRunConfiguration(parent, static_cast<CustomExecutableRunConfiguration*>(source)); } +bool CustomExecutableRunConfigurationFactory::canHandle(ProjectExplorer::Target *parent) const +{ + return parent->project()->supportsProfile(parent->profile()); +} + QList<Core::Id> CustomExecutableRunConfigurationFactory::availableCreationIds(ProjectExplorer::Target *parent) const { - Q_UNUSED(parent) + if (!canHandle(parent)) + return QList<Core::Id>(); return QList<Core::Id>() << Core::Id(CUSTOM_EXECUTABLE_ID); } diff --git a/src/plugins/qtsupport/customexecutablerunconfiguration.h b/src/plugins/qtsupport/customexecutablerunconfiguration.h index 17542ba38b..ca20068dcf 100644 --- a/src/plugins/qtsupport/customexecutablerunconfiguration.h +++ b/src/plugins/qtsupport/customexecutablerunconfiguration.h @@ -148,6 +148,8 @@ public: bool canClone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration *product) const; ProjectExplorer::RunConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration *source); + + bool canHandle(ProjectExplorer::Target *parent) const; }; } // namespace QtSupport diff --git a/src/plugins/qtsupport/debugginghelperbuildtask.cpp b/src/plugins/qtsupport/debugginghelperbuildtask.cpp index bf7c7ae1f9..ae3e1e26f0 100644 --- a/src/plugins/qtsupport/debugginghelperbuildtask.cpp +++ b/src/plugins/qtsupport/debugginghelperbuildtask.cpp @@ -88,7 +88,9 @@ DebuggingHelperBuildTask::DebuggingHelperBuildTask(const BaseQtVersion *version, } m_environment = Utils::Environment::systemEnvironment(); +#if 0 // FIXME: Reenable this! version->addToEnvironment(m_environment); +#endif toolChain->addToEnvironment(m_environment); diff --git a/src/plugins/qtsupport/qtprofileconfigwidget.cpp b/src/plugins/qtsupport/qtprofileconfigwidget.cpp new file mode 100644 index 0000000000..4130fe0b58 --- /dev/null +++ b/src/plugins/qtsupport/qtprofileconfigwidget.cpp @@ -0,0 +1,173 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. +** +**************************************************************************/ + +#include "qtprofileconfigwidget.h" + +#include "qtsupportconstants.h" +#include "qtprofileinformation.h" +#include "qtversionmanager.h" + +#include <coreplugin/icore.h> +#include <projectexplorer/projectexplorerconstants.h> + +#include <utils/qtcassert.h> + +#include <QComboBox> +#include <QHBoxLayout> +#include <QPushButton> + +namespace QtSupport { +namespace Internal { + +QtProfileConfigWidget::QtProfileConfigWidget(ProjectExplorer::Profile *p, + QWidget *parent) : + ProjectExplorer::ProfileConfigWidget(parent), + m_profile(p), + m_combo(new QComboBox), + m_manageButton(new QPushButton) +{ + QHBoxLayout *layout = new QHBoxLayout(this); + layout->setMargin(0); + + m_combo->setContentsMargins(0, 0, 0, 0); + m_combo->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed); + layout->addWidget(m_combo); + + m_manageButton->setContentsMargins(0, 0, 0, 0); + m_manageButton->setText(tr("Manage...")); + layout->addWidget(m_manageButton); + + QtVersionManager *mgr = QtVersionManager::instance(); + + // initially populate combobox: + m_combo->addItem(tr("None"), -1); + QList<BaseQtVersion *> versions = mgr->validVersions(); + QList<int> versionIds; + foreach (BaseQtVersion *v, versions) + versionIds.append(v->uniqueId()); + versionsChanged(versionIds, QList<int>(), QList<int>()); + + discard(); + connect(m_combo, SIGNAL(currentIndexChanged(int)), this, SIGNAL(dirty())); + + connect(mgr, SIGNAL(qtVersionsChanged(QList<int>,QList<int>,QList<int>)), + this, SLOT(versionsChanged(QList<int>,QList<int>,QList<int>))); + connect(ProjectExplorer::ProfileManager::instance(), SIGNAL(profileUpdated(ProjectExplorer::Profile*)), + this, SLOT(profileUpdated(ProjectExplorer::Profile*))); + + connect(m_manageButton, SIGNAL(clicked()), this, SLOT(manageQtVersions())); +} + +QString QtProfileConfigWidget::displayName() const +{ + return tr("Qt version:"); +} + +void QtProfileConfigWidget::makeReadOnly() +{ + m_combo->setEnabled(false); +} + +void QtProfileConfigWidget::apply() +{ + int id = m_combo->itemData(m_combo->currentIndex()).toInt(); + QtProfileInformation::setQtVersionId(m_profile, id); +} + +void QtProfileConfigWidget::discard() +{ + m_combo->setCurrentIndex(findQtVersion(QtProfileInformation::qtVersionId(m_profile))); +} + +bool QtProfileConfigWidget::isDirty() const +{ + int id = m_combo->itemData(m_combo->currentIndex()).toInt(); + return id != QtProfileInformation::qtVersionId(m_profile); +} + +void QtProfileConfigWidget::versionsChanged(const QList<int> &added, const QList<int> &removed, + const QList<int> &changed) +{ + QtVersionManager *mgr = QtVersionManager::instance(); + + foreach (const int id, added) { + BaseQtVersion *v = mgr->version(id); + QTC_CHECK(v); + QTC_CHECK(findQtVersion(id) < 0); + m_combo->addItem(v->displayName(), id); + } + foreach (const int id, removed) { + int pos = findQtVersion(id); + QTC_CHECK(pos >= 0); + m_combo->removeItem(pos); + + } + foreach (const int id, changed) { + BaseQtVersion *v = mgr->version(id); + int pos = findQtVersion(id); + QTC_CHECK(pos >= 0); + m_combo->setItemText(pos, v->displayName()); + } +} + +void QtProfileConfigWidget::profileUpdated(ProjectExplorer::Profile *p) +{ + if (p != m_profile) + return; + + int id = QtProfileInformation::qtVersionId(p); + + for (int i = 0; i < m_combo->count(); ++i) { + if (m_combo->itemData(i).toInt() == id) { + m_combo->setCurrentIndex(i); + break; + } + } +} + +void QtProfileConfigWidget::manageQtVersions() +{ + Core::ICore::showOptionsDialog(QLatin1String(ProjectExplorer::Constants::PROJECTEXPLORER_SETTINGS_CATEGORY), + QLatin1String(QtSupport::Constants::QTVERSION_SETTINGS_PAGE_ID)); +} + +int QtProfileConfigWidget::findQtVersion(const int id) const +{ + for (int i = 0; i < m_combo->count(); ++i) { + if (id == m_combo->itemData(i).toInt()) + return i; + } + return -1; +} + +} // namespace Internal +} // namespace QtSupport diff --git a/src/plugins/qtsupport/qtprofileconfigwidget.h b/src/plugins/qtsupport/qtprofileconfigwidget.h new file mode 100644 index 0000000000..a0c2078133 --- /dev/null +++ b/src/plugins/qtsupport/qtprofileconfigwidget.h @@ -0,0 +1,79 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. +** +**************************************************************************/ + +#ifndef QTSUPPORT_QTPROFILECONFIGWIDGET_H +#define QTSUPPORT_QTPROFILECONFIGWIDGET_H + +#include <projectexplorer/profileconfigwidget.h> + +QT_FORWARD_DECLARE_CLASS(QComboBox) +QT_FORWARD_DECLARE_CLASS(QPushButton) + +namespace ProjectExplorer { class Profile; } + +namespace QtSupport { +class BaseQtVersion; + +namespace Internal { + +class QtProfileConfigWidget : public ProjectExplorer::ProfileConfigWidget +{ + Q_OBJECT + +public: + QtProfileConfigWidget(ProjectExplorer::Profile *p, QWidget *parent = 0); + + QString displayName() const; + + void makeReadOnly(); + + void apply(); + void discard(); + bool isDirty() const; + +private slots: + void versionsChanged(const QList<int> &added, const QList<int> &removed, const QList<int> &changed); + void profileUpdated(ProjectExplorer::Profile *p); + void manageQtVersions(); + +private: + int findQtVersion(const int id) const; + + ProjectExplorer::Profile *m_profile; + QComboBox *m_combo; + QPushButton *m_manageButton; +}; + +} // namespace Internal +} // namespace Debugger + +#endif // QTSUPPORT_QTYSTEMCONFIGWIDGET_H diff --git a/src/plugins/qtsupport/qtprofileinformation.cpp b/src/plugins/qtsupport/qtprofileinformation.cpp new file mode 100644 index 0000000000..4a20304741 --- /dev/null +++ b/src/plugins/qtsupport/qtprofileinformation.cpp @@ -0,0 +1,179 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. +** +**************************************************************************/ + +#include "qtprofileinformation.h" + +#include "qtprofileconfigwidget.h" +#include "qtversionmanager.h" + +#include <utils/environment.h> + +namespace QtSupport { +namespace Internal { +const char QT_INFORMATION[] = "QtSupport.QtInformation"; +} // namespace Internal + +QtProfileInformation::QtProfileInformation() +{ + setObjectName(QLatin1String("QtProfileInformation")); + connect(QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>,QList<int>,QList<int>)), + this, SIGNAL(validationNeeded())); +} + +Core::Id QtProfileInformation::dataId() const +{ + static Core::Id id = Core::Id(Internal::QT_INFORMATION); + return id; +} + +unsigned int QtProfileInformation::priority() const +{ + return 26000; +} + +QVariant QtProfileInformation::defaultValue(ProjectExplorer::Profile *p) const +{ + Q_UNUSED(p); + QtVersionManager *mgr = QtVersionManager::instance(); + + // find "Qt in PATH": + Utils::Environment env = Utils::Environment::systemEnvironment(); + Utils::FileName qmake = Utils::FileName::fromString(env.searchInPath(QLatin1String("qmake"))); + + if (qmake.isEmpty()) + return -1; + + QList<BaseQtVersion *> versionList = mgr->versions(); + foreach (BaseQtVersion *v, versionList) { + if (qmake == v->qmakeCommand()) + return v->uniqueId(); + } + + return -1; +} + +QList<ProjectExplorer::Task> QtProfileInformation::validate(ProjectExplorer::Profile *p) const +{ + int id = qtVersionId(p); + if (id == -1) + return QList<ProjectExplorer::Task>(); + BaseQtVersion *version = QtVersionManager::instance()->version(id); + if (!version) { + setQtVersionId(p, -1); + return QList<ProjectExplorer::Task>(); + } + return version->validateProfile(p); +} + +ProjectExplorer::ProfileConfigWidget * +QtProfileInformation::createConfigWidget(ProjectExplorer::Profile *p) const +{ + return new Internal::QtProfileConfigWidget(p); +} + +ProjectExplorer::ProfileInformation::ItemList +QtProfileInformation::toUserOutput(ProjectExplorer::Profile *p) const +{ + BaseQtVersion *version = qtVersion(p); + return ItemList() << qMakePair(tr("Qt version"), version ? version->displayName() : tr("None")); +} + +void QtProfileInformation::addToEnvironment(const ProjectExplorer::Profile *p, Utils::Environment &env) const +{ + BaseQtVersion *version = qtVersion(p); + if (version) + version->addToEnvironment(p, env); +} + +int QtProfileInformation::qtVersionId(const ProjectExplorer::Profile *p) +{ + if (!p) + return -1; + bool ok = false; + int id = p->value(Core::Id(Internal::QT_INFORMATION), -1).toInt(&ok); + if (!ok) + id = -1; + return id; +} + +void QtProfileInformation::setQtVersionId(ProjectExplorer::Profile *p, const int id) +{ + p->setValue(Core::Id(Internal::QT_INFORMATION), id); +} + +BaseQtVersion *QtProfileInformation::qtVersion(const ProjectExplorer::Profile *p) +{ + return QtVersionManager::instance()->version(qtVersionId(p)); +} + +void QtProfileInformation::setQtVersion(ProjectExplorer::Profile *p, BaseQtVersion *v) +{ + if (!v) + setQtVersionId(p, -1); + else + setQtVersionId(p, v->uniqueId()); +} + +QtTypeProfileMatcher::QtTypeProfileMatcher(const QString &type) : + m_type(type) +{ } + +bool QtTypeProfileMatcher::matches(const ProjectExplorer::Profile *p) const +{ + BaseQtVersion *version = QtProfileInformation::qtVersion(p); + return version && version->type() == m_type; +} + +QtPlatformProfileMatcher::QtPlatformProfileMatcher(const QString &platform) : + m_platform(platform) +{ } + +bool QtPlatformProfileMatcher::matches(const ProjectExplorer::Profile *p) const +{ + BaseQtVersion *version = QtProfileInformation::qtVersion(p); + return version && version->platformName() == m_platform; +} + +bool QtVersionProfileMatcher::matches(const ProjectExplorer::Profile *p) const +{ + BaseQtVersion *version = QtProfileInformation::qtVersion(p); + if (!version) + return false; + QtVersionNumber current = version->qtVersion(); + if (m_min.majorVersion > -1 && current < m_min) + return false; + if (m_max.majorVersion > -1 && current > m_max) + return false; + return version->availableFeatures().contains(m_features); +} + +} // namespace QtSupport diff --git a/src/plugins/qtsupport/qtprofileinformation.h b/src/plugins/qtsupport/qtprofileinformation.h new file mode 100644 index 0000000000..55be3bd090 --- /dev/null +++ b/src/plugins/qtsupport/qtprofileinformation.h @@ -0,0 +1,112 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. +** +**************************************************************************/ + +#ifndef QTSUPPORT_QTPROFILEINFORMATION_H +#define QTSUPPORT_QTPROFILEINFORMATION_H + +#include "qtsupport_global.h" + +#include <projectexplorer/profileinformation.h> + +#include "baseqtversion.h" + +namespace QtSupport { + +class QTSUPPORT_EXPORT QtProfileInformation : public ProjectExplorer::ProfileInformation +{ + Q_OBJECT + +public: + QtProfileInformation(); + + Core::Id dataId() const; + + unsigned int priority() const; // the higher the closer to the top. + + QVariant defaultValue(ProjectExplorer::Profile *p) const; + + QList<ProjectExplorer::Task> validate(ProjectExplorer::Profile *p) const; + + ProjectExplorer::ProfileConfigWidget *createConfigWidget(ProjectExplorer::Profile *p) const; + + ItemList toUserOutput(ProjectExplorer::Profile *p) const; + + void addToEnvironment(const ProjectExplorer::Profile *p, Utils::Environment &env) const; + + static int qtVersionId(const ProjectExplorer::Profile *p); + static void setQtVersionId(ProjectExplorer::Profile *p, const int id); + static BaseQtVersion *qtVersion(const ProjectExplorer::Profile *p); + static void setQtVersion(ProjectExplorer::Profile *p, BaseQtVersion *v); +}; + +class QTSUPPORT_EXPORT QtTypeProfileMatcher : public ProjectExplorer::ProfileMatcher +{ +public: + QtTypeProfileMatcher(const QString &type); + + bool matches(const ProjectExplorer::Profile *p) const; + +private: + QString m_type; +}; + +class QTSUPPORT_EXPORT QtPlatformProfileMatcher : public ProjectExplorer::ProfileMatcher +{ +public: + QtPlatformProfileMatcher(const QString &platform); + + bool matches(const ProjectExplorer::Profile *p) const; + +private: + QString m_platform; +}; + +class QTSUPPORT_EXPORT QtVersionProfileMatcher : public ProjectExplorer::ProfileMatcher +{ +public: + explicit QtVersionProfileMatcher(const Core::FeatureSet &required = Core::FeatureSet(), + const QtVersionNumber &min = QtVersionNumber(0, 0, 0), + const QtVersionNumber &max = QtVersionNumber(INT_MAX, INT_MAX, INT_MAX)) : + m_min(min), m_max(max), m_features(required) + { } + + bool matches(const ProjectExplorer::Profile *p) const; + +private: + QtVersionNumber m_min; + QtVersionNumber m_max; + Core::FeatureSet m_features; +}; + +} // namespace QtSupport + +#endif // QTSUPPORT_QTPROFILEINFORMATION_H diff --git a/src/plugins/qtsupport/qtsupport.pro b/src/plugins/qtsupport/qtsupport.pro index e225359e54..26cbceaae8 100644 --- a/src/plugins/qtsupport/qtsupport.pro +++ b/src/plugins/qtsupport/qtsupport.pro @@ -18,6 +18,8 @@ include(../../shared/proparser/proparser.pri) HEADERS += \ qtsupportplugin.h \ qtsupport_global.h \ + qtprofileconfigwidget.h \ + qtprofileinformation.h \ qtoutputformatter.h \ qtversionmanager.h \ qtversionfactory.h \ @@ -39,6 +41,8 @@ HEADERS += \ SOURCES += \ qtsupportplugin.cpp \ + qtprofileconfigwidget.cpp \ + qtprofileinformation.cpp \ qtoutputformatter.cpp \ qtversionmanager.cpp \ qtversionfactory.cpp \ diff --git a/src/plugins/qtsupport/qtsupport.qbs b/src/plugins/qtsupport/qtsupport.qbs index 835d9987b7..a60f22490a 100644 --- a/src/plugins/qtsupport/qtsupport.qbs +++ b/src/plugins/qtsupport/qtsupport.qbs @@ -62,6 +62,10 @@ QtcPlugin { "qtoutputformatter.cpp", "qtoutputformatter.h", "qtparser.h", + "qtprofileconfigwidget.cpp", + "qtprofileconfigwidget.h", + "qtprofileinformation.cpp", + "qtprofileinformation.h", "qtsupport_global.h", "qtsupportconstants.h", "qtsupportplugin.cpp", diff --git a/src/plugins/qtsupport/qtsupportconstants.h b/src/plugins/qtsupport/qtsupportconstants.h index df367c1fe2..0753f5e7b4 100644 --- a/src/plugins/qtsupport/qtsupportconstants.h +++ b/src/plugins/qtsupport/qtsupportconstants.h @@ -37,7 +37,7 @@ namespace QtSupport { namespace Constants { // Qt4 settings pages -const char QTVERSION_SETTINGS_PAGE_ID[] = "B.Qt Versions"; +const char QTVERSION_SETTINGS_PAGE_ID[] = "H.Qt Versions"; const char QTVERSION_SETTINGS_PAGE_NAME[] = QT_TRANSLATE_NOOP("Qt4ProjectManager", "Qt Versions"); // QtVersions @@ -64,17 +64,22 @@ const char FEATURE_DESKTOP[] = "QtSupport.Wizards.FeatureDesktop"; // Platforms const char MEEGO_HARMATTAN_PLATFORM[] = "MeeGo/Harmattan"; +const char MAEMO_FREMANTLE_PLATFORM[] = "Maemo/Fremantle"; +const char MEEGO_PLATFORM[] = "Meego"; const char SYMBIAN_PLATFORM[] = "Symbian"; const char DESKTOP_PLATFORM[] = "Desktop"; const char EMBEDDED_LINUX_PLATFORM[] = "Embedded Linux"; const char WINDOWS_CE_PLATFORM[] = "Windows CE"; +const char ANDROID_PLATFORM[] = "Android"; const char MEEGO_HARMATTAN_PLATFORM_TR[] = QT_TRANSLATE_NOOP("QtSupport", "MeeGo/Harmattan"); +const char MAEMO_FREMANTLE_PLATFORM_TR[] = QT_TRANSLATE_NOOP("QtSupport", "Maemo/Fremantle"); +const char MEEGO_PLATFORM_TR[] = QT_TRANSLATE_NOOP("QtSupport", "Meego"); const char SYMBIAN_PLATFORM_TR[] = QT_TRANSLATE_NOOP("QtSupport", "Symbian"); const char DESKTOP_PLATFORM_TR[] = QT_TRANSLATE_NOOP("QtSupport", "Desktop"); const char EMBEDDED_LINUX_PLATFORM_TR[] = QT_TRANSLATE_NOOP("QtSupport", "Embedded Linux"); const char WINDOWS_CE_PLATFORM_TR[] = QT_TRANSLATE_NOOP("QtSupport", "Windows CE"); - +const char ANDROID_PLATFORM_TR[] = QT_TRANSLATE_NOOP("QtSupport", "Android"); // QML wizard icon // both the qt4projectmanager and the qmlprojectmanager do have qt quick wizards diff --git a/src/plugins/qtsupport/qtsupportplugin.cpp b/src/plugins/qtsupport/qtsupportplugin.cpp index d1f0872196..1456a97593 100644 --- a/src/plugins/qtsupport/qtsupportplugin.cpp +++ b/src/plugins/qtsupport/qtsupportplugin.cpp @@ -34,6 +34,7 @@ #include "customexecutablerunconfiguration.h" #include "qtoptionspage.h" +#include "qtprofileinformation.h" #include "qtversionmanager.h" #include "profilereader.h" @@ -41,6 +42,7 @@ #include "gettingstartedwelcomepage.h" #include <extensionsystem/pluginmanager.h> +#include <projectexplorer/profilemanager.h> #include <QtPlugin> #include <QMenu> @@ -83,6 +85,7 @@ bool QtSupportPlugin::initialize(const QStringList &arguments, QString *errorMes void QtSupportPlugin::extensionsInitialized() { QtVersionManager::instance()->extensionsInitialized(); + ProjectExplorer::ProfileManager::instance()->registerProfileInformation(new QtProfileInformation); } bool QtSupportPlugin::delayedInitialize() diff --git a/src/plugins/qtsupport/qtsupportplugin.h b/src/plugins/qtsupport/qtsupportplugin.h index 0400e313e9..405f51b9be 100644 --- a/src/plugins/qtsupport/qtsupportplugin.h +++ b/src/plugins/qtsupport/qtsupportplugin.h @@ -36,7 +36,6 @@ #include <extensionsystem/iplugin.h> #include <coreplugin/icontext.h> - namespace QtSupport { namespace Internal { diff --git a/src/plugins/qtsupport/qtversionmanager.cpp b/src/plugins/qtsupport/qtversionmanager.cpp index 79c3a7de93..10f36d3d72 100644 --- a/src/plugins/qtsupport/qtversionmanager.cpp +++ b/src/plugins/qtsupport/qtversionmanager.cpp @@ -32,6 +32,7 @@ #include "qtversionmanager.h" +#include "qtprofileinformation.h" #include "qtversionfactory.h" #include "qtsupportconstants.h" @@ -77,7 +78,8 @@ static const char OLDQTVERSION_DATA_KEY[] = "QtVersion.Old."; static const char OLDQTVERSION_SDKSOURCE[] = "QtVersion.Old.SdkSource"; static const char OLDQTVERSION_PATH[] = "QtVersion.Old.Path"; static const char QTVERSION_FILE_VERSION_KEY[] = "Version"; -static const char QTVERSION_FILENAME[] = "/qtversion.xml"; +static const char QTVERSION_FILENAME[] = "/qtcreator/qtversion.xml"; +static const char QTVERSION_SDK_FILENAME[] = "/qtversion.xml"; // legacy settings static const char QtVersionsSectionName[] = "QtVersions"; @@ -100,14 +102,16 @@ static T *createToolChain(const QString &id) static QString globalSettingsFileName() { - return QFileInfo(ExtensionSystem::PluginManager::globalSettings()->fileName()).absolutePath() - + QLatin1String(QTVERSION_FILENAME); + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + return QFileInfo(pm->globalSettings()->fileName()).absolutePath() + + QLatin1String(QTVERSION_SDK_FILENAME); } -static QString settingsFileName() +static QString settingsFileName(const QString &path) { - QFileInfo settingsLocation(ExtensionSystem::PluginManager::settings()->fileName()); - return settingsLocation.absolutePath() + QLatin1String(QTVERSION_FILENAME); + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + QFileInfo settingsLocation(pm->settings()->fileName()); + return settingsLocation.absolutePath() + path; } @@ -183,7 +187,11 @@ bool QtVersionManager::restoreQtVersions() QList<QtVersionFactory *> factories = ExtensionSystem::PluginManager::getObjects<QtVersionFactory>(); Utils::PersistentSettingsReader reader; - if (!reader.load(settingsFileName())) + QString filename = settingsFileName(QLatin1String(QTVERSION_FILENAME)); + // Read Qt Creator 2.5 qtversions.xml once: + if (!QFileInfo(filename).exists()) + filename = settingsFileName(QLatin1String(QTVERSION_SDK_FILENAME)); + if (!reader.load(filename)) return false; QVariantMap data = reader.restoreValues(); @@ -222,7 +230,7 @@ bool QtVersionManager::restoreQtVersions() if (!restored) qWarning("Warning: Unable to restore Qt version '%s' stored in %s.", qPrintable(type), - qPrintable(QDir::toNativeSeparators(settingsFileName()))); + qPrintable(QDir::toNativeSeparators(filename))); } ++m_idcount; return true; @@ -402,7 +410,7 @@ void QtVersionManager::saveQtVersions() } writer.saveValue(QLatin1String(QTVERSION_COUNT_KEY), count); - writer.save(settingsFileName(), QLatin1String("QtCreatorQtVersions"), Core::ICore::mainWindow()); + writer.save(settingsFileName(QLatin1String(QTVERSION_FILENAME)), QLatin1String("QtCreatorQtVersions"), Core::ICore::mainWindow()); } void QtVersionManager::findSystemQt() @@ -499,37 +507,6 @@ void QtVersionManager::removeVersion(BaseQtVersion *version) delete version; } -bool QtVersionManager::supportsTargetId(Core::Id id) const -{ - QList<BaseQtVersion *> versions = QtVersionManager::instance()->versionsForTargetId(id); - foreach (BaseQtVersion *v, versions) - if (v->isValid() && v->toolChainAvailable(id)) - return true; - return false; -} - -QList<BaseQtVersion *> QtVersionManager::versionsForTargetId(Core::Id id, - const QtVersionNumber &minimumQtVersion, - const QtVersionNumber &maximumQtVersion) const -{ - QList<BaseQtVersion *> targetVersions; - foreach (BaseQtVersion *version, m_versions) { - if (version->supportsTargetId(id) && version->qtVersion() >= minimumQtVersion - && version->qtVersion() <= maximumQtVersion) - targetVersions.append(version); - } - qSort(targetVersions.begin(), targetVersions.end(), &qtVersionNumberCompare); - return targetVersions; -} - -QSet<Core::Id> QtVersionManager::supportedTargetIds() const -{ - QSet<Core::Id> results; - foreach (BaseQtVersion *version, m_versions) - results.unite(version->supportedTargetIds()); - return results; -} - void QtVersionManager::updateDocumentation() { Core::HelpManager *helpManager = Core::HelpManager::instance(); diff --git a/src/plugins/qtsupport/qtversionmanager.h b/src/plugins/qtsupport/qtversionmanager.h index 5c39a288eb..c2b96e8f43 100644 --- a/src/plugins/qtsupport/qtversionmanager.h +++ b/src/plugins/qtsupport/qtversionmanager.h @@ -40,6 +40,7 @@ #include <QStringList> namespace Utils { class FileSystemWatcher; } +namespace ProjectExplorer { class ProfileInformation; } namespace QtSupport { namespace Internal { @@ -81,16 +82,6 @@ public: void addVersion(BaseQtVersion *version); void removeVersion(BaseQtVersion *version); - // Target Support: - bool supportsTargetId(Core::Id id) const; - // This returns a list of versions that support the target with the given id. - // @return A list of QtVersions that supports a target. This list may be empty! - - QList<BaseQtVersion *> versionsForTargetId(Core::Id id, - const QtVersionNumber &minimumQtVersion = QtVersionNumber(), - const QtVersionNumber &maximumQtVersion = QtVersionNumber(INT_MAX, INT_MAX, INT_MAX)) const; - QSet<Core::Id> supportedTargetIds() const; - // Static Methods enum MakefileCompatible { CouldNotParse, DifferentProject, SameProject }; static MakefileCompatible makefileIsFor(const QString &makefile, const QString &proFile); diff --git a/src/plugins/qtsupport/qtversionmanager.ui b/src/plugins/qtsupport/qtversionmanager.ui index 2f6134be33..d78f79639b 100644 --- a/src/plugins/qtsupport/qtversionmanager.ui +++ b/src/plugins/qtsupport/qtversionmanager.ui @@ -12,82 +12,94 @@ </property> <layout class="QGridLayout" name="gridLayout"> <item row="0" column="0"> - <layout class="QHBoxLayout" name="horizontalLayout"> + <widget class="QTreeWidget" name="qtdirList"> + <property name="uniformRowHeights"> + <bool>true</bool> + </property> + <property name="columnCount"> + <number>2</number> + </property> + <column> + <property name="text"> + <string>Name</string> + </property> + </column> + <column> + <property name="text"> + <string>qmake Location</string> + </property> + </column> + </widget> + </item> + <item row="0" column="1" rowspan="3"> + <layout class="QVBoxLayout"> + <property name="spacing"> + <number>6</number> + </property> + <property name="margin"> + <number>0</number> + </property> + <item> + <widget class="QPushButton" name="addButton"> + <property name="minimumSize"> + <size> + <width>21</width> + <height>23</height> + </size> + </property> + <property name="text"> + <string>Add...</string> + </property> + </widget> + </item> <item> - <widget class="QTreeWidget" name="qtdirList"> - <property name="uniformRowHeights"> - <bool>true</bool> + <widget class="QPushButton" name="delButton"> + <property name="minimumSize"> + <size> + <width>21</width> + <height>23</height> + </size> </property> - <property name="columnCount"> - <number>2</number> + <property name="text"> + <string>Remove</string> + </property> + </widget> + </item> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Fixed</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>10</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QPushButton" name="cleanUpButton"> + <property name="text"> + <string>Clean up</string> </property> - <column> - <property name="text"> - <string>Name</string> - </property> - </column> - <column> - <property name="text"> - <string>qmake Location</string> - </property> - </column> </widget> </item> <item> - <layout class="QVBoxLayout"> - <property name="spacing"> - <number>6</number> + <spacer name="spacer_2"> + <property name="orientation"> + <enum>Qt::Vertical</enum> </property> - <property name="margin"> - <number>0</number> + <property name="sizeHint" stdset="0"> + <size> + <width>77</width> + <height>37</height> + </size> </property> - <item> - <widget class="QPushButton" name="addButton"> - <property name="minimumSize"> - <size> - <width>21</width> - <height>23</height> - </size> - </property> - <property name="text"> - <string>Add...</string> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="delButton"> - <property name="minimumSize"> - <size> - <width>21</width> - <height>23</height> - </size> - </property> - <property name="text"> - <string>Remove</string> - </property> - </widget> - </item> - <item> - <spacer> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>10</width> - <height>40</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QPushButton" name="cleanUpButton"> - <property name="text"> - <string>Clean up</string> - </property> - </widget> - </item> - </layout> + </spacer> </item> </layout> </item> diff --git a/src/plugins/remotelinux/abstractembeddedlinuxtarget.h b/src/plugins/remotelinux/abstractembeddedlinuxtarget.h deleted file mode 100644 index 4f60678d9a..0000000000 --- a/src/plugins/remotelinux/abstractembeddedlinuxtarget.h +++ /dev/null @@ -1,77 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. -** -**************************************************************************/ -#ifndef ABSTRACTEMBEDDEDLINUXTARGET_H -#define ABSTRACTEMBEDDEDLINUXTARGET_H - -#include "remotelinux_export.h" - -#include <qt4projectmanager/qt4target.h> - -#include <QSharedPointer> -#include <QString> - -namespace ProjectExplorer { -class IBuildConfigurationFactory; -class IDevice; -} -namespace Qt4ProjectManager { class Qt4BuildConfigurationFactory; } - -namespace RemoteLinux { -class DeploymentInfo; -namespace Internal { class TypeSpecificDeviceConfigurationListModel; } - -class REMOTELINUX_EXPORT AbstractEmbeddedLinuxTarget : public Qt4ProjectManager::Qt4BaseTarget -{ - Q_OBJECT -public: - AbstractEmbeddedLinuxTarget(Qt4ProjectManager::Qt4Project *parent, const Core::Id id); - - ProjectExplorer::IBuildConfigurationFactory *buildConfigurationFactory() const; - - DeploymentInfo *deploymentInfo() const { return m_deploymentInfo; } - Internal::TypeSpecificDeviceConfigurationListModel *deviceConfigModel() const { - return m_deviceConfigModel; - } - virtual bool supportsDevice(const QSharedPointer<const ProjectExplorer::IDevice> &device) const = 0; - -signals: - void supportedDevicesChanged(); - -private: - Qt4ProjectManager::Qt4BuildConfigurationFactory * const m_buildConfigurationFactory; - DeploymentInfo * const m_deploymentInfo; - Internal::TypeSpecificDeviceConfigurationListModel * const m_deviceConfigModel; -}; - -} // namespace RemoteLinux - -#endif // ABSTRACTEMBEDDEDLINUXTARGET_H diff --git a/src/plugins/remotelinux/abstractremotelinuxdeployservice.cpp b/src/plugins/remotelinux/abstractremotelinuxdeployservice.cpp index 7f84926544..a534857da2 100644 --- a/src/plugins/remotelinux/abstractremotelinuxdeployservice.cpp +++ b/src/plugins/remotelinux/abstractremotelinuxdeployservice.cpp @@ -34,7 +34,9 @@ #include "deployablefile.h" #include "linuxdeviceconfiguration.h" +#include <projectexplorer/target.h> #include <qt4projectmanager/qt4buildconfiguration.h> +#include <qtsupport/qtprofileinformation.h> #include <utils/qtcassert.h> #include <ssh/sshconnection.h> #include <ssh/sshconnectionmanager.h> @@ -127,23 +129,32 @@ void AbstractRemoteLinuxDeployService::saveDeploymentTimeStamp(const DeployableF { if (!d->buildConfiguration) return; - const QtSupport::BaseQtVersion * const qtVersion = d->buildConfiguration->qtVersion(); + const QtSupport::BaseQtVersion *const qtVersion + = QtSupport::QtProfileInformation::qtVersion(d->buildConfiguration->target()->profile()); + QString systemRoot; + if (ProjectExplorer::SysRootProfileInformation::hasSysRoot(d->buildConfiguration->target()->profile())) + systemRoot = ProjectExplorer::SysRootProfileInformation::sysRoot(d->buildConfiguration->target()->profile()).toString(); if (!qtVersion || !qtVersion->isValid()) return; d->lastDeployed.insert(DeployParameters(deployableFile, - deviceConfiguration()->sshParameters().host, - qtVersion->systemRoot()), QDateTime::currentDateTime()); + deviceConfiguration()->sshParameters().host, + systemRoot), + QDateTime::currentDateTime()); } bool AbstractRemoteLinuxDeployService::hasChangedSinceLastDeployment(const DeployableFile &deployableFile) const { if (!d->buildConfiguration) return true; - const QtSupport::BaseQtVersion * const qtVersion = d->buildConfiguration->qtVersion(); + const QtSupport::BaseQtVersion *const qtVersion + = QtSupport::QtProfileInformation::qtVersion(d->buildConfiguration->target()->profile()); if (!qtVersion || !qtVersion->isValid()) return true; + QString systemRoot; + if (ProjectExplorer::SysRootProfileInformation::hasSysRoot(d->buildConfiguration->target()->profile())) + systemRoot = ProjectExplorer::SysRootProfileInformation::sysRoot(d->buildConfiguration->target()->profile()).toString(); const QDateTime &lastDeployed = d->lastDeployed.value(DeployParameters(deployableFile, - deviceConfiguration()->sshParameters().host, qtVersion->systemRoot())); + deviceConfiguration()->sshParameters().host, systemRoot)); return !lastDeployed.isValid() || QFileInfo(deployableFile.localFilePath).lastModified() > lastDeployed; } diff --git a/src/plugins/remotelinux/abstractremotelinuxdeploystep.cpp b/src/plugins/remotelinux/abstractremotelinuxdeploystep.cpp index 68a8f9fc92..4acbe663f5 100644 --- a/src/plugins/remotelinux/abstractremotelinuxdeploystep.cpp +++ b/src/plugins/remotelinux/abstractremotelinuxdeploystep.cpp @@ -32,9 +32,12 @@ #include "abstractremotelinuxdeploystep.h" #include "abstractremotelinuxdeployservice.h" +#include "linuxdeviceconfiguration.h" #include "remotelinuxdeployconfiguration.h" +#include <projectexplorer/devicesupport/devicemanager.h> #include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/profileinformation.h> #include <projectexplorer/target.h> #include <qt4projectmanager/qt4buildconfiguration.h> @@ -79,7 +82,8 @@ QVariantMap AbstractRemoteLinuxDeployStep::toMap() const bool AbstractRemoteLinuxDeployStep::init() { QString error; - deployService()->setDeviceConfiguration(deployConfiguration()->deviceConfiguration()); + deployService()->setDeviceConfiguration(ProjectExplorer::DeviceProfileInformation::device(target()->profile()) + .dynamicCast<const LinuxDeviceConfiguration>()); deployService()->setBuildConfiguration(qobject_cast<Qt4ProjectManager::Qt4BuildConfiguration *>(target()->activeBuildConfiguration())); const bool canDeploy = initInternal(&error); if (!canDeploy) diff --git a/src/plugins/remotelinux/deploymentinfo.cpp b/src/plugins/remotelinux/deploymentinfo.cpp index e599b754be..dddd7bf101 100644 --- a/src/plugins/remotelinux/deploymentinfo.cpp +++ b/src/plugins/remotelinux/deploymentinfo.cpp @@ -31,13 +31,15 @@ #include "deploymentinfo.h" -#include "abstractembeddedlinuxtarget.h" #include "deployablefile.h" #include "deployablefilesperprofile.h" +#include "remotelinuxdeployconfiguration.h" #include <projectexplorer/buildstep.h> +#include <projectexplorer/target.h> #include <qt4projectmanager/qt4buildconfiguration.h> #include <qt4projectmanager/qt4project.h> +#include <qtsupport/qtprofileinformation.h> #include <QList> #include <QTimer> @@ -49,20 +51,20 @@ namespace Internal { class DeploymentInfoPrivate { public: - DeploymentInfoPrivate(const AbstractEmbeddedLinuxTarget *target) : target(target) {} + DeploymentInfoPrivate(const Qt4ProjectManager::Qt4Project *p) : project(p) {} QList<DeployableFilesPerProFile *> listModels; - const AbstractEmbeddedLinuxTarget * const target; + const Qt4ProjectManager::Qt4Project *const project; QString installPrefix; }; } // namespace Internal using namespace Internal; -DeploymentInfo::DeploymentInfo(AbstractEmbeddedLinuxTarget *target, const QString &installPrefix) - : QAbstractListModel(target), d(new DeploymentInfoPrivate(target)) +DeploymentInfo::DeploymentInfo(Qt4ProjectManager::Qt4Project *project, const QString &installPrefix) + : QAbstractListModel(project), d(new DeploymentInfoPrivate(project)) { - connect (d->target->qt4Project(), SIGNAL(proParsingDone()), SLOT(createModels())); + connect(project, SIGNAL(buildSystemEvaluated()), SLOT(createModels())); setInstallPrefix(installPrefix); } @@ -73,27 +75,30 @@ DeploymentInfo::~DeploymentInfo() void DeploymentInfo::createModels() { - if (d->target->project()->activeTarget() != d->target) + ProjectExplorer::Target *target = d->project->activeTarget(); + if (!target + || !target->activeDeployConfiguration() + || !qobject_cast<RemoteLinuxDeployConfiguration *>(target->activeDeployConfiguration())) return; - const Qt4BuildConfiguration *bc = d->target->activeQt4BuildConfiguration(); - if (!bc || !bc->qtVersion() || !bc->qtVersion()->isValid()) { + + QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(target->profile()); + if (!version || !version->isValid()) { beginResetModel(); qDeleteAll(d->listModels); d->listModels.clear(); endResetModel(); return; } - const Qt4ProFileNode *const rootNode - = d->target->qt4Project()->rootQt4ProjectNode(); + const Qt4ProFileNode *const rootNode = d->project->rootQt4ProjectNode(); if (!rootNode || rootNode->parseInProgress()) // Can be null right after project creation by wizard. return; - disconnect(d->target->qt4Project(), SIGNAL(proParsingDone()), this, SLOT(createModels())); + disconnect(d->project, SIGNAL(buildSystemEvaluated()), this, SLOT(createModels())); beginResetModel(); qDeleteAll(d->listModels); d->listModels.clear(); createModels(rootNode); endResetModel(); - connect (d->target->qt4Project(), SIGNAL(proParsingDone()), SLOT(createModels())); + connect (d->project, SIGNAL(buildSystemEvaluated()), SLOT(createModels())); } void DeploymentInfo::createModels(const Qt4ProFileNode *proFileNode) diff --git a/src/plugins/remotelinux/deploymentinfo.h b/src/plugins/remotelinux/deploymentinfo.h index fffa093ac0..a7cb01bb07 100644 --- a/src/plugins/remotelinux/deploymentinfo.h +++ b/src/plugins/remotelinux/deploymentinfo.h @@ -36,10 +36,13 @@ #include <QAbstractListModel> -namespace Qt4ProjectManager { class Qt4ProFileNode; } +namespace ProjectExplorer { class Target; } +namespace Qt4ProjectManager { +class Qt4ProFileNode; +class Qt4Project; +} // namespace Qt4ProjectManager namespace RemoteLinux { -class AbstractEmbeddedLinuxTarget; class DeployableFile; class DeployableFilesPerProFile; @@ -51,7 +54,7 @@ class REMOTELINUX_EXPORT DeploymentInfo : public QAbstractListModel { Q_OBJECT public: - DeploymentInfo(AbstractEmbeddedLinuxTarget *target, const QString &installPrefix = QString()); + DeploymentInfo(Qt4ProjectManager::Qt4Project *project, const QString &installPrefix = QString()); ~DeploymentInfo(); void setUnmodified(); diff --git a/src/plugins/remotelinux/deploymentsettingsassistant.cpp b/src/plugins/remotelinux/deploymentsettingsassistant.cpp index 23270136a0..e87c571883 100644 --- a/src/plugins/remotelinux/deploymentsettingsassistant.cpp +++ b/src/plugins/remotelinux/deploymentsettingsassistant.cpp @@ -34,9 +34,12 @@ #include "deployablefile.h" #include "deployablefilesperprofile.h" #include "profilesupdatedialog.h" +#include "remotelinuxdeployconfiguration.h" #include <coreplugin/documentmanager.h> #include <coreplugin/icore.h> +#include <projectexplorer/project.h> +#include <projectexplorer/target.h> #include <qt4projectmanager/qt4nodes.h> #include <utils/fileutils.h> #include <utils/qtcassert.h> @@ -60,14 +63,11 @@ typedef QHash<QString, ProFileUpdateSetting> UpdateSettingsMap; class DeploymentSettingsAssistantInternal { public: - DeploymentSettingsAssistantInternal(const QString &qmakeScope, const QString &installPrefix, - DeploymentInfo *deploymentInfo) - : qmakeScope(qmakeScope), installPrefix(installPrefix), deploymentInfo(deploymentInfo) + DeploymentSettingsAssistantInternal(DeploymentInfo *deploymentInfo) + : deploymentInfo(deploymentInfo) { } - const QString qmakeScope; - const QString installPrefix; DeploymentInfo * const deploymentInfo; UpdateSettingsMap updateSettings; }; @@ -76,10 +76,10 @@ public: using namespace Internal; -DeploymentSettingsAssistant::DeploymentSettingsAssistant(const QString &qmakeScope, - const QString &installPrefix, DeploymentInfo *deploymentInfo, QObject *parent) +DeploymentSettingsAssistant::DeploymentSettingsAssistant(DeploymentInfo *deploymentInfo, + ProjectExplorer::Project *parent) : QObject(parent), - d(new DeploymentSettingsAssistantInternal(qmakeScope, installPrefix, deploymentInfo)) + d(new DeploymentSettingsAssistantInternal(deploymentInfo)) { connect(d->deploymentInfo, SIGNAL(modelReset()), SLOT(handleDeploymentInfoUpdated())); } @@ -89,23 +89,26 @@ DeploymentSettingsAssistant::~DeploymentSettingsAssistant() delete d; } -bool DeploymentSettingsAssistant::addDeployableToProFile(const DeployableFilesPerProFile *proFileInfo, - const QString &variableName, const DeployableFile &deployable) +bool DeploymentSettingsAssistant::addDeployableToProFile(const QString &qmakeScope, + const DeployableFilesPerProFile *proFileInfo, const QString &variableName, + const DeployableFile &deployable) { const QString filesLine = variableName + QLatin1String(".files = ") + QDir(proFileInfo->projectDir()).relativeFilePath(deployable.localFilePath); const QString pathLine = variableName + QLatin1String(".path = ") + deployable.remoteDir; const QString installsLine = QLatin1String("INSTALLS += ") + variableName; - return addLinesToProFile(proFileInfo, QStringList() << filesLine << pathLine << installsLine); + return addLinesToProFile(qmakeScope, proFileInfo, + QStringList() << filesLine << pathLine << installsLine); } -bool DeploymentSettingsAssistant::addLinesToProFile(const DeployableFilesPerProFile *proFileInfo, - const QStringList &lines) +bool DeploymentSettingsAssistant::addLinesToProFile(const QString &qmakeScope, + const DeployableFilesPerProFile *proFileInfo, + const QStringList &lines) { Core::FileChangeBlocker update(proFileInfo->proFilePath()); const QString separator = QLatin1String("\n "); - const QString proFileString = QLatin1Char('\n') + d->qmakeScope + QLatin1String(" {") + const QString proFileString = QLatin1Char('\n') + qmakeScope + QLatin1String(" {") + separator + lines.join(separator) + QLatin1String("\n}\n"); Utils::FileSaver saver(proFileInfo->proFilePath(), QIODevice::Append); saver.write(proFileString.toLocal8Bit()); @@ -114,6 +117,24 @@ bool DeploymentSettingsAssistant::addLinesToProFile(const DeployableFilesPerProF void DeploymentSettingsAssistant::handleDeploymentInfoUpdated() { + ProjectExplorer::Project *project = static_cast<ProjectExplorer::Project *>(parent()); + QStringList scopes; + QStringList pathes; + foreach (ProjectExplorer::Target *target, project->targets()) { + foreach (ProjectExplorer::DeployConfiguration *dc, target->deployConfigurations()) { + RemoteLinuxDeployConfiguration *rldc = qobject_cast<RemoteLinuxDeployConfiguration *>(dc); + if (!rldc) + continue; + const QString scope = rldc->qmakeScope(); + if (!scopes.contains(scope)) { + scopes.append(scope); + pathes.append(rldc->installPrefix()); + } + } + } + if (scopes.isEmpty()) + return; + QList<DeployableFilesPerProFile *> proFilesToAskAbout; QList<DeployableFilesPerProFile *> proFilesToUpdate; for (int i = 0; i < d->deploymentInfo->modelCount(); ++i) { @@ -144,11 +165,13 @@ void DeploymentSettingsAssistant::handleDeploymentInfoUpdated() foreach (const DeployableFilesPerProFile * const proFileInfo, proFilesToUpdate) { const QString remoteDirSuffix = QLatin1String(proFileInfo->projectType() == LibraryTemplate ? "/lib" : "/bin"); - const QString remoteDir = QLatin1String("target.path = ") + d->installPrefix - + QLatin1Char('/') + proFileInfo->projectName() + remoteDirSuffix; - const QStringList deployInfo = QStringList() << remoteDir - << QLatin1String("INSTALLS += target"); - addLinesToProFile(proFileInfo, deployInfo); + for (int i = 0; i < scopes.count(); ++i) { + const QString remoteDir = QLatin1String("target.path = ") + pathes.at(i) + + QLatin1Char('/') + proFileInfo->projectName() + remoteDirSuffix; + const QStringList deployInfo = QStringList() << remoteDir + << QLatin1String("INSTALLS += target"); + addLinesToProFile(scopes.at(i), proFileInfo, deployInfo); + } } } diff --git a/src/plugins/remotelinux/deploymentsettingsassistant.h b/src/plugins/remotelinux/deploymentsettingsassistant.h index d2912845bb..4a7ad0956d 100644 --- a/src/plugins/remotelinux/deploymentsettingsassistant.h +++ b/src/plugins/remotelinux/deploymentsettingsassistant.h @@ -36,32 +36,32 @@ #include <QObject> #include <QStringList> +namespace ProjectExplorer { class Project; } + namespace RemoteLinux { class DeployableFile; class DeployableFilesPerProFile; class DeploymentInfo; -namespace Internal { -class DeploymentSettingsAssistantInternal; -} // namespace Internal +namespace Internal { class DeploymentSettingsAssistantInternal; } class REMOTELINUX_EXPORT DeploymentSettingsAssistant : public QObject { Q_OBJECT - Q_DISABLE_COPY(DeploymentSettingsAssistant) + public: - DeploymentSettingsAssistant(const QString &qmakeScope, const QString &installPrefix, - DeploymentInfo *deploymentInfo, QObject *parent = 0); + DeploymentSettingsAssistant(DeploymentInfo *deploymentInfo, ProjectExplorer::Project *parent); ~DeploymentSettingsAssistant(); - bool addDeployableToProFile(const DeployableFilesPerProFile *proFileInfo, - const QString &variableName, const DeployableFile &deployable); + bool addDeployableToProFile(const QString &qmakeScope, + const DeployableFilesPerProFile *proFileInfo, + const QString &variableName, const DeployableFile &deployable); private slots: void handleDeploymentInfoUpdated(); private: - bool addLinesToProFile(const DeployableFilesPerProFile *proFileInfo, const QStringList &lines); + bool addLinesToProFile(const QString &qmakeScope, const DeployableFilesPerProFile *proFileInfo, const QStringList &lines); Internal::DeploymentSettingsAssistantInternal * const d; }; diff --git a/src/plugins/remotelinux/embeddedlinuxqtversion.cpp b/src/plugins/remotelinux/embeddedlinuxqtversion.cpp index b08ee8a4f2..e6b8c17518 100644 --- a/src/plugins/remotelinux/embeddedlinuxqtversion.cpp +++ b/src/plugins/remotelinux/embeddedlinuxqtversion.cpp @@ -74,16 +74,6 @@ QList<ProjectExplorer::Abi> EmbeddedLinuxQtVersion::detectQtAbis() const return qtAbisFromLibrary(qtCorePath(versionInfo(), qtVersionString())); } -bool EmbeddedLinuxQtVersion::supportsTargetId(const Core::Id id) const -{ - return id == Core::Id(Constants::EMBEDDED_LINUX_TARGET_ID); -} - -QSet<Core::Id> EmbeddedLinuxQtVersion::supportedTargetIds() const -{ - return QSet<Core::Id>() << Core::Id(Constants::EMBEDDED_LINUX_TARGET_ID); -} - QString EmbeddedLinuxQtVersion::description() const { return QCoreApplication::translate("QtVersion", "Embedded Linux", "Qt Version is used for embedded Linux development"); diff --git a/src/plugins/remotelinux/embeddedlinuxqtversion.h b/src/plugins/remotelinux/embeddedlinuxqtversion.h index c7d4181676..e548acb0b2 100644 --- a/src/plugins/remotelinux/embeddedlinuxqtversion.h +++ b/src/plugins/remotelinux/embeddedlinuxqtversion.h @@ -52,9 +52,6 @@ public: QList<ProjectExplorer::Abi> detectQtAbis() const; - bool supportsTargetId(const Core::Id id) const; - QSet<Core::Id> supportedTargetIds() const; - QString description() const; QString platformName() const; diff --git a/src/plugins/remotelinux/embeddedlinuxtargetfactory.cpp b/src/plugins/remotelinux/embeddedlinuxtargetfactory.cpp deleted file mode 100644 index a9eb98b01d..0000000000 --- a/src/plugins/remotelinux/embeddedlinuxtargetfactory.cpp +++ /dev/null @@ -1,176 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. -** -**************************************************************************/ - -#include "embeddedlinuxtargetfactory.h" - -#include "remotelinuxdeployconfiguration.h" -#include "remotelinuxdeployconfigurationfactory.h" -#include "genericembeddedlinuxtarget.h" -#include "remotelinux_constants.h" - -#include <qt4projectmanager/buildconfigurationinfo.h> -#include <qt4projectmanager/qt4project.h> -#include <qt4projectmanager/qt4projectmanagerconstants.h> - -#include <qtsupport/customexecutablerunconfiguration.h> -#include <qtsupport/qtversionmanager.h> - -#include <QIcon> - -namespace RemoteLinux { -namespace Internal { - -EmbeddedLinuxTargetFactory::EmbeddedLinuxTargetFactory(QObject *parent) : - Qt4ProjectManager::Qt4BaseTargetFactory(parent) -{ } - -EmbeddedLinuxTargetFactory::~EmbeddedLinuxTargetFactory() -{ } - -QIcon EmbeddedLinuxTargetFactory::iconForId(const Core::Id id) const -{ - if (id == Core::Id(Constants::EMBEDDED_LINUX_TARGET_ID)) - return QIcon(":/remotelinux/images/embeddedtarget.png"); - return QIcon(); -} - -QString EmbeddedLinuxTargetFactory::buildNameForId(const Core::Id id) const -{ - if (supportsTargetId(id)) - return tr("embedded"); - return QString(); -} - -QSet<QString> EmbeddedLinuxTargetFactory::targetFeatures(const Core::Id id) const -{ - Q_UNUSED(id); - QSet<QString> features; - features << Qt4ProjectManager::Constants::MOBILE_TARGETFEATURE_ID; - features << Qt4ProjectManager::Constants::SHADOWBUILD_TARGETFEATURE_ID; - - return features; -} - -QList<Core::Id> EmbeddedLinuxTargetFactory::supportedTargetIds() const -{ - return QList<Core::Id>() << Core::Id(RemoteLinux::Constants::EMBEDDED_LINUX_TARGET_ID); -} - -bool EmbeddedLinuxTargetFactory::supportsTargetId(const Core::Id id) const -{ - return id == Core::Id(RemoteLinux::Constants::EMBEDDED_LINUX_TARGET_ID); -} - -QString EmbeddedLinuxTargetFactory::displayNameForId(const Core::Id id) const -{ - if (id == Core::Id(RemoteLinux::Constants::EMBEDDED_LINUX_TARGET_ID)) - return tr("Embedded Linux"); - return QString(); -} - -bool EmbeddedLinuxTargetFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const -{ - return qobject_cast<Qt4ProjectManager::Qt4Project *>(parent) && supportsTargetId(ProjectExplorer::idFromMap(map)); -} - -ProjectExplorer::Target *EmbeddedLinuxTargetFactory::restore(ProjectExplorer::Project *parent, const QVariantMap &map) -{ - Q_ASSERT(canRestore(parent, map)); - - GenericEmbeddedLinuxTarget *t = - new GenericEmbeddedLinuxTarget(static_cast<Qt4ProjectManager::Qt4Project *>(parent), Core::Id()); - if (t->fromMap(map)) - return t; - - delete t; - return 0; -} - -bool EmbeddedLinuxTargetFactory::canCreate(ProjectExplorer::Project *parent, const Core::Id id) const -{ - Qt4ProjectManager::Qt4Project *project = qobject_cast<Qt4ProjectManager::Qt4Project *>(parent); - if (!project) - return false; - - if (!supportsTargetId(id)) - return false; - - return QtSupport::QtVersionManager::instance()->supportsTargetId(id); -} - -ProjectExplorer::Target *EmbeddedLinuxTargetFactory::create(ProjectExplorer::Project *parent, - const Core::Id id) -{ - if (!canCreate(parent, id)) - return 0; - - QList<QtSupport::BaseQtVersion *> knownVersions = - QtSupport::QtVersionManager::instance()->versionsForTargetId(id); - QtSupport::BaseQtVersion *qtVersion = knownVersions.first(); - QtSupport::BaseQtVersion::QmakeBuildConfigs config = qtVersion->defaultBuildConfig(); - - QList<Qt4ProjectManager::BuildConfigurationInfo> infos; - infos.append(Qt4ProjectManager::BuildConfigurationInfo(qtVersion->uniqueId(), config, QString(), QString())); - infos.append(Qt4ProjectManager::BuildConfigurationInfo(qtVersion->uniqueId(), - config ^ QtSupport::BaseQtVersion::DebugBuild, - QString(), QString())); - - return create(parent, id, infos); -} - -ProjectExplorer::Target *EmbeddedLinuxTargetFactory::create(ProjectExplorer::Project *parent, - const Core::Id id, - const QList<Qt4ProjectManager::BuildConfigurationInfo> &infos) -{ - if (!canCreate(parent, id) || infos.isEmpty()) - return 0; - - GenericEmbeddedLinuxTarget *t = new GenericEmbeddedLinuxTarget(static_cast<Qt4ProjectManager::Qt4Project *>(parent), id); - - foreach (const Qt4ProjectManager::BuildConfigurationInfo &info, infos) - t->addQt4BuildConfiguration(msgBuildConfigurationName(info), QString(), - info.version(), info.buildConfig, - info.additionalArguments, info.directory, info.importing); - - t->addDeployConfiguration( - t->createDeployConfiguration( - RemoteLinuxDeployConfigurationFactory::genericDeployConfigurationId())); - - t->createApplicationProFiles(false); - - if (t->runConfigurations().isEmpty()) - t->addRunConfiguration(new QtSupport::CustomExecutableRunConfiguration(t)); - return t; -} - -} // namespace Internal -} // namespace RemoteLinux diff --git a/src/plugins/remotelinux/embeddedlinuxtargetfactory.h b/src/plugins/remotelinux/embeddedlinuxtargetfactory.h deleted file mode 100644 index 77f4d80803..0000000000 --- a/src/plugins/remotelinux/embeddedlinuxtargetfactory.h +++ /dev/null @@ -1,71 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. -** -**************************************************************************/ - -#ifndef EMBEDDEDLINUXTARGETFACTORY_H -#define EMBEDDEDLINUXTARGETFACTORY_H - -#include <qt4projectmanager/qt4basetargetfactory.h> - -namespace RemoteLinux { -namespace Internal { - -class EmbeddedLinuxTargetFactory : public Qt4ProjectManager::Qt4BaseTargetFactory -{ - Q_OBJECT - -public: - explicit EmbeddedLinuxTargetFactory(QObject *parent = 0); - ~EmbeddedLinuxTargetFactory(); - - QIcon iconForId(const Core::Id id) const; - QString buildNameForId(const Core::Id id) const; - - QSet<QString> targetFeatures(const Core::Id id) const; - - QList<Core::Id> supportedTargetIds() const; - bool supportsTargetId(const Core::Id id) const; - - QString displayNameForId(const Core::Id id) const; - - bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const; - ProjectExplorer::Target *restore(ProjectExplorer::Project *parent, const QVariantMap &map); - - bool canCreate(ProjectExplorer::Project *parent, const Core::Id id) const; - ProjectExplorer::Target *create(ProjectExplorer::Project *parent, const Core::Id id); - ProjectExplorer::Target *create(ProjectExplorer::Project *parent, const Core::Id id, - const QList<Qt4ProjectManager::BuildConfigurationInfo> &infos); -}; - -} // namespace Internal -} // namespace RemoteLinux - -#endif // EMBEDDEDLINUXTARGETFACTORY_H diff --git a/src/plugins/remotelinux/genericembeddedlinuxtarget.cpp b/src/plugins/remotelinux/genericembeddedlinuxtarget.cpp deleted file mode 100644 index 4cd46186b8..0000000000 --- a/src/plugins/remotelinux/genericembeddedlinuxtarget.cpp +++ /dev/null @@ -1,109 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation (qt-info@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 qt-info@nokia.com. -** -**************************************************************************/ - -#include "genericembeddedlinuxtarget.h" - -#include "remotelinux_constants.h" -#include "remotelinuxrunconfiguration.h" - -#include <projectexplorer/devicesupport/idevice.h> -#include <qt4projectmanager/qt4buildconfiguration.h> -#include <qt4projectmanager/qt4nodes.h> -#include <qt4projectmanager/qt4project.h> -#include <qtsupport/baseqtversion.h> -#include <qtsupport/customexecutablerunconfiguration.h> - -#include <QCoreApplication> - -namespace RemoteLinux { -namespace Internal { - -GenericEmbeddedLinuxTarget::GenericEmbeddedLinuxTarget(Qt4ProjectManager::Qt4Project *parent, - const Core::Id id) : - AbstractEmbeddedLinuxTarget(parent, id) -{ - setDisplayName(tr("Embedded Linux")); -} - -QList<ProjectExplorer::RunConfiguration *> GenericEmbeddedLinuxTarget::runConfigurationsForNode(ProjectExplorer::Node *n) -{ - QList<ProjectExplorer::RunConfiguration *> result; - foreach (ProjectExplorer::RunConfiguration *rc, runConfigurations()) - if (RemoteLinuxRunConfiguration *qt4c = qobject_cast<RemoteLinuxRunConfiguration *>(rc)) - if (qt4c->proFilePath() == n->path()) - result << rc; - return result; -} - -Utils::FileName GenericEmbeddedLinuxTarget::mkspec(const Qt4ProjectManager::Qt4BuildConfiguration *bc) const -{ - QtSupport::BaseQtVersion *version = bc->qtVersion(); - if (!version) - return Utils::FileName(); - return version->mkspec(); -} - -bool GenericEmbeddedLinuxTarget::supportsDevice(const ProjectExplorer::IDevice::ConstPtr &device) const -{ - return device->type() == Core::Id(Constants::GenericLinuxOsType); -} - -void GenericEmbeddedLinuxTarget::createApplicationProFiles(bool reparse) -{ - if (!reparse) - removeUnconfiguredCustomExectutableRunConfigurations(); - - // We use the list twice - QList<Qt4ProjectManager::Qt4ProFileNode *> profiles = qt4Project()->applicationProFiles(); - QStringList pathes; - foreach (Qt4ProjectManager::Qt4ProFileNode *pro, profiles) - pathes.append(pro->path()); - - foreach (ProjectExplorer::RunConfiguration *rc, runConfigurations()) { - if (RemoteLinuxRunConfiguration *qt4rc = qobject_cast<RemoteLinuxRunConfiguration *>(rc)) - pathes.removeAll(qt4rc->proFilePath()); - } - - // Only add new runconfigurations if there are none. - foreach (const QString &path, pathes) { - RemoteLinuxRunConfiguration *qt4rc = - new RemoteLinuxRunConfiguration(this, Core::Id(RemoteLinuxRunConfiguration::Id), path); - addRunConfiguration(qt4rc); - } - - // Oh still none? Add a custom executable runconfiguration - if (runConfigurations().isEmpty()) - addRunConfiguration(new QtSupport::CustomExecutableRunConfiguration(this)); -} - -} // namespace Internal -} // namespace RemoteLinux diff --git a/src/plugins/remotelinux/genericremotelinuxdeploystepfactory.cpp b/src/plugins/remotelinux/genericremotelinuxdeploystepfactory.cpp index 93d7159044..1aebf376fd 100644 --- a/src/plugins/remotelinux/genericremotelinuxdeploystepfactory.cpp +++ b/src/plugins/remotelinux/genericremotelinuxdeploystepfactory.cpp @@ -33,13 +33,15 @@ #include "genericdirectuploadstep.h" #include "remotelinuxcheckforfreediskspacestep.h" +#include "remotelinuxdeployconfiguration.h" #include "remotelinuxdeployconfigurationfactory.h" #include "remotelinuxcustomcommanddeploymentstep.h" #include "tarpackagecreationstep.h" #include "uploadandinstalltarpackagestep.h" #include <projectexplorer/buildsteplist.h> -#include <projectexplorer/deployconfiguration.h> +#include <projectexplorer/profileinformation.h> +#include <projectexplorer/target.h> using namespace ProjectExplorer; @@ -54,8 +56,7 @@ GenericRemoteLinuxDeployStepFactory::GenericRemoteLinuxDeployStepFactory(QObject QList<Core::Id> GenericRemoteLinuxDeployStepFactory::availableCreationIds(BuildStepList *parent) const { QList<Core::Id> ids; - const DeployConfiguration * const dc = qobject_cast<DeployConfiguration *>(parent->parent()); - if (!dc || dc->id() != RemoteLinuxDeployConfigurationFactory::genericDeployConfigurationId()) + if (!qobject_cast<RemoteLinuxDeployConfiguration *>(parent->parent())) return ids; ids << TarPackageCreationStep::stepId() << UploadAndInstallTarPackageStep::stepId() << GenericDirectUploadStep::stepId() diff --git a/src/plugins/remotelinux/linuxdeviceconfiguration.cpp b/src/plugins/remotelinux/linuxdeviceconfiguration.cpp index 1a192ecd5a..fd0d12b8b0 100644 --- a/src/plugins/remotelinux/linuxdeviceconfiguration.cpp +++ b/src/plugins/remotelinux/linuxdeviceconfiguration.cpp @@ -29,6 +29,7 @@ ** Nokia at qt-info@nokia.com. ** **************************************************************************/ + #include "linuxdeviceconfiguration.h" #include "genericlinuxdeviceconfigurationwidget.h" @@ -39,6 +40,9 @@ #include "remotelinux_constants.h" #include <coreplugin/id.h> + +#include <utils/portlist.h> +#include <ssh/sshconnection.h> #include <utils/qtcassert.h> namespace RemoteLinux { diff --git a/src/plugins/remotelinux/remotelinux.pro b/src/plugins/remotelinux/remotelinux.pro index 834306880b..b20e68f78b 100644 --- a/src/plugins/remotelinux/remotelinux.pro +++ b/src/plugins/remotelinux/remotelinux.pro @@ -6,8 +6,6 @@ include(../../qtcreatorplugin.pri) include(remotelinux_dependencies.pri) HEADERS += \ - genericembeddedlinuxtarget.h \ - embeddedlinuxtargetfactory.h \ embeddedlinuxqtversion.h \ embeddedlinuxqtversionfactory.h \ remotelinuxplugin.h \ @@ -56,14 +54,11 @@ HEADERS += \ startgdbserverdialog.h \ remotelinuxcustomcommanddeployservice.h \ remotelinuxcustomcommanddeploymentstep.h \ - abstractembeddedlinuxtarget.h \ genericlinuxdeviceconfigurationwidget.h \ remotelinuxcheckforfreediskspaceservice.h \ remotelinuxcheckforfreediskspacestep.h SOURCES += \ - genericembeddedlinuxtarget.cpp \ - embeddedlinuxtargetfactory.cpp \ embeddedlinuxqtversion.cpp \ embeddedlinuxqtversionfactory.cpp \ remotelinuxplugin.cpp \ @@ -109,7 +104,6 @@ SOURCES += \ startgdbserverdialog.cpp \ remotelinuxcustomcommanddeployservice.cpp \ remotelinuxcustomcommanddeploymentstep.cpp \ - abstractembeddedlinuxtarget.cpp \ genericlinuxdeviceconfigurationwidget.cpp \ remotelinuxcheckforfreediskspaceservice.cpp \ remotelinuxcheckforfreediskspacestep.cpp diff --git a/src/plugins/remotelinux/remotelinux.qbs b/src/plugins/remotelinux/remotelinux.qbs index bad03535f8..5c6bdf04bf 100644 --- a/src/plugins/remotelinux/remotelinux.qbs +++ b/src/plugins/remotelinux/remotelinux.qbs @@ -28,10 +28,6 @@ QtcPlugin { "abstractremotelinuxdeploystep.h", "abstractuploadandinstallpackageservice.cpp", "abstractuploadandinstallpackageservice.h", - "abstractembeddedlinuxtarget.cpp", - "abstractembeddedlinuxtarget.h", - "genericembeddedlinuxtarget.cpp", - "genericembeddedlinuxtarget.h", "deployablefile.h", "deployablefilesperprofile.cpp", "deployablefilesperprofile.h", @@ -43,8 +39,6 @@ QtcPlugin { "embeddedlinuxqtversion.h", "embeddedlinuxqtversionfactory.cpp", "embeddedlinuxqtversionfactory.h", - "embeddedlinuxtargetfactory.cpp", - "embeddedlinuxtargetfactory.h", "genericdirectuploadservice.cpp", "genericdirectuploadstep.h", "genericlinuxdeviceconfigurationfactory.cpp", diff --git a/src/plugins/remotelinux/remotelinux_constants.h b/src/plugins/remotelinux/remotelinux_constants.h index dc7c90df81..ae7049f593 100644 --- a/src/plugins/remotelinux/remotelinux_constants.h +++ b/src/plugins/remotelinux/remotelinux_constants.h @@ -42,7 +42,6 @@ const char GenericDeployKeyToDeviceActionId[] = "RemoteLinux.GenericDeployKeyToD const char GenericRemoteProcessesActionId[] = "RemoteLinux.GenericRemoteProcessesAction"; const char EMBEDDED_LINUX_QT[] = "RemoteLinux.EmbeddedLinuxQt"; -const char EMBEDDED_LINUX_TARGET_ID[] = "RemoteLinux.EmbeddedLinuxTarget"; } // Constants } // RemoteLinux diff --git a/src/plugins/remotelinux/remotelinuxapplicationrunner.cpp b/src/plugins/remotelinux/remotelinuxapplicationrunner.cpp index f8cb42f094..5744373eea 100644 --- a/src/plugins/remotelinux/remotelinuxapplicationrunner.cpp +++ b/src/plugins/remotelinux/remotelinuxapplicationrunner.cpp @@ -35,6 +35,9 @@ #include "remotelinuxrunconfiguration.h" #include "remotelinuxusedportsgatherer.h" +#include <projectexplorer/target.h> +#include <projectexplorer/profileinformation.h> + #include <utils/portlist.h> #include <utils/qtcassert.h> #include <ssh/sshconnection.h> @@ -63,16 +66,16 @@ class AbstractRemoteLinuxApplicationRunnerPrivate { public: AbstractRemoteLinuxApplicationRunnerPrivate(const RemoteLinuxRunConfiguration *runConfig) - : devConfig(runConfig->deviceConfig()), + : devConfig(ProjectExplorer::DeviceProfileInformation::device(runConfig->target()->profile()) + .dynamicCast<const LinuxDeviceConfiguration>()), remoteExecutable(runConfig->remoteExecutableFilePath()), appArguments(runConfig->arguments()), commandPrefix(runConfig->commandPrefix()), - initialFreePorts(runConfig->freePorts()), + initialFreePorts(devConfig->freePorts()), connection(0), stopRequested(false), state(Inactive) - { - } + { } RemoteLinuxUsedPortsGatherer portsGatherer; LinuxDeviceConfiguration::ConstPtr devConfig; diff --git a/src/plugins/remotelinux/remotelinuxdebugsupport.cpp b/src/plugins/remotelinux/remotelinuxdebugsupport.cpp index 0e75c07a25..a561bda67a 100644 --- a/src/plugins/remotelinux/remotelinuxdebugsupport.cpp +++ b/src/plugins/remotelinux/remotelinuxdebugsupport.cpp @@ -37,11 +37,14 @@ #include <debugger/debuggerengine.h> #include <debugger/debuggerstartparameters.h> +#include <debugger/debuggerprofileinformation.h> #include <projectexplorer/abi.h> +#include <projectexplorer/profile.h> #include <projectexplorer/project.h> #include <projectexplorer/target.h> #include <projectexplorer/toolchain.h> #include <qt4projectmanager/qt4buildconfiguration.h> +#include <qtsupport/qtprofileinformation.h> #include <utils/qtcassert.h> #include <QPointer> @@ -94,29 +97,35 @@ using namespace Internal; DebuggerStartParameters AbstractRemoteLinuxDebugSupport::startParameters(const RemoteLinuxRunConfiguration *runConfig) { DebuggerStartParameters params; - const IDevice::ConstPtr &devConf = runConfig->deviceConfig(); + const LinuxDeviceConfiguration::ConstPtr devConf + = ProjectExplorer::DeviceProfileInformation::device(runConfig->target()->profile()) + .dynamicCast<const RemoteLinux::LinuxDeviceConfiguration>(); if (runConfig->debuggerAspect()->useQmlDebugger()) { params.languages |= QmlLanguage; - params.qmlServerAddress = runConfig->deviceConfig()->sshParameters().host; + params.qmlServerAddress = devConf->sshParameters().host; params.qmlServerPort = 0; // port is selected later on } if (runConfig->debuggerAspect()->useCppDebugger()) { params.languages |= CppLanguage; params.processArgs = runConfig->arguments(); - if (runConfig->activeQt4BuildConfiguration()->qtVersion()) - params.sysroot = runConfig->activeQt4BuildConfiguration()->qtVersion()->systemRoot(); + QString systemRoot; + if (ProjectExplorer::SysRootProfileInformation::hasSysRoot(runConfig->target()->profile())) + systemRoot = ProjectExplorer::SysRootProfileInformation::sysRoot(runConfig->target()->profile()).toString(); + params.sysroot = systemRoot; params.toolChainAbi = runConfig->abi(); params.startMode = AttachToRemoteServer; params.executable = runConfig->localExecutableFilePath(); - params.debuggerCommand = runConfig->gdbCmd(); + params.debuggerCommand = Debugger::DebuggerProfileInformation::debuggerCommand(runConfig->target()->profile()).toString(); params.remoteChannel = devConf->sshParameters().host + QLatin1String(":-1"); // TODO: This functionality should be inside the debugger. - const ProjectExplorer::Abi &abi = runConfig->target() - ->activeBuildConfiguration()->toolChain()->targetAbi(); - params.remoteArchitecture = abi.toString(); - params.gnuTarget = QLatin1String(abi.architecture() == ProjectExplorer::Abi::ArmArchitecture - ? "arm-none-linux-gnueabi": "i386-unknown-linux-gnu"); + ToolChain *tc = ToolChainProfileInformation::toolChain(runConfig->target()->profile()); + if (tc) { + const ProjectExplorer::Abi &abi = tc->targetAbi(); + params.remoteArchitecture = abi.toString(); + params.gnuTarget = QLatin1String(abi.architecture() == ProjectExplorer::Abi::ArmArchitecture + ? "arm-none-linux-gnueabi": "i386-unknown-linux-gnu"); + } } else { params.startMode = AttachToRemoteServer; } diff --git a/src/plugins/remotelinux/remotelinuxdeployconfiguration.cpp b/src/plugins/remotelinux/remotelinuxdeployconfiguration.cpp index 788777f591..91f3dc365d 100644 --- a/src/plugins/remotelinux/remotelinuxdeployconfiguration.cpp +++ b/src/plugins/remotelinux/remotelinuxdeployconfiguration.cpp @@ -31,109 +31,62 @@ **************************************************************************/ #include "remotelinuxdeployconfiguration.h" -#include "abstractembeddedlinuxtarget.h" #include "deploymentinfo.h" #include "remotelinuxdeployconfigurationwidget.h" #include "typespecificdeviceconfigurationlistmodel.h" #include <coreplugin/id.h> #include <projectexplorer/devicesupport/devicemanager.h> -#include <qt4projectmanager/qt4target.h> +#include <projectexplorer/target.h> +#include <qt4projectmanager/qt4project.h> using namespace ProjectExplorer; using namespace Qt4ProjectManager; -namespace RemoteLinux { -namespace Internal { namespace { -const char DeviceIdKey[] = "Qt4ProjectManager.MaemoRunConfiguration.DeviceId"; -} // anonymous namespace - -class RemoteLinuxDeployConfigurationPrivate -{ -public: - QSharedPointer<const LinuxDeviceConfiguration> deviceConfiguration; -}; +const char DEPLOYMENT_INFO_SETTING[] = "RemoteLinux.DeploymentInfo"; +} // namespace -} // namespace Internal +namespace RemoteLinux { using namespace Internal; RemoteLinuxDeployConfiguration::RemoteLinuxDeployConfiguration(ProjectExplorer::Target *target, const Core::Id id, const QString &defaultDisplayName) - : DeployConfiguration(target, id), d(new RemoteLinuxDeployConfigurationPrivate) + : DeployConfiguration(target, id) { setDefaultDisplayName(defaultDisplayName); - initialize(); + // Make sure we have deploymentInfo, but create it only once: + DeploymentInfo *info + = qobject_cast<DeploymentInfo *>(target->project()->namedSettings(QLatin1String(DEPLOYMENT_INFO_SETTING)).value<QObject *>()); + if (!info) { + info = new DeploymentInfo(static_cast<Qt4ProjectManager::Qt4Project *>(target->project())); + QVariant data = QVariant::fromValue(static_cast<QObject *>(info)); + target->project()->setNamedSettings(QLatin1String(DEPLOYMENT_INFO_SETTING), data); + } } RemoteLinuxDeployConfiguration::RemoteLinuxDeployConfiguration(ProjectExplorer::Target *target, RemoteLinuxDeployConfiguration *source) - : DeployConfiguration(target, source), d(new RemoteLinuxDeployConfigurationPrivate) -{ - initialize(); -} - -RemoteLinuxDeployConfiguration::~RemoteLinuxDeployConfiguration() -{ - delete d; -} - -void RemoteLinuxDeployConfiguration::initialize() -{ - d->deviceConfiguration = target()->deviceConfigModel()->defaultDeviceConfig(); - connect(target()->deviceConfigModel(), SIGNAL(modelReset()), - SLOT(handleDeviceConfigurationListUpdated())); -} - -void RemoteLinuxDeployConfiguration::handleDeviceConfigurationListUpdated() -{ - setDeviceConfig(DeviceManager::instance()->deviceId(d->deviceConfiguration)); -} + : DeployConfiguration(target, source) +{ } -void RemoteLinuxDeployConfiguration::setDeviceConfig(Core::Id id) -{ - d->deviceConfiguration = target()->deviceConfigModel()->find(id); - emit deviceConfigurationListChanged(); - emit currentDeviceConfigurationChanged(); -} - -bool RemoteLinuxDeployConfiguration::fromMap(const QVariantMap &map) -{ - if (!DeployConfiguration::fromMap(map)) - return false; - const QString idString = map.value(QLatin1String(DeviceIdKey)).toString(); - setDeviceConfig(!idString.isEmpty() ? Core::Id(idString) : IDevice::invalidId()); - return true; -} - -QVariantMap RemoteLinuxDeployConfiguration::toMap() const -{ - QVariantMap map = DeployConfiguration::toMap(); - map.insert(QLatin1String(DeviceIdKey), - DeviceManager::instance()->deviceId(d->deviceConfiguration).toString()); - return map; -} - -void RemoteLinuxDeployConfiguration::setDeviceConfiguration(int index) +DeploymentInfo *RemoteLinuxDeployConfiguration::deploymentInfo() const { - const LinuxDeviceConfiguration::ConstPtr &newDevConf - = target()->deviceConfigModel()->deviceAt(index); - if (d->deviceConfiguration != newDevConf) { - d->deviceConfiguration = newDevConf; - emit currentDeviceConfigurationChanged(); - } + DeploymentInfo *info + = qobject_cast<DeploymentInfo *>(target()->project()->namedSettings(QLatin1String(DEPLOYMENT_INFO_SETTING)).value<QObject *>()); + return info; } -AbstractEmbeddedLinuxTarget *RemoteLinuxDeployConfiguration::target() const +QString RemoteLinuxDeployConfiguration::qmakeScope() const { - return qobject_cast<AbstractEmbeddedLinuxTarget *>(DeployConfiguration::target()); + return QLatin1String("unix"); } -DeploymentInfo *RemoteLinuxDeployConfiguration::deploymentInfo() const +QString RemoteLinuxDeployConfiguration::installPrefix() const { - return target()->deploymentInfo(); + return QString(); } DeployConfigurationWidget *RemoteLinuxDeployConfiguration::configurationWidget() const @@ -141,9 +94,4 @@ DeployConfigurationWidget *RemoteLinuxDeployConfiguration::configurationWidget() return new RemoteLinuxDeployConfigurationWidget; } -LinuxDeviceConfiguration::ConstPtr RemoteLinuxDeployConfiguration::deviceConfiguration() const -{ - return d->deviceConfiguration; -} - } // namespace RemoteLinux diff --git a/src/plugins/remotelinux/remotelinuxdeployconfiguration.h b/src/plugins/remotelinux/remotelinuxdeployconfiguration.h index b000e2023e..55ee42421d 100644 --- a/src/plugins/remotelinux/remotelinuxdeployconfiguration.h +++ b/src/plugins/remotelinux/remotelinuxdeployconfiguration.h @@ -29,24 +29,25 @@ ** Nokia at qt-info@nokia.com. ** **************************************************************************/ + #ifndef REMOTELINUXDEPLOYCONFIGURATION_H #define REMOTELINUXDEPLOYCONFIGURATION_H #include "linuxdeviceconfiguration.h" + #include "remotelinux_export.h" +#include <coreplugin/id.h> #include <projectexplorer/buildstep.h> #include <projectexplorer/buildsteplist.h> #include <projectexplorer/deployconfiguration.h> -#include <QSharedPointer> - namespace RemoteLinux { class AbstractEmbeddedLinuxTarget; class DeploymentInfo; namespace Internal { -class RemoteLinuxDeployConfigurationPrivate; +class RemoteLinuxDeployConfigurationFactory; class TypeSpecificDeviceConfigurationListModel; } // namespace Internal @@ -54,22 +55,16 @@ class REMOTELINUX_EXPORT RemoteLinuxDeployConfiguration : public ProjectExplorer::DeployConfiguration { Q_OBJECT - Q_DISABLE_COPY(RemoteLinuxDeployConfiguration) + public: RemoteLinuxDeployConfiguration(ProjectExplorer::Target *target, const Core::Id id, const QString &defaultDisplayName); RemoteLinuxDeployConfiguration(ProjectExplorer::Target *target, RemoteLinuxDeployConfiguration *source); - ~RemoteLinuxDeployConfiguration(); - - bool fromMap(const QVariantMap &map); ProjectExplorer::DeployConfigurationWidget *configurationWidget() const; - void setDeviceConfiguration(int index); - AbstractEmbeddedLinuxTarget *target() const; DeploymentInfo *deploymentInfo() const; - QSharedPointer<const LinuxDeviceConfiguration> deviceConfiguration() const; template<class T> T *earlierBuildStep(const ProjectExplorer::BuildStep *laterBuildStep) const { @@ -83,20 +78,14 @@ public: return 0; } -protected: - QVariantMap toMap() const; + virtual QString qmakeScope() const; + virtual QString installPrefix() const; signals: - void deviceConfigurationListChanged(); - void currentDeviceConfigurationChanged(); + void packagingChanged(); private: - - void initialize(); - void setDeviceConfig(Core::Id id); - Q_SLOT void handleDeviceConfigurationListUpdated(); - - Internal::RemoteLinuxDeployConfigurationPrivate * const d; + friend class Internal::RemoteLinuxDeployConfigurationFactory; }; } // namespace RemoteLinux diff --git a/src/plugins/remotelinux/remotelinuxdeployconfigurationfactory.cpp b/src/plugins/remotelinux/remotelinuxdeployconfigurationfactory.cpp index 7ff2c34c30..5d7590be6f 100644 --- a/src/plugins/remotelinux/remotelinuxdeployconfigurationfactory.cpp +++ b/src/plugins/remotelinux/remotelinuxdeployconfigurationfactory.cpp @@ -31,11 +31,17 @@ **************************************************************************/ #include "remotelinuxdeployconfigurationfactory.h" -#include "genericembeddedlinuxtarget.h" #include "genericdirectuploadstep.h" #include "remotelinuxcheckforfreediskspacestep.h" +#include "remotelinux_constants.h" #include "remotelinuxdeployconfiguration.h" +#include <projectexplorer/abi.h> +#include <projectexplorer/profileinformation.h> +#include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/target.h> +#include <qt4projectmanager/qt4project.h> + #include <QCoreApplication> using namespace ProjectExplorer; @@ -50,12 +56,23 @@ QString genericLinuxDisplayName() { RemoteLinuxDeployConfigurationFactory::RemoteLinuxDeployConfigurationFactory(QObject *parent) : DeployConfigurationFactory(parent) -{ } +{ setObjectName(QLatin1String("RemoteLinuxDeployConfiguration"));} QList<Core::Id> RemoteLinuxDeployConfigurationFactory::availableCreationIds(Target *parent) const { QList<Core::Id> ids; - if (qobject_cast<GenericEmbeddedLinuxTarget *>(parent)) + if (!qobject_cast<Qt4ProjectManager::Qt4Project *>(parent->project())) + return ids; + ProjectExplorer::ToolChain *tc + = ProjectExplorer::ToolChainProfileInformation::toolChain(parent->profile()); + if (!tc || tc->targetAbi().os() != ProjectExplorer::Abi::LinuxOS) + return ids; + if (ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(parent->profile()) + == ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE) + return ids; + + ProjectExplorer::IDevice::ConstPtr dev = ProjectExplorer::DeviceProfileInformation::device(parent->profile()); + if (!dev.isNull() && dev->type() == Core::Id(Constants::GenericLinuxOsType)) ids << genericDeployConfigurationId(); return ids; } diff --git a/src/plugins/remotelinux/remotelinuxdeployconfigurationwidget.cpp b/src/plugins/remotelinux/remotelinuxdeployconfigurationwidget.cpp index 818221ffcc..d5440c2a43 100644 --- a/src/plugins/remotelinux/remotelinuxdeployconfigurationwidget.cpp +++ b/src/plugins/remotelinux/remotelinuxdeployconfigurationwidget.cpp @@ -31,7 +31,6 @@ #include "remotelinuxdeployconfigurationwidget.h" #include "ui_remotelinuxdeployconfigurationwidget.h" -#include "abstractembeddedlinuxtarget.h" #include "deployablefilesperprofile.h" #include "deploymentinfo.h" #include "remotelinuxdeployconfiguration.h" @@ -42,6 +41,7 @@ #include <coreplugin/id.h> #include <projectexplorer/devicesupport/devicemanager.h> #include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/target.h> #include <utils/qtcassert.h> #include <QTreeView> @@ -102,17 +102,8 @@ void RemoteLinuxDeployConfigurationWidget::init(DeployConfiguration *dc) d->deployConfiguration = qobject_cast<RemoteLinuxDeployConfiguration *>(dc); Q_ASSERT(d->deployConfiguration); - connect(d->ui.manageDevConfsLabel, SIGNAL(linkActivated(QString)), - SLOT(showDeviceConfigurations())); connect(&d->treeView, SIGNAL(doubleClicked()), SLOT(openProjectFile())); - d->ui.deviceConfigsComboBox->setModel(d->deployConfiguration->target()->deviceConfigModel()); - connect(d->ui.deviceConfigsComboBox, SIGNAL(activated(int)), - SLOT(handleSelectedDeviceConfigurationChanged(int))); - connect(d->deployConfiguration, SIGNAL(deviceConfigurationListChanged()), - SLOT(handleDeviceConfigurationListChanged())); - handleDeviceConfigurationListChanged(); - d->ui.projectsComboBox->setModel(d->deployConfiguration->deploymentInfo()); connect(d->deployConfiguration->deploymentInfo(), SIGNAL(modelAboutToBeReset()), SLOT(handleModelListToBeReset())); @@ -170,32 +161,6 @@ void RemoteLinuxDeployConfigurationWidget::setModel(int row) emit currentModelChanged(proFileInfo); } -void RemoteLinuxDeployConfigurationWidget::handleSelectedDeviceConfigurationChanged(int index) -{ - disconnect(d->deployConfiguration, SIGNAL(deviceConfigurationListChanged()), this, - SLOT(handleDeviceConfigurationListChanged())); - d->deployConfiguration->setDeviceConfiguration(index); - connect(d->deployConfiguration, SIGNAL(deviceConfigurationListChanged()), - SLOT(handleDeviceConfigurationListChanged())); -} - -void RemoteLinuxDeployConfigurationWidget::handleDeviceConfigurationListChanged() -{ - const LinuxDeviceConfiguration::ConstPtr &devConf - = d->deployConfiguration->deviceConfiguration(); - const Core::Id id = DeviceManager::instance()->deviceId(devConf); - const int newIndex - = d->deployConfiguration->target()->deviceConfigModel()->indexForId(id); - d->ui.deviceConfigsComboBox->setCurrentIndex(newIndex); -} - -void RemoteLinuxDeployConfigurationWidget::showDeviceConfigurations() -{ - Core::ICore::showOptionsDialog( - QLatin1String(ProjectExplorer::Constants::DEVICE_SETTINGS_CATEGORY), - QLatin1String(ProjectExplorer::Constants::DEVICE_SETTINGS_PAGE_ID)); -} - void RemoteLinuxDeployConfigurationWidget::openProjectFile() { const int row = d->ui.projectsComboBox->currentIndex(); diff --git a/src/plugins/remotelinux/remotelinuxdeployconfigurationwidget.h b/src/plugins/remotelinux/remotelinuxdeployconfigurationwidget.h index b28e7f707f..0d0036a43a 100644 --- a/src/plugins/remotelinux/remotelinuxdeployconfigurationwidget.h +++ b/src/plugins/remotelinux/remotelinuxdeployconfigurationwidget.h @@ -64,9 +64,6 @@ private slots: void handleModelListToBeReset(); void handleModelListReset(); void setModel(int row); - void handleSelectedDeviceConfigurationChanged(int index); - void handleDeviceConfigurationListChanged(); - void showDeviceConfigurations(); void openProjectFile(); private: diff --git a/src/plugins/remotelinux/remotelinuxdeployconfigurationwidget.ui b/src/plugins/remotelinux/remotelinuxdeployconfigurationwidget.ui index caba98032e..2bfa1bd8a6 100644 --- a/src/plugins/remotelinux/remotelinuxdeployconfigurationwidget.ui +++ b/src/plugins/remotelinux/remotelinuxdeployconfigurationwidget.ui @@ -16,41 +16,10 @@ <layout class="QVBoxLayout" name="verticalLayout"> <item> <layout class="QFormLayout" name="formLayout"> + <property name="fieldGrowthPolicy"> + <enum>QFormLayout::AllNonFixedFieldsGrow</enum> + </property> <item row="0" column="0"> - <widget class="QLabel" name="label"> - <property name="text"> - <string>Device configuration:</string> - </property> - </widget> - </item> - <item row="0" column="1"> - <layout class="QHBoxLayout" name="horizontalLayout_2"> - <item> - <widget class="QComboBox" name="deviceConfigsComboBox"/> - </item> - <item> - <widget class="QLabel" name="manageDevConfsLabel"> - <property name="text"> - <string><a href="irrelevant">Manage device configurations</a></string> - </property> - </widget> - </item> - <item> - <spacer name="horizontalSpacer"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - </layout> - </item> - <item row="1" column="0"> <widget class="QLabel" name="installLabel"> <property name="toolTip"> <string>These show the INSTALLS settings from the project file(s).</string> @@ -60,7 +29,7 @@ </property> </widget> </item> - <item row="1" column="1"> + <item row="0" column="1"> <layout class="QHBoxLayout" name="horizontalLayout"> <item> <widget class="QComboBox" name="projectsComboBox"> diff --git a/src/plugins/remotelinux/remotelinuxenvironmentreader.cpp b/src/plugins/remotelinux/remotelinuxenvironmentreader.cpp index 5b51621fca..97fdd7c1d6 100644 --- a/src/plugins/remotelinux/remotelinuxenvironmentreader.cpp +++ b/src/plugins/remotelinux/remotelinuxenvironmentreader.cpp @@ -34,6 +34,8 @@ #include "remotelinuxrunconfiguration.h" #include <ssh/sshremoteprocessrunner.h> +#include <projectexplorer/profileinformation.h> +#include <projectexplorer/target.h> namespace RemoteLinux { namespace Internal { @@ -42,11 +44,11 @@ RemoteLinuxEnvironmentReader::RemoteLinuxEnvironmentReader(RemoteLinuxRunConfigu QObject *parent) : QObject(parent) , m_stop(false) - , m_devConfig(config->deviceConfig()) + , m_devConfig(ProjectExplorer::DeviceProfileInformation::device(config->target()->profile())) , m_runConfig(config) , m_remoteProcessRunner(0) { - connect(config, SIGNAL(deviceConfigurationChanged(ProjectExplorer::Target*)), + connect(config->target(), SIGNAL(profileChanged()), this, SLOT(handleCurrentDeviceConfigChanged())); } @@ -87,7 +89,7 @@ void RemoteLinuxEnvironmentReader::handleConnectionFailure() void RemoteLinuxEnvironmentReader::handleCurrentDeviceConfigChanged() { - m_devConfig = m_runConfig->deviceConfig(); + m_devConfig = ProjectExplorer::DeviceProfileInformation::device(m_runConfig->target()->profile()); if (m_remoteProcessRunner) disconnect(m_remoteProcessRunner, 0, this, 0); diff --git a/src/plugins/remotelinux/remotelinuxenvironmentreader.h b/src/plugins/remotelinux/remotelinuxenvironmentreader.h index acda6147d9..d1c78dada2 100644 --- a/src/plugins/remotelinux/remotelinuxenvironmentreader.h +++ b/src/plugins/remotelinux/remotelinuxenvironmentreader.h @@ -32,10 +32,11 @@ #ifndef REMOTELINUXENVIRONMENTREADER_H #define REMOTELINUXENVIRONMENTREADER_H +#include <projectexplorer/devicesupport/idevice.h> #include <utils/environment.h> #include <QObject> -#include <QSharedPointer> + namespace QSsh { class SshRemoteProcessRunner; @@ -74,7 +75,7 @@ private: bool m_stop; Utils::Environment m_env; - QSharedPointer<const LinuxDeviceConfiguration> m_devConfig; + ProjectExplorer::IDevice::ConstPtr m_devConfig; RemoteLinuxRunConfiguration *m_runConfig; QSsh::SshRemoteProcessRunner *m_remoteProcessRunner; }; diff --git a/src/plugins/remotelinux/remotelinuxplugin.cpp b/src/plugins/remotelinux/remotelinuxplugin.cpp index 0cf91f4fdf..f037a30768 100644 --- a/src/plugins/remotelinux/remotelinuxplugin.cpp +++ b/src/plugins/remotelinux/remotelinuxplugin.cpp @@ -33,7 +33,6 @@ #include "remotelinuxplugin.h" #include "embeddedlinuxqtversionfactory.h" -#include "embeddedlinuxtargetfactory.h" #include "deployablefile.h" #include "genericlinuxdeviceconfigurationfactory.h" #include "genericremotelinuxdeploystepfactory.h" @@ -76,7 +75,6 @@ bool RemoteLinuxPlugin::initialize(const QStringList &arguments, addAutoReleasedObject(new RemoteLinuxDeployConfigurationFactory); addAutoReleasedObject(new GenericRemoteLinuxDeployStepFactory); - addAutoReleasedObject(new EmbeddedLinuxTargetFactory); addAutoReleasedObject(new EmbeddedLinuxQtVersionFactory); qRegisterMetaType<RemoteLinux::DeployableFile>("RemoteLinux::DeployableFile"); diff --git a/src/plugins/remotelinux/remotelinuxrunconfiguration.cpp b/src/plugins/remotelinux/remotelinuxrunconfiguration.cpp index 50c1a714e0..a46252a62c 100644 --- a/src/plugins/remotelinux/remotelinuxrunconfiguration.cpp +++ b/src/plugins/remotelinux/remotelinuxrunconfiguration.cpp @@ -39,12 +39,12 @@ #include <projectexplorer/projectexplorer.h> #include <projectexplorer/session.h> +#include <projectexplorer/target.h> #include <projectexplorer/toolchain.h> #include <qtsupport/qtoutputformatter.h> #include <qt4projectmanager/qt4buildconfiguration.h> #include <qt4projectmanager/qt4nodes.h> #include <qt4projectmanager/qt4project.h> -#include <qt4projectmanager/qt4target.h> #include <utils/portlist.h> #include <utils/qtcassert.h> @@ -70,13 +70,15 @@ const char WorkingDirectoryKey[] = "RemoteLinux.RunConfig.WorkingDirectory"; class RemoteLinuxRunConfigurationPrivate { public: - RemoteLinuxRunConfigurationPrivate(const QString &proFilePath, const Qt4BaseTarget *target) + RemoteLinuxRunConfigurationPrivate(const QString &proFilePath, const ProjectExplorer::Target *target) : proFilePath(proFilePath), baseEnvironmentType(RemoteLinuxRunConfiguration::RemoteBaseEnvironment), - validParse(target->qt4Project()->validParse(proFilePath)), - parseInProgress(target->qt4Project()->parseInProgress(proFilePath)), + validParse(false), + parseInProgress(true), useAlternateRemoteExecutable(false) { + validParse = static_cast<Qt4Project *>(target->project())->validParse(proFilePath); + parseInProgress = static_cast<Qt4Project *>(target->project())->parseInProgress(proFilePath); } RemoteLinuxRunConfigurationPrivate(const RemoteLinuxRunConfigurationPrivate *other) @@ -110,7 +112,7 @@ public: using namespace Internal; -RemoteLinuxRunConfiguration::RemoteLinuxRunConfiguration(Qt4BaseTarget *parent, const Core::Id id, +RemoteLinuxRunConfiguration::RemoteLinuxRunConfiguration(Target *parent, const Core::Id id, const QString &proFilePath) : RunConfiguration(parent, id), d(new RemoteLinuxRunConfigurationPrivate(proFilePath, parent)) @@ -118,7 +120,7 @@ RemoteLinuxRunConfiguration::RemoteLinuxRunConfiguration(Qt4BaseTarget *parent, init(); } -RemoteLinuxRunConfiguration::RemoteLinuxRunConfiguration(Qt4BaseTarget *parent, +RemoteLinuxRunConfiguration::RemoteLinuxRunConfiguration(ProjectExplorer::Target *parent, RemoteLinuxRunConfiguration *source) : RunConfiguration(parent, source), d(new RemoteLinuxRunConfigurationPrivate(source->d)) @@ -136,14 +138,11 @@ void RemoteLinuxRunConfiguration::init() this, SLOT(handleDeployConfigChanged())); handleDeployConfigChanged(); - Qt4Project *pro = qt4Target()->qt4Project(); + Qt4Project *pro = static_cast<Qt4Project *>(target()->project()); connect(pro, SIGNAL(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode*,bool,bool)), this, SLOT(proFileUpdate(Qt4ProjectManager::Qt4ProFileNode*,bool,bool))); -} - -Qt4BaseTarget *RemoteLinuxRunConfiguration::qt4Target() const -{ - return static_cast<Qt4BaseTarget *>(target()); + connect(target(), SIGNAL(profileChanged()), + this, SLOT(handleDeployablesUpdated())); // Handles device changes, etc. } Qt4BuildConfiguration *RemoteLinuxRunConfiguration::activeQt4BuildConfiguration() const @@ -159,7 +158,7 @@ bool RemoteLinuxRunConfiguration::isEnabled() const return false; } if (!d->validParse) { - Qt4Project *project = qt4Target()->qt4Project(); + Qt4Project *project = static_cast<Qt4Project *>(target()->project()); d->disabledReason = project->disabledReasonForRunConfiguration(d->proFilePath); return false; } @@ -187,7 +186,7 @@ QWidget *RemoteLinuxRunConfiguration::createConfigurationWidget() OutputFormatter *RemoteLinuxRunConfiguration::createOutputFormatter() const { - return new QtSupport::QtOutputFormatter(qt4Target()->qt4Project()); + return new QtSupport::QtOutputFormatter(target()->project()); } void RemoteLinuxRunConfiguration::proFileUpdate(Qt4ProjectManager::Qt4ProFileNode *pro, bool success, bool parseInProgress) @@ -236,8 +235,9 @@ bool RemoteLinuxRunConfiguration::fromMap(const QVariantMap &map) d->alternateRemoteExecutable = map.value(QLatin1String(AlternateExeKey)).toString(); d->workingDirectory = map.value(QLatin1String(WorkingDirectoryKey)).toString(); - d->validParse = qt4Target()->qt4Project()->validParse(d->proFilePath); - d->parseInProgress = qt4Target()->qt4Project()->parseInProgress(d->proFilePath); + Qt4Project *project = static_cast<Qt4Project *>(target()->project()); + d->validParse = project->validParse(d->proFilePath); + d->parseInProgress = project->parseInProgress(d->proFilePath); setDefaultDisplayName(defaultDisplayName()); @@ -253,17 +253,6 @@ QString RemoteLinuxRunConfiguration::defaultDisplayName() return tr("Run on Remote Device"); } -LinuxDeviceConfiguration::ConstPtr RemoteLinuxRunConfiguration::deviceConfig() const -{ - return deployConfig() - ? deployConfig()->deviceConfiguration() : LinuxDeviceConfiguration::ConstPtr(); -} - -QString RemoteLinuxRunConfiguration::gdbCmd() const -{ - return activeBuildConfiguration()->toolChain()->debuggerCommand().toUserOutput(); -} - RemoteLinuxDeployConfiguration *RemoteLinuxRunConfiguration::deployConfig() const { return qobject_cast<RemoteLinuxDeployConfiguration *>(target()->activeDeployConfiguration()); @@ -296,7 +285,7 @@ QString RemoteLinuxRunConfiguration::commandPrefix() const QString RemoteLinuxRunConfiguration::localExecutableFilePath() const { - TargetInformation ti = qt4Target()->qt4Project()->rootQt4ProjectNode() + TargetInformation ti = static_cast<Qt4Project *>(target()->project())->rootQt4ProjectNode() ->targetInformation(d->proFilePath); if (!ti.valid) return QString(); @@ -317,14 +306,6 @@ QString RemoteLinuxRunConfiguration::remoteExecutableFilePath() const ? alternateRemoteExecutable() : defaultRemoteExecutableFilePath(); } -PortList RemoteLinuxRunConfiguration::freePorts() const -{ - const LinuxDeviceConfiguration::ConstPtr &devConf = deviceConfig(); - if (!devConf) - return PortList(); - return devConf->freePorts(); -} - void RemoteLinuxRunConfiguration::setArguments(const QString &args) { d->arguments = args; @@ -371,23 +352,12 @@ int RemoteLinuxRunConfiguration::portsUsedByDebuggers() const return ports; } -void RemoteLinuxRunConfiguration::updateDeviceConfigurations() -{ - emit deviceConfigurationChanged(target()); - updateEnabledState(); -} - void RemoteLinuxRunConfiguration::handleDeployConfigChanged() { RemoteLinuxDeployConfiguration * const activeDeployConf = deployConfig(); - if (activeDeployConf) { + if (activeDeployConf) connect(activeDeployConf->deploymentInfo(), SIGNAL(modelReset()), - SLOT(handleDeployablesUpdated()), Qt::UniqueConnection); - connect(activeDeployConf, SIGNAL(currentDeviceConfigurationChanged()), - SLOT(updateDeviceConfigurations()), Qt::UniqueConnection); - } - - updateDeviceConfigurations(); + SLOT(handleDeployablesUpdated()), Qt::UniqueConnection); } void RemoteLinuxRunConfiguration::handleDeployablesUpdated() diff --git a/src/plugins/remotelinux/remotelinuxrunconfiguration.h b/src/plugins/remotelinux/remotelinuxrunconfiguration.h index e374d9c71f..1fe6d639eb 100644 --- a/src/plugins/remotelinux/remotelinuxrunconfiguration.h +++ b/src/plugins/remotelinux/remotelinuxrunconfiguration.h @@ -35,19 +35,19 @@ #include "remotelinux_export.h" +#include "linuxdeviceconfiguration.h" + #include <projectexplorer/runconfiguration.h> #include <utils/environment.h> namespace Qt4ProjectManager { class Qt4BuildConfiguration; -class Qt4BaseTarget; class Qt4ProFileNode; } // namespace Qt4ProjectManager namespace Utils { class PortList; } namespace RemoteLinux { -class LinuxDeviceConfiguration; class RemoteLinuxRunConfigurationWidget; class RemoteLinuxDeployConfiguration; @@ -71,21 +71,20 @@ public: enum DebuggingType { DebugCppOnly, DebugQmlOnly, DebugCppAndQml }; - RemoteLinuxRunConfiguration(Qt4ProjectManager::Qt4BaseTarget *parent, const Core::Id id, + RemoteLinuxRunConfiguration(ProjectExplorer::Target *parent, const Core::Id id, const QString &proFilePath); bool isEnabled() const; QString disabledReason() const; QWidget *createConfigurationWidget(); Utils::OutputFormatter *createOutputFormatter() const; - Qt4ProjectManager::Qt4BaseTarget *qt4Target() const; Qt4ProjectManager::Qt4BuildConfiguration *activeQt4BuildConfiguration() const; RemoteLinuxDeployConfiguration *deployConfig() const; + LinuxDeviceConfiguration::ConstPtr device() const; virtual QString environmentPreparationCommand() const; virtual QString commandPrefix() const; - virtual Utils::PortList freePorts() const; QString localExecutableFilePath() const; QString defaultRemoteExecutableFilePath() const; @@ -98,8 +97,6 @@ public: QString alternateRemoteExecutable() const; void setUseAlternateExecutable(bool useAlternate); bool useAlternateExecutable() const; - QSharedPointer<const LinuxDeviceConfiguration> deviceConfig() const; - QString gdbCmd() const; virtual QVariantMap toMap() const; @@ -117,7 +114,6 @@ public: static const QString Id; signals: - void deviceConfigurationChanged(ProjectExplorer::Target *target); void deploySpecsChanged(); void targetInformationChanged() const; void baseEnvironmentChanged(); @@ -125,7 +121,7 @@ signals: void userEnvironmentChangesChanged(const QList<Utils::EnvironmentItem> &diff); protected: - RemoteLinuxRunConfiguration(Qt4ProjectManager::Qt4BaseTarget *parent, + RemoteLinuxRunConfiguration(ProjectExplorer::Target *parent, RemoteLinuxRunConfiguration *source); virtual bool fromMap(const QVariantMap &map); QString defaultDisplayName(); @@ -137,7 +133,6 @@ protected slots: private slots: void proFileUpdate(Qt4ProjectManager::Qt4ProFileNode *pro, bool success, bool parseInProgress); - void updateDeviceConfigurations(); void handleDeployConfigChanged(); void handleDeployablesUpdated(); diff --git a/src/plugins/remotelinux/remotelinuxrunconfigurationfactory.cpp b/src/plugins/remotelinux/remotelinuxrunconfigurationfactory.cpp index 921461bf23..fe0be28a81 100644 --- a/src/plugins/remotelinux/remotelinuxrunconfigurationfactory.cpp +++ b/src/plugins/remotelinux/remotelinuxrunconfigurationfactory.cpp @@ -31,12 +31,16 @@ **************************************************************************/ #include "remotelinuxrunconfigurationfactory.h" +#include "remotelinux_constants.h" #include "remotelinuxdeployconfigurationfactory.h" #include "remotelinuxrunconfiguration.h" #include "remotelinuxutils.h" +#include <projectexplorer/profileinformation.h> +#include <projectexplorer/target.h> #include <qt4projectmanager/qt4project.h> -#include <qt4projectmanager/qt4target.h> +#include <qt4projectmanager/qt4nodes.h> +#include <qtsupport/customexecutablerunconfiguration.h> #include <utils/qtcassert.h> #include <QFileInfo> @@ -61,50 +65,45 @@ QString pathFromId(Core::Id id) } // namespace RemoteLinuxRunConfigurationFactory::RemoteLinuxRunConfigurationFactory(QObject *parent) - : IRunConfigurationFactory(parent) -{ -} + : Qt4ProjectManager::QmakeRunConfigurationFactory(parent) +{ setObjectName(QLatin1String("RemoteLinuxRunConfigurationFactory")); } RemoteLinuxRunConfigurationFactory::~RemoteLinuxRunConfigurationFactory() { } -bool RemoteLinuxRunConfigurationFactory::canCreate(Target *parent, - const Core::Id id) const +bool RemoteLinuxRunConfigurationFactory::canCreate(Target *parent, const Core::Id id) const { - if (!QString::fromUtf8(id.name()).startsWith(RemoteLinuxRunConfiguration::Id)) + if (!canHandle(parent)) return false; - return qobject_cast<Qt4BaseTarget *>(parent)->qt4Project() - ->hasApplicationProFile(pathFromId(id)); + return static_cast<Qt4Project *>(parent->project())->hasApplicationProFile(pathFromId(id)); } bool RemoteLinuxRunConfigurationFactory::canRestore(Target *parent, const QVariantMap &map) const { - Q_UNUSED(parent); - return QString::fromLatin1(ProjectExplorer::idFromMap(map).name()).startsWith(RemoteLinuxRunConfiguration::Id); + if (!canHandle(parent)) + return false; + return ProjectExplorer::idFromMap(map).toString().startsWith(RemoteLinuxRunConfiguration::Id); } bool RemoteLinuxRunConfigurationFactory::canClone(Target *parent, RunConfiguration *source) const { const RemoteLinuxRunConfiguration * const rlrc = qobject_cast<RemoteLinuxRunConfiguration *>(source); - const QString idStr = QString::fromLatin1(source->id().name()) + QLatin1Char('.') + rlrc->proFilePath(); - return rlrc && canCreate(parent, Core::Id(idStr.toUtf8().constData())); + const QString idStr = source->id().toString() + QLatin1Char('.') + rlrc->proFilePath(); + return rlrc && canCreate(parent, Core::Id(idStr)); } QList<Core::Id> RemoteLinuxRunConfigurationFactory::availableCreationIds(Target *parent) const { QList<Core::Id> result; - const QList<DeployConfiguration *> &depConfs = parent->deployConfigurations(); - foreach (const DeployConfiguration * const dc, depConfs) { - if (dc->id() == RemoteLinuxDeployConfigurationFactory::genericDeployConfigurationId()) { - QStringList proFiles = qobject_cast<Qt4BaseTarget *>(parent)->qt4Project() - ->applicationProFilePathes(RemoteLinuxRunConfiguration::Id); - foreach (const QString &pf, proFiles) - result << Core::Id(pf); - return result; - } - } + if (!canHandle(parent)) + return result; + + QStringList proFiles = static_cast<Qt4Project *>(parent->project()) + ->applicationProFilePathes(RemoteLinuxRunConfiguration::Id); + foreach (const QString &pf, proFiles) + result << Core::Id(pf); return result; } @@ -117,15 +116,15 @@ QString RemoteLinuxRunConfigurationFactory::displayNameForId(const Core::Id id) RunConfiguration *RemoteLinuxRunConfigurationFactory::create(Target *parent, const Core::Id id) { QTC_ASSERT(canCreate(parent, id), return 0); - return new RemoteLinuxRunConfiguration(qobject_cast<Qt4BaseTarget *>(parent), id, pathFromId(id)); + return new RemoteLinuxRunConfiguration(parent, id, pathFromId(id)); } RunConfiguration *RemoteLinuxRunConfigurationFactory::restore(Target *parent, const QVariantMap &map) { QTC_ASSERT(canRestore(parent, map), return 0); - RemoteLinuxRunConfiguration *rc = new RemoteLinuxRunConfiguration(qobject_cast<Qt4BaseTarget *>(parent), - Core::Id(RemoteLinuxRunConfiguration::Id), QString()); + RemoteLinuxRunConfiguration *rc + = new RemoteLinuxRunConfiguration(parent, Core::Id(RemoteLinuxRunConfiguration::Id), QString()); if (rc->fromMap(map)) return rc; @@ -138,7 +137,28 @@ RunConfiguration *RemoteLinuxRunConfigurationFactory::clone(Target *parent, { QTC_ASSERT(canClone(parent, source), return 0); RemoteLinuxRunConfiguration *old = static_cast<RemoteLinuxRunConfiguration *>(source); - return new RemoteLinuxRunConfiguration(static_cast<Qt4BaseTarget *>(parent), old); + return new RemoteLinuxRunConfiguration(parent, old); +} + +bool RemoteLinuxRunConfigurationFactory::canHandle(Target *t) const +{ + if (!t->project()->supportsProfile(t->profile())) + return false; + if (!qobject_cast<Qt4Project *>(t->project())) + return false; + + Core::Id deviceType = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(t->profile()); + return deviceType == Core::Id(RemoteLinux::Constants::GenericLinuxOsType); +} + +QList<RunConfiguration *> RemoteLinuxRunConfigurationFactory::runConfigurationsForNode(Target *t, ProjectExplorer::Node *n) +{ + QList<ProjectExplorer::RunConfiguration *> result; + foreach (ProjectExplorer::RunConfiguration *rc, t->runConfigurations()) + if (RemoteLinuxRunConfiguration *qt4c = qobject_cast<RemoteLinuxRunConfiguration *>(rc)) + if (qt4c->proFilePath() == n->path()) + result << rc; + return result; } } // namespace Internal diff --git a/src/plugins/remotelinux/remotelinuxrunconfigurationfactory.h b/src/plugins/remotelinux/remotelinuxrunconfigurationfactory.h index a2704a23a1..988b76447d 100644 --- a/src/plugins/remotelinux/remotelinuxrunconfigurationfactory.h +++ b/src/plugins/remotelinux/remotelinuxrunconfigurationfactory.h @@ -33,11 +33,14 @@ #define REMOTELINUXRUNCONFIGURATIONFACTORY_H #include <projectexplorer/runconfiguration.h> +#include <qt4projectmanager/qmakerunconfigurationfactory.h> + +namespace ProjectExplorer { class Node; } namespace RemoteLinux { namespace Internal { -class RemoteLinuxRunConfigurationFactory : public ProjectExplorer::IRunConfigurationFactory +class RemoteLinuxRunConfigurationFactory : public Qt4ProjectManager::QmakeRunConfigurationFactory { Q_OBJECT @@ -58,6 +61,10 @@ public: bool canClone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration *source) const; ProjectExplorer::RunConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration *source); + + bool canHandle(ProjectExplorer::Target *t) const; + QList<ProjectExplorer::RunConfiguration *> runConfigurationsForNode(ProjectExplorer::Target *t, + ProjectExplorer::Node *n); }; } // namespace Internal diff --git a/src/plugins/remotelinux/remotelinuxrunconfigurationwidget.cpp b/src/plugins/remotelinux/remotelinuxrunconfigurationwidget.cpp index bf30a70ff5..7ee46a0459 100644 --- a/src/plugins/remotelinux/remotelinuxrunconfigurationwidget.cpp +++ b/src/plugins/remotelinux/remotelinuxrunconfigurationwidget.cpp @@ -41,7 +41,6 @@ #include <projectexplorer/environmentwidget.h> #include <projectexplorer/projectexplorerconstants.h> #include <qt4projectmanager/qt4buildconfiguration.h> -#include <qt4projectmanager/qt4target.h> #include <utils/detailswidget.h> #include <QCoreApplication> @@ -111,9 +110,6 @@ RemoteLinuxRunConfigurationWidget::RemoteLinuxRunConfigurationWidget(RemoteLinux addGenericWidgets(mainLayout); addEnvironmentWidgets(mainLayout); - connect(d->runConfiguration, SIGNAL(deviceConfigurationChanged(ProjectExplorer::Target*)), - SLOT(handleCurrentDeviceConfigChanged())); - handleCurrentDeviceConfigChanged(); connect(d->runConfiguration, SIGNAL(enabledChanged()), SLOT(runConfigurationEnabledChange())); runConfigurationEnabledChange(); @@ -163,21 +159,6 @@ void RemoteLinuxRunConfigurationWidget::addGenericWidgets(QVBoxLayout *mainLayou d->genericWidgetsLayout.setFormAlignment(Qt::AlignLeft | Qt::AlignVCenter); - QWidget * const devConfWidget = new QWidget; - QHBoxLayout * const devConfLayout = new QHBoxLayout(devConfWidget); - devConfLayout->setMargin(0); - devConfLayout->addWidget(&d->devConfLabel); - QLabel * const addDevConfLabel= new QLabel(tr("<a href=\"%1\">Manage device configurations</a>") - .arg(QLatin1String("deviceconfig"))); - addDevConfLabel->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); - devConfLayout->addWidget(addDevConfLabel); - - QLabel * const debuggerConfLabel = new QLabel(tr("<a href=\"%1\">Set Debugger</a>") - .arg(QLatin1String("debugger"))); - debuggerConfLabel->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); - devConfLayout->addWidget(debuggerConfLabel); - - d->genericWidgetsLayout.addRow(new QLabel(tr("Device configuration:")), devConfWidget); d->localExecutableLabel.setText(d->runConfiguration->localExecutableFilePath()); d->genericWidgetsLayout.addRow(tr("Executable on host:"), &d->localExecutableLabel); d->genericWidgetsLayout.addRow(tr("Executable on device:"), &d->remoteExecutableLabel); @@ -198,10 +179,6 @@ void RemoteLinuxRunConfigurationWidget::addGenericWidgets(QVBoxLayout *mainLayou d->workingDirLineEdit.setText(d->runConfiguration->workingDirectory()); d->genericWidgetsLayout.addRow(tr("Working directory:"), &d->workingDirLineEdit); - connect(addDevConfLabel, SIGNAL(linkActivated(QString)), this, - SLOT(showDeviceConfigurationsDialog(QString))); - connect(debuggerConfLabel, SIGNAL(linkActivated(QString)), this, - SLOT(showDeviceConfigurationsDialog(QString))); connect(&d->argsLineEdit, SIGNAL(textEdited(QString)), SLOT(argumentsEdited(QString))); connect(d->runConfiguration, SIGNAL(targetInformationChanged()), this, SLOT(updateTargetInformation())); @@ -287,23 +264,6 @@ void RemoteLinuxRunConfigurationWidget::handleWorkingDirectoryChanged() d->runConfiguration->setWorkingDirectory(d->workingDirLineEdit.text().trimmed()); } -void RemoteLinuxRunConfigurationWidget::showDeviceConfigurationsDialog(const QString &link) -{ - if (link == QLatin1String("deviceconfig")) { - Core::ICore::showOptionsDialog( - QLatin1String(ProjectExplorer::Constants::DEVICE_SETTINGS_CATEGORY), - QLatin1String(ProjectExplorer::Constants::DEVICE_SETTINGS_PAGE_ID)); - } else if (link == QLatin1String("debugger")) { - Core::ICore::showOptionsDialog(QLatin1String("O.Debugger"), - QLatin1String("M.Gdb")); - } -} - -void RemoteLinuxRunConfigurationWidget::handleCurrentDeviceConfigChanged() -{ - d->devConfLabel.setText(RemoteLinuxUtils::deviceConfigurationName(d->runConfiguration->deviceConfig())); -} - void RemoteLinuxRunConfigurationWidget::fetchEnvironment() { disconnect(&d->fetchEnvButton, SIGNAL(clicked()), this, SLOT(fetchEnvironment())); diff --git a/src/plugins/remotelinux/remotelinuxrunconfigurationwidget.h b/src/plugins/remotelinux/remotelinuxrunconfigurationwidget.h index 840c3b54f1..1cbed48b31 100644 --- a/src/plugins/remotelinux/remotelinuxrunconfigurationwidget.h +++ b/src/plugins/remotelinux/remotelinuxrunconfigurationwidget.h @@ -64,9 +64,7 @@ public: private slots: void argumentsEdited(const QString &args); - void showDeviceConfigurationsDialog(const QString &link); void updateTargetInformation(); - void handleCurrentDeviceConfigChanged(); void fetchEnvironment(); void fetchEnvironmentFinished(); void fetchEnvironmentError(const QString &error); diff --git a/src/plugins/remotelinux/remotelinuxruncontrolfactory.cpp b/src/plugins/remotelinux/remotelinuxruncontrolfactory.cpp index 28b40a4e87..470eb289fc 100644 --- a/src/plugins/remotelinux/remotelinuxruncontrolfactory.cpp +++ b/src/plugins/remotelinux/remotelinuxruncontrolfactory.cpp @@ -39,7 +39,9 @@ #include <debugger/debuggerplugin.h> #include <debugger/debuggerrunner.h> #include <debugger/debuggerstartparameters.h> +#include <projectexplorer/profileinformation.h> #include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/target.h> #include <utils/portlist.h> using namespace Debugger; @@ -63,17 +65,23 @@ bool RemoteLinuxRunControlFactory::canRun(RunConfiguration *runConfiguration, Ru return false; const QString idStr = QString::fromLatin1(runConfiguration->id().name()); - if (!runConfiguration->isEnabled() - || !idStr.startsWith(RemoteLinuxRunConfiguration::Id)) { + if (!runConfiguration->isEnabled() || !idStr.startsWith(RemoteLinuxRunConfiguration::Id)) return false; - } if (mode == NormalRunMode) return true; const RemoteLinuxRunConfiguration * const remoteRunConfig - = qobject_cast<RemoteLinuxRunConfiguration *>(runConfiguration); - return remoteRunConfig->portsUsedByDebuggers() <= remoteRunConfig->freePorts().count(); + = qobject_cast<RemoteLinuxRunConfiguration *>(runConfiguration); + if (mode == DebugRunMode) { + LinuxDeviceConfiguration::ConstPtr dev = + ProjectExplorer::DeviceProfileInformation::device(runConfiguration->target()->profile()) + .dynamicCast<const LinuxDeviceConfiguration>(); + if (dev.isNull()) + return false; + return remoteRunConfig->portsUsedByDebuggers() <= dev->freePorts().count(); + } + return true; } RunControl *RemoteLinuxRunControlFactory::create(RunConfiguration *runConfig, RunMode mode) diff --git a/src/plugins/remotelinux/typespecificdeviceconfigurationlistmodel.cpp b/src/plugins/remotelinux/typespecificdeviceconfigurationlistmodel.cpp index bf740bf56f..84aa089179 100644 --- a/src/plugins/remotelinux/typespecificdeviceconfigurationlistmodel.cpp +++ b/src/plugins/remotelinux/typespecificdeviceconfigurationlistmodel.cpp @@ -31,9 +31,9 @@ **************************************************************************/ #include "typespecificdeviceconfigurationlistmodel.h" -#include "abstractembeddedlinuxtarget.h" - #include <projectexplorer/devicesupport/devicemanager.h> +#include <projectexplorer/profileinformation.h> +#include <projectexplorer/target.h> #include <utils/qtcassert.h> using namespace ProjectExplorer; @@ -41,12 +41,12 @@ using namespace ProjectExplorer; namespace RemoteLinux { namespace Internal { -TypeSpecificDeviceConfigurationListModel::TypeSpecificDeviceConfigurationListModel(AbstractEmbeddedLinuxTarget *target) +TypeSpecificDeviceConfigurationListModel::TypeSpecificDeviceConfigurationListModel(ProjectExplorer::Target *target) : QAbstractListModel(target) { const DeviceManager * const devConfs = DeviceManager::instance(); connect(devConfs, SIGNAL(updated()), this, SIGNAL(modelReset())); - connect(target, SIGNAL(supportedDevicesChanged()), this, SIGNAL(modelReset())); + connect(target, SIGNAL(profileChanged()), this, SIGNAL(modelReset())); } TypeSpecificDeviceConfigurationListModel::~TypeSpecificDeviceConfigurationListModel() @@ -61,7 +61,7 @@ int TypeSpecificDeviceConfigurationListModel::rowCount(const QModelIndex &parent const DeviceManager * const devConfs = DeviceManager::instance(); const int devConfsCount = devConfs->deviceCount(); for (int i = 0; i < devConfsCount; ++i) { - if (target()->supportsDevice(devConfs->deviceAt(i))) + if (deviceMatches(devConfs->deviceAt(i))) ++count; } return count; @@ -75,8 +75,8 @@ QVariant TypeSpecificDeviceConfigurationListModel::data(const QModelIndex &index const LinuxDeviceConfiguration::ConstPtr &devConf = deviceAt(index.row()); Q_ASSERT(devConf); QString displayedName = devConf->displayName(); - if (target()->supportsDevice(devConf) && DeviceManager::instance() - ->defaultDevice(devConf->type()) == devConf) { + if (deviceMatches(devConf) + && DeviceManager::instance()->defaultDevice(devConf->type()) == devConf) { displayedName = tr("%1 (default)").arg(displayedName); } return displayedName; @@ -89,7 +89,7 @@ LinuxDeviceConfiguration::ConstPtr TypeSpecificDeviceConfigurationListModel::dev const int devConfsCount = devConfs->deviceCount(); for (int i = 0; i < devConfsCount; ++i) { const IDevice::ConstPtr device = devConfs->deviceAt(i); - if (target()->supportsDevice(device) && ++currentRow == idx) + if (deviceMatches(device) && ++currentRow == idx) return device.staticCast<const LinuxDeviceConfiguration>(); } QTC_CHECK(false); @@ -102,7 +102,7 @@ LinuxDeviceConfiguration::ConstPtr TypeSpecificDeviceConfigurationListModel::def const int deviceCount = deviceManager->deviceCount(); for (int i = 0; i < deviceCount; ++i) { const IDevice::ConstPtr device = deviceManager->deviceAt(i); - if (target()->supportsDevice(device) + if (deviceMatches(device) && deviceManager->defaultDevice(device->type()) == device) { return device.staticCast<const LinuxDeviceConfiguration>(); } @@ -113,7 +113,7 @@ LinuxDeviceConfiguration::ConstPtr TypeSpecificDeviceConfigurationListModel::def LinuxDeviceConfiguration::ConstPtr TypeSpecificDeviceConfigurationListModel::find(Core::Id id) const { const IDevice::ConstPtr &devConf = DeviceManager::instance()->find(id); - if (devConf && target()->supportsDevice(devConf)) + if (deviceMatches(devConf)) return devConf.staticCast<const LinuxDeviceConfiguration>(); return defaultDeviceConfig(); } @@ -128,9 +128,17 @@ int TypeSpecificDeviceConfigurationListModel::indexForId(Core::Id id) const return -1; } -AbstractEmbeddedLinuxTarget *TypeSpecificDeviceConfigurationListModel::target() const +ProjectExplorer::Target *TypeSpecificDeviceConfigurationListModel::target() const +{ + return qobject_cast<ProjectExplorer::Target *>(QObject::parent()); +} + +bool TypeSpecificDeviceConfigurationListModel::deviceMatches(ProjectExplorer::IDevice::ConstPtr dev) const { - return qobject_cast<AbstractEmbeddedLinuxTarget *>(QObject::parent()); + if (dev.isNull()) + return false; + Core::Id typeId = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(target()->profile()); + return dev->type() == typeId; } } // namespace Internal diff --git a/src/plugins/remotelinux/typespecificdeviceconfigurationlistmodel.h b/src/plugins/remotelinux/typespecificdeviceconfigurationlistmodel.h index e240bcd07f..d7ad4f3e1d 100644 --- a/src/plugins/remotelinux/typespecificdeviceconfigurationlistmodel.h +++ b/src/plugins/remotelinux/typespecificdeviceconfigurationlistmodel.h @@ -37,15 +37,16 @@ #include <QAbstractListModel> #include <QSharedPointer> +namespace ProjectExplorer { class Target; } + namespace RemoteLinux { -class AbstractEmbeddedLinuxTarget; namespace Internal { class TypeSpecificDeviceConfigurationListModel : public QAbstractListModel { Q_OBJECT public: - explicit TypeSpecificDeviceConfigurationListModel(AbstractEmbeddedLinuxTarget *target); + explicit TypeSpecificDeviceConfigurationListModel(ProjectExplorer::Target *target); ~TypeSpecificDeviceConfigurationListModel(); virtual int rowCount(const QModelIndex &parent = QModelIndex()) const; @@ -58,7 +59,8 @@ public: int indexForId(Core::Id id) const; private: - AbstractEmbeddedLinuxTarget * target() const; + ProjectExplorer::Target *target() const; + bool deviceMatches(ProjectExplorer::IDevice::ConstPtr dev) const; }; } // namespace Internal diff --git a/src/plugins/valgrind/valgrindtool.cpp b/src/plugins/valgrind/valgrindtool.cpp index 46a9bbe805..013dd6c132 100644 --- a/src/plugins/valgrind/valgrindtool.cpp +++ b/src/plugins/valgrind/valgrindtool.cpp @@ -36,7 +36,9 @@ #include <remotelinux/linuxdeviceconfiguration.h> #include <projectexplorer/applicationrunconfiguration.h> +#include <projectexplorer/profileinformation.h> #include <projectexplorer/projectexplorer.h> +#include <projectexplorer/target.h> using namespace ProjectExplorer; using namespace RemoteLinux; @@ -75,7 +77,7 @@ Analyzer::AnalyzerStartParameters ValgrindTool::createStartParameters( sp.startMode = Analyzer::StartRemote; sp.debuggee = rc2->remoteExecutableFilePath(); sp.debuggeeArgs = rc2->arguments(); - sp.connParams = rc2->deviceConfig()->sshParameters(); + sp.connParams = ProjectExplorer::DeviceProfileInformation::device(rc2->target()->profile())->sshParameters(); sp.analyzerCmdPrefix = rc2->commandPrefix(); sp.displayName = rc2->displayName(); } else { |