diff options
81 files changed, 2404 insertions, 1010 deletions
diff --git a/src/plugins/cmakeprojectmanager/cmaketarget.cpp b/src/plugins/cmakeprojectmanager/cmaketarget.cpp index 55f9f85024..655173f4c3 100644 --- a/src/plugins/cmakeprojectmanager/cmaketarget.cpp +++ b/src/plugins/cmakeprojectmanager/cmaketarget.cpp @@ -186,7 +186,7 @@ CMakeTargetFactory::~CMakeTargetFactory() { } -QStringList CMakeTargetFactory::availableCreationIds(ProjectExplorer::Project *parent) const +QStringList CMakeTargetFactory::supportedTargetIds(ProjectExplorer::Project *parent) const { if (!qobject_cast<CMakeProject *>(parent)) return QStringList(); diff --git a/src/plugins/cmakeprojectmanager/cmaketarget.h b/src/plugins/cmakeprojectmanager/cmaketarget.h index 4563fd8922..a710dbb742 100644 --- a/src/plugins/cmakeprojectmanager/cmaketarget.h +++ b/src/plugins/cmakeprojectmanager/cmaketarget.h @@ -89,7 +89,7 @@ public: bool supportsTargetId(const QString &id) const; - QStringList availableCreationIds(ProjectExplorer::Project *parent) const; + QStringList supportedTargetIds(ProjectExplorer::Project *parent) const; QString displayNameForId(const QString &id) const; bool canCreate(ProjectExplorer::Project *parent, const QString &id) const; diff --git a/src/plugins/genericprojectmanager/generictarget.cpp b/src/plugins/genericprojectmanager/generictarget.cpp index 3f60955017..ae5b402800 100644 --- a/src/plugins/genericprojectmanager/generictarget.cpp +++ b/src/plugins/genericprojectmanager/generictarget.cpp @@ -121,7 +121,7 @@ bool GenericTargetFactory::supportsTargetId(const QString &id) const return id == QLatin1String(GENERIC_DESKTOP_TARGET_ID); } -QStringList GenericTargetFactory::availableCreationIds(ProjectExplorer::Project *parent) const +QStringList GenericTargetFactory::supportedTargetIds(ProjectExplorer::Project *parent) const { if (!qobject_cast<GenericProject *>(parent)) return QStringList(); diff --git a/src/plugins/genericprojectmanager/generictarget.h b/src/plugins/genericprojectmanager/generictarget.h index 07ad77f203..3aa281b7e3 100644 --- a/src/plugins/genericprojectmanager/generictarget.h +++ b/src/plugins/genericprojectmanager/generictarget.h @@ -91,7 +91,7 @@ public: bool supportsTargetId(const QString &id) const; - QStringList availableCreationIds(ProjectExplorer::Project *parent) const; + QStringList supportedTargetIds(ProjectExplorer::Project *parent) const; QString displayNameForId(const QString &id) const; bool canCreate(ProjectExplorer::Project *parent, const QString &id) const; diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index c754be241d..dcc632a14d 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -63,7 +63,6 @@ namespace ProjectExplorer { class ProjectPrivate { public: ProjectPrivate(); - QSet<QString> m_supportedTargetIds; QList<Target *> m_targets; Target *m_activeTarget; EditorConfiguration *m_editorConfiguration; @@ -102,34 +101,6 @@ QString Project::makeUnique(const QString &preferredName, const QStringList &use return tryName; } -QSet<QString> Project::supportedTargetIds() const -{ - return d->m_supportedTargetIds; -} - -QSet<QString> Project::possibleTargetIds() const -{ - QSet<QString> result(d->m_supportedTargetIds); - foreach (ProjectExplorer::Target *t, targets()) - result.remove(t->id()); - - return result; -} - -bool Project::canAddTarget(const QString &id) const -{ - return possibleTargetIds().contains(id); -} - -void Project::setSupportedTargetIds(const QSet<QString> &ids) -{ - if (ids == d->m_supportedTargetIds) - return; - - d->m_supportedTargetIds = ids; - emit supportedTargetIdsChanged(); -} - void Project::changeEnvironment() { Target *t(qobject_cast<Target *>(sender())); @@ -280,26 +251,31 @@ bool Project::fromMap(const QVariantMap &map) qWarning() << key << "was not found in data."; return false; } - QVariantMap targetMap = map.value(key).toMap(); + QVariantMap targetMap = map.value(key).toMap(); QList<ITargetFactory *> factories = ExtensionSystem::PluginManager::instance()->getObjects<ITargetFactory>(); Target *t = 0; - foreach (ITargetFactory *factory, factories) { - if (factory->canRestore(this, targetMap)) { - t = factory->restore(this, targetMap); - break; + + if(target(idFromMap(targetMap))) { + qWarning() << "Duplicated target id found, not restoring second target with id"<<idFromMap(targetMap)<<"(Continuing)"; + } else { + foreach (ITargetFactory *factory, factories) { + if (factory->canRestore(this, targetMap)) { + t = factory->restore(this, targetMap); + break; + } } - } - if (!t) { - qWarning() << "Restoration of a target failed! (Continuing)"; - continue; + if (!t) { + qWarning() << "Restoration of a target failed! (Continuing)"; + continue; + } + addTarget(t); + if (i == active) + setActiveTarget(t); } - addTarget(t); - if (i == active) - setActiveTarget(t); } return true; } diff --git a/src/plugins/projectexplorer/project.h b/src/plugins/projectexplorer/project.h index 56621c925c..5e3b0004f7 100644 --- a/src/plugins/projectexplorer/project.h +++ b/src/plugins/projectexplorer/project.h @@ -82,13 +82,6 @@ public: EditorConfiguration *editorConfiguration() const; // Target: - - // Note: You can only add a specific kind of target (identified by id) - // once. - QSet<QString> supportedTargetIds() const; - QSet<QString> possibleTargetIds() const; - bool canAddTarget(const QString &id) const; - void addTarget(Target *target); void removeTarget(Target *target); @@ -136,8 +129,6 @@ signals: void removedTarget(ProjectExplorer::Target *target); void addedTarget(ProjectExplorer::Target *target); - void supportedTargetIdsChanged(); - /// convenience signal emitted if the activeBuildConfiguration emits environmentChanged /// or if the activeBuildConfiguration changes /// (which theoretically might happen due to the active target changing). @@ -149,8 +140,6 @@ protected: // Note: Do not forget to call your base class' fromMap method! virtual bool fromMap(const QVariantMap &map); - void setSupportedTargetIds(const QSet<QString> &ids); - private slots: void changeEnvironment(); diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 94106572f7..88c2b27fab 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -961,6 +961,7 @@ void ProjectExplorerPlugin::clearSession() void ProjectExplorerPlugin::extensionsInitialized() { + d->m_proWindow->extensionsInitialized(); d->m_fileFactories = ProjectFileFactory::createFactories(&d->m_projectFilterString); foreach (ProjectFileFactory *pf, d->m_fileFactories) { d->m_profileMimeTypes += pf->mimeTypes(); diff --git a/src/plugins/projectexplorer/projectwindow.cpp b/src/plugins/projectexplorer/projectwindow.cpp index ba2635e98f..728c1c4ba5 100644 --- a/src/plugins/projectexplorer/projectwindow.cpp +++ b/src/plugins/projectexplorer/projectwindow.cpp @@ -42,6 +42,7 @@ #include "projecttreewidget.h" #include "iprojectproperties.h" #include "targetsettingspanel.h" +#include "target.h" #include <coreplugin/icore.h> #include <coreplugin/ifile.h> @@ -261,6 +262,14 @@ ProjectWindow::~ProjectWindow() { } +void ProjectWindow::extensionsInitialized() +{ + foreach (ITargetFactory *fac, ExtensionSystem::PluginManager::instance()->getObjects<ITargetFactory>()) + connect(fac, SIGNAL(supportedTargetIdsChanged()), + this, SLOT(targetFactoriesChanged())); + +} + void ProjectWindow::aboutToShutdown() { showProperties(-1, -1); // TODO that's a bit stupid, but otherwise stuff is still @@ -268,6 +277,35 @@ void ProjectWindow::aboutToShutdown() disconnect(ProjectExplorerPlugin::instance()->session(), 0, this, 0); } +void ProjectWindow::targetFactoriesChanged() +{ + bool changed = false; + int index = m_tabWidget->currentIndex(); + QList<Project *> projects = m_tabIndexToProject; + foreach (ProjectExplorer::Project *project, projects) { + if (m_usesTargetPage.value(project) != useTargetPage(project)) { + changed = true; + deregisterProject(project); + registerProject(project); + } + } + if (changed) + m_tabWidget->setCurrentIndex(index); +} + +bool ProjectWindow::useTargetPage(ProjectExplorer::Project *project) +{ + if (project->targets().size() > 1) + return true; + QStringList tmp; + foreach (ITargetFactory *fac, ExtensionSystem::PluginManager::instance()->getObjects<ITargetFactory>()) { + tmp.append(fac->supportedTargetIds(project)); + if (tmp.size() > 1) + return true; + } + return false; +} + void ProjectWindow::registerProject(ProjectExplorer::Project *project) { if (!project || m_tabIndexToProject.contains(project)) @@ -284,7 +322,11 @@ void ProjectWindow::registerProject(ProjectExplorer::Project *project) } QStringList subtabs; - if (project->supportedTargetIds().count() <= 1) { + + bool usesTargetPage = useTargetPage(project); + m_usesTargetPage.insert(project, usesTargetPage); + + if (!usesTargetPage){ // Show the target specific pages directly QList<ITargetPanelFactory *> factories = ExtensionSystem::PluginManager::instance()->getObjects<ITargetPanelFactory>(); @@ -308,9 +350,6 @@ void ProjectWindow::registerProject(ProjectExplorer::Project *project) m_tabIndexToProject.insert(index, project); m_tabWidget->insertTab(index, project->displayName(), subtabs); - - connect(project, SIGNAL(supportedTargetIdsChanged()), - this, SLOT(refreshProject())); } void ProjectWindow::deregisterProject(ProjectExplorer::Project *project) @@ -319,9 +358,6 @@ void ProjectWindow::deregisterProject(ProjectExplorer::Project *project) if (index < 0) return; - disconnect(project, SIGNAL(supportedTargetIdsChanged()), - this, SLOT(refreshProject())); - m_tabIndexToProject.removeAt(index); m_tabWidget->removeTab(index); } @@ -336,19 +372,6 @@ void ProjectWindow::saveStatus() // TODO } -void ProjectWindow::refreshProject() -{ - Project *project = qobject_cast<ProjectExplorer::Project *>(sender()); - if (!m_tabIndexToProject.contains(project)) - return; - - // TODO this changes the subindex - int index = m_tabWidget->currentIndex(); - deregisterProject(project); - registerProject(project); - m_tabWidget->setCurrentIndex(index); -} - void ProjectWindow::startupProjectChanged(ProjectExplorer::Project *p) { int index = m_tabIndexToProject.indexOf(p); @@ -373,7 +396,8 @@ void ProjectWindow::showProperties(int index, int subIndex) = qobject_cast<TargetSettingsPanelWidget*>(m_currentWidget)) { m_previousTargetSubIndex = previousPanelWidget->currentSubIndex(); } - if (project->supportedTargetIds().count() > 1) { + + if (m_usesTargetPage.value(project)) { if (subIndex == 0) { // Targets page removeCurrentWidget(); diff --git a/src/plugins/projectexplorer/projectwindow.h b/src/plugins/projectexplorer/projectwindow.h index 9c2976b99a..ccf2576ffa 100644 --- a/src/plugins/projectexplorer/projectwindow.h +++ b/src/plugins/projectexplorer/projectwindow.h @@ -34,6 +34,7 @@ #ifndef PROJECTWINDOW_H #define PROJECTWINDOW_H +#include <QtCore/QMap> #include <QtGui/QScrollArea> QT_BEGIN_NAMESPACE @@ -81,7 +82,9 @@ public: ~ProjectWindow(); void aboutToShutdown(); + void extensionsInitialized(); private slots: + void targetFactoriesChanged(); void showProperties(int index, int subIndex); void restoreStatus(); void saveStatus(); @@ -89,15 +92,15 @@ private slots: void deregisterProject(ProjectExplorer::Project*); void startupProjectChanged(ProjectExplorer::Project *); - void refreshProject(); - private: + bool useTargetPage(ProjectExplorer::Project *project); void removeCurrentWidget(); DoubleTabWidget *m_tabWidget; QStackedWidget *m_centralWidget; QWidget *m_currentWidget; QList<ProjectExplorer::Project *> m_tabIndexToProject; + QMap<ProjectExplorer::Project *, bool> m_usesTargetPage; int m_previousTargetSubIndex; }; diff --git a/src/plugins/projectexplorer/target.h b/src/plugins/projectexplorer/target.h index 719b3ca06e..ce1dbe2fec 100644 --- a/src/plugins/projectexplorer/target.h +++ b/src/plugins/projectexplorer/target.h @@ -159,10 +159,9 @@ public: explicit ITargetFactory(QObject *parent = 0); virtual ~ITargetFactory(); + virtual QStringList supportedTargetIds(ProjectExplorer::Project *project) const = 0; virtual bool supportsTargetId(const QString &id) const = 0; - // used to show the list of possible additons to a target, returns a list of types - virtual QStringList availableCreationIds(Project *parent) const = 0; // used to translate the types to names to display to the user virtual QString displayNameForId(const QString &id) const = 0; @@ -172,7 +171,7 @@ public: virtual Target *restore(Project *parent, const QVariantMap &map) = 0; signals: - void availableCreationIdsChanged(); + void supportedTargetIdsChanged(); }; } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/targetsettingspanel.cpp b/src/plugins/projectexplorer/targetsettingspanel.cpp index 865cefae9f..e3eff51eea 100644 --- a/src/plugins/projectexplorer/targetsettingspanel.cpp +++ b/src/plugins/projectexplorer/targetsettingspanel.cpp @@ -79,8 +79,14 @@ TargetSettingsPanelWidget::TargetSettingsPanelWidget(Project *project) : connect(m_project, SIGNAL(activeTargetChanged(ProjectExplorer::Target*)), this, SLOT(activeTargetChanged(ProjectExplorer::Target*))); - connect(m_project, SIGNAL(supportedTargetIdsChanged()), - this, SLOT(updateTargetAddAndRemoveButtons())); + + QList<ITargetFactory *> factories = + ExtensionSystem::PluginManager::instance()->getObjects<ITargetFactory>(); + + foreach (ITargetFactory *fac, factories) { + connect(fac, SIGNAL(supportedTargetIdsChanged()), + this, SLOT(updateTargetAddAndRemoveButtons())); + } } TargetSettingsPanelWidget::~TargetSettingsPanelWidget() @@ -204,6 +210,7 @@ void TargetSettingsPanelWidget::currentTargetChanged(int targetIndex, int subInd void TargetSettingsPanelWidget::addTarget(QAction *action) { QString id = action->data().toString(); + Q_ASSERT(!m_project->target(id)); QList<ITargetFactory *> factories = ExtensionSystem::PluginManager::instance()->getObjects<ITargetFactory>(); @@ -284,30 +291,26 @@ void TargetSettingsPanelWidget::updateTargetAddAndRemoveButtons() QList<ITargetFactory *> factories = ExtensionSystem::PluginManager::instance()->getObjects<ITargetFactory>(); - foreach (const QString &id, m_project->possibleTargetIds()) { - QString displayName; - foreach (ITargetFactory *fac, factories) { - if (fac->supportsTargetId(id)) { - displayName = fac->displayNameForId(id); - break; + foreach (ITargetFactory *fac, factories) { + foreach (const QString &id, fac->supportedTargetIds(m_project)) { + if (m_project->target(id)) + continue; + QString displayName = fac->displayNameForId(id); + QAction *action = new QAction(displayName, m_addMenu); + action->setData(QVariant(id)); + bool added = false; + foreach(QAction *existing, m_addMenu->actions()) { + if (existing->text() > action->text()) { + m_addMenu->insertAction(existing, action); + added = true; + } } - } - if (displayName.isEmpty()) - continue; - QAction *action = new QAction(displayName, m_addMenu); - action->setData(QVariant(id)); - bool added = false; - foreach(QAction *existing, m_addMenu->actions()) { - if (existing->text() > action->text()) { - m_addMenu->insertAction(existing, action); - added = true; - } + if (!added) + m_addMenu->addAction(action); } - - if (!added) - m_addMenu->addAction(action); } + m_selector->setAddButtonEnabled(!m_addMenu->actions().isEmpty()); m_selector->setRemoveButtonEnabled(m_project->targets().count() > 1); } diff --git a/src/plugins/qmlprojectmanager/qmlproject.cpp b/src/plugins/qmlprojectmanager/qmlproject.cpp index 69023ebaff..a104b02619 100644 --- a/src/plugins/qmlprojectmanager/qmlproject.cpp +++ b/src/plugins/qmlprojectmanager/qmlproject.cpp @@ -58,7 +58,6 @@ QmlProject::QmlProject(Internal::Manager *manager, const QString &fileName) m_modelManager(ExtensionSystem::PluginManager::instance()->getObject<QmlJS::ModelManagerInterface>()), m_fileWatcher(new ProjectExplorer::FileWatcher(this)) { - setSupportedTargetIds(QSet<QString>() << QLatin1String(Constants::QML_VIEWER_TARGET_ID)); QFileInfo fileInfo(m_fileName); m_projectName = fileInfo.completeBaseName(); diff --git a/src/plugins/qmlprojectmanager/qmlprojecttarget.cpp b/src/plugins/qmlprojectmanager/qmlprojecttarget.cpp index e01c8400d5..3144ad3246 100644 --- a/src/plugins/qmlprojectmanager/qmlprojecttarget.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojecttarget.cpp @@ -108,7 +108,7 @@ bool QmlProjectTargetFactory::supportsTargetId(const QString &id) const return id == QLatin1String(Constants::QML_VIEWER_TARGET_ID); } -QStringList QmlProjectTargetFactory::availableCreationIds(ProjectExplorer::Project *parent) const +QStringList QmlProjectTargetFactory::supportedTargetIds(ProjectExplorer::Project *parent) const { if (!qobject_cast<QmlProject *>(parent)) return QStringList(); diff --git a/src/plugins/qmlprojectmanager/qmlprojecttarget.h b/src/plugins/qmlprojectmanager/qmlprojecttarget.h index 7fc8aacebb..843e4431cc 100644 --- a/src/plugins/qmlprojectmanager/qmlprojecttarget.h +++ b/src/plugins/qmlprojectmanager/qmlprojecttarget.h @@ -76,7 +76,7 @@ public: ~QmlProjectTargetFactory(); bool supportsTargetId(const QString &id) const; - QStringList availableCreationIds(ProjectExplorer::Project *parent) const; + QStringList supportedTargetIds(ProjectExplorer::Project *parent) const; QString displayNameForId(const QString &id) const; bool canCreate(ProjectExplorer::Project *parent, const QString &id) const; diff --git a/src/plugins/qt4projectmanager/externaleditors.cpp b/src/plugins/qt4projectmanager/externaleditors.cpp index 53d1b7ba1a..872f8bf5fd 100644 --- a/src/plugins/qt4projectmanager/externaleditors.cpp +++ b/src/plugins/qt4projectmanager/externaleditors.cpp @@ -34,7 +34,6 @@ #include "externaleditors.h" #include "qt4project.h" #include "qt4projectmanagerconstants.h" -#include "qt4target.h" #include "qtversionmanager.h" #include "qt4buildconfiguration.h" diff --git a/src/plugins/qt4projectmanager/projectloadwizard.cpp b/src/plugins/qt4projectmanager/projectloadwizard.cpp index 0341cb19db..5797e99b17 100644 --- a/src/plugins/qt4projectmanager/projectloadwizard.cpp +++ b/src/plugins/qt4projectmanager/projectloadwizard.cpp @@ -32,16 +32,8 @@ **************************************************************************/ #include "projectloadwizard.h" - -#include "qt4project.h" -#include "qmakestep.h" -#include "qt4target.h" -#include "makestep.h" -#include "qt4buildconfiguration.h" -#include "qt4projectmanagerconstants.h" -#include "qtversionmanager.h" - #include "wizards/targetsetuppage.h" +#include "qt4project.h" #include <QtGui/QCheckBox> #include <QtGui/QHeaderView> @@ -98,7 +90,7 @@ void ProjectLoadWizard::setupTargetPage() return; QList<TargetSetupPage::ImportInfo> importVersions = TargetSetupPage::scanDefaultProjectDirectories(m_project); - importVersions.append(TargetSetupPage::importInfosForKnownQtVersions()); + importVersions.append(TargetSetupPage::importInfosForKnownQtVersions(m_project->file()->fileName())); m_targetSetupPage = new TargetSetupPage(this); m_targetSetupPage->setProFilePath(m_project->file()->fileName()); diff --git a/src/plugins/qt4projectmanager/qmakestep.h b/src/plugins/qt4projectmanager/qmakestep.h index 67514439d7..a1e82bbc1d 100644 --- a/src/plugins/qt4projectmanager/qmakestep.h +++ b/src/plugins/qt4projectmanager/qmakestep.h @@ -47,8 +47,8 @@ class Project; } namespace Qt4ProjectManager { -class Qt4Project; class Qt4BuildConfiguration; +class Qt4Project; namespace Internal { diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt-desktop.pri b/src/plugins/qt4projectmanager/qt-desktop/qt-desktop.pri new file mode 100644 index 0000000000..d002792d25 --- /dev/null +++ b/src/plugins/qt4projectmanager/qt-desktop/qt-desktop.pri @@ -0,0 +1,14 @@ + +HEADERS += \ + $$PWD/qt4runconfiguration.h \ + $$PWD/qt4desktoptargetfactory.h \ + $$PWD/qt4simulatortargetfactory.h \ + $$PWD/qt4desktoptarget.h \ + $$PWD/qt4simulatortarget.h + +SOURCES += \ + $$PWD/qt4runconfiguration.cpp \ + $$PWD/qt4desktoptargetfactory.cpp \ + $$PWD/qt4simulatortargetfactory.cpp \ + $$PWD/qt4desktoptarget.cpp \ + $$PWD/qt4simulatortarget.cpp diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptarget.cpp b/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptarget.cpp new file mode 100644 index 0000000000..f4b8e47a8c --- /dev/null +++ b/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptarget.cpp @@ -0,0 +1,92 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "qt4desktoptarget.h" +#include "qt4project.h" +#include "qt4runconfiguration.h" +#include <projectexplorer/deployconfiguration.h> +#include <projectexplorer/customexecutablerunconfiguration.h> +#include <QtGui/QApplication> +#include <QtGui/QStyle> + +using namespace Qt4ProjectManager; +using namespace Qt4ProjectManager::Internal; + +Qt4DesktopTarget::Qt4DesktopTarget(Qt4Project *parent, const QString &id) : + Qt4BaseTarget(parent, id), + m_buildConfigurationFactory(new Qt4BuildConfigurationFactory(this)), + m_deployConfigurationFactory(new ProjectExplorer::DeployConfigurationFactory(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"); +} + +Qt4BuildConfigurationFactory *Qt4DesktopTarget::buildConfigurationFactory() const +{ + return m_buildConfigurationFactory; +} + +ProjectExplorer::DeployConfigurationFactory *Qt4DesktopTarget::deployConfigurationFactory() const +{ + return m_deployConfigurationFactory; +} + +void Qt4DesktopTarget::createApplicationProFiles() +{ + 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 ProjectExplorer::CustomExecutableRunConfiguration(this)); + } +} diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptarget.h b/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptarget.h new file mode 100644 index 0000000000..68ef63c35f --- /dev/null +++ b/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptarget.h @@ -0,0 +1,63 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef QT4DESKTOPTARGET_H +#define QT4DESKTOPTARGET_H + +#include "qt4target.h" + +namespace Qt4ProjectManager { + +class Qt4Project; + +namespace Internal { + +class Qt4DesktopTarget : public Qt4BaseTarget +{ + friend class Qt4DesktopTargetFactory; + Q_OBJECT +public: + explicit Qt4DesktopTarget(Qt4Project *parent, const QString &id); + virtual ~Qt4DesktopTarget(); + + Internal::Qt4BuildConfigurationFactory *buildConfigurationFactory() const; + ProjectExplorer::DeployConfigurationFactory *deployConfigurationFactory() const; + + void createApplicationProFiles(); + + static QString defaultDisplayName(); + +private: + Internal::Qt4BuildConfigurationFactory *m_buildConfigurationFactory; + ProjectExplorer::DeployConfigurationFactory *m_deployConfigurationFactory; +}; + +} // namespace Internal +} // namespace Qt4ProjectManager +#endif // QT4DESKTOPTARGET_H diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.cpp b/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.cpp new file mode 100644 index 0000000000..681ccfee86 --- /dev/null +++ b/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.cpp @@ -0,0 +1,177 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "qt4desktoptargetfactory.h" +#include "qt4projectmanagerconstants.h" +#include "qt4project.h" +#include "qt4runconfiguration.h" +#include "qt4desktoptarget.h" + +#include <projectexplorer/deployconfiguration.h> +#include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/customexecutablerunconfiguration.h> +#include <projectexplorer/projectexplorerconstants.h> + +#include <QtGui/QApplication> +#include <QtGui/QStyle> + +using namespace Qt4ProjectManager; +using namespace Qt4ProjectManager::Internal; +using ProjectExplorer::idFromMap; + +Qt4DesktopTargetFactory::Qt4DesktopTargetFactory(QObject *parent) : + Qt4BaseTargetFactory(parent) +{ + connect(QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>)), + this, SIGNAL(supportedTargetIdsChanged())); +} + +Qt4DesktopTargetFactory::~Qt4DesktopTargetFactory() +{ +} + +bool Qt4DesktopTargetFactory::supportsTargetId(const QString &id) const +{ + return id == QLatin1String(Constants::DESKTOP_TARGET_ID); +} + +QStringList Qt4DesktopTargetFactory::supportedTargetIds(ProjectExplorer::Project *parent) const +{ + if (!qobject_cast<Qt4Project *>(parent)) + return QStringList(); + if (!QtVersionManager::instance()->supportsTargetId(Constants::DESKTOP_TARGET_ID)) + return QStringList(); + return QStringList() << QLatin1String(Constants::DESKTOP_TARGET_ID); +} + +QString Qt4DesktopTargetFactory::displayNameForId(const QString &id) const +{ + if (id == QLatin1String(Constants::DESKTOP_TARGET_ID)) + return Qt4DesktopTarget::defaultDisplayName(); + return QString(); +} + +bool Qt4DesktopTargetFactory::canCreate(ProjectExplorer::Project *parent, const QString &id) const +{ + if (!qobject_cast<Qt4Project *>(parent)) + return false; + return supportsTargetId(id); +} + +bool Qt4DesktopTargetFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const +{ + return canCreate(parent, idFromMap(map)); +} + +Qt4BaseTarget *Qt4DesktopTargetFactory::restore(ProjectExplorer::Project *parent, const QVariantMap &map) +{ + if (!canRestore(parent, map)) + return 0; + + Qt4Project *qt4project = static_cast<Qt4Project *>(parent); + Qt4DesktopTarget *target = new Qt4DesktopTarget(qt4project, QLatin1String("transient ID")); + + if (target->fromMap(map)) + return target; + delete target; + return 0; +} + +QString Qt4DesktopTargetFactory::defaultShadowBuildDirectory(const QString &projectLocation, const QString &id) +{ + if (id != QLatin1String(Constants::DESKTOP_TARGET_ID)) + return QString(); + + // currently we can't have the build directory to be deeper than the source directory + // since that is broken in qmake + // Once qmake is fixed we can change that to have a top directory and + // subdirectories per build. (Replacing "QChar('-')" with "QChar('/') ) + return projectLocation + QLatin1String("-desktop"); +} + +QList<BuildConfigurationInfo> Qt4DesktopTargetFactory::availableBuildConfigurations(const QString &proFilePath) +{ + QList<BuildConfigurationInfo> infos; + QList<QtVersion *> knownVersions = QtVersionManager::instance()->versionsForTargetId(Constants::DESKTOP_TARGET_ID); + + foreach (QtVersion *version, knownVersions) { + bool buildAll = version->defaultBuildConfig() & QtVersion::BuildAll; + QtVersion::QmakeBuildConfigs config = buildAll ? QtVersion::BuildAll : QtVersion::QmakeBuildConfig(0); + + QString dir = defaultShadowBuildDirectory(Qt4Project::defaultTopLevelBuildDirectory(proFilePath), Constants::DESKTOP_TARGET_ID); + infos.append(BuildConfigurationInfo(version, config, QString(), dir)); + infos.append(BuildConfigurationInfo(version, config | QtVersion::DebugBuild, QString(), dir)); + } + return infos; +} + +Qt4BaseTarget *Qt4DesktopTargetFactory::create(ProjectExplorer::Project *parent, const QString &id) +{ + if (!canCreate(parent, id)) + return 0; + + QList<QtVersion *> knownVersions = QtVersionManager::instance()->versionsForTargetId(id); + if (knownVersions.isEmpty()) + return 0; + + QtVersion *qtVersion = knownVersions.first(); + bool buildAll = qtVersion->isValid() && (qtVersion->defaultBuildConfig() & QtVersion::BuildAll); + QtVersion::QmakeBuildConfigs config = buildAll ? QtVersion::BuildAll : QtVersion::QmakeBuildConfig(0); + + QList<BuildConfigurationInfo> infos; + infos.append(BuildConfigurationInfo(qtVersion, config | QtVersion::DebugBuild, QString(), QString())); + infos.append(BuildConfigurationInfo(qtVersion, config, QString(), QString())); + + return create(parent, id, infos); +} + +Qt4BaseTarget *Qt4DesktopTargetFactory::create(ProjectExplorer::Project *parent, const QString &id, QList<BuildConfigurationInfo> infos) +{ + if (!canCreate(parent, id)) + return 0; + Qt4DesktopTarget *t = new Qt4DesktopTarget(static_cast<Qt4Project *>(parent), id); + + foreach (const BuildConfigurationInfo &info, infos) { + QString displayName = info.version->displayName() + QLatin1Char(' '); + displayName += (info.buildConfig & QtVersion::DebugBuild) ? tr("Debug") : tr("Release"); + t->addQt4BuildConfiguration(displayName, + info.version, + info.buildConfig, + info.additionalArguments, + info.directory); + } + + t->addDeployConfiguration(t->deployConfigurationFactory()->create(t, ProjectExplorer::Constants::DEFAULT_DEPLOYCONFIGURATION_ID)); + + t->createApplicationProFiles(); + + if (t->runConfigurations().isEmpty()) + t->addRunConfiguration(new ProjectExplorer::CustomExecutableRunConfiguration(t)); + return t; +} diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.h b/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.h new file mode 100644 index 0000000000..b65d9716f7 --- /dev/null +++ b/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.h @@ -0,0 +1,61 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef QT4DESKTOPTARGETFACTORY_H +#define QT4DESKTOPTARGETFACTORY_H + +#include "qt4target.h" + +namespace Qt4ProjectManager { +namespace Internal { +class Qt4DesktopTargetFactory : public Qt4BaseTargetFactory +{ + Q_OBJECT +public: + Qt4DesktopTargetFactory(QObject *parent = 0); + ~Qt4DesktopTargetFactory(); + + QStringList supportedTargetIds(ProjectExplorer::Project *parent) const; + QString displayNameForId(const QString &id) const; + + bool canCreate(ProjectExplorer::Project *parent, const QString &id) const; + bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const; + Qt4ProjectManager::Qt4BaseTarget *restore(ProjectExplorer::Project *parent, const QVariantMap &map); + QString defaultShadowBuildDirectory(const QString &projectLocation, const QString &id); + + virtual bool supportsTargetId(const QString &id) const; + + QList<BuildConfigurationInfo> availableBuildConfigurations(const QString &proFilePath); + Qt4BaseTarget *create(ProjectExplorer::Project *parent, const QString &id); + Qt4BaseTarget *create(ProjectExplorer::Project *parent, const QString &id, QList<BuildConfigurationInfo> infos); +}; +} +} + +#endif // QT4DESKTOPTARGETFACTORY_H diff --git a/src/plugins/qt4projectmanager/qt4runconfiguration.cpp b/src/plugins/qt4projectmanager/qt-desktop/qt4runconfiguration.cpp index 43d964de2a..ecae28a091 100644 --- a/src/plugins/qt4projectmanager/qt4runconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt-desktop/qt4runconfiguration.cpp @@ -41,6 +41,7 @@ #include "qt4buildconfiguration.h" #include "qt4projectmanagerconstants.h" #include "qtoutputformatter.h" +#include "qt4desktoptarget.h" #include <coreplugin/coreconstants.h> #include <coreplugin/icore.h> @@ -100,7 +101,7 @@ QString pathToId(const QString &path) // Qt4RunConfiguration // -Qt4RunConfiguration::Qt4RunConfiguration(Qt4Target *parent, const QString &proFilePath) : +Qt4RunConfiguration::Qt4RunConfiguration(Qt4BaseTarget *parent, const QString &proFilePath) : LocalApplicationRunConfiguration(parent, QLatin1String(QT4_RC_ID)), m_proFilePath(proFilePath), m_runMode(Gui), @@ -111,7 +112,7 @@ Qt4RunConfiguration::Qt4RunConfiguration(Qt4Target *parent, const QString &proFi ctor(); } -Qt4RunConfiguration::Qt4RunConfiguration(Qt4Target *parent, Qt4RunConfiguration *source) : +Qt4RunConfiguration::Qt4RunConfiguration(Qt4BaseTarget *parent, Qt4RunConfiguration *source) : LocalApplicationRunConfiguration(parent, source), m_commandLineArguments(source->m_commandLineArguments), m_proFilePath(source->m_proFilePath), @@ -129,9 +130,9 @@ Qt4RunConfiguration::~Qt4RunConfiguration() { } -Qt4Target *Qt4RunConfiguration::qt4Target() const +Qt4DesktopTarget *Qt4RunConfiguration::qt4Target() const { - return static_cast<Qt4Target *>(target()); + return static_cast<Qt4DesktopTarget *>(target()); } bool Qt4RunConfiguration::isEnabled(ProjectExplorer::BuildConfiguration * /* configuration */) const @@ -719,7 +720,7 @@ Qt4RunConfigurationFactory::~Qt4RunConfigurationFactory() bool Qt4RunConfigurationFactory::canCreate(ProjectExplorer::Target *parent, const QString &id) const { - Qt4Target *t = qobject_cast<Qt4Target *>(parent); + Qt4DesktopTarget *t = qobject_cast<Qt4DesktopTarget *>(parent); if (!t) return false; if (t->id() != QLatin1String(Constants::DESKTOP_TARGET_ID)) @@ -731,13 +732,13 @@ ProjectExplorer::RunConfiguration *Qt4RunConfigurationFactory::create(ProjectExp { if (!canCreate(parent, id)) return 0; - Qt4Target *t(static_cast<Qt4Target *>(parent)); + Qt4DesktopTarget *t(static_cast<Qt4DesktopTarget *>(parent)); return new Qt4RunConfiguration(t, pathFromId(id)); } bool Qt4RunConfigurationFactory::canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const { - if (!qobject_cast<Qt4Target *>(parent)) + if (!qobject_cast<Qt4DesktopTarget *>(parent)) return false; if (parent->id() != QLatin1String(Constants::DESKTOP_TARGET_ID)) return false; @@ -749,8 +750,8 @@ ProjectExplorer::RunConfiguration *Qt4RunConfigurationFactory::restore(ProjectEx { if (!canRestore(parent, map)) return 0; - Qt4Target *t(static_cast<Qt4Target *>(parent)); - Qt4RunConfiguration *rc(new Qt4RunConfiguration(t, QString())); + Qt4DesktopTarget *t = static_cast<Qt4DesktopTarget *>(parent); + Qt4RunConfiguration *rc = new Qt4RunConfiguration(t, QString()); if (rc->fromMap(map)) return rc; @@ -767,14 +768,14 @@ ProjectExplorer::RunConfiguration *Qt4RunConfigurationFactory::clone(ProjectExpl { if (!canClone(parent, source)) return 0; - Qt4Target *t(static_cast<Qt4Target *>(parent)); - Qt4RunConfiguration *old(static_cast<Qt4RunConfiguration *>(source)); + Qt4DesktopTarget *t = static_cast<Qt4DesktopTarget *>(parent); + Qt4RunConfiguration *old = static_cast<Qt4RunConfiguration *>(source); return new Qt4RunConfiguration(t, old); } QStringList Qt4RunConfigurationFactory::availableCreationIds(ProjectExplorer::Target *parent) const { - Qt4Target *t(qobject_cast<Qt4Target *>(parent)); + Qt4DesktopTarget *t = qobject_cast<Qt4DesktopTarget *>(parent); if (!t) return QStringList(); if (t->id() != Constants::DESKTOP_TARGET_ID) diff --git a/src/plugins/qt4projectmanager/qt4runconfiguration.h b/src/plugins/qt4projectmanager/qt-desktop/qt4runconfiguration.h index 86210b53c3..182521bfa7 100644 --- a/src/plugins/qt4projectmanager/qt4runconfiguration.h +++ b/src/plugins/qt4projectmanager/qt-desktop/qt4runconfiguration.h @@ -59,10 +59,12 @@ namespace ProjectExplorer { } namespace Qt4ProjectManager { + class Qt4Project; -class Qt4Target; +class Qt4BaseTarget; namespace Internal { +class Qt4DesktopTarget; class Qt4PriFileNode; class Qt4ProFileNode; class Qt4RunConfigurationFactory; @@ -75,10 +77,10 @@ class Qt4RunConfiguration : public ProjectExplorer::LocalApplicationRunConfigura friend class Qt4RunConfigurationFactory; public: - Qt4RunConfiguration(Qt4Target *parent, const QString &proFilePath); + Qt4RunConfiguration(Qt4BaseTarget *parent, const QString &proFilePath); virtual ~Qt4RunConfiguration(); - Qt4Target *qt4Target() const; + Qt4DesktopTarget *qt4Target() const; virtual bool isEnabled(ProjectExplorer::BuildConfiguration *configuration) const; using ProjectExplorer::LocalApplicationRunConfiguration::isEnabled; @@ -119,7 +121,7 @@ private slots: void proFileInvalidated(Qt4ProjectManager::Internal::Qt4ProFileNode *pro); protected: - Qt4RunConfiguration(Qt4Target *parent, Qt4RunConfiguration *source); + Qt4RunConfiguration(Qt4BaseTarget *parent, Qt4RunConfiguration *source); virtual bool fromMap(const QVariantMap &map); private: diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortarget.cpp b/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortarget.cpp new file mode 100644 index 0000000000..c15df4ccb4 --- /dev/null +++ b/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortarget.cpp @@ -0,0 +1,96 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "qt4simulatortarget.h" +#include "qt4project.h" +#include "qt4runconfiguration.h" + +#include <projectexplorer/customexecutablerunconfiguration.h> +#include <projectexplorer/deployconfiguration.h> +#include <QtGui/QApplication> + +using namespace Qt4ProjectManager; +using namespace Qt4ProjectManager::Internal; + + +// ------------------------------------------------------------------------- +// Qt4Target +// ------------------------------------------------------------------------- + +Qt4SimulatorTarget::Qt4SimulatorTarget(Qt4Project *parent, const QString &id) : + Qt4BaseTarget(parent, id), + m_buildConfigurationFactory(new Qt4BuildConfigurationFactory(this)), + m_deployConfigurationFactory(new ProjectExplorer::DeployConfigurationFactory(this)) +{ + setDisplayName(defaultDisplayName()); + setIcon(QIcon(":/projectexplorer/images/SymbianEmulator.png")); +} + +Qt4SimulatorTarget::~Qt4SimulatorTarget() +{ +} + +QString Qt4SimulatorTarget::defaultDisplayName() +{ + return QApplication::translate("Qt4ProjectManager::Qt4Target", "Qt Simulator", "Qt4 Simulator target display name"); +} + +Qt4BuildConfigurationFactory *Qt4SimulatorTarget::buildConfigurationFactory() const +{ + return m_buildConfigurationFactory; +} + +ProjectExplorer::DeployConfigurationFactory *Qt4SimulatorTarget::deployConfigurationFactory() const +{ + return m_deployConfigurationFactory; +} + +void Qt4SimulatorTarget::createApplicationProFiles() +{ + 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 ProjectExplorer::CustomExecutableRunConfiguration(this)); + } +} diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortarget.h b/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortarget.h new file mode 100644 index 0000000000..c9b6858a7a --- /dev/null +++ b/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortarget.h @@ -0,0 +1,64 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef QT4SIMULATORTARGET_H +#define QT4SIMULATORTARGET_H + +#include "qt4target.h" + +namespace Qt4ProjectManager { + +class Qt4Project; + +namespace Internal { + +class Qt4SimulatorTarget : public Qt4BaseTarget +{ + friend class Qt4SimulatorTargetFactory; + Q_OBJECT +public: + explicit Qt4SimulatorTarget(Qt4Project *parent, const QString &id); + virtual ~Qt4SimulatorTarget(); + + Internal::Qt4BuildConfigurationFactory *buildConfigurationFactory() const; + ProjectExplorer::DeployConfigurationFactory *deployConfigurationFactory() const; + + void createApplicationProFiles(); + + static QString defaultDisplayName(); + +private: + Internal::Qt4BuildConfigurationFactory *m_buildConfigurationFactory; + ProjectExplorer::DeployConfigurationFactory *m_deployConfigurationFactory; +}; + +} // namespace Internal +} // namespace Qt4ProjectManager + +#endif // QT4SIMULATORTARGET_H diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.cpp b/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.cpp new file mode 100644 index 0000000000..0ce2888dca --- /dev/null +++ b/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.cpp @@ -0,0 +1,178 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "qt4simulatortargetfactory.h" +#include "qt4projectmanagerconstants.h" +#include "qt4project.h" +#include "qt4runconfiguration.h" +#include "qt4simulatortarget.h" + +#include <projectexplorer/deployconfiguration.h> +#include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/customexecutablerunconfiguration.h> + +#include <QtGui/QApplication> +#include <QtGui/QStyle> + +using namespace Qt4ProjectManager; +using namespace Qt4ProjectManager::Internal; +using ProjectExplorer::idFromMap; + +// ------------------------------------------------------------------------- +// Qt4SimulatorTargetFactory +// ------------------------------------------------------------------------- + +Qt4SimulatorTargetFactory::Qt4SimulatorTargetFactory(QObject *parent) : + Qt4BaseTargetFactory(parent) +{ + connect(QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>)), + this, SIGNAL(supportedTargetIdsChanged())); +} + +Qt4SimulatorTargetFactory::~Qt4SimulatorTargetFactory() +{ +} + +bool Qt4SimulatorTargetFactory::supportsTargetId(const QString &id) const +{ + return id == QLatin1String(Constants::QT_SIMULATOR_TARGET_ID); +} + +QStringList Qt4SimulatorTargetFactory::supportedTargetIds(ProjectExplorer::Project *parent) const +{ + if (!qobject_cast<Qt4Project *>(parent)) + return QStringList(); + if (!QtVersionManager::instance()->supportsTargetId(Constants::QT_SIMULATOR_TARGET_ID)) + return QStringList(); + return QStringList() << QLatin1String(Constants::QT_SIMULATOR_TARGET_ID); +} + +QString Qt4SimulatorTargetFactory::displayNameForId(const QString &id) const +{ + if (id == QLatin1String(Constants::QT_SIMULATOR_TARGET_ID)) + return Qt4SimulatorTarget::defaultDisplayName(); + return QString(); +} + +bool Qt4SimulatorTargetFactory::canCreate(ProjectExplorer::Project *parent, const QString &id) const +{ + if (!qobject_cast<Qt4Project *>(parent)) + return false; + return supportsTargetId(id); +} + +bool Qt4SimulatorTargetFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const +{ + return canCreate(parent, idFromMap(map)); +} + +Qt4BaseTarget *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, QLatin1String("transient ID")); + if (target->fromMap(map)) + return target; + delete target; + return 0; +} + +QString Qt4SimulatorTargetFactory::defaultShadowBuildDirectory(const QString &projectLocation, const QString &id) +{ + if (id != QLatin1String(Constants::QT_SIMULATOR_TARGET_ID)) + return QString(); + + // currently we can't have the build directory to be deeper than the source directory + // since that is broken in qmake + // Once qmake is fixed we can change that to have a top directory and + // subdirectories per build. (Replacing "QChar('-')" with "QChar('/') ) + return projectLocation + QLatin1String("-simulator"); +} + +QList<BuildConfigurationInfo> Qt4SimulatorTargetFactory::availableBuildConfigurations(const QString &proFilePath) +{ + QList<BuildConfigurationInfo> infos; + QList<QtVersion *> knownVersions = QtVersionManager::instance()->versionsForTargetId(Constants::QT_SIMULATOR_TARGET_ID); + + foreach (QtVersion *version, knownVersions) { + bool buildAll = version->defaultBuildConfig() & QtVersion::BuildAll; + QtVersion::QmakeBuildConfigs config = buildAll ? QtVersion::BuildAll : QtVersion::QmakeBuildConfig(0); + QString dir = defaultShadowBuildDirectory(Qt4Project::defaultTopLevelBuildDirectory(proFilePath), Constants::QT_SIMULATOR_TARGET_ID); + infos.append(BuildConfigurationInfo(version, config, QString(), dir)); + infos.append(BuildConfigurationInfo(version, config | QtVersion::DebugBuild, QString(), dir)); + } + return infos; +} + +Qt4BaseTarget *Qt4SimulatorTargetFactory::create(ProjectExplorer::Project *parent, const QString &id) +{ + if (!canCreate(parent, id)) + return 0; + + QList<QtVersion *> knownVersions = QtVersionManager::instance()->versionsForTargetId(id); + if (knownVersions.isEmpty()) + return 0; + + QtVersion *qtVersion = knownVersions.first(); + bool buildAll = qtVersion->isValid() && (qtVersion->defaultBuildConfig() & QtVersion::BuildAll); + QtVersion::QmakeBuildConfigs config = buildAll ? QtVersion::BuildAll : QtVersion::QmakeBuildConfig(0); + + QList<BuildConfigurationInfo> infos; + infos.append(BuildConfigurationInfo(qtVersion, config | QtVersion::DebugBuild, QString(), QString())); + infos.append(BuildConfigurationInfo(qtVersion, config, QString(), QString())); + + return create(parent, id, infos); +} + +Qt4BaseTarget *Qt4SimulatorTargetFactory::create(ProjectExplorer::Project *parent, const QString &id, QList<BuildConfigurationInfo> infos) +{ + if (!canCreate(parent, id)) + return 0; + Qt4SimulatorTarget *t = new Qt4SimulatorTarget(static_cast<Qt4Project *>(parent), id); + + foreach (const BuildConfigurationInfo &info, infos) { + QString displayName = info.version->displayName() + QLatin1Char(' '); + displayName += (info.buildConfig & QtVersion::DebugBuild) ? tr("Debug") : tr("Release"); + t->addQt4BuildConfiguration(displayName, + info.version, + info.buildConfig, + info.additionalArguments, + info.directory); + } + + t->addDeployConfiguration(t->deployConfigurationFactory()->create(t, ProjectExplorer::Constants::DEFAULT_DEPLOYCONFIGURATION_ID)); + + t->createApplicationProFiles(); + + if (t->runConfigurations().isEmpty()) + t->addRunConfiguration(new ProjectExplorer::CustomExecutableRunConfiguration(t)); + return t; +} diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.h b/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.h new file mode 100644 index 0000000000..9b2df9d12b --- /dev/null +++ b/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.h @@ -0,0 +1,64 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef QT4SIMULATORTARGETFACTORY_H +#define QT4SIMULATORTARGETFACTORY_H +#include "qt4target.h" + +namespace Qt4ProjectManager { +namespace Internal { + +class Qt4SimulatorTargetFactory : public Qt4BaseTargetFactory +{ + Q_OBJECT +public: + Qt4SimulatorTargetFactory(QObject *parent = 0); + ~Qt4SimulatorTargetFactory(); + + bool supportsTargetId(const QString &id); + + QStringList supportedTargetIds(ProjectExplorer::Project *parent) const; + QString displayNameForId(const QString &id) const; + + bool canCreate(ProjectExplorer::Project *parent, const QString &id) const; + bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const; + Qt4ProjectManager::Qt4BaseTarget *restore(ProjectExplorer::Project *parent, const QVariantMap &map); + QString defaultShadowBuildDirectory(const QString &projectLocation, const QString &id); + + virtual bool supportsTargetId(const QString &id) const; + + QList<BuildConfigurationInfo> availableBuildConfigurations(const QString &proFilePath); + Qt4BaseTarget *create(ProjectExplorer::Project *parent, const QString &id); + Qt4BaseTarget *create(ProjectExplorer::Project *parent, const QString &id, QList<BuildConfigurationInfo> infos); +}; + +} +} + +#endif // QT4SIMULATORTARGETFACTORY_H diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemodeployablelistmodel.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemodeployablelistmodel.cpp index 073949e2ea..320ba3669a 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemodeployablelistmodel.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemodeployablelistmodel.cpp @@ -34,6 +34,7 @@ #include "maemodeployablelistmodel.h" #include "maemoglobal.h" +#include "qt4maemotarget.h" #include <projectexplorer/projectexplorer.h> #include <projectexplorer/session.h> @@ -340,8 +341,8 @@ const QtVersion *MaemoDeployableListModel::qtVersion() const const ProjectExplorer::Project *const activeProject = ProjectExplorer::ProjectExplorerPlugin::instance()->session()->startupProject(); QTC_ASSERT(activeProject, return 0); - const Qt4Target *const activeTarget - = qobject_cast<Qt4Target *>(activeProject->activeTarget()); + const Qt4MaemoTarget *const activeTarget + = qobject_cast<Qt4MaemoTarget *>(activeProject->activeTarget()); QTC_ASSERT(activeTarget, return 0); const Qt4BuildConfiguration *const bc = activeTarget->activeBuildConfiguration(); diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemodeployables.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemodeployables.cpp index f25b4b90cc..b664e9ea4e 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemodeployables.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemodeployables.cpp @@ -42,20 +42,20 @@ #include "maemodeployables.h" #include "maemoprofilesupdatedialog.h" +#include "qt4maemotarget.h" #include <profileevaluator.h> #include <projectexplorer/buildstep.h> #include <qt4projectmanager/qt4projectmanagerconstants.h> #include <qt4projectmanager/qt4buildconfiguration.h> #include <qt4projectmanager/qt4project.h> -#include <qt4projectmanager/qt4target.h> #include <QtCore/QTimer> namespace Qt4ProjectManager { namespace Internal { -MaemoDeployables::MaemoDeployables(const Qt4Target *target) +MaemoDeployables::MaemoDeployables(const Qt4MaemoTarget *target) : m_target(target), m_updateTimer(new QTimer(this)) { QTimer::singleShot(0, this, SLOT(init())); diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemodeployables.h b/src/plugins/qt4projectmanager/qt-maemo/maemodeployables.h index 8f0712ac1a..df7e676e77 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemodeployables.h +++ b/src/plugins/qt4projectmanager/qt-maemo/maemodeployables.h @@ -53,16 +53,16 @@ QT_FORWARD_DECLARE_CLASS(QTimer) namespace Qt4ProjectManager { class Qt4BuildConfiguration; -class Qt4Target; namespace Internal { class Qt4ProFileNode; +class Qt4MaemoTarget; class MaemoDeployables : public QAbstractListModel { Q_OBJECT public: - MaemoDeployables(const Qt4Target *target); + MaemoDeployables(const Qt4MaemoTarget *target); ~MaemoDeployables(); void setUnmodified(); bool isModified() const; @@ -84,7 +84,7 @@ private: QList<MaemoDeployableListModel *> m_listModels; UpdateSettingsMap m_updateSettings; - const Qt4Target * const m_target; + const Qt4MaemoTarget * const m_target; QTimer *const m_updateTimer; }; diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemodeploystep.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemodeploystep.cpp index 104ce44bac..3db09d2495 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemodeploystep.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemodeploystep.cpp @@ -41,6 +41,7 @@ #include "maemorunconfiguration.h" #include "maemotoolchain.h" #include "maemousedportsgatherer.h" +#include "qt4maemotarget.h" #include <coreplugin/ssh/sftpchannel.h> #include <coreplugin/ssh/sshconnection.h> @@ -96,7 +97,7 @@ void MaemoDeployStep::ctor() const QList<DeployConfiguration *> &deployConfigs = target()->deployConfigurations(); if (deployConfigs.isEmpty()) { - const Qt4Target * const qt4Target = qobject_cast<Qt4Target *>(target()); + const Qt4MaemoTarget * const qt4Target = qobject_cast<Qt4MaemoTarget *>(target()); Q_ASSERT(qt4Target); m_deployables = QSharedPointer<MaemoDeployables>(new MaemoDeployables(qt4Target)); } else { diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemomanager.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemomanager.cpp index bf2107e3f0..32f118a93f 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemomanager.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemomanager.cpp @@ -44,6 +44,7 @@ #include "maemosettingspages.h" #include "maemotemplatesmanager.h" #include "maemotoolchain.h" +#include "qt4maemotargetfactory.h" #include <extensionsystem/pluginmanager.h> #include <qt4projectmanager/qtversionmanager.h> @@ -69,6 +70,7 @@ MaemoManager::MaemoManager() , m_deviceConfigurationsSettingsPage(new MaemoDeviceConfigurationsSettingsPage(this)) , m_qemuSettingsPage(new MaemoQemuSettingsPage(this)) , m_publishingFactoryFremantleFree(new MaemoPublishingWizardFactoryFremantleFree(this)) + , m_maemoTargetFactory(new Qt4MaemoTargetFactory(this)) { Q_ASSERT(!m_instance); @@ -85,6 +87,7 @@ MaemoManager::MaemoManager() pluginManager->addObject(m_deviceConfigurationsSettingsPage); pluginManager->addObject(m_qemuSettingsPage); pluginManager->addObject(m_publishingFactoryFremantleFree); + pluginManager->addObject(m_maemoTargetFactory); } MaemoManager::~MaemoManager() @@ -98,6 +101,7 @@ MaemoManager::~MaemoManager() pluginManager->removeObject(m_deviceConfigurationsSettingsPage); pluginManager->removeObject(m_qemuSettingsPage); pluginManager->removeObject(m_publishingFactoryFremantleFree); + pluginManager->removeObject(m_maemoTargetFactory); m_instance = 0; } diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemomanager.h b/src/plugins/qt4projectmanager/qt-maemo/maemomanager.h index d3730b4df6..d8af50191a 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemomanager.h +++ b/src/plugins/qt4projectmanager/qt-maemo/maemomanager.h @@ -53,6 +53,7 @@ class MaemoRunConfigurationFactory; class MaemoDeviceConfigurationsSettingsPage; class MaemoQemuManager; class MaemoQemuSettingsPage; +class Qt4MaemoTargetFactory; class MaemoManager : public QObject { @@ -80,6 +81,7 @@ private: MaemoQemuSettingsPage *m_qemuSettingsPage; MaemoQemuManager *m_qemuRuntimeManager; MaemoPublishingWizardFactoryFremantleFree *m_publishingFactoryFremantleFree; + Qt4MaemoTargetFactory *m_maemoTargetFactory; }; } // namespace Internal diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemoqemumanager.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemoqemumanager.cpp index 4691c5db4d..22e7894982 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemoqemumanager.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemoqemumanager.cpp @@ -41,6 +41,7 @@ #include "qtversionmanager.h" #include "qt4project.h" #include "qt4projectmanagerconstants.h" +#include "qt4maemotarget.h" #include <coreplugin/actionmanager/actionmanager.h> #include <coreplugin/actionmanager/command.h> @@ -506,7 +507,7 @@ void MaemoQemuManager::toggleStarterButton(Target *target) { int uniqueId = -1; if (target) { - if (Qt4Target *qt4Target = qobject_cast<Qt4Target*>(target)) { + if (Qt4MaemoTarget *qt4Target = qobject_cast<Qt4MaemoTarget*>(target)) { if (Qt4BuildConfiguration *bc = qt4Target->activeBuildConfiguration()) { if (QtVersion *version = bc->qtVersion()) uniqueId = version->uniqueId(); diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp index 2e6c7e62e5..2f893175c8 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp @@ -40,6 +40,7 @@ #include "maemoremotemountsmodel.h" #include "maemorunconfigurationwidget.h" #include "maemotoolchain.h" +#include "qt4maemotarget.h" #include "qtoutputformatter.h" #include <coreplugin/icore.h> @@ -65,7 +66,7 @@ const bool DefaultUseRemoteGdbValue = false; using namespace ProjectExplorer; -MaemoRunConfiguration::MaemoRunConfiguration(Qt4Target *parent, +MaemoRunConfiguration::MaemoRunConfiguration(Qt4BaseTarget *parent, const QString &proFilePath) : RunConfiguration(parent, QLatin1String(MAEMO_RC_ID)) , m_proFilePath(proFilePath) @@ -76,7 +77,7 @@ MaemoRunConfiguration::MaemoRunConfiguration(Qt4Target *parent, init(); } -MaemoRunConfiguration::MaemoRunConfiguration(Qt4Target *parent, +MaemoRunConfiguration::MaemoRunConfiguration(Qt4BaseTarget *parent, MaemoRunConfiguration *source) : RunConfiguration(parent, source) , m_proFilePath(source->m_proFilePath) @@ -114,9 +115,9 @@ MaemoRunConfiguration::~MaemoRunConfiguration() { } -Qt4Target *MaemoRunConfiguration::qt4Target() const +Qt4MaemoTarget *MaemoRunConfiguration::qt4Target() const { - return static_cast<Qt4Target *>(target()); + return static_cast<Qt4MaemoTarget *>(target()); } Qt4BuildConfiguration *MaemoRunConfiguration::activeQt4BuildConfiguration() const @@ -443,5 +444,10 @@ void MaemoRunConfiguration::setSystemEnvironment(const Utils::Environment &envir } } +QString MaemoRunConfiguration::proFilePath() const +{ + return m_proFilePath; +} + } // namespace Internal } // namespace Qt4ProjectManager diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.h b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.h index e05f581684..4f11271847 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.h +++ b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.h @@ -51,11 +51,12 @@ namespace Qt4ProjectManager { class Qt4BuildConfiguration; class Qt4Project; -class Qt4Target; +class Qt4BaseTarget; namespace Internal { class Qt4ProFileNode; +class Qt4MaemoTarget; class MaemoDeviceConfigListModel; class MaemoDeployStep; @@ -77,14 +78,14 @@ public: enum DebuggingType { DebugCppOnly, DebugQmlOnly, DebugCppAndQml }; - MaemoRunConfiguration(Qt4Target *parent, const QString &proFilePath); + MaemoRunConfiguration(Qt4BaseTarget *parent, const QString &proFilePath); virtual ~MaemoRunConfiguration(); using ProjectExplorer::RunConfiguration::isEnabled; bool isEnabled(ProjectExplorer::BuildConfiguration *config) const; QWidget *createConfigurationWidget(); ProjectExplorer::OutputFormatter *createOutputFormatter() const; - Qt4Target *qt4Target() const; + Qt4MaemoTarget *qt4Target() const; Qt4BuildConfiguration *activeQt4BuildConfiguration() const; MaemoDeployStep *deployStep() const; @@ -126,6 +127,8 @@ public: int portsUsedByDebuggers() const; + QString proFilePath() const; + signals: void deviceConfigurationChanged(ProjectExplorer::Target *target); void targetInformationChanged() const; @@ -135,7 +138,7 @@ signals: void userEnvironmentChangesChanged(const QList<Utils::EnvironmentItem> &diff); protected: - MaemoRunConfiguration(Qt4Target *parent, MaemoRunConfiguration *source); + MaemoRunConfiguration(Qt4BaseTarget *parent, MaemoRunConfiguration *source); virtual bool fromMap(const QVariantMap &map); QString defaultDisplayName(); diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfigurationwidget.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfigurationwidget.cpp index 5bec1d09c9..3c8d04696b 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfigurationwidget.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfigurationwidget.cpp @@ -42,6 +42,7 @@ #include "maemoremotemountsmodel.h" #include "maemorunconfiguration.h" #include "maemosettingspages.h" +#include "qt4maemotarget.h" #include <coreplugin/coreconstants.h> #include <coreplugin/icore.h> diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemorunfactories.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemorunfactories.cpp index 5ab079c1aa..f0e4f2745d 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemorunfactories.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemorunfactories.cpp @@ -40,6 +40,8 @@ #include "maemoremotemountsmodel.h" #include "maemorunconfiguration.h" #include "maemoruncontrol.h" +#include "maemotoolchain.h" +#include "qt4maemotarget.h" #include <projectexplorer/projectexplorerconstants.h> #include <debugger/debuggerconstants.h> @@ -74,7 +76,7 @@ MaemoRunConfigurationFactory::~MaemoRunConfigurationFactory() bool MaemoRunConfigurationFactory::canCreate(Target *parent, const QString &id) const { - Qt4Target *target = qobject_cast<Qt4Target *>(parent); + Qt4MaemoTarget *target = qobject_cast<Qt4MaemoTarget *>(parent); if (!target || target->id() != QLatin1String(Constants::MAEMO_DEVICE_TARGET_ID)) { return false; @@ -85,7 +87,7 @@ bool MaemoRunConfigurationFactory::canCreate(Target *parent, bool MaemoRunConfigurationFactory::canRestore(Target *parent, const QVariantMap &map) const { - if (!qobject_cast<Qt4Target *>(parent)) + if (!qobject_cast<Qt4MaemoTarget *>(parent)) return false; return ProjectExplorer::idFromMap(map) .startsWith(QLatin1String(MAEMO_RC_ID)); @@ -99,7 +101,7 @@ bool MaemoRunConfigurationFactory::canClone(Target *parent, QStringList MaemoRunConfigurationFactory::availableCreationIds(Target *parent) const { - if (Qt4Target *t = qobject_cast<Qt4Target *>(parent)) { + if (Qt4MaemoTarget *t = qobject_cast<Qt4MaemoTarget *>(parent)) { if (t->id() == QLatin1String(Constants::MAEMO_DEVICE_TARGET_ID)) { return t->qt4Project()-> applicationProFilePathes(QLatin1String(MAEMO_RC_ID_PREFIX)); @@ -118,7 +120,7 @@ RunConfiguration *MaemoRunConfigurationFactory::create(Target *parent, { if (!canCreate(parent, id)) return 0; - Qt4Target *pqt4parent = static_cast<Qt4Target *>(parent); + Qt4MaemoTarget *pqt4parent = static_cast<Qt4MaemoTarget *>(parent); return new MaemoRunConfiguration(pqt4parent, pathFromId(id)); } @@ -128,7 +130,7 @@ RunConfiguration *MaemoRunConfigurationFactory::restore(Target *parent, { if (!canRestore(parent, map)) return 0; - Qt4Target *target = static_cast<Qt4Target *>(parent); + Qt4MaemoTarget *target = static_cast<Qt4MaemoTarget *>(parent); MaemoRunConfiguration *rc = new MaemoRunConfiguration(target, QString()); if (rc->fromMap(map)) return rc; @@ -144,7 +146,7 @@ RunConfiguration *MaemoRunConfigurationFactory::clone(Target *parent, return 0; MaemoRunConfiguration *old = static_cast<MaemoRunConfiguration *>(source); - return new MaemoRunConfiguration(static_cast<Qt4Target *>(parent), old); + return new MaemoRunConfiguration(static_cast<Qt4MaemoTarget *>(parent), old); } // #pragma mark -- MaemoRunControlFactory diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemotemplatesmanager.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemotemplatesmanager.cpp index 205dedd5eb..a9bd9f8b45 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemotemplatesmanager.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemotemplatesmanager.cpp @@ -38,6 +38,7 @@ #include "maemodeploystep.h" #include "maemoglobal.h" #include "maemopackagecreationstep.h" +#include "qt4maemotarget.h" #include <projectexplorer/project.h> #include <projectexplorer/projectexplorer.h> @@ -119,7 +120,7 @@ bool MaemoTemplatesManager::handleTarget(ProjectExplorer::Target *target) if (!createDebianTemplatesIfNecessary(target)) return false; - const Qt4Target * const qt4Target = qobject_cast<Qt4Target *>(target); + const Qt4MaemoTarget * const qt4Target = qobject_cast<Qt4MaemoTarget *>(target); const MaemoDeployStep * const deployStep = MaemoGlobal::buildStep<MaemoDeployStep>(qt4Target->activeDeployConfiguration()); connect(deployStep->deployables().data(), SIGNAL(modelReset()), this, @@ -186,7 +187,7 @@ bool MaemoTemplatesManager::createDebianTemplatesIfNecessary(const ProjectExplor QProcess dh_makeProc; QString error; - const Qt4Target * const qt4Target = qobject_cast<const Qt4Target *>(target); + const Qt4MaemoTarget * const qt4Target = qobject_cast<const Qt4MaemoTarget *>(target); Q_ASSERT_X(qt4Target, Q_FUNC_INFO, "Target ID does not match actual type."); const Qt4BuildConfiguration * const bc = qt4Target->activeBuildConfiguration(); @@ -339,9 +340,9 @@ bool MaemoTemplatesManager::adaptControlFileField(QByteArray &document, return updated; } -bool MaemoTemplatesManager::updateDesktopFiles(const Qt4Target *target) +bool MaemoTemplatesManager::updateDesktopFiles(const Qt4MaemoTarget *target) { - const Qt4Target * const qt4Target = qobject_cast<const Qt4Target *>(target); + const Qt4MaemoTarget * const qt4Target = qobject_cast<const Qt4MaemoTarget *>(target); Q_ASSERT_X(qt4Target, Q_FUNC_INFO, "Impossible: Target has Maemo id, but could not be cast to Qt4Target."); const QList<Qt4ProFileNode *> &applicationProjects @@ -352,7 +353,7 @@ bool MaemoTemplatesManager::updateDesktopFiles(const Qt4Target *target) return success; } -bool MaemoTemplatesManager::updateDesktopFile(const Qt4Target *target, +bool MaemoTemplatesManager::updateDesktopFile(const Qt4MaemoTarget *target, Qt4ProFileNode *proFileNode) { const QString appName = proFileNode->targetInformation().target; diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemotemplatesmanager.h b/src/plugins/qt4projectmanager/qt-maemo/maemotemplatesmanager.h index 0e81f8888b..8751b70334 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemotemplatesmanager.h +++ b/src/plugins/qt4projectmanager/qt-maemo/maemotemplatesmanager.h @@ -50,10 +50,10 @@ class Target; namespace Qt4ProjectManager { class Qt4Project; -class Qt4Target; namespace Internal { class Qt4ProFileNode; +class Qt4MaemoTarget; class MaemoTemplatesManager : public QObject { @@ -103,8 +103,8 @@ private: QString changeLogFilePath(const ProjectExplorer::Project *project) const; QString controlFilePath(const ProjectExplorer::Project *project) const; bool createDebianTemplatesIfNecessary(const ProjectExplorer::Target *target); - bool updateDesktopFiles(const Qt4Target *target); - bool updateDesktopFile(const Qt4Target *target, + bool updateDesktopFiles(const Qt4MaemoTarget *target); + bool updateDesktopFile(const Qt4MaemoTarget *target, Qt4ProFileNode *proFileNode); ProjectExplorer::Project *findProject(const QFileSystemWatcher *fsWatcher) const; void findLine(const QByteArray &string, QByteArray &document, diff --git a/src/plugins/qt4projectmanager/qt-maemo/qt-maemo.pri b/src/plugins/qt4projectmanager/qt-maemo/qt-maemo.pri index 19bfd77865..26087aa920 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/qt-maemo.pri +++ b/src/plugins/qt4projectmanager/qt-maemo/qt-maemo.pri @@ -44,7 +44,10 @@ HEADERS += \ $$PWD/maemoqemuruntime.h \ $$PWD/maemoqemuruntimeparser.h \ $$PWD/maemoqemusettingswidget.h \ - $$PWD/maemoqemusettings.h + $$PWD/maemoqemusettings.h \ + $$PWD/qt4maemotargetfactory.h \ + $$PWD/qt4maemotarget.h \ + $$PWD/qt4maemodeployconfiguration.h SOURCES += \ $$PWD/maemoconfigtestdialog.cpp \ @@ -89,7 +92,10 @@ SOURCES += \ $$PWD/maemopublisherfremantlefree.cpp \ $$PWD/maemoqemuruntimeparser.cpp \ $$PWD/maemoqemusettingswidget.cpp \ - $$PWD/maemoqemusettings.cpp + $$PWD/maemoqemusettings.cpp \ + $$PWD/qt4maemotargetfactory.cpp \ + $$PWD/qt4maemotarget.cpp \ + $$PWD/qt4maemodeployconfiguration.cpp FORMS += \ $$PWD/maemoconfigtestdialog.ui \ diff --git a/src/plugins/qt4projectmanager/qt-maemo/qt4maemodeployconfiguration.cpp b/src/plugins/qt4projectmanager/qt-maemo/qt4maemodeployconfiguration.cpp new file mode 100644 index 0000000000..4b70bff1a7 --- /dev/null +++ b/src/plugins/qt4projectmanager/qt-maemo/qt4maemodeployconfiguration.cpp @@ -0,0 +1,57 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + + +#include "maemodeploystep.h" +#include "maemopackagecreationstep.h" +#include "qt4maemodeployconfiguration.h" + +#include <projectexplorer/buildsteplist.h> +#include <projectexplorer/target.h> + +using namespace Qt4ProjectManager; +using namespace Qt4ProjectManager::Internal; + +Qt4MaemoDeployConfigurationFactory::Qt4MaemoDeployConfigurationFactory(QObject *parent) : + ProjectExplorer::DeployConfigurationFactory(parent) +{ } + +ProjectExplorer::DeployConfiguration *Qt4MaemoDeployConfigurationFactory::create(ProjectExplorer::Target *parent, const QString &id) +{ + ProjectExplorer::DeployConfiguration *dc = ProjectExplorer::DeployConfigurationFactory::create(parent, id); + + if (!dc) + return 0; + + dc->setDefaultDisplayName(tr("Deploy to Maemo device")); + dc->stepList()->insertStep(0, new MaemoPackageCreationStep(dc->stepList())); + dc->stepList()->insertStep(1, new MaemoDeployStep(dc->stepList())); + + return dc; +} diff --git a/src/plugins/qt4projectmanager/qt-maemo/qt4maemodeployconfiguration.h b/src/plugins/qt4projectmanager/qt-maemo/qt4maemodeployconfiguration.h new file mode 100644 index 0000000000..6982725679 --- /dev/null +++ b/src/plugins/qt4projectmanager/qt-maemo/qt4maemodeployconfiguration.h @@ -0,0 +1,53 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef QT4PROJECTMANAGER_QT4DEPLOYCONFIGURATION_H +#define QT4PROJECTMANAGER_QT4DEPLOYCONFIGURATION_H + +#include <projectexplorer/deployconfiguration.h> + +namespace Qt4ProjectManager { +namespace Internal { + +class Target; + +class Qt4MaemoDeployConfigurationFactory : public ProjectExplorer::DeployConfigurationFactory +{ + Q_OBJECT + +public: + explicit Qt4MaemoDeployConfigurationFactory(QObject *parent = 0); + + ProjectExplorer::DeployConfiguration *create(ProjectExplorer::Target *parent, const QString &id); +}; + +} // namespace Internal +} // namespace Qt4ProjectManager + +#endif // QT4PROJECTMANAGER_QT4DEPLOYCONFIGURATION_H diff --git a/src/plugins/qt4projectmanager/qt-maemo/qt4maemotarget.cpp b/src/plugins/qt4projectmanager/qt-maemo/qt4maemotarget.cpp new file mode 100644 index 0000000000..bad562040a --- /dev/null +++ b/src/plugins/qt4projectmanager/qt-maemo/qt4maemotarget.cpp @@ -0,0 +1,102 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + + +#include "maemorunconfiguration.h" +#include "qt4project.h" +#include "qt4maemotarget.h" +#include "qt4maemodeployconfiguration.h" + +#include <projectexplorer/customexecutablerunconfiguration.h> +#include <QtGui/QApplication> +#include <QtGui/QIcon> + +using namespace Qt4ProjectManager; +using namespace Qt4ProjectManager::Internal; + +Qt4MaemoTarget::Qt4MaemoTarget(Qt4Project *parent, const QString &id) : + Qt4BaseTarget(parent, id), + m_buildConfigurationFactory(new Qt4BuildConfigurationFactory(this)), + m_deployConfigurationFactory(new Qt4MaemoDeployConfigurationFactory(this)) +{ + setDisplayName(defaultDisplayName()); + setIcon(QIcon(":/projectexplorer/images/MaemoDevice.png")); +} + +Qt4MaemoTarget::~Qt4MaemoTarget() +{ + +} + +QString Qt4MaemoTarget::defaultDisplayName() +{ + return QApplication::translate("Qt4ProjectManager::Qt4Target", "Maemo", "Qt4 Maemo target display name"); +} + +Qt4BuildConfigurationFactory *Qt4MaemoTarget::buildConfigurationFactory() const +{ + return m_buildConfigurationFactory; +} + +ProjectExplorer::DeployConfigurationFactory *Qt4MaemoTarget::deployConfigurationFactory() const +{ + return m_deployConfigurationFactory; +} + +QString Qt4MaemoTarget::defaultBuildDirectory() const +{ + //TODO why? +#if defined(Q_OS_WIN) + return project()->projectDirectory(); +#endif + return Qt4BaseTarget::defaultBuildDirectory(); +} + +void Qt4MaemoTarget::createApplicationProFiles() +{ + 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 ProjectExplorer::CustomExecutableRunConfiguration(this)); + } +} diff --git a/src/plugins/qt4projectmanager/qt-maemo/qt4maemotarget.h b/src/plugins/qt4projectmanager/qt-maemo/qt4maemotarget.h new file mode 100644 index 0000000000..d22918c033 --- /dev/null +++ b/src/plugins/qt4projectmanager/qt-maemo/qt4maemotarget.h @@ -0,0 +1,64 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef QT4MAEMOTARGET_H +#define QT4MAEMOTARGET_H + +#include "qt4target.h" + +namespace Qt4ProjectManager { +class Qt4Project; +namespace Internal { +class Qt4MaemoDeployConfigurationFactory; + +class Qt4MaemoTarget : public Qt4BaseTarget +{ + friend class Qt4MaemoTargetFactory; + Q_OBJECT +public: + explicit Qt4MaemoTarget(Qt4Project *parent, const QString &id); + virtual ~Qt4MaemoTarget(); + + Internal::Qt4BuildConfigurationFactory *buildConfigurationFactory() const; + ProjectExplorer::DeployConfigurationFactory *deployConfigurationFactory() const; + + QString defaultBuildDirectory() const; + + void createApplicationProFiles(); + + static QString defaultDisplayName(); + +private: + Internal::Qt4BuildConfigurationFactory *m_buildConfigurationFactory; + Internal::Qt4MaemoDeployConfigurationFactory *m_deployConfigurationFactory; +}; +} +} + +#endif // QT4MAEMOTARGET_H diff --git a/src/plugins/qt4projectmanager/qt-maemo/qt4maemotargetfactory.cpp b/src/plugins/qt4projectmanager/qt-maemo/qt4maemotargetfactory.cpp new file mode 100644 index 0000000000..7e49fb5066 --- /dev/null +++ b/src/plugins/qt4projectmanager/qt-maemo/qt4maemotargetfactory.cpp @@ -0,0 +1,178 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "qt4maemotargetfactory.h" +#include "qt4project.h" +#include "qt4projectmanagerconstants.h" +#include "qt-maemo/maemodeploystep.h" +#include "qt-maemo/maemopackagecreationstep.h" +#include "qt-maemo/maemorunconfiguration.h" +#include "qt-maemo/qt4maemotarget.h" + +#include <projectexplorer/deployconfiguration.h> +#include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/customexecutablerunconfiguration.h> + +#include <QtGui/QApplication> + +using namespace Qt4ProjectManager; +using namespace Qt4ProjectManager::Internal; +using ProjectExplorer::idFromMap; + +// ------------------------------------------------------------------------- +// Qt4MaemoTargetFactory +// ------------------------------------------------------------------------- +Qt4MaemoTargetFactory::Qt4MaemoTargetFactory(QObject *parent) : + Qt4BaseTargetFactory(parent) +{ + connect(QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>)), + this, SIGNAL(supportedTargetIdsChanged())); +} + +Qt4MaemoTargetFactory::~Qt4MaemoTargetFactory() +{ +} + +bool Qt4MaemoTargetFactory::supportsTargetId(const QString &id) const +{ + return id == QLatin1String(Constants::MAEMO_DEVICE_TARGET_ID); +} + +QStringList Qt4MaemoTargetFactory::supportedTargetIds(ProjectExplorer::Project *parent) const +{ + if (!qobject_cast<Qt4Project *>(parent)) + return QStringList(); + if (!QtVersionManager::instance()->supportsTargetId(Constants::MAEMO_DEVICE_TARGET_ID)) + return QStringList(); + return QStringList() << QLatin1String(Constants::MAEMO_DEVICE_TARGET_ID); +} + +QString Qt4MaemoTargetFactory::displayNameForId(const QString &id) const +{ + if (id == QLatin1String(Constants::MAEMO_DEVICE_TARGET_ID)) + return Qt4MaemoTarget::defaultDisplayName(); + return QString(); +} + +bool Qt4MaemoTargetFactory::canCreate(ProjectExplorer::Project *parent, const QString &id) const +{ + if (!qobject_cast<Qt4Project *>(parent)) + return false; + return supportsTargetId(id); +} + +bool Qt4MaemoTargetFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const +{ + return canCreate(parent, idFromMap(map)); +} + +Qt4BaseTarget *Qt4MaemoTargetFactory::restore(ProjectExplorer::Project *parent, const QVariantMap &map) +{ + if (!canRestore(parent, map)) + return 0; + + Qt4Project *qt4project = static_cast<Qt4Project *>(parent); + Qt4MaemoTarget *target = new Qt4MaemoTarget(qt4project, QLatin1String("transient ID")); + + if (target->fromMap(map)) + return target; + delete target; + return 0; +} + +QString Qt4MaemoTargetFactory::defaultShadowBuildDirectory(const QString &projectLocation, const QString &id) +{ + if (id != QLatin1String(Constants::MAEMO_DEVICE_TARGET_ID)) + return QString(); + + // currently we can't have the build directory to be deeper than the source directory + // since that is broken in qmake + // Once qmake is fixed we can change that to have a top directory and + // subdirectories per build. (Replacing "QChar('-')" with "QChar('/') ) + return projectLocation + QLatin1String("-maemo"); +} + +QList<BuildConfigurationInfo> Qt4MaemoTargetFactory::availableBuildConfigurations(const QString &proFilePath) +{ + QList<BuildConfigurationInfo> infos; + QList<QtVersion *> knownVersions = QtVersionManager::instance()->versionsForTargetId(Constants::MAEMO_DEVICE_TARGET_ID); + + foreach (QtVersion *version, knownVersions) { + bool buildAll = version->defaultBuildConfig() & QtVersion::BuildAll; + QtVersion::QmakeBuildConfigs config = buildAll ? QtVersion::BuildAll : QtVersion::QmakeBuildConfig(0); + QString dir = defaultShadowBuildDirectory(Qt4Project::defaultTopLevelBuildDirectory(proFilePath), Constants::MAEMO_DEVICE_TARGET_ID); + infos.append(BuildConfigurationInfo(version, config, QString(), dir)); + infos.append(BuildConfigurationInfo(version, config | QtVersion::DebugBuild, QString(), dir)); + } + return infos; +} + +Qt4BaseTarget *Qt4MaemoTargetFactory::create(ProjectExplorer::Project *parent, const QString &id) +{ + if (!canCreate(parent, id)) + return 0; + + QList<QtVersion *> knownVersions = QtVersionManager::instance()->versionsForTargetId(id); + if (knownVersions.isEmpty()) + return 0; + + QtVersion *qtVersion = knownVersions.first(); + bool buildAll = qtVersion->isValid() && (qtVersion->defaultBuildConfig() & QtVersion::BuildAll); + QtVersion::QmakeBuildConfigs config = buildAll ? QtVersion::BuildAll : QtVersion::QmakeBuildConfig(0); + + QList<BuildConfigurationInfo> infos; + infos.append(BuildConfigurationInfo(qtVersion, config | QtVersion::DebugBuild, QString(), QString())); + infos.append(BuildConfigurationInfo(qtVersion, config, QString(), QString())); + + return create(parent, id, infos); +} + +Qt4BaseTarget *Qt4MaemoTargetFactory::create(ProjectExplorer::Project *parent, const QString &id, QList<BuildConfigurationInfo> infos) +{ + if (!canCreate(parent, id)) + return 0; + Qt4MaemoTarget *t = new Qt4MaemoTarget(static_cast<Qt4Project *>(parent), id); + foreach (const BuildConfigurationInfo &info, infos) { + QString displayName = info.version->displayName() + QLatin1Char(' '); + displayName += (info.buildConfig & QtVersion::DebugBuild) ? tr("Debug") : tr("Release"); + t->addQt4BuildConfiguration(displayName, + info.version, + info.buildConfig, + info.additionalArguments, + info.directory); + } + + t->addDeployConfiguration(t->deployConfigurationFactory()->create(t, ProjectExplorer::Constants::DEFAULT_DEPLOYCONFIGURATION_ID)); + + t->createApplicationProFiles(); + + if (t->runConfigurations().isEmpty()) + t->addRunConfiguration(new ProjectExplorer::CustomExecutableRunConfiguration(t)); + return t; +} diff --git a/src/plugins/qt4projectmanager/qt-maemo/qt4maemotargetfactory.h b/src/plugins/qt4projectmanager/qt-maemo/qt4maemotargetfactory.h new file mode 100644 index 0000000000..d27ce6deda --- /dev/null +++ b/src/plugins/qt4projectmanager/qt-maemo/qt4maemotargetfactory.h @@ -0,0 +1,63 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef QT4MAEMOTARGETFACTORY_H +#define QT4MAEMOTARGETFACTORY_H + +#include "qt4target.h" + +namespace Qt4ProjectManager { +namespace Internal { + +class Qt4MaemoTargetFactory : public Qt4BaseTargetFactory +{ + Q_OBJECT +public: + Qt4MaemoTargetFactory(QObject *parent = 0); + ~Qt4MaemoTargetFactory(); + + QStringList supportedTargetIds(ProjectExplorer::Project *parent) const; + QString displayNameForId(const QString &id) const; + + bool canCreate(ProjectExplorer::Project *parent, const QString &id) const; + bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const; + Qt4ProjectManager::Qt4BaseTarget *restore(ProjectExplorer::Project *parent, const QVariantMap &map); + QString defaultShadowBuildDirectory(const QString &projectLocation, const QString &id); + + virtual bool supportsTargetId(const QString &id) const; + + QList<BuildConfigurationInfo> availableBuildConfigurations(const QString &proFilePath); + Qt4BaseTarget *create(ProjectExplorer::Project *parent, const QString &id); + Qt4BaseTarget *create(ProjectExplorer::Project *parent, const QString &id, QList<BuildConfigurationInfo> infos); +}; + +} // namespace Internal +} // namespace Qt4ProjectManager + +#endif // QT4MAEMOTARGETFACTORY_H diff --git a/src/plugins/qt4projectmanager/qt-s60/qt-s60.pri b/src/plugins/qt4projectmanager/qt-s60/qt-s60.pri index ed097c0cee..ebd09902b9 100644 --- a/src/plugins/qt4projectmanager/qt-s60/qt-s60.pri +++ b/src/plugins/qt4projectmanager/qt-s60/qt-s60.pri @@ -25,7 +25,10 @@ SOURCES += $$PWD/s60devices.cpp \ $$PWD/s60certificateinfo.cpp \ $$PWD/certificatepathchooser.cpp \ $$PWD/s60symbiancertificate.cpp \ - $$PWD/s60certificatedetailsdialog.cpp + $$PWD/s60certificatedetailsdialog.cpp \ + $$PWD/qt4symbiantargetfactory.cpp \ + $$PWD/qt4symbiantarget.cpp + HEADERS += $$PWD/s60devices.h \ $$PWD/s60devicespreferencepane.h \ $$PWD/s60manager.h \ @@ -50,7 +53,10 @@ HEADERS += $$PWD/s60devices.h \ $$PWD/s60certificateinfo.h \ $$PWD/certificatepathchooser.h \ $$PWD/s60symbiancertificate.h \ - $$PWD/s60certificatedetailsdialog.h + $$PWD/s60certificatedetailsdialog.h \ + $$PWD/qt4symbiantargetfactory.h \ + $$PWD/qt4symbiantarget.h + FORMS += $$PWD/s60devicespreferencepane.ui \ $$PWD/s60createpackagestep.ui \ $$PWD/s60certificatedetailsdialog.ui diff --git a/src/plugins/qt4projectmanager/qt-s60/qt4symbiantarget.cpp b/src/plugins/qt4projectmanager/qt-s60/qt4symbiantarget.cpp new file mode 100644 index 0000000000..9028ac194d --- /dev/null +++ b/src/plugins/qt4projectmanager/qt-s60/qt4symbiantarget.cpp @@ -0,0 +1,247 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "qt4symbiantarget.h" +#include "qt4projectmanagerconstants.h" +#include "qt4project.h" +#include "qt-s60/s60deployconfiguration.h" +#include "qt-s60/s60emulatorrunconfiguration.h" +#include "qt-s60/s60devicerunconfiguration.h" + +#include <coreplugin/coreconstants.h> +#include <projectexplorer/project.h> +#include <projectexplorer/customexecutablerunconfiguration.h> +#include <symbianutils/symbiandevicemanager.h> +#include <QtGui/QPainter> +#include <QtGui/QApplication> + +using namespace Qt4ProjectManager; +using namespace Qt4ProjectManager::Internal; + +Qt4SymbianTarget::Qt4SymbianTarget(Qt4Project *parent, const QString &id) : + Qt4BaseTarget(parent, id), + m_connectedPixmap(QLatin1String(":/projectexplorer/images/ConnectionOn.png")), + m_disconnectedPixmap(QLatin1String(":/projectexplorer/images/ConnectionOff.png")), + m_buildConfigurationFactory(new Qt4BuildConfigurationFactory(this)), + m_deployConfigurationFactory(new S60DeployConfigurationFactory(this)) +{ + setDisplayName(defaultDisplayName(id)); + setIcon(iconForId(id)); + connect(this, SIGNAL(addedDeployConfiguration(ProjectExplorer::DeployConfiguration*)), + this, SLOT(onAddedDeployConfiguration(ProjectExplorer::DeployConfiguration*))); + connect(this, SIGNAL(activeRunConfigurationChanged(ProjectExplorer::RunConfiguration*)), + this, SLOT(updateToolTipAndIcon())); +} + +Qt4SymbianTarget::~Qt4SymbianTarget() +{ + +} + +QString Qt4SymbianTarget::defaultDisplayName(const QString &id) +{ + if (id == QLatin1String(Constants::S60_EMULATOR_TARGET_ID)) + return QApplication::translate("Qt4ProjectManager::Qt4Target", "Symbian Emulator", "Qt4 Symbian Emulator target display name"); + if (id == QLatin1String(Constants::S60_DEVICE_TARGET_ID)) + return QApplication::translate("Qt4ProjectManager::Qt4Target", "Symbian Device", "Qt4 Symbian Device target display name"); + return QString(); +} + +QIcon Qt4SymbianTarget::iconForId(const QString &id) +{ + if (id == QLatin1String(Constants::S60_EMULATOR_TARGET_ID)) + return QIcon(":/projectexplorer/images/SymbianEmulator.png"); + if (id == QLatin1String(Constants::S60_DEVICE_TARGET_ID)) + return QIcon(":/projectexplorer/images/SymbianDevice.png"); + return QIcon(); +} + +Qt4BuildConfigurationFactory *Qt4SymbianTarget::buildConfigurationFactory() const +{ + return m_buildConfigurationFactory; +} + +ProjectExplorer::DeployConfigurationFactory *Qt4SymbianTarget::deployConfigurationFactory() const +{ + return m_deployConfigurationFactory; +} + +QList<ProjectExplorer::ToolChainType> Qt4SymbianTarget::filterToolChainTypes(const QList<ProjectExplorer::ToolChainType> &candidates) const +{ + QList<ProjectExplorer::ToolChainType> tmp(candidates); + if (id() == QLatin1String(Constants::S60_EMULATOR_TARGET_ID)) { + if (tmp.contains(ProjectExplorer::ToolChain_WINSCW)) + return QList<ProjectExplorer::ToolChainType>() << ProjectExplorer::ToolChain_WINSCW; + else + return QList<ProjectExplorer::ToolChainType>(); + } else if (id() == QLatin1String(Constants::S60_DEVICE_TARGET_ID)) { + tmp.removeAll(ProjectExplorer::ToolChain_WINSCW); + return tmp; + } + return tmp; +} + +ProjectExplorer::ToolChainType Qt4SymbianTarget::preferredToolChainType(const QList<ProjectExplorer::ToolChainType> &candidates) const +{ + ProjectExplorer::ToolChainType preferredType = ProjectExplorer::ToolChain_INVALID; + if (id() == QLatin1String(Constants::S60_EMULATOR_TARGET_ID) && + candidates.contains(ProjectExplorer::ToolChain_WINSCW)) + preferredType = ProjectExplorer::ToolChain_WINSCW; + if (!candidates.isEmpty()) + preferredType = candidates.at(0); + return preferredType; +} + +QString Qt4SymbianTarget::defaultBuildDirectory() const +{ + return project()->projectDirectory(); +} + +void Qt4SymbianTarget::createApplicationProFiles() +{ + removeUnconfiguredCustomExectutableRunConfigurations(); + + // We use the list twice + QList<Qt4ProFileNode *> profiles = qt4Project()->applicationProFiles(); + QSet<QString> paths; + foreach (Qt4ProFileNode *pro, profiles) + paths << pro->path(); + + if (id() == QLatin1String(Constants::S60_EMULATOR_TARGET_ID)) { + foreach (ProjectExplorer::RunConfiguration *rc, runConfigurations()) + if (S60EmulatorRunConfiguration *qt4rc = qobject_cast<S60EmulatorRunConfiguration *>(rc)) + paths.remove(qt4rc->proFilePath()); + + // Only add new runconfigurations if there are none. + foreach (const QString &path, paths) + addRunConfiguration(new S60EmulatorRunConfiguration(this, path)); + } else if (id() == QLatin1String(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 ProjectExplorer::CustomExecutableRunConfiguration(this)); + } +} + +bool Qt4SymbianTarget::isSymbianConnectionAvailable(QString &tooltipText) +{ + const S60DeployConfiguration *s60DeployConf = qobject_cast<S60DeployConfiguration *>(activeDeployConfiguration()); + if (!s60DeployConf) + return false; + switch (s60DeployConf->communicationChannel()) { + case S60DeployConfiguration::CommunicationSerialConnection: { + const SymbianUtils::SymbianDeviceManager *sdm = SymbianUtils::SymbianDeviceManager::instance(); + const int deviceIndex = sdm->findByPortName(s60DeployConf->serialPortName()); + if (deviceIndex == -1) { + tooltipText = tr("<b>Device:</b> Not connected"); + return false; + } else { + // device connected + const SymbianUtils::SymbianDevice device = sdm->devices().at(deviceIndex); + tooltipText = device.additionalInformation().isEmpty() ? + tr("<b>Device:</b> %1").arg(device.friendlyName()) : + tr("<b>Device:</b> %1, %2").arg(device.friendlyName(), device.additionalInformation()); + return true; + } + } + break; + case S60DeployConfiguration::CommunicationTcpConnection: { + if(!s60DeployConf->deviceAddress().isEmpty() && !s60DeployConf->devicePort().isEmpty()) { + tooltipText = tr("<b>IP address:</b> %1:%2").arg(s60DeployConf->deviceAddress(), s60DeployConf->devicePort()); + return true; + } + return false; + } + break; + default: + break; + } + return false; +} + +void Qt4SymbianTarget::onAddedDeployConfiguration(ProjectExplorer::DeployConfiguration *dc) +{ + Q_ASSERT(dc); + S60DeployConfiguration *deployConf(qobject_cast<S60DeployConfiguration *>(dc)); + if (!deployConf) + return; + connect(deployConf, SIGNAL(serialPortNameChanged()), + this, SLOT(slotUpdateDeviceInformation())); + connect(deployConf, SIGNAL(communicationChannelChanged()), + this, SLOT(slotUpdateDeviceInformation())); + connect(deployConf, SIGNAL(deviceAddressChanged()), + this, SLOT(slotUpdateDeviceInformation())); + connect(deployConf, SIGNAL(devicePortChanged()), + this, SLOT(slotUpdateDeviceInformation())); +} + +void Qt4SymbianTarget::slotUpdateDeviceInformation() +{ + S60DeployConfiguration *dc(qobject_cast<S60DeployConfiguration *>(sender())); + if (dc && dc == activeDeployConfiguration()) { + updateToolTipAndIcon(); + } +} + +void Qt4SymbianTarget::updateToolTipAndIcon() +{ + static const int TARGET_OVERLAY_ORIGINAL_SIZE = 32; + + if (qobject_cast<S60DeployConfiguration *>(activeDeployConfiguration())) { + QPixmap overlay; + QString tooltip; + if (isSymbianConnectionAvailable(tooltip)) + overlay = m_connectedPixmap; + else + overlay = m_disconnectedPixmap; + setToolTip(tooltip); + + double factor = Core::Constants::TARGET_ICON_SIZE / (double)TARGET_OVERLAY_ORIGINAL_SIZE; + QSize overlaySize(overlay.size().width()*factor, overlay.size().height()*factor); + QPixmap pixmap(Core::Constants::TARGET_ICON_SIZE, Core::Constants::TARGET_ICON_SIZE); + pixmap.fill(Qt::transparent); + QPainter painter(&pixmap); + painter.drawPixmap(Core::Constants::TARGET_ICON_SIZE - overlaySize.width(), + Core::Constants::TARGET_ICON_SIZE - overlaySize.height(), + overlay.scaled(overlaySize)); + + setOverlayIcon(QIcon(pixmap)); + } else { + setToolTip(QString()); + setOverlayIcon(QIcon()); + } +} diff --git a/src/plugins/qt4projectmanager/qt-s60/qt4symbiantarget.h b/src/plugins/qt4projectmanager/qt-s60/qt4symbiantarget.h new file mode 100644 index 0000000000..e4a2c9225b --- /dev/null +++ b/src/plugins/qt4projectmanager/qt-s60/qt4symbiantarget.h @@ -0,0 +1,79 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef QT4SYMBIANTARGET_H +#define QT4SYMBIANTARGET_H + +#include "qt4target.h" + +#include <QtGui/QPixmap> + +namespace Qt4ProjectManager { +class Qt4Project; +namespace Internal { + + +class Qt4SymbianTarget : public Qt4BaseTarget +{ + friend class Qt4SymbianTargetFactory; // for from Map + Q_OBJECT +public: + explicit Qt4SymbianTarget(Qt4Project *parent, const QString &id); + virtual ~Qt4SymbianTarget(); + + Internal::Qt4BuildConfigurationFactory *buildConfigurationFactory() const; + ProjectExplorer::DeployConfigurationFactory *deployConfigurationFactory() const; + + QList<ProjectExplorer::ToolChainType> filterToolChainTypes(const QList<ProjectExplorer::ToolChainType> &candidates) const; + ProjectExplorer::ToolChainType preferredToolChainType(const QList<ProjectExplorer::ToolChainType> &candidates) const; + + QString defaultBuildDirectory() const; + + void createApplicationProFiles(); + + static QString defaultDisplayName(const QString &id); + static QIcon iconForId(const QString &id); +private: + bool isSymbianConnectionAvailable(QString &tooltipText); + +private slots: + void onAddedDeployConfiguration(ProjectExplorer::DeployConfiguration *dc); + void slotUpdateDeviceInformation(); + void updateToolTipAndIcon(); + +private: + const QPixmap m_connectedPixmap; + const QPixmap m_disconnectedPixmap; + + Internal::Qt4BuildConfigurationFactory *m_buildConfigurationFactory; + ProjectExplorer::DeployConfigurationFactory *m_deployConfigurationFactory; +}; +} // namespace Internal +} // namespace Qt4ProjectManager +#endif // QT4SYMBIANTARGET_H diff --git a/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.cpp b/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.cpp new file mode 100644 index 0000000000..901a0ec70b --- /dev/null +++ b/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.cpp @@ -0,0 +1,196 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "qt4symbiantargetfactory.h" +#include "qt4projectmanagerconstants.h" +#include "qt4project.h" + +#include "qt-s60/s60deployconfiguration.h" +#include "qt-s60/s60devicerunconfiguration.h" +#include "qt-s60/s60emulatorrunconfiguration.h" +#include "qt-s60/s60createpackagestep.h" +#include "qt-s60/s60deploystep.h" +#include "qt-s60/qt4symbiantarget.h" + +#include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/customexecutablerunconfiguration.h> + +using ProjectExplorer::idFromMap; +using namespace Qt4ProjectManager; +using namespace Qt4ProjectManager::Internal; + +// ------------------------------------------------------------------------- +// Qt4SymbianTargetFactory +// ------------------------------------------------------------------------- + +Qt4SymbianTargetFactory::Qt4SymbianTargetFactory(QObject *parent) : + Qt4BaseTargetFactory(parent) +{ + connect(QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>)), + this, SIGNAL(supportedTargetIdsChanged())); +} + +Qt4SymbianTargetFactory::~Qt4SymbianTargetFactory() +{ +} + +bool Qt4SymbianTargetFactory::supportsTargetId(const QString &id) const +{ + return id == QLatin1String(Constants::S60_DEVICE_TARGET_ID) + || id == QLatin1String(Constants::S60_EMULATOR_TARGET_ID); +} + +QStringList Qt4SymbianTargetFactory::supportedTargetIds(ProjectExplorer::Project *parent) const +{ + if (!qobject_cast<Qt4Project *>(parent)) + return QStringList(); + + QStringList ids; + if (QtVersionManager::instance()->supportsTargetId(Constants::S60_DEVICE_TARGET_ID)) + ids << QLatin1String(Constants::S60_DEVICE_TARGET_ID); + if (QtVersionManager::instance()->supportsTargetId(Constants::S60_EMULATOR_TARGET_ID)) + ids << QLatin1String(Constants::S60_EMULATOR_TARGET_ID); + + return ids; +} + +QString Qt4SymbianTargetFactory::displayNameForId(const QString &id) const +{ + return Qt4SymbianTarget::defaultDisplayName(id); +} + +bool Qt4SymbianTargetFactory::canCreate(ProjectExplorer::Project *parent, const QString &id) const +{ + if (!qobject_cast<Qt4Project *>(parent)) + return false; + return supportsTargetId(id); +} + +bool Qt4SymbianTargetFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const +{ + return canCreate(parent, idFromMap(map)); +} + +Qt4BaseTarget *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::defaultShadowBuildDirectory(const QString &projectLocation, const QString &id) +{ + QString shortName = QLatin1String("unknown"); + if (id == QLatin1String(Constants::S60_EMULATOR_TARGET_ID)) + shortName = QLatin1String("symbian_emulator"); + else if (id == QLatin1String(Constants::S60_DEVICE_TARGET_ID)) + shortName = QLatin1String("symbian"); + + // currently we can't have the build directory to be deeper than the source directory + // since that is broken in qmake + // Once qmake is fixed we can change that to have a top directory and + // subdirectories per build. (Replacing "QChar('-')" with "QChar('/') ) + return projectLocation + QChar('-') + shortName; +} + +QList<BuildConfigurationInfo> Qt4SymbianTargetFactory::availableBuildConfigurations(const QString &proFilePath) +{ + QList<BuildConfigurationInfo> infos; + QList<QtVersion *> knownVersions = QtVersionManager::instance()->versionsForTargetId(Constants::S60_EMULATOR_TARGET_ID); + + foreach (QtVersion *version, knownVersions) { + bool buildAll = version->defaultBuildConfig() & QtVersion::BuildAll; + QtVersion::QmakeBuildConfigs config = buildAll ? QtVersion::BuildAll : QtVersion::QmakeBuildConfig(0); + QString dir = defaultShadowBuildDirectory(Qt4Project::defaultTopLevelBuildDirectory(proFilePath), Constants::S60_EMULATOR_TARGET_ID); + infos.append(BuildConfigurationInfo(version, config | QtVersion::DebugBuild, QString(), dir)); + } + + knownVersions = QtVersionManager::instance()->versionsForTargetId(Constants::S60_DEVICE_TARGET_ID); + foreach (QtVersion *version, knownVersions) { + bool buildAll = version->defaultBuildConfig() & QtVersion::BuildAll; + QtVersion::QmakeBuildConfigs config = buildAll ? QtVersion::BuildAll : QtVersion::QmakeBuildConfig(0); + QString dir = defaultShadowBuildDirectory(Qt4Project::defaultTopLevelBuildDirectory(proFilePath), Constants::S60_DEVICE_TARGET_ID); + infos.append(BuildConfigurationInfo(version, config, QString(), dir)); + infos.append(BuildConfigurationInfo(version, config | QtVersion::DebugBuild, QString(), dir)); + } + + return infos; +} + +Qt4BaseTarget *Qt4SymbianTargetFactory::create(ProjectExplorer::Project *parent, const QString &id) +{ + if (!canCreate(parent, id)) + return 0; + + QList<QtVersion *> knownVersions = QtVersionManager::instance()->versionsForTargetId(id); + if (knownVersions.isEmpty()) + return 0; + + QtVersion *qtVersion = knownVersions.first(); + bool buildAll = qtVersion->isValid() && (qtVersion->defaultBuildConfig() & QtVersion::BuildAll); + QtVersion::QmakeBuildConfigs config = buildAll ? QtVersion::BuildAll : QtVersion::QmakeBuildConfig(0); + + QList<BuildConfigurationInfo> infos; + infos.append(BuildConfigurationInfo(qtVersion, config | QtVersion::DebugBuild, QString(), QString())); + if (id != Constants::S60_EMULATOR_TARGET_ID) + infos.append(BuildConfigurationInfo(qtVersion, config, QString(), QString())); + + return create(parent, id, infos); +} + +Qt4BaseTarget *Qt4SymbianTargetFactory::create(ProjectExplorer::Project *parent, const QString &id, QList<BuildConfigurationInfo> infos) +{ + if (!canCreate(parent, id)) + return 0; + Qt4SymbianTarget *t = new Qt4SymbianTarget(static_cast<Qt4Project *>(parent), id); + foreach (const BuildConfigurationInfo &info, infos) { + QString displayName = info.version->displayName() + QLatin1Char(' '); + displayName += (info.buildConfig & QtVersion::DebugBuild) ? tr("Debug") : tr("Release"); + t->addQt4BuildConfiguration(displayName, + info.version, + info.buildConfig, + info.additionalArguments, + info.directory); + } + + t->addDeployConfiguration(t->deployConfigurationFactory()->create(t, ProjectExplorer::Constants::DEFAULT_DEPLOYCONFIGURATION_ID)); + + t->createApplicationProFiles(); + + if (t->runConfigurations().isEmpty()) + t->addRunConfiguration(new ProjectExplorer::CustomExecutableRunConfiguration(t)); + return t; +} diff --git a/src/plugins/qt4projectmanager/qt4deployconfiguration.h b/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.h index 46b21acfcb..dbb5af9f3c 100644 --- a/src/plugins/qt4projectmanager/qt4deployconfiguration.h +++ b/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.h @@ -31,36 +31,37 @@ ** **************************************************************************/ -#ifndef QT4PROJECTMANAGER_QT4DEPLOYCONFIGURATION_H -#define QT4PROJECTMANAGER_QT4DEPLOYCONFIGURATION_H +#ifndef QT4SYMBIANTARGETFACTORY_H +#define QT4SYMBIANTARGETFACTORY_H -#include <projectexplorer/deployconfiguration.h> +#include "qt4target.h" namespace Qt4ProjectManager { namespace Internal { - -class Target; -class S60DeployConfigurationFactory; - -class Qt4DeployConfigurationFactory : public ProjectExplorer::DeployConfigurationFactory +class Qt4SymbianTargetFactory : public Qt4BaseTargetFactory { Q_OBJECT - public: - explicit Qt4DeployConfigurationFactory(QObject *parent = 0); + Qt4SymbianTargetFactory(QObject *parent = 0); + ~Qt4SymbianTargetFactory(); - ProjectExplorer::DeployConfiguration *create(ProjectExplorer::Target *parent, const QString &id); - bool canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const; - ProjectExplorer::DeployConfiguration *restore(ProjectExplorer::Target *parent, const QVariantMap &map); - bool canClone(ProjectExplorer::Target *parent, ProjectExplorer::DeployConfiguration *product) const; - ProjectExplorer::DeployConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::DeployConfiguration *product); + QStringList supportedTargetIds(ProjectExplorer::Project *parent) const; + bool supportsTargetId(const QString &id) const; + QString displayNameForId(const QString &id) const; -private: - S60DeployConfigurationFactory *m_s60DeployConfigurationFactory; + bool canCreate(ProjectExplorer::Project *parent, const QString &id) const; + bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const; + Qt4ProjectManager::Qt4BaseTarget *restore(ProjectExplorer::Project *parent, const QVariantMap &map); + Qt4BaseTarget *create(ProjectExplorer::Project *parent, const QString &id); + Qt4BaseTarget *create(ProjectExplorer::Project *parent, const QString &id, QList<BuildConfigurationInfo> infos); + + QString defaultShadowBuildDirectory(const QString &projectLocation, const QString &id); + QList<BuildConfigurationInfo> availableBuildConfigurations(const QString &proFilePath); }; } // namespace Internal } // namespace Qt4ProjectManager -#endif // QT4PROJECTMANAGER_QT4DEPLOYCONFIGURATION_H + +#endif // QT4SYMBIANTARGETFACTORY_H diff --git a/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.cpp index fcbf9f6ddd..22a0ede8f0 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.cpp @@ -37,11 +37,14 @@ #include "qt4target.h" #include "qt4projectmanagerconstants.h" #include "qt4buildconfiguration.h" +#include "qt4symbiantarget.h" #include "s60createpackagestep.h" +#include "s60deploystep.h" #include <utils/qtcassert.h> #include <symbianutils/symbiandevicemanager.h> +#include <projectexplorer/buildconfiguration.h> #include <projectexplorer/buildsteplist.h> #include <projectexplorer/project.h> @@ -278,9 +281,8 @@ QString S60DeployConfiguration::symbianTarget() const const QtVersion *S60DeployConfiguration::qtVersion() const { - if (const BuildConfiguration *bc = target()->activeBuildConfiguration()) - if (const Qt4BuildConfiguration *qt4bc = qobject_cast<const Qt4BuildConfiguration *>(bc)) - return qt4bc->qtVersion(); + if (const Qt4BuildConfiguration *qt4bc = qt4Target()->activeBuildConfiguration()) + return qt4bc->qtVersion(); return 0; } @@ -342,9 +344,9 @@ bool S60DeployConfiguration::fromMap(const QVariantMap &map) return true; } -Qt4Target *S60DeployConfiguration::qt4Target() const +Qt4SymbianTarget *S60DeployConfiguration::qt4Target() const { - return static_cast<Qt4Target *>(target()); + return static_cast<Qt4SymbianTarget *>(target()); } QString S60DeployConfiguration::serialPortName() const @@ -436,7 +438,7 @@ S60DeployConfigurationFactory::~S60DeployConfigurationFactory() QStringList S60DeployConfigurationFactory::availableCreationIds(Target *parent) const { - Qt4Target *target = qobject_cast<Qt4Target *>(parent); + Qt4SymbianTarget *target = qobject_cast<Qt4SymbianTarget *>(parent); if (!target || target->id() != QLatin1String(Constants::S60_DEVICE_TARGET_ID)) return QStringList(); @@ -456,13 +458,18 @@ DeployConfiguration *S60DeployConfigurationFactory::create(Target *parent, const if (!canCreate(parent, id)) return 0; - Qt4Target *t(static_cast<Qt4Target *>(parent)); - return new S60DeployConfiguration(t); + Qt4SymbianTarget *t = static_cast<Qt4SymbianTarget *>(parent); + S60DeployConfiguration *dc = new S60DeployConfiguration(t); + + dc->setDefaultDisplayName(tr("Deploy to Symbian device")); + dc->stepList()->insertStep(0, new S60CreatePackageStep(dc->stepList())); + dc->stepList()->insertStep(1, new S60DeployStep(dc->stepList())); + return dc; } bool S60DeployConfigurationFactory::canCreate(Target *parent, const QString& /*id*/) const { - Qt4Target *t = qobject_cast<Qt4Target *>(parent); + Qt4SymbianTarget * t = qobject_cast<Qt4SymbianTarget *>(parent); if (!t || t->id() != QLatin1String(Constants::S60_DEVICE_TARGET_ID)) return false; return true; @@ -470,7 +477,7 @@ bool S60DeployConfigurationFactory::canCreate(Target *parent, const QString& /*i bool S60DeployConfigurationFactory::canRestore(Target *parent, const QVariantMap& /*map*/) const { - Qt4Target *t = qobject_cast<Qt4Target *>(parent); + Qt4SymbianTarget * t = qobject_cast<Qt4SymbianTarget *>(parent); return t && t->id() == QLatin1String(Constants::S60_DEVICE_TARGET_ID); } @@ -478,8 +485,8 @@ DeployConfiguration *S60DeployConfigurationFactory::restore(Target *parent, cons { if (!canRestore(parent, map)) return 0; - Qt4Target *t(static_cast<Qt4Target *>(parent)); - S60DeployConfiguration *dc(new S60DeployConfiguration(t)); + Qt4SymbianTarget *t = static_cast<Qt4SymbianTarget *>(parent); + S60DeployConfiguration *dc = new S60DeployConfiguration(t); if (dc->fromMap(map)) return dc; @@ -489,7 +496,7 @@ DeployConfiguration *S60DeployConfigurationFactory::restore(Target *parent, cons bool S60DeployConfigurationFactory::canClone(Target *parent, DeployConfiguration *source) const { - if (!qobject_cast<Qt4Target *>(parent)) + if (!qobject_cast<Qt4SymbianTarget *>(parent)) return false; return source->id() == QLatin1String(S60_DC_ID); } @@ -498,7 +505,7 @@ DeployConfiguration *S60DeployConfigurationFactory::clone(Target *parent, Deploy { if (!canClone(parent, source)) return 0; - Qt4Target *t = static_cast<Qt4Target *>(parent); - S60DeployConfiguration *old = static_cast<S60DeployConfiguration *>(source); + Qt4SymbianTarget *t = static_cast<Qt4SymbianTarget *>(parent); + S60DeployConfiguration * old = static_cast<S60DeployConfiguration *>(source); return new S60DeployConfiguration(t, old); } diff --git a/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.h b/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.h index 1f2b780e4d..1348870774 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.h +++ b/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.h @@ -44,9 +44,9 @@ class RunConfiguration; namespace Qt4ProjectManager { class QtVersion; -class Qt4Target; namespace Internal { +class Qt4SymbianTarget; class Qt4ProFileNode; class S60DeployConfigurationFactory; class S60DeviceRunConfiguration; @@ -70,7 +70,7 @@ public: ProjectExplorer::DeployConfigurationWidget *configurationWidget() const; const QtVersion *qtVersion() const; - Qt4Target *qt4Target() const; + Qt4SymbianTarget *qt4Target() const; ProjectExplorer::ToolChainType toolChainType() const; QString serialPortName() const; diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp index 8c727672c5..f873bab995 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp @@ -41,6 +41,7 @@ #include "s60runconfigbluetoothstarter.h" #include "qt4projectmanagerconstants.h" #include "qtoutputformatter.h" +#include "qt4symbiantarget.h" #include "tcftrkdevice.h" #include "tcftrkmessage.h" @@ -126,7 +127,7 @@ bool isProcessRunning(const TcfTrkCommandResult &result, const QString &processN // ======== S60DeviceRunConfiguration -S60DeviceRunConfiguration::S60DeviceRunConfiguration(Qt4Target *parent, const QString &proFilePath) : +S60DeviceRunConfiguration::S60DeviceRunConfiguration(Qt4BaseTarget *parent, const QString &proFilePath) : RunConfiguration(parent, QLatin1String(S60_DEVICE_RC_ID)), m_proFilePath(proFilePath), m_validParse(parent->qt4Project()->validParse(proFilePath)) @@ -134,7 +135,7 @@ S60DeviceRunConfiguration::S60DeviceRunConfiguration(Qt4Target *parent, const QS ctor(); } -S60DeviceRunConfiguration::S60DeviceRunConfiguration(Qt4Target *target, S60DeviceRunConfiguration *source) : +S60DeviceRunConfiguration::S60DeviceRunConfiguration(Qt4BaseTarget *target, S60DeviceRunConfiguration *source) : RunConfiguration(target, source), m_proFilePath(source->m_proFilePath), m_commandLineArguments(source->m_commandLineArguments), @@ -186,9 +187,9 @@ S60DeviceRunConfiguration::~S60DeviceRunConfiguration() { } -Qt4Target *S60DeviceRunConfiguration::qt4Target() const +Qt4SymbianTarget *S60DeviceRunConfiguration::qt4Target() const { - return static_cast<Qt4Target *>(target()); + return static_cast<Qt4SymbianTarget *>(target()); } ProjectExplorer::ToolChainType S60DeviceRunConfiguration::toolChainType( @@ -428,6 +429,11 @@ void S60DeviceRunConfiguration::setCommandLineArguments(const QString &args) m_commandLineArguments = args; } +QString S60DeviceRunConfiguration::proFilePath() const +{ + return m_proFilePath; +} + // ======== S60DeviceRunConfigurationFactory S60DeviceRunConfigurationFactory::S60DeviceRunConfigurationFactory(QObject *parent) : @@ -441,7 +447,7 @@ S60DeviceRunConfigurationFactory::~S60DeviceRunConfigurationFactory() QStringList S60DeviceRunConfigurationFactory::availableCreationIds(Target *parent) const { - Qt4Target *target = qobject_cast<Qt4Target *>(parent); + Qt4SymbianTarget *target = qobject_cast<Qt4SymbianTarget *>(parent); if (!target || target->id() != QLatin1String(Constants::S60_DEVICE_TARGET_ID)) return QStringList(); @@ -457,7 +463,7 @@ QString S60DeviceRunConfigurationFactory::displayNameForId(const QString &id) co bool S60DeviceRunConfigurationFactory::canCreate(Target *parent, const QString &id) const { - Qt4Target *t = qobject_cast<Qt4Target *>(parent); + Qt4SymbianTarget *t = qobject_cast<Qt4SymbianTarget *>(parent); if (!t || t->id() != QLatin1String(Constants::S60_DEVICE_TARGET_ID)) return false; return t->qt4Project()->hasApplicationProFile(pathFromId(id)); @@ -468,13 +474,13 @@ RunConfiguration *S60DeviceRunConfigurationFactory::create(Target *parent, const if (!canCreate(parent, id)) return 0; - Qt4Target *t = static_cast<Qt4Target *>(parent); + Qt4SymbianTarget *t = static_cast<Qt4SymbianTarget *>(parent); return new S60DeviceRunConfiguration(t, pathFromId(id)); } bool S60DeviceRunConfigurationFactory::canRestore(Target *parent, const QVariantMap &map) const { - Qt4Target *t = qobject_cast<Qt4Target *>(parent); + Qt4SymbianTarget *t = qobject_cast<Qt4SymbianTarget *>(parent); if (!t || t->id() != QLatin1String(Constants::S60_DEVICE_TARGET_ID)) return false; QString id = ProjectExplorer::idFromMap(map); @@ -485,8 +491,8 @@ RunConfiguration *S60DeviceRunConfigurationFactory::restore(Target *parent, cons { if (!canRestore(parent, map)) return 0; - Qt4Target *t = static_cast<Qt4Target *>(parent); - S60DeviceRunConfiguration *rc(new S60DeviceRunConfiguration(t, QString())); + Qt4SymbianTarget *t = static_cast<Qt4SymbianTarget *>(parent); + S60DeviceRunConfiguration *rc = new S60DeviceRunConfiguration(t, QString()); if (rc->fromMap(map)) return rc; @@ -496,7 +502,7 @@ RunConfiguration *S60DeviceRunConfigurationFactory::restore(Target *parent, cons bool S60DeviceRunConfigurationFactory::canClone(Target *parent, RunConfiguration *source) const { - if (!qobject_cast<Qt4Target *>(parent)) + if (!qobject_cast<Qt4SymbianTarget *>(parent)) return false; return source->id() == QLatin1String(S60_DEVICE_RC_ID); } @@ -505,7 +511,7 @@ RunConfiguration *S60DeviceRunConfigurationFactory::clone(Target *parent, RunCon { if (!canClone(parent, source)) return 0; - Qt4Target *t = static_cast<Qt4Target *>(parent); + Qt4SymbianTarget *t = static_cast<Qt4SymbianTarget *>(parent); S60DeviceRunConfiguration *old = static_cast<S60DeviceRunConfiguration *>(source); return new S60DeviceRunConfiguration(t, old); } diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h index ba355fa12e..e5f02d951b 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h +++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h @@ -66,9 +66,10 @@ class TcfTrkEvent; namespace Qt4ProjectManager { class QtVersion; -class Qt4Target; +class Qt4BaseTarget; namespace Internal { +class Qt4SymbianTarget; class Qt4ProFileNode; class S60DeviceRunConfigurationFactory; @@ -78,10 +79,10 @@ class S60DeviceRunConfiguration : public ProjectExplorer::RunConfiguration friend class S60DeviceRunConfigurationFactory; public: - S60DeviceRunConfiguration(Qt4ProjectManager::Qt4Target *parent, const QString &proFilePath); + S60DeviceRunConfiguration(Qt4ProjectManager::Qt4BaseTarget *parent, const QString &proFilePath); virtual ~S60DeviceRunConfiguration(); - Qt4Target *qt4Target() const; + Qt4SymbianTarget *qt4Target() const; const QtVersion *qtVersion() const; using ProjectExplorer::RunConfiguration::isEnabled; @@ -106,11 +107,12 @@ public: QVariantMap toMap() const; + QString proFilePath() const; signals: void targetInformationChanged(); protected: - S60DeviceRunConfiguration(Qt4ProjectManager::Qt4Target *parent, S60DeviceRunConfiguration *source); + S60DeviceRunConfiguration(Qt4ProjectManager::Qt4BaseTarget *parent, S60DeviceRunConfiguration *source); QString defaultDisplayName() const; virtual bool fromMap(const QVariantMap &map); private slots: diff --git a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp index 0d41bdb638..a6e8728c8f 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp @@ -36,6 +36,7 @@ #include "qt4project.h" #include "qt4target.h" #include "s60manager.h" +#include "qt4symbiantarget.h" #include "qt4projectmanagerconstants.h" #include "qtoutputformatter.h" @@ -72,7 +73,7 @@ QString pathToId(const QString &path) // ======== S60EmulatorRunConfiguration -S60EmulatorRunConfiguration::S60EmulatorRunConfiguration(Qt4Target *parent, const QString &proFilePath) : +S60EmulatorRunConfiguration::S60EmulatorRunConfiguration(Qt4BaseTarget *parent, const QString &proFilePath) : RunConfiguration(parent, QLatin1String(S60_EMULATOR_RC_ID)), m_proFilePath(proFilePath), m_validParse(parent->qt4Project()->validParse(proFilePath)) @@ -80,7 +81,7 @@ S60EmulatorRunConfiguration::S60EmulatorRunConfiguration(Qt4Target *parent, cons ctor(); } -S60EmulatorRunConfiguration::S60EmulatorRunConfiguration(Qt4Target *parent, S60EmulatorRunConfiguration *source) : +S60EmulatorRunConfiguration::S60EmulatorRunConfiguration(Qt4BaseTarget *parent, S60EmulatorRunConfiguration *source) : RunConfiguration(parent, source), m_proFilePath(source->m_proFilePath), m_validParse(source->m_validParse) @@ -132,9 +133,9 @@ void S60EmulatorRunConfiguration::proFileUpdate(Qt4ProjectManager::Internal::Qt4 emit targetInformationChanged(); } -Qt4Target *S60EmulatorRunConfiguration::qt4Target() const +Qt4SymbianTarget *S60EmulatorRunConfiguration::qt4Target() const { - return static_cast<Qt4Target *>(target()); + return static_cast<Qt4SymbianTarget *>(target()); } bool S60EmulatorRunConfiguration::isEnabled(ProjectExplorer::BuildConfiguration *configuration) const @@ -200,6 +201,11 @@ QString S60EmulatorRunConfiguration::executable() const return executable; } +QString S60EmulatorRunConfiguration::proFilePath() const +{ + return m_proFilePath; +} + // ======== S60EmulatorRunConfigurationWidget S60EmulatorRunConfigurationWidget::S60EmulatorRunConfigurationWidget(S60EmulatorRunConfiguration *runConfiguration, @@ -255,7 +261,7 @@ S60EmulatorRunConfigurationFactory::~S60EmulatorRunConfigurationFactory() bool S60EmulatorRunConfigurationFactory::canCreate(Target *parent, const QString &id) const { - Qt4Target * t(qobject_cast<Qt4Target *>(parent)); + Qt4SymbianTarget *t = qobject_cast<Qt4SymbianTarget *>(parent); if (!t || t->id() != QLatin1String(Constants::S60_EMULATOR_TARGET_ID)) return false; @@ -266,13 +272,13 @@ RunConfiguration *S60EmulatorRunConfigurationFactory::create(Target *parent, con { if (!canCreate(parent, id)) return 0; - Qt4Target *t(static_cast<Qt4Target *>(parent)); + Qt4SymbianTarget *t = static_cast<Qt4SymbianTarget *>(parent); return new S60EmulatorRunConfiguration(t, pathFromId(id)); } bool S60EmulatorRunConfigurationFactory::canRestore(Target *parent, const QVariantMap &map) const { - Qt4Target * t(qobject_cast<Qt4Target *>(parent)); + Qt4SymbianTarget *t = qobject_cast<Qt4SymbianTarget *>(parent); if (!t || t->id() != QLatin1String(Constants::S60_EMULATOR_TARGET_ID)) return false; @@ -284,8 +290,8 @@ RunConfiguration *S60EmulatorRunConfigurationFactory::restore(Target *parent, co { if (!canRestore(parent, map)) return 0; - Qt4Target *t(static_cast<Qt4Target *>(parent)); - S60EmulatorRunConfiguration *rc(new S60EmulatorRunConfiguration(t, QString())); + Qt4SymbianTarget *t = static_cast<Qt4SymbianTarget *>(parent); + S60EmulatorRunConfiguration *rc = new S60EmulatorRunConfiguration(t, QString()); if (rc->fromMap(map)) return rc; delete rc; @@ -301,13 +307,13 @@ RunConfiguration *S60EmulatorRunConfigurationFactory::clone(Target *parent, RunC { if (!canClone(parent, source)) return 0; - Qt4Target *t(static_cast<Qt4Target *>(parent)); + Qt4SymbianTarget *t = static_cast<Qt4SymbianTarget *>(parent); return new S60EmulatorRunConfiguration(t, QString()); } QStringList S60EmulatorRunConfigurationFactory::availableCreationIds(Target *parent) const { - Qt4Target * t(qobject_cast<Qt4Target *>(parent)); + Qt4SymbianTarget *t = qobject_cast<Qt4SymbianTarget *>(parent); if (!t || t->id() != QLatin1String(Constants::S60_EMULATOR_TARGET_ID)) return QStringList(); diff --git a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.h b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.h index b2a8faee71..d81e7d2f17 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.h +++ b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.h @@ -51,9 +51,10 @@ class DetailsWidget; namespace Qt4ProjectManager { class Qt4Project; -class Qt4Target; +class Qt4BaseTarget; namespace Internal { +class Qt4SymbianTarget; class Qt4ProFileNode; class S60EmulatorRunConfigurationFactory; @@ -63,10 +64,10 @@ class S60EmulatorRunConfiguration : public ProjectExplorer::RunConfiguration friend class S60EmulatorRunConfigurationFactory; public: - S60EmulatorRunConfiguration(Qt4ProjectManager::Qt4Target *parent, const QString &proFilePath); + S60EmulatorRunConfiguration(Qt4ProjectManager::Qt4BaseTarget *parent, const QString &proFilePath); virtual ~S60EmulatorRunConfiguration(); - Qt4Target *qt4Target() const; + Qt4SymbianTarget *qt4Target() const; using ProjectExplorer::RunConfiguration::isEnabled; bool isEnabled(ProjectExplorer::BuildConfiguration *configuration) const; @@ -78,6 +79,8 @@ public: QVariantMap toMap() const; + QString proFilePath() const; + signals: void targetInformationChanged(); @@ -86,7 +89,7 @@ private slots: void proFileInvalidated(Qt4ProjectManager::Internal::Qt4ProFileNode *pro); protected: - S60EmulatorRunConfiguration(Qt4ProjectManager::Qt4Target *parent, S60EmulatorRunConfiguration *source); + S60EmulatorRunConfiguration(Qt4ProjectManager::Qt4BaseTarget *parent, S60EmulatorRunConfiguration *source); virtual bool fromMap(const QVariantMap &map); private: diff --git a/src/plugins/qt4projectmanager/qt-s60/s60manager.cpp b/src/plugins/qt4projectmanager/qt-s60/s60manager.cpp index e3fb186b25..cafee45fb7 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60manager.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60manager.cpp @@ -42,6 +42,7 @@ #include "s60devicerunconfiguration.h" #include "s60createpackagestep.h" #include "s60deploystep.h" +#include "qt4symbiantargetfactory.h" #include <symbianutils/symbiandevicemanager.h> @@ -130,6 +131,8 @@ S60Manager::S60Manager(QObject *parent) S60DeviceRunConfiguration> (QLatin1String(Debugger::Constants::DEBUGMODE), tr("Debug on Device"), parent)); + addAutoReleasedObject(new Qt4SymbianTargetFactory); + updateQtVersions(); connect(m_devices, SIGNAL(qtVersionsChanged()), this, SLOT(updateQtVersions())); diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp index e94a77124e..d8b399eaf4 100644 --- a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp @@ -67,7 +67,7 @@ const char * const QT_VERSION_ID_KEY("Qt4ProjectManager.Qt4BuildConfiguration.Qt enum { debug = 0 }; } -Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4Target *target) : +Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4BaseTarget *target) : BuildConfiguration(target, QLatin1String(QT4_BC_ID)), m_shadowBuild(true), m_qtVersionId(-1), @@ -78,7 +78,7 @@ Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4Target *target) : ctor(); } -Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4Target *target, const QString &id) : +Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4BaseTarget *target, const QString &id) : BuildConfiguration(target, id), m_shadowBuild(true), m_qtVersionId(-1), @@ -89,7 +89,7 @@ Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4Target *target, const QString &i ctor(); } -Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4Target *target, Qt4BuildConfiguration *source) : +Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4BaseTarget *target, Qt4BuildConfiguration *source) : BuildConfiguration(target, source), m_shadowBuild(source->m_shadowBuild), m_buildDirectory(source->m_buildDirectory), @@ -205,9 +205,9 @@ void Qt4BuildConfiguration::pickValidQtVersion() setQtVersion(QtVersionManager::instance()->emptyVersion()); } -Qt4Target *Qt4BuildConfiguration::qt4Target() const +Qt4BaseTarget *Qt4BuildConfiguration::qt4Target() const { - return static_cast<Qt4Target *>(target()); + return static_cast<Qt4BaseTarget *>(target()); } Utils::Environment Qt4BuildConfiguration::baseEnvironment() const @@ -687,7 +687,7 @@ void Qt4BuildConfigurationFactory::update() QStringList Qt4BuildConfigurationFactory::availableCreationIds(ProjectExplorer::Target *parent) const { - if (!qobject_cast<Qt4Target *>(parent)) + if (!qobject_cast<Qt4BaseTarget *>(parent)) return QStringList(); QStringList results; @@ -709,7 +709,7 @@ QString Qt4BuildConfigurationFactory::displayNameForId(const QString &id) const bool Qt4BuildConfigurationFactory::canCreate(ProjectExplorer::Target *parent, const QString &id) const { - if (!qobject_cast<Qt4Target *>(parent)) + if (!qobject_cast<Qt4BaseTarget *>(parent)) return false; if (!m_versions.contains(id)) return false; @@ -730,7 +730,7 @@ BuildConfiguration *Qt4BuildConfigurationFactory::create(ProjectExplorer::Target QtVersion *version = QtVersionManager::instance()->version(info.versionId); Q_ASSERT(version); - Qt4Target *qt4Target = static_cast<Qt4Target *>(parent); + Qt4BaseTarget *qt4Target = static_cast<Qt4BaseTarget *>(parent); bool ok; QString buildConfigurationName = QInputDialog::getText(0, @@ -757,7 +757,7 @@ BuildConfiguration *Qt4BuildConfigurationFactory::create(ProjectExplorer::Target bool Qt4BuildConfigurationFactory::canClone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const { - if (!qobject_cast<Qt4Target *>(parent)) + if (!qobject_cast<Qt4BaseTarget *>(parent)) return false; Qt4BuildConfiguration *qt4bc(qobject_cast<Qt4BuildConfiguration *>(source)); if (!qt4bc) @@ -774,15 +774,15 @@ BuildConfiguration *Qt4BuildConfigurationFactory::clone(Target *parent, BuildCon { if (!canClone(parent, source)) return 0; - Qt4Target *target(static_cast<Qt4Target *>(parent)); + Qt4BaseTarget *target = static_cast<Qt4BaseTarget *>(parent); Qt4BuildConfiguration *oldbc(static_cast<Qt4BuildConfiguration *>(source)); return new Qt4BuildConfiguration(target, oldbc); } bool Qt4BuildConfigurationFactory::canRestore(Target *parent, const QVariantMap &map) const { - QString id(ProjectExplorer::idFromMap(map)); - if (!qobject_cast<Qt4Target *>(parent)) + QString id = ProjectExplorer::idFromMap(map); + if (!qobject_cast<Qt4BaseTarget *>(parent)) return false; return id.startsWith(QLatin1String(QT4_BC_ID_PREFIX)) || id == QLatin1String(QT4_BC_ID); @@ -792,8 +792,8 @@ BuildConfiguration *Qt4BuildConfigurationFactory::restore(Target *parent, const { if (!canRestore(parent, map)) return 0; - Qt4Target *target(static_cast<Qt4Target *>(parent)); - Qt4BuildConfiguration *bc(new Qt4BuildConfiguration(target)); + Qt4BaseTarget *target = static_cast<Qt4BaseTarget *>(parent); + Qt4BuildConfiguration *bc = new Qt4BuildConfiguration(target); if (bc->fromMap(map)) return bc; delete bc; diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.h b/src/plugins/qt4projectmanager/qt4buildconfiguration.h index 449dfa1ef5..b7bf7c6392 100644 --- a/src/plugins/qt4projectmanager/qt4buildconfiguration.h +++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.h @@ -47,7 +47,7 @@ namespace Qt4ProjectManager { class QMakeStep; class MakeStep; -class Qt4Target; +class Qt4BaseTarget; namespace Internal { class Qt4ProFileNode; @@ -60,10 +60,10 @@ class Qt4BuildConfiguration : public ProjectExplorer::BuildConfiguration friend class Internal::Qt4BuildConfigurationFactory; public: - explicit Qt4BuildConfiguration(Qt4Target *target); + explicit Qt4BuildConfiguration(Qt4BaseTarget *target); virtual ~Qt4BuildConfiguration(); - Qt4Target *qt4Target() const; + Qt4BaseTarget *qt4Target() const; virtual Utils::Environment baseEnvironment() const; @@ -150,8 +150,8 @@ private slots: void emitBuildDirectoryChanged(); protected: - Qt4BuildConfiguration(Qt4Target *target, Qt4BuildConfiguration *source); - Qt4BuildConfiguration(Qt4Target *target, const QString &id); + Qt4BuildConfiguration(Qt4BaseTarget *target, Qt4BuildConfiguration *source); + Qt4BuildConfiguration(Qt4BaseTarget *target, const QString &id); virtual bool fromMap(const QVariantMap &map); private: diff --git a/src/plugins/qt4projectmanager/qt4deployconfiguration.cpp b/src/plugins/qt4projectmanager/qt4deployconfiguration.cpp deleted file mode 100644 index 7495f9e2c5..0000000000 --- a/src/plugins/qt4projectmanager/qt4deployconfiguration.cpp +++ /dev/null @@ -1,109 +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) -** -** No Commercial Usage -** -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, 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. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -**************************************************************************/ - -#include "qt4deployconfiguration.h" - -#include "qt4projectmanagerconstants.h" -#include "qt4target.h" -#include "qt-maemo/maemodeploystep.h" -#include "qt-maemo/maemopackagecreationstep.h" -#include "qt-s60/s60createpackagestep.h" -#include "qt-s60/s60deploystep.h" -#include "qt-s60/s60deployconfiguration.h" - -#include <projectexplorer/buildsteplist.h> -#include <projectexplorer/target.h> - -using namespace Qt4ProjectManager; -using namespace Qt4ProjectManager::Internal; - -Qt4DeployConfigurationFactory::Qt4DeployConfigurationFactory(QObject *parent) : - ProjectExplorer::DeployConfigurationFactory(parent), - m_s60DeployConfigurationFactory(new S60DeployConfigurationFactory(this)) -{ } - -ProjectExplorer::DeployConfiguration *Qt4DeployConfigurationFactory::create(ProjectExplorer::Target *parent, const QString &id) -{ - ProjectExplorer::DeployConfiguration *dc = 0; - if (parent->id() == QLatin1String(Constants::S60_DEVICE_TARGET_ID)) - dc = m_s60DeployConfigurationFactory->create(parent, id); - else - dc = ProjectExplorer::DeployConfigurationFactory::create(parent, id); - - if (!dc) - return 0; - - if (parent->id() == Constants::S60_DEVICE_TARGET_ID) { - dc->setDefaultDisplayName(tr("Deploy to Symbian device")); - dc->stepList()->insertStep(0, new S60CreatePackageStep(dc->stepList())); - dc->stepList()->insertStep(1, new S60DeployStep(dc->stepList())); - } else if (parent->id() == Constants::MAEMO_DEVICE_TARGET_ID) { - dc->setDefaultDisplayName(tr("Deploy to Maemo device")); - dc->stepList()->insertStep(0, new MaemoPackageCreationStep(dc->stepList())); - dc->stepList()->insertStep(1, new MaemoDeployStep(dc->stepList())); - } - - return dc; -} - -bool Qt4DeployConfigurationFactory::canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const -{ - if (parent->id() == Constants::S60_DEVICE_TARGET_ID) - return m_s60DeployConfigurationFactory->canRestore(parent, map); - else - return ProjectExplorer::DeployConfigurationFactory::canRestore(parent, map); -} - -ProjectExplorer::DeployConfiguration *Qt4DeployConfigurationFactory::restore(ProjectExplorer::Target *parent, const QVariantMap &map) -{ - if (parent->id() == Constants::S60_DEVICE_TARGET_ID) - return m_s60DeployConfigurationFactory->restore(parent, map); - else - return ProjectExplorer::DeployConfigurationFactory::restore(parent, map); -} - -bool Qt4DeployConfigurationFactory::canClone(ProjectExplorer::Target *parent, ProjectExplorer::DeployConfiguration *product) const -{ - if (parent->id() == Constants::S60_DEVICE_TARGET_ID) - return m_s60DeployConfigurationFactory->canClone(parent, product); - else - return ProjectExplorer::DeployConfigurationFactory::canClone(parent, product); -} - -ProjectExplorer::DeployConfiguration *Qt4DeployConfigurationFactory::clone(ProjectExplorer::Target *parent, ProjectExplorer::DeployConfiguration *product) -{ - if (parent->id() == Constants::S60_DEVICE_TARGET_ID) - return m_s60DeployConfigurationFactory->clone(parent, product); - else - return ProjectExplorer::DeployConfigurationFactory::clone(parent, product); -} diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp index fab6f8c7c9..6a29d15103 100644 --- a/src/plugins/qt4projectmanager/qt4project.cpp +++ b/src/plugins/qt4projectmanager/qt4project.cpp @@ -37,7 +37,6 @@ #include "qt4projectmanager.h" #include "makestep.h" #include "qmakestep.h" -#include "qt4runconfiguration.h" #include "qt4nodes.h" #include "qt4projectconfigwidget.h" #include "qt4projectmanagerconstants.h" @@ -264,8 +263,6 @@ Qt4Project::Qt4Project(Qt4Manager *manager, const QString& fileName) : m_asyncUpdateTimer.setSingleShot(true); m_asyncUpdateTimer.setInterval(3000); connect(&m_asyncUpdateTimer, SIGNAL(timeout()), this, SLOT(asyncUpdate())); - - setSupportedTargetIds(QtVersionManager::instance()->supportedTargetIds()); } Qt4Project::~Qt4Project() @@ -327,14 +324,12 @@ bool Qt4Project::fromMap(const QVariantMap &map) // This might be incorrect, need a full update updateCodeModels(); - createApplicationProjects(); + foreach (Target *t, targets()) + static_cast<Qt4BaseTarget *>(t)->createApplicationProFiles(); foreach (Target *t, targets()) onAddedTarget(t); - setSupportedTargetIds(QtVersionManager::instance()->supportedTargetIds()); - - connect(m_nodesWatcher, SIGNAL(proFileUpdated(Qt4ProjectManager::Internal::Qt4ProFileNode*,bool)), this, SIGNAL(proFileUpdated(Qt4ProjectManager::Internal::Qt4ProFileNode *,bool))); @@ -349,32 +344,29 @@ bool Qt4Project::fromMap(const QVariantMap &map) connect(this, SIGNAL(addedTarget(ProjectExplorer::Target*)), this, SLOT(onAddedTarget(ProjectExplorer::Target*))); - connect(QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>)), - this, SLOT(qtVersionsChanged())); - connect(this, SIGNAL(activeTargetChanged(ProjectExplorer::Target*)), this, SLOT(activeTargetWasChanged())); return true; } -Qt4Target *Qt4Project::activeTarget() const +Qt4BaseTarget *Qt4Project::activeTarget() const { - return static_cast<Qt4Target *>(Project::activeTarget()); + return static_cast<Qt4BaseTarget *>(Project::activeTarget()); } void Qt4Project::onAddedTarget(ProjectExplorer::Target *t) { Q_ASSERT(t); - Qt4Target *qt4target = qobject_cast<Qt4Target *>(t); + Qt4BaseTarget *qt4target = qobject_cast<Qt4BaseTarget *>(t); Q_ASSERT(qt4target); connect(qt4target, SIGNAL(buildDirectoryInitialized()), this, SIGNAL(buildDirectoryInitialized())); - connect(qt4target, SIGNAL(proFileEvaluateNeeded(Qt4ProjectManager::Qt4Target*)), - this, SLOT(proFileEvaluateNeeded(Qt4ProjectManager::Qt4Target*))); + connect(qt4target, SIGNAL(proFileEvaluateNeeded(Qt4ProjectManager::Qt4BaseTarget*)), + this, SLOT(proFileEvaluateNeeded(Qt4ProjectManager::Qt4BaseTarget*))); } -void Qt4Project::proFileEvaluateNeeded(Qt4ProjectManager::Qt4Target *target) +void Qt4Project::proFileEvaluateNeeded(Qt4ProjectManager::Qt4BaseTarget *target) { if (activeTarget() == target) scheduleAsyncUpdate(); @@ -606,11 +598,6 @@ void Qt4Project::updateQmlJSCodeModel() modelManager->updateProjectInfo(projectInfo); } -void Qt4Project::qtVersionsChanged() -{ - setSupportedTargetIds(QtVersionManager::instance()->supportedTargetIds()); -} - ///*! // Updates complete project // */ @@ -763,6 +750,8 @@ void Qt4Project::decrementPendingEvaluateFutures() m_asyncUpdateTimer.start(); } else if (m_asyncUpdateState != ShuttingDown){ // After being done, we need to call: + foreach (Target *t, targets()) + static_cast<Qt4BaseTarget *>(t)->createApplicationProFiles(); updateFileList(); updateCodeModels(); if (debug) @@ -1000,51 +989,6 @@ void Qt4Project::collectApplicationProFiles(QList<Qt4ProFileNode *> &list, Qt4Pr } } -void Qt4Project::createApplicationProjects() -{ - foreach (Target *target, targets()) { - if (target->runConfigurations().count()) { - // Remove all run configurations which the new project wizard created - QList<RunConfiguration*> toRemove; - foreach (RunConfiguration * rc, target->runConfigurations()) { - CustomExecutableRunConfiguration *cerc = qobject_cast<CustomExecutableRunConfiguration *>(rc); - if (cerc && !cerc->isConfigured()) - toRemove.append(rc); - } - foreach (RunConfiguration *rc, toRemove) - target->removeRunConfiguration(rc); - } - - // We use the list twice - QList<Qt4ProFileNode *> profiles = applicationProFiles(); - QStringList paths; - foreach (Qt4ProFileNode *pro, profiles) - paths << pro->path(); - - foreach (RunConfiguration *rc, target->runConfigurations()) { - if (Qt4RunConfiguration *qt4rc = qobject_cast<Qt4RunConfiguration *>(rc)) { - if (!paths.contains(qt4rc->proFilePath())) { - // A deleted .pro file? or a change template - // We do remove those though - target->removeRunConfiguration(rc); - } - } - } - - // Only add new runconfigurations if there are none. - if (target->runConfigurations().isEmpty()) { - Qt4Target *qt4Target = static_cast<Qt4Target *>(target); - foreach (Qt4ProFileNode *qt4proFile, profiles) { - qt4Target->addRunConfigurationForPath(qt4proFile->path()); - } - } - // Oh still none? Add a custom executable runconfiguration - if (target->runConfigurations().isEmpty()) { - target->addRunConfiguration(new ProjectExplorer::CustomExecutableRunConfiguration(target)); - } - } -} - QList<Qt4ProFileNode *> Qt4Project::leafProFiles() const { QList<Qt4ProFileNode *> list; diff --git a/src/plugins/qt4projectmanager/qt4project.h b/src/plugins/qt4projectmanager/qt4project.h index f20cdeb7be..f75a3d97d3 100644 --- a/src/plugins/qt4projectmanager/qt4project.h +++ b/src/plugins/qt4projectmanager/qt4project.h @@ -59,7 +59,6 @@ namespace Internal { class FileItem; class Qt4ProFileNode; class Qt4PriFileNode; - class Qt4RunConfiguration; class GCCPreprocessor; struct Qt4ProjectFiles; class Qt4ProjectConfigWidget; @@ -155,7 +154,7 @@ public: ProjectExplorer::IProjectManager *projectManager() const; Qt4Manager *qt4ProjectManager() const; - Qt4Target *activeTarget() const; + Qt4BaseTarget *activeTarget() const; QList<Core::IFile *> dependencies(); //NBS remove QList<ProjectExplorer::Project *>dependsOn(); @@ -210,18 +209,16 @@ protected: virtual bool fromMap(const QVariantMap &map); private slots: - void proFileEvaluateNeeded(Qt4ProjectManager::Qt4Target *target); + void proFileEvaluateNeeded(Qt4ProjectManager::Qt4BaseTarget *target); void asyncUpdate(); - void qtVersionsChanged(); void onAddedTarget(ProjectExplorer::Target *t); void activeTargetWasChanged(); private: void scheduleAsyncUpdate(); - void createApplicationProjects(); void updateCodeModels(); void updateCppCodeModel(); void updateQmlJSCodeModel(); @@ -273,4 +270,5 @@ private: } // namespace Qt4ProjectManager + #endif // QT4PROJECT_H diff --git a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp index 43cf95e18c..cb25702b00 100644 --- a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp +++ b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp @@ -63,7 +63,7 @@ using namespace Qt4ProjectManager; using namespace Qt4ProjectManager::Internal; using ProjectExplorer::ToolChain; -Qt4ProjectConfigWidget::Qt4ProjectConfigWidget(Qt4Target *target) +Qt4ProjectConfigWidget::Qt4ProjectConfigWidget(Qt4BaseTarget *target) : BuildConfigWidget(), m_buildConfiguration(0), m_ignoreChange(false) diff --git a/src/plugins/qt4projectmanager/qt4projectconfigwidget.h b/src/plugins/qt4projectmanager/qt4projectconfigwidget.h index 2e01e2a985..cf2227bb87 100644 --- a/src/plugins/qt4projectmanager/qt4projectconfigwidget.h +++ b/src/plugins/qt4projectmanager/qt4projectconfigwidget.h @@ -45,7 +45,7 @@ namespace Utils { } namespace Qt4ProjectManager { -class Qt4Target; +class Qt4BaseTarget; class Qt4BuildConfiguration; class Qt4Target; @@ -58,7 +58,7 @@ class Qt4ProjectConfigWidget : public ProjectExplorer::BuildConfigWidget { Q_OBJECT public: - explicit Qt4ProjectConfigWidget(Qt4Target *target); + explicit Qt4ProjectConfigWidget(Qt4BaseTarget *target); ~Qt4ProjectConfigWidget(); QString displayName() const; diff --git a/src/plugins/qt4projectmanager/qt4projectmanager.pro b/src/plugins/qt4projectmanager/qt4projectmanager.pro index 9e221211fd..298a0259ba 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanager.pro +++ b/src/plugins/qt4projectmanager/qt4projectmanager.pro @@ -4,7 +4,7 @@ DEFINES += QT_CREATOR QT4PROJECTMANAGER_LIBRARY QT += network include(../../qtcreatorplugin.pri) include(qt4projectmanager_dependencies.pri) -HEADERS += qt4deployconfiguration.h \ +HEADERS += \ qtparser.h \ qt4projectmanagerplugin.h \ qt4projectmanager.h \ @@ -46,7 +46,6 @@ HEADERS += qt4deployconfiguration.h \ qt4projectmanagerconstants.h \ makestep.h \ qmakestep.h \ - qt4runconfiguration.h \ qtmodulesinfo.h \ qt4projectconfigwidget.h \ projectloadwizard.h \ @@ -69,7 +68,6 @@ HEADERS += qt4deployconfiguration.h \ profilecompletion.h \ profilekeywords.h SOURCES += qt4projectmanagerplugin.cpp \ - qt4deployconfiguration.cpp \ qtparser.cpp \ qt4projectmanager.cpp \ qt4project.cpp \ @@ -109,7 +107,6 @@ SOURCES += qt4projectmanagerplugin.cpp \ wizards/subdirsprojectwizarddialog.cpp \ makestep.cpp \ qmakestep.cpp \ - qt4runconfiguration.cpp \ qtmodulesinfo.cpp \ qt4projectconfigwidget.cpp \ projectloadwizard.cpp \ @@ -146,10 +143,13 @@ FORMS += makestep.ui \ librarydetailswidget.ui RESOURCES += qt4projectmanager.qrc \ wizards/wizards.qrc + DEFINES += PROPARSER_THREAD_SAFE PROEVALUATOR_THREAD_SAFE include(../../shared/proparser/proparser.pri) include(qt-s60/qt-s60.pri) include(qt-maemo/qt-maemo.pri) +include(qt-desktop/qt-desktop.pri) include(customwidgetwizard/customwidgetwizard.pri) + DEFINES += QT_NO_CAST_TO_ASCII OTHER_FILES += Qt4ProjectManager.mimetypes.xml diff --git a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp index a92fe593e2..7ed77f57bf 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp +++ b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp @@ -48,7 +48,6 @@ #include "profileeditorfactory.h" #include "qt4projectmanagerconstants.h" #include "qt4project.h" -#include "qt4runconfiguration.h" #include "profileeditor.h" #include "profilereader.h" #include "qtversionmanager.h" @@ -59,6 +58,9 @@ #include "qt-maemo/maemomanager.h" #include "qt-s60/s60manager.h" +#include "qt-desktop/qt4desktoptargetfactory.h" +#include "qt-desktop/qt4simulatortargetfactory.h" +#include "qt-desktop/qt4runconfiguration.h" #include <coreplugin/uniqueidmanager.h> #include <coreplugin/icore.h> @@ -151,7 +153,6 @@ bool Qt4ProjectManagerPlugin::initialize(const QStringList &arguments, QString * addAutoReleasedObject(new QMakeStepFactory); addAutoReleasedObject(new MakeStepFactory); - addAutoReleasedObject(new Qt4TargetFactory); addAutoReleasedObject(new Qt4RunConfigurationFactory); #ifdef Q_OS_MAC @@ -164,6 +165,9 @@ bool Qt4ProjectManagerPlugin::initialize(const QStringList &arguments, QString * addAutoReleasedObject(new S60Manager); addAutoReleasedObject(new MaemoManager); + addAutoReleasedObject(new Qt4DesktopTargetFactory); + addAutoReleasedObject(new Qt4SimulatorTargetFactory); + ProFileCompletion *completion = new ProFileCompletion; addAutoReleasedObject(completion); // Set completion settings and keep them up to date diff --git a/src/plugins/qt4projectmanager/qt4target.cpp b/src/plugins/qt4projectmanager/qt4target.cpp index ecc01b744f..f966894a30 100644 --- a/src/plugins/qt4projectmanager/qt4target.cpp +++ b/src/plugins/qt4projectmanager/qt4target.cpp @@ -34,274 +34,115 @@ #include "qt4target.h" #include "makestep.h" -#include "profilereader.h" #include "qmakestep.h" -#include "qt4deployconfiguration.h" #include "qt4project.h" -#include "qt4runconfiguration.h" #include "qt4projectmanagerconstants.h" -#include "qt-maemo/maemodeploystep.h" -#include "qt-maemo/maemopackagecreationstep.h" -#include "qt-maemo/maemorunconfiguration.h" -#include "qt-s60/s60deployconfiguration.h" -#include "qt-s60/s60devicerunconfiguration.h" -#include "qt-s60/s60emulatorrunconfiguration.h" -#include "qt-s60/s60createpackagestep.h" -#include "qt-s60/s60deploystep.h" #include "qt4projectconfigwidget.h" +#include <extensionsystem/pluginmanager.h> #include <projectexplorer/buildsteplist.h> +#include <projectexplorer/runconfiguration.h> #include <projectexplorer/customexecutablerunconfiguration.h> -#include <projectexplorer/toolchaintype.h> #include <projectexplorer/projectexplorerconstants.h> -#include <coreplugin/coreconstants.h> -#include <symbianutils/symbiandevicemanager.h> -#include <QtGui/QApplication> -#include <QtGui/QPixmap> -#include <QtGui/QPainter> - -using namespace ProjectExplorer; using namespace Qt4ProjectManager; using namespace Qt4ProjectManager::Internal; -namespace { - -QString displayNameForId(const QString &id) { - if (id == QLatin1String(Qt4ProjectManager::Constants::DESKTOP_TARGET_ID)) - return QApplication::translate("Qt4ProjectManager::Internal::Qt4Target", "Desktop", "Qt4 Desktop target display name"); - if (id == QLatin1String(Qt4ProjectManager::Constants::S60_EMULATOR_TARGET_ID)) - return QApplication::translate("Qt4ProjectManager::Internal::Qt4Target", "Symbian Emulator", "Qt4 Symbian Emulator target display name"); - if (id == QLatin1String(Qt4ProjectManager::Constants::S60_DEVICE_TARGET_ID)) - return QApplication::translate("Qt4ProjectManager::Internal::Qt4Target", "Symbian Device", "Qt4 Symbian Device target display name"); - if (id == QLatin1String(Qt4ProjectManager::Constants::MAEMO_DEVICE_TARGET_ID)) - return QApplication::translate("Qt4ProjectManager::Internal::Qt4Target", "Maemo", "Qt4 Maemo target display name"); - if (id == QLatin1String(Qt4ProjectManager::Constants::QT_SIMULATOR_TARGET_ID)) - return QApplication::translate("Qt4ProjectManager::Internal::Qt4Target", "Qt Simulator", "Qt4 Simulator target display name"); - return QString(); -} - -QIcon iconForId(const QString &id) { - if (id == QLatin1String(Qt4ProjectManager::Constants::DESKTOP_TARGET_ID)) - return QIcon(qApp->style()->standardIcon(QStyle::SP_ComputerIcon)); - if (id == QLatin1String(Qt4ProjectManager::Constants::S60_EMULATOR_TARGET_ID)) - return QIcon(QLatin1String(":/projectexplorer/images/SymbianEmulator.png")); - if (id == QLatin1String(Qt4ProjectManager::Constants::S60_DEVICE_TARGET_ID)) - return QIcon(QLatin1String(":/projectexplorer/images/SymbianDevice.png")); - if (id == QLatin1String(Qt4ProjectManager::Constants::MAEMO_DEVICE_TARGET_ID)) - return QIcon(QLatin1String(":/projectexplorer/images/MaemoDevice.png")); - if (id == QLatin1String(Qt4ProjectManager::Constants::QT_SIMULATOR_TARGET_ID)) - return QIcon(QLatin1String(":/projectexplorer/images/SymbianEmulator.png")); - return QIcon(); -} - -} // namespace - // ------------------------------------------------------------------------- -// Qt4TargetFactory +// Qt4BaseTargetFactory // ------------------------------------------------------------------------- -Qt4TargetFactory::Qt4TargetFactory(QObject *parent) : +Qt4BaseTargetFactory::Qt4BaseTargetFactory(QObject *parent) : ITargetFactory(parent) { - connect(QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>)), - this, SIGNAL(availableCreationIdsChanged())); -} - -Qt4TargetFactory::~Qt4TargetFactory() -{ -} - -bool Qt4TargetFactory::supportsTargetId(const QString &id) const -{ - QSet<QString> ids; - ids << QLatin1String("Qt4ProjectManager.Target.DesktopTarget") - << QLatin1String("Qt4ProjectManager.Target.S60EmulatorTarget") - << QLatin1String("Qt4ProjectManager.Target.S60DeviceTarget") - << QLatin1String("Qt4ProjectManager.Target.MaemoDeviceTarget") - << QLatin1String("Qt4ProjectManager.Target.QtSimulatorTarget"); - return ids.contains(id); -} - -QStringList Qt4TargetFactory::availableCreationIds(ProjectExplorer::Project *parent) const -{ - if (!qobject_cast<Qt4Project *>(parent)) - return QStringList(); - QSet<QString> ids; - ids << QLatin1String("Qt4ProjectManager.Target.DesktopTarget") - << QLatin1String("Qt4ProjectManager.Target.S60EmulatorTarget") - << QLatin1String("Qt4ProjectManager.Target.S60DeviceTarget") - << QLatin1String("Qt4ProjectManager.Target.MaemoDeviceTarget") - << QLatin1String("Qt4ProjectManager.Target.QtSimulatorTarget"); - - - return parent->possibleTargetIds().intersect(ids).toList(); -} - -QString Qt4TargetFactory::displayNameForId(const QString &id) const -{ - return ::displayNameForId(id); } -bool Qt4TargetFactory::canCreate(ProjectExplorer::Project *parent, const QString &id) const +Qt4BaseTargetFactory::~Qt4BaseTargetFactory() { - if (!qobject_cast<Qt4Project *>(parent)) - return false; - - return parent->canAddTarget(id); -} -Qt4Target *Qt4TargetFactory::create(ProjectExplorer::Project *parent, const QString &id) -{ - QList<QtVersion *> knownVersions = QtVersionManager::instance()->versionsForTargetId(id); - if (knownVersions.count() > 1) - knownVersions = knownVersions.mid(0, 1); - return create(parent, id, knownVersions); } -Qt4Target *Qt4TargetFactory::create(ProjectExplorer::Project *parent, const QString &id, QList<QtVersion *> versions) +Qt4BaseTargetFactory *Qt4BaseTargetFactory::qt4BaseTargetFactoryForId(const QString &id) { - QList<BuildConfigurationInfo> infos; - foreach (QtVersion *version, versions) { - bool buildAll = false; - if (version && version->isValid() && (version->defaultBuildConfig() & QtVersion::BuildAll)) - buildAll = true; - - if (buildAll) { - infos.append(BuildConfigurationInfo(version, QtVersion::BuildAll | QtVersion::DebugBuild)); - infos.append(BuildConfigurationInfo(version, QtVersion::BuildAll)); - } else { - infos.append(BuildConfigurationInfo(version, QtVersion::DebugBuild)); - infos.append(BuildConfigurationInfo(version, QtVersion::QmakeBuildConfig(0))); - } - } - - return create(parent, id, infos); -} - -Qt4Target *Qt4TargetFactory::create(ProjectExplorer::Project *parent, const QString &id, QList<BuildConfigurationInfo> infos) -{ - if (!canCreate(parent, id)) - return 0; - - Qt4Project *qt4project = static_cast<Qt4Project *>(parent); - Qt4Target *t = new Qt4Target(qt4project, id); - - QList<QtVersion *> knownVersions(QtVersionManager::instance()->versionsForTargetId(id)); - if (knownVersions.isEmpty()) - return t; - - // count Qt versions: - int qtVersionCount = 0; - { - QSet<QtVersion *> differentVersions; - foreach (const BuildConfigurationInfo &info, infos) { - if (knownVersions.contains(info.version)) - differentVersions.insert(info.version); - } - qtVersionCount = differentVersions.count(); + QList<Qt4BaseTargetFactory *> factories = ExtensionSystem::PluginManager::instance()->getObjects<Qt4BaseTargetFactory>(); + foreach (Qt4BaseTargetFactory *fac, factories) { + if (fac->supportsTargetId(id)) + return fac; } - - // Create Buildconfigurations: - foreach (const BuildConfigurationInfo &info, infos) { - if (!info.version || !knownVersions.contains(info.version)) - continue; - - QString displayName; - - if (qtVersionCount > 1) - displayName = info.version->displayName() + QChar(' '); - displayName.append((info.buildConfig & QtVersion::DebugBuild) ? tr("Debug") : tr("Release")); - - // Skip release builds for the symbian emulator. - if (id == QLatin1String(Constants::S60_EMULATOR_TARGET_ID) && - !(info.buildConfig & QtVersion::DebugBuild)) - continue; - - t->addQt4BuildConfiguration(displayName, info.version, info.buildConfig, info.additionalArguments, info.directory); - } - - t->addDeployConfiguration(t->deployConfigurationFactory()->create(t, ProjectExplorer::Constants::DEFAULT_DEPLOYCONFIGURATION_ID)); - - // create RunConfigurations: - QStringList pathes = qt4project->applicationProFilePathes(); - foreach (const QString &path, pathes) - t->addRunConfigurationForPath(path); - - if (t->runConfigurations().isEmpty()) - t->addRunConfiguration(new CustomExecutableRunConfiguration(t)); - - return t; -} - -bool Qt4TargetFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const -{ - return canCreate(parent, ProjectExplorer::idFromMap(map)); -} - -Qt4Target *Qt4TargetFactory::restore(ProjectExplorer::Project *parent, const QVariantMap &map) -{ - if (!canRestore(parent, map)) - return 0; - - Qt4Project *qt4project(static_cast<Qt4Project *>(parent)); - Qt4Target *t(new Qt4Target(qt4project, QLatin1String("transient ID"))); - if (t->fromMap(map)) - return t; - delete t; return 0; } // ------------------------------------------------------------------------- -// Qt4Target +// Qt4BaseTarget // ------------------------------------------------------------------------- -Qt4Target::Qt4Target(Qt4Project *parent, const QString &id) : - ProjectExplorer::Target(parent, id), - m_connectedPixmap(QLatin1String(":/projectexplorer/images/ConnectionOn.png")), - m_disconnectedPixmap(QLatin1String(":/projectexplorer/images/ConnectionOff.png")), - m_buildConfigurationFactory(new Qt4BuildConfigurationFactory(this)), - m_deployConfigurationFactory(new Qt4DeployConfigurationFactory(this)) +Qt4BaseTarget::Qt4BaseTarget(Qt4Project *parent, const QString &id) : + ProjectExplorer::Target(parent, id) { - connect(project(), SIGNAL(supportedTargetIdsChanged()), - this, SLOT(updateQtVersion())); - 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*))); - connect(this, SIGNAL(addedDeployConfiguration(ProjectExplorer::DeployConfiguration*)), - this, SLOT(onAddedDeployConfiguration(ProjectExplorer::DeployConfiguration*))); - connect(this, SIGNAL(activeRunConfigurationChanged(ProjectExplorer::RunConfiguration*)), - this, SLOT(updateToolTipAndIcon())); - - setDefaultDisplayName(displayNameForId(id)); - setIcon(iconForId(id)); } -Qt4Target::~Qt4Target() +Qt4BaseTarget::~Qt4BaseTarget() { } -ProjectExplorer::BuildConfigWidget *Qt4Target::createConfigWidget() +ProjectExplorer::BuildConfigWidget *Qt4BaseTarget::createConfigWidget() { return new Qt4ProjectConfigWidget(this); } -Qt4BuildConfiguration *Qt4Target::activeBuildConfiguration() const +Qt4BuildConfiguration *Qt4BaseTarget::activeBuildConfiguration() const { return static_cast<Qt4BuildConfiguration *>(Target::activeBuildConfiguration()); } -Qt4Project *Qt4Target::qt4Project() const +Qt4Project *Qt4BaseTarget::qt4Project() const { return static_cast<Qt4Project *>(project()); } -Qt4BuildConfiguration *Qt4Target::addQt4BuildConfiguration(QString displayName, QtVersion *qtversion, +QList<ProjectExplorer::ToolChainType> Qt4BaseTarget::filterToolChainTypes(const QList<ProjectExplorer::ToolChainType> &candidates) const +{ + return candidates; +} + +ProjectExplorer::ToolChainType Qt4BaseTarget::preferredToolChainType(const QList<ProjectExplorer::ToolChainType> &candidates) const +{ + ProjectExplorer::ToolChainType preferredType = ProjectExplorer::ToolChain_INVALID; + if (!candidates.isEmpty()) + preferredType = candidates.at(0); + return preferredType; +} + +QString Qt4BaseTarget::defaultBuildDirectory() const +{ + Qt4BaseTargetFactory *fac = Qt4BaseTargetFactory::qt4BaseTargetFactoryForId(id()); + return fac->defaultShadowBuildDirectory(qt4Project()->defaultTopLevelBuildDirectory(), id()); +} + +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()) { + ProjectExplorer::CustomExecutableRunConfiguration *cerc + = qobject_cast<ProjectExplorer::CustomExecutableRunConfiguration *>(rc); + if (cerc && !cerc->isConfigured()) + toRemove.append(rc); + } + foreach (ProjectExplorer::RunConfiguration *rc, toRemove) + removeRunConfiguration(rc); + } +} + +Qt4BuildConfiguration *Qt4BaseTarget::addQt4BuildConfiguration(QString displayName, QtVersion *qtversion, QtVersion::QmakeBuildConfigs qmakeBuildConfiguration, QString additionalArguments, QString directory) @@ -313,8 +154,8 @@ Qt4BuildConfiguration *Qt4Target::addQt4BuildConfiguration(QString displayName, Qt4BuildConfiguration *bc = new Qt4BuildConfiguration(this); bc->setDefaultDisplayName(displayName); - BuildStepList *buildSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); - BuildStepList *cleanSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN); + ProjectExplorer::BuildStepList *buildSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); + ProjectExplorer::BuildStepList *cleanSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN); Q_ASSERT(buildSteps); Q_ASSERT(cleanSteps); @@ -348,103 +189,7 @@ Qt4BuildConfiguration *Qt4Target::addQt4BuildConfiguration(QString displayName, return bc; } -Qt4BuildConfigurationFactory *Qt4Target::buildConfigurationFactory() const -{ - return m_buildConfigurationFactory; -} - -ProjectExplorer::DeployConfigurationFactory *Qt4Target::deployConfigurationFactory() const -{ - return m_deployConfigurationFactory; -} - -void Qt4Target::addRunConfigurationForPath(const QString &proFilePath) -{ - if (id() == QLatin1String(Constants::DESKTOP_TARGET_ID) || - id() == QLatin1String(Constants::QT_SIMULATOR_TARGET_ID)) - addRunConfiguration(new Qt4RunConfiguration(this, proFilePath)); - else if (id() == QLatin1String(Constants::S60_EMULATOR_TARGET_ID)) - addRunConfiguration(new S60EmulatorRunConfiguration(this, proFilePath)); - else if (id() == QLatin1String(Constants::S60_DEVICE_TARGET_ID)) - addRunConfiguration(new S60DeviceRunConfiguration(this, proFilePath)); - else if (id() == QLatin1String(Constants::MAEMO_DEVICE_TARGET_ID)) - addRunConfiguration(new MaemoRunConfiguration(this, proFilePath)); -} - -QList<ProjectExplorer::ToolChainType> Qt4Target::filterToolChainTypes(const QList<ProjectExplorer::ToolChainType> &candidates) const -{ - QList<ProjectExplorer::ToolChainType> tmp(candidates); - if (id() == QLatin1String(Constants::S60_EMULATOR_TARGET_ID)) { - if (tmp.contains(ProjectExplorer::ToolChain_WINSCW)) - return QList<ProjectExplorer::ToolChainType>() << ProjectExplorer::ToolChain_WINSCW; - else - return QList<ProjectExplorer::ToolChainType>(); - } else if (id() == QLatin1String(Constants::S60_DEVICE_TARGET_ID)) { - tmp.removeAll(ProjectExplorer::ToolChain_WINSCW); - return tmp; - } - return tmp; -} - -ProjectExplorer::ToolChainType Qt4Target::preferredToolChainType(const QList<ProjectExplorer::ToolChainType> &candidates) const -{ - ProjectExplorer::ToolChainType preferredType = ProjectExplorer::ToolChain_INVALID; - if (id() == QLatin1String(Constants::S60_EMULATOR_TARGET_ID) && - candidates.contains(ProjectExplorer::ToolChain_WINSCW)) - preferredType = ProjectExplorer::ToolChain_WINSCW; - if (!candidates.isEmpty()) - preferredType = candidates.at(0); - return preferredType; -} - -QString Qt4Target::defaultBuildDirectory() const -{ - if (id() == QLatin1String(Constants::S60_DEVICE_TARGET_ID) - || id() == QLatin1String(Constants::S60_EMULATOR_TARGET_ID) -#if defined(Q_OS_WIN) - || id() == QLatin1String(Constants::MAEMO_DEVICE_TARGET_ID) -#endif - ) - return project()->projectDirectory(); - - return defaultShadowBuildDirectory(qt4Project()->defaultTopLevelBuildDirectory(), id()); -} - -QString Qt4Target::defaultShadowBuildDirectory(const QString &projectLocation, const QString &id) -{ - QString shortName = QLatin1String("unknown"); - if (id == QLatin1String(Constants::DESKTOP_TARGET_ID)) - shortName = QLatin1String("desktop"); - else if (id == QLatin1String(Constants::S60_EMULATOR_TARGET_ID)) - shortName = QLatin1String("symbian_emulator"); - else if (id == QLatin1String(Constants::S60_DEVICE_TARGET_ID)) - shortName = QLatin1String("symbian"); - else if (id == QLatin1String(Constants::MAEMO_DEVICE_TARGET_ID)) - shortName = QLatin1String("maemo"); - else if (id == QLatin1String(Constants::QT_SIMULATOR_TARGET_ID)) - shortName = QLatin1String("simulator"); - - // currently we can't have the build directory to be deeper then the source directory - // since that is broken in qmake - // Once qmake is fixed we can change that to have a top directory and - // subdirectories per build. (Replacing "QChar('-')" with "QChar('/') ) - return projectLocation + QChar('-') + shortName; -} - -bool Qt4Target::fromMap(const QVariantMap &map) -{ - bool success = Target::fromMap(map); - setIcon(iconForId(id())); - setDefaultDisplayName(displayNameForId(id())); - return success; -} - -void Qt4Target::updateQtVersion() -{ - setEnabled(project()->supportedTargetIds().contains(id())); -} - -void Qt4Target::onAddedBuildConfiguration(ProjectExplorer::BuildConfiguration *bc) +void Qt4BaseTarget::onAddedBuildConfiguration(ProjectExplorer::BuildConfiguration *bc) { Q_ASSERT(bc); Qt4BuildConfiguration *qt4bc = qobject_cast<Qt4BuildConfiguration *>(bc); @@ -455,103 +200,13 @@ void Qt4Target::onAddedBuildConfiguration(ProjectExplorer::BuildConfiguration *b this, SLOT(onProFileEvaluateNeeded(Qt4ProjectManager::Qt4BuildConfiguration *))); } -void Qt4Target::onAddedDeployConfiguration(ProjectExplorer::DeployConfiguration *dc) -{ - Q_ASSERT(dc); - S60DeployConfiguration *deployConf(qobject_cast<S60DeployConfiguration *>(dc)); - if (!deployConf) - return; - connect(deployConf, SIGNAL(serialPortNameChanged()), - this, SLOT(slotUpdateDeviceInformation())); - connect(deployConf, SIGNAL(communicationChannelChanged()), - this, SLOT(slotUpdateDeviceInformation())); - connect(deployConf, SIGNAL(deviceAddressChanged()), - this, SLOT(slotUpdateDeviceInformation())); - connect(deployConf, SIGNAL(devicePortChanged()), - this, SLOT(slotUpdateDeviceInformation())); -} - -void Qt4Target::slotUpdateDeviceInformation() -{ - S60DeployConfiguration *dc(qobject_cast<S60DeployConfiguration *>(sender())); - if (dc && dc == activeDeployConfiguration()) { - updateToolTipAndIcon(); - } -} - -void Qt4Target::onProFileEvaluateNeeded(Qt4ProjectManager::Qt4BuildConfiguration *bc) +void Qt4BaseTarget::onProFileEvaluateNeeded(Qt4ProjectManager::Qt4BuildConfiguration *bc) { if (bc && bc == activeBuildConfiguration()) emit proFileEvaluateNeeded(this); } -void Qt4Target::emitProFileEvaluateNeeded() +void Qt4BaseTarget::emitProFileEvaluateNeeded() { emit proFileEvaluateNeeded(this); } - -void Qt4Target::updateToolTipAndIcon() -{ - static const int TARGET_OVERLAY_ORIGINAL_SIZE = 32; - - if (qobject_cast<S60DeployConfiguration *>(activeDeployConfiguration())) { - QPixmap overlay; - QString tooltip; - if (isSymbianConnectionAvailable(tooltip)) - overlay = m_connectedPixmap; - else - overlay = m_disconnectedPixmap; - setToolTip(tooltip); - - double factor = Core::Constants::TARGET_ICON_SIZE / (double)TARGET_OVERLAY_ORIGINAL_SIZE; - QSize overlaySize(overlay.size().width()*factor, overlay.size().height()*factor); - QPixmap pixmap(Core::Constants::TARGET_ICON_SIZE, Core::Constants::TARGET_ICON_SIZE); - pixmap.fill(Qt::transparent); - QPainter painter(&pixmap); - painter.drawPixmap(Core::Constants::TARGET_ICON_SIZE - overlaySize.width(), - Core::Constants::TARGET_ICON_SIZE - overlaySize.height(), - overlay.scaled(overlaySize)); - - setOverlayIcon(QIcon(pixmap)); - } else { - setToolTip(QString()); - setOverlayIcon(QIcon()); - } -} - -bool Qt4Target::isSymbianConnectionAvailable(QString &tooltipText) -{ - const S60DeployConfiguration *s60DeployConf = qobject_cast<S60DeployConfiguration *>(activeDeployConfiguration()); - if (!s60DeployConf) - return false; - switch (s60DeployConf->communicationChannel()) { - case S60DeployConfiguration::CommunicationSerialConnection: { - const SymbianUtils::SymbianDeviceManager *sdm = SymbianUtils::SymbianDeviceManager::instance(); - const int deviceIndex = sdm->findByPortName(s60DeployConf->serialPortName()); - if (deviceIndex == -1) { - tooltipText = tr("<b>Device:</b> Not connected"); - return false; - } else { - // device connected - const SymbianUtils::SymbianDevice device = sdm->devices().at(deviceIndex); - tooltipText = device.additionalInformation().isEmpty() ? - tr("<b>Device:</b> %1").arg(device.friendlyName()) : - tr("<b>Device:</b> %1, %2").arg(device.friendlyName(), device.additionalInformation()); - return true; - } - } - break; - case S60DeployConfiguration::CommunicationTcpConnection: { - if(!s60DeployConf->deviceAddress().isEmpty() && !s60DeployConf->devicePort().isEmpty()) { - tooltipText = tr("<b>IP address:</b> %1:%2").arg(s60DeployConf->deviceAddress(), s60DeployConf->devicePort()); - return true; - } - return false; - } - break; - default: - break; - } - return false; -} - diff --git a/src/plugins/qt4projectmanager/qt4target.h b/src/plugins/qt4projectmanager/qt4target.h index 0e27c702be..926a8717a8 100644 --- a/src/plugins/qt4projectmanager/qt4target.h +++ b/src/plugins/qt4projectmanager/qt4target.h @@ -35,23 +35,20 @@ #define QT4TARGET_H #include "qt4buildconfiguration.h" +#include "qtversionmanager.h" #include <projectexplorer/target.h> -#include <QtGui/QPixmap> - namespace Qt4ProjectManager { class Qt4Project; namespace Internal { class Qt4ProFileNode; -class Qt4TargetFactory; -class Qt4BuildConfigurationFactory; -class Qt4DeployConfigurationFactory; +} struct BuildConfigurationInfo { - explicit BuildConfigurationInfo(QtVersion *v = 0, QtVersion::QmakeBuildConfigs bc = QtVersion::QmakeBuildConfig(0), - const QString &aa = QString(), const QString &d = QString()) : + explicit BuildConfigurationInfo(QtVersion *v, QtVersion::QmakeBuildConfigs bc, + const QString &aa, const QString &d) : version(v), buildConfig(bc), additionalArguments(aa), directory(d) { } QtVersion *version; @@ -59,88 +56,63 @@ struct BuildConfigurationInfo { QString additionalArguments; QString directory; }; -} -class Qt4Target : public ProjectExplorer::Target +class Qt4BaseTarget : public ProjectExplorer::Target { Q_OBJECT - friend class Internal::Qt4TargetFactory; - public: - explicit Qt4Target(Qt4Project *parent, const QString &id); - virtual ~Qt4Target(); + explicit Qt4BaseTarget(Qt4Project *parent, const QString &id); + virtual ~Qt4BaseTarget(); ProjectExplorer::BuildConfigWidget *createConfigWidget(); Qt4BuildConfiguration *activeBuildConfiguration() const; Qt4ProjectManager::Qt4Project *qt4Project() const; + // This is the same for almost all Qt4Targets + // so for now offer a convience function Qt4BuildConfiguration *addQt4BuildConfiguration(QString displayName, - QtVersion *qtversion, - QtVersion::QmakeBuildConfigs qmakeBuildConfiguration, - QString additionalArguments, - QString directory); - void addRunConfigurationForPath(const QString &proFilePath); - - Internal::Qt4BuildConfigurationFactory *buildConfigurationFactory() const; - ProjectExplorer::DeployConfigurationFactory *deployConfigurationFactory() const; - - QList<ProjectExplorer::ToolChainType> filterToolChainTypes(const QList<ProjectExplorer::ToolChainType> &candidates) const; - ProjectExplorer::ToolChainType preferredToolChainType(const QList<ProjectExplorer::ToolChainType> &candidates) const; - - QString defaultBuildDirectory() const; - static QString defaultShadowBuildDirectory(const QString &projectLocation, const QString &id); - - bool fromMap(const QVariantMap &map); - + QtVersion *qtversion, + QtVersion::QmakeBuildConfigs qmakeBuildConfiguration, + QString additionalArguments, + QString directory); + + virtual void createApplicationProFiles() = 0; + virtual QList<ProjectExplorer::ToolChainType> filterToolChainTypes(const QList<ProjectExplorer::ToolChainType> &candidates) const; + virtual ProjectExplorer::ToolChainType preferredToolChainType(const QList<ProjectExplorer::ToolChainType> &candidates) const; + virtual QString defaultBuildDirectory() 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::Qt4Target *); + void proFileEvaluateNeeded(Qt4ProjectManager::Qt4BaseTarget *); + +protected: + void removeUnconfiguredCustomExectutableRunConfigurations(); private slots: - void updateQtVersion(); void onAddedBuildConfiguration(ProjectExplorer::BuildConfiguration *bc); - void onAddedDeployConfiguration(ProjectExplorer::DeployConfiguration *dc); - void slotUpdateDeviceInformation(); void onProFileEvaluateNeeded(Qt4ProjectManager::Qt4BuildConfiguration *bc); void emitProFileEvaluateNeeded(); - void updateToolTipAndIcon(); - -private: - bool isSymbianConnectionAvailable(QString &tooltipText); - -private: - const QPixmap m_connectedPixmap; - const QPixmap m_disconnectedPixmap; - - Internal::Qt4BuildConfigurationFactory *m_buildConfigurationFactory; - Internal::Qt4DeployConfigurationFactory *m_deployConfigurationFactory; }; -namespace Internal { -class Qt4TargetFactory : public ProjectExplorer::ITargetFactory +class QT4PROJECTMANAGER_EXPORT Qt4BaseTargetFactory : public ProjectExplorer::ITargetFactory { Q_OBJECT - public: - Qt4TargetFactory(QObject *parent = 0); - ~Qt4TargetFactory(); + Qt4BaseTargetFactory(QObject *parent); + ~Qt4BaseTargetFactory(); - virtual bool supportsTargetId(const QString &id) const; + virtual QString defaultShadowBuildDirectory(const QString &projectLocation, const QString &id) =0; + virtual QList<BuildConfigurationInfo> availableBuildConfigurations(const QString &proFilePath) = 0; - QStringList availableCreationIds(ProjectExplorer::Project *parent) const; - QString displayNameForId(const QString &id) const; + virtual Qt4BaseTarget *create(ProjectExplorer::Project *parent, const QString &id) = 0; + virtual Qt4BaseTarget *create(ProjectExplorer::Project *parent, + const QString &id, + QList<BuildConfigurationInfo> infos) = 0; - bool canCreate(ProjectExplorer::Project *parent, const QString &id) const; - Qt4ProjectManager::Qt4Target *create(ProjectExplorer::Project *parent, const QString &id); - Qt4ProjectManager::Qt4Target *create(ProjectExplorer::Project *parent, const QString &id, QList<QtVersion *> versions); - Qt4ProjectManager::Qt4Target *create(ProjectExplorer::Project *parent, const QString &id, QList<Internal::BuildConfigurationInfo> infos); - bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const; - Qt4ProjectManager::Qt4Target *restore(ProjectExplorer::Project *parent, const QVariantMap &map); + static Qt4BaseTargetFactory *qt4BaseTargetFactoryForId(const QString &id); }; -} } // namespace Qt4ProjectManager diff --git a/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.cpp b/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.cpp index ecf8c2f5f6..4e307bd0bb 100644 --- a/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.cpp +++ b/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.cpp @@ -215,6 +215,7 @@ void AbstractMobileAppWizard::useProjectPath(const QString &projectName, app()->setProjectName(projectName); app()->setProjectPath(projectPath); wizardDialog()->m_targetsPage->setProFilePath(app()->path(AbstractMobileApp::AppPro)); + projectPathChanged(app()->path(AbstractMobileApp::AppPro)); } } // end of namespace Internal diff --git a/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.h b/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.h index 752c0c37ec..e198027262 100644 --- a/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.h +++ b/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.h @@ -99,6 +99,7 @@ private: virtual AbstractMobileApp *app() const=0; virtual AbstractMobileAppWizardDialog *wizardDialog() const=0; virtual AbstractMobileAppWizardDialog *createWizardDialogInternal(QWidget *parent) const=0; + virtual void projectPathChanged(const QString &path) const=0; virtual void prepareGenerateFiles(const QWizard *wizard, QString *errorMessage) const=0; virtual bool postGenerateFilesInternal(const Core::GeneratedFiles &l, diff --git a/src/plugins/qt4projectmanager/wizards/mobileappwizard.cpp b/src/plugins/qt4projectmanager/wizards/mobileappwizard.cpp index 4880601d4e..d8fbeea4ff 100644 --- a/src/plugins/qt4projectmanager/wizards/mobileappwizard.cpp +++ b/src/plugins/qt4projectmanager/wizards/mobileappwizard.cpp @@ -107,11 +107,15 @@ Core::BaseFileWizardParameters MobileAppWizard::parameters() AbstractMobileAppWizardDialog *MobileAppWizard::createWizardDialogInternal(QWidget *parent) const { m_d->wizardDialog = new MobileAppWizardDialog(parent); - m_d->wizardDialog->m_targetsPage->setImportInfos(TargetSetupPage::importInfosForKnownQtVersions()); m_d->wizardDialog->m_targetsPage->setPreferMobile(true); return m_d->wizardDialog; } +void MobileAppWizard::projectPathChanged(const QString &path) const +{ + m_d->wizardDialog->m_targetsPage->setImportInfos(TargetSetupPage::importInfosForKnownQtVersions(path)); +} + void MobileAppWizard::prepareGenerateFiles(const QWizard *w, QString *errorMessage) const { diff --git a/src/plugins/qt4projectmanager/wizards/mobileappwizard.h b/src/plugins/qt4projectmanager/wizards/mobileappwizard.h index 7491ef99b2..d6421ef883 100644 --- a/src/plugins/qt4projectmanager/wizards/mobileappwizard.h +++ b/src/plugins/qt4projectmanager/wizards/mobileappwizard.h @@ -53,6 +53,7 @@ private: virtual AbstractMobileApp *app() const; virtual AbstractMobileAppWizardDialog *wizardDialog() const; virtual AbstractMobileAppWizardDialog *createWizardDialogInternal(QWidget *parent) const; + virtual void projectPathChanged(const QString &path) const; virtual void prepareGenerateFiles(const QWizard *wizard, QString *errorMessage) const; virtual bool postGenerateFilesInternal(const Core::GeneratedFiles &l, diff --git a/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizard.cpp b/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizard.cpp index e9c38e911c..a1915f9643 100644 --- a/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizard.cpp +++ b/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizard.cpp @@ -117,8 +117,13 @@ Core::BaseFileWizardParameters QmlStandaloneAppWizard::parameters() AbstractMobileAppWizardDialog *QmlStandaloneAppWizard::createWizardDialogInternal(QWidget *parent) const { m_d->wizardDialog = new QmlStandaloneAppWizardDialog(parent); + return m_d->wizardDialog; +} + +void QmlStandaloneAppWizard::projectPathChanged(const QString &path) const +{ const QList<TargetSetupPage::ImportInfo> &qtVersions - = TargetSetupPage::importInfosForKnownQtVersions(); + = TargetSetupPage::importInfosForKnownQtVersions(path); QList<TargetSetupPage::ImportInfo> qmlQtVersions; foreach (const TargetSetupPage::ImportInfo &qtVersion, qtVersions) { const QString versionString = qtVersion.version->qtVersionString(); @@ -132,8 +137,6 @@ AbstractMobileAppWizardDialog *QmlStandaloneAppWizard::createWizardDialogInterna qmlQtVersions << qtVersion; } m_d->wizardDialog->m_targetsPage->setImportInfos(qmlQtVersions); - - return m_d->wizardDialog; } void QmlStandaloneAppWizard::prepareGenerateFiles(const QWizard *w, diff --git a/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizard.h b/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizard.h index 1eac5f18e7..666ef94610 100644 --- a/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizard.h +++ b/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizard.h @@ -53,6 +53,7 @@ private: virtual AbstractMobileApp *app() const; virtual AbstractMobileAppWizardDialog *wizardDialog() const; virtual AbstractMobileAppWizardDialog *createWizardDialogInternal(QWidget *parent) const; + virtual void projectPathChanged(const QString &path) const; virtual void prepareGenerateFiles(const QWizard *wizard, QString *errorMessage) const; virtual bool postGenerateFilesInternal(const Core::GeneratedFiles &l, diff --git a/src/plugins/qt4projectmanager/wizards/qtwizard.cpp b/src/plugins/qt4projectmanager/wizards/qtwizard.cpp index 6630f59624..dc7a3a53f0 100644 --- a/src/plugins/qt4projectmanager/wizards/qtwizard.cpp +++ b/src/plugins/qt4projectmanager/wizards/qtwizard.cpp @@ -237,12 +237,13 @@ int BaseQt4ProjectWizardDialog::addModulesPage(int id) int BaseQt4ProjectWizardDialog::addTargetSetupPage(QSet<QString> targets, bool mobile, int id) { m_targetSetupPage = new TargetSetupPage; + m_targets = targets; resize(900, 450); connect(this, SIGNAL(projectLocationChanged(QString)), m_targetSetupPage, SLOT(setProFilePath(QString))); - QList<TargetSetupPage::ImportInfo> infos = TargetSetupPage::importInfosForKnownQtVersions(); + QList<TargetSetupPage::ImportInfo> infos = TargetSetupPage::importInfosForKnownQtVersions(path()); if (!targets.isEmpty()) infos = TargetSetupPage::filterImportInfos(targets, infos); m_targetSetupPage->setImportDirectoryBrowsingEnabled(false); @@ -323,6 +324,10 @@ bool BaseQt4ProjectWizardDialog::isTargetSelected(const QString &targetid) const void BaseQt4ProjectWizardDialog::generateProfileName(const QString &name, const QString &path) { const QString proFile = QDir::fromNativeSeparators(path) + QChar('/') + name + QChar('/') + name + QLatin1String(".pro"); + QList<TargetSetupPage::ImportInfo> infos = TargetSetupPage::importInfosForKnownQtVersions(proFile); + if (!m_targets.isEmpty()) + infos = TargetSetupPage::filterImportInfos(m_targets, infos); + m_targetSetupPage->setImportInfos(infos); emit projectLocationChanged(proFile); } diff --git a/src/plugins/qt4projectmanager/wizards/qtwizard.h b/src/plugins/qt4projectmanager/wizards/qtwizard.h index 2871e7ae8b..a0a507bee2 100644 --- a/src/plugins/qt4projectmanager/wizards/qtwizard.h +++ b/src/plugins/qt4projectmanager/wizards/qtwizard.h @@ -159,6 +159,7 @@ private: TargetSetupPage *m_targetSetupPage; QString m_selectedModules; QString 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 fc0e1915d2..b6d4bf0cbb 100644 --- a/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp +++ b/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp @@ -85,8 +85,6 @@ TargetSetupPage::TargetSetupPage(QWidget *parent) : this, SLOT(addShadowBuildLocation())); connect(m_ui->uncheckButton, SIGNAL(clicked()), this, SLOT(checkAllButtonClicked())); - connect(m_ui->versionTree, SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)), - this, SLOT(handleDoubleClicks(QTreeWidgetItem*,int))); connect(m_ui->versionTree, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(contextMenuRequested(QPoint))); @@ -128,7 +126,7 @@ void TargetSetupPage::setImportInfos(const QList<ImportInfo> &infos) m_infos.clear(); // Find possible targets: - QStringList targets; + QStringList targetIds; foreach (const ImportInfo &i, infos) { // Make sure we have no duplicate directories: bool skip = false; @@ -148,28 +146,42 @@ void TargetSetupPage::setImportInfos(const QList<ImportInfo> &infos) QSet<QString> versionTargets = i.version->supportedTargetIds(); foreach (const QString &t, versionTargets) { - if (!targets.contains(t)) - targets.append(t); + if (!targetIds.contains(t)) + targetIds.append(t); } } - qSort(targets.begin(), targets.end()); + qSort(targetIds.begin(), targetIds.end()); m_ui->versionTree->clear(); - Qt4TargetFactory factory; - foreach (const QString &t, targets) { + + foreach (const QString &targetId, targetIds) { QTreeWidgetItem *targetItem = new QTreeWidgetItem(m_ui->versionTree); - const QString targetName = factory.displayNameForId(t); - targetItem->setText(NAME_COLUMN, targetName); - targetItem->setToolTip(NAME_COLUMN, targetName); + + Qt4BaseTargetFactory *factory = 0; + QList<Qt4BaseTargetFactory *> factories = + ExtensionSystem::PluginManager::instance()->getObjects<Qt4BaseTargetFactory>(); + foreach (Qt4BaseTargetFactory *fac, factories) { + if (fac->supportsTargetId(targetId)) { + factory = fac; + break; + } + } + if (!factory) + continue; + + QString displayName = factory->displayNameForId(targetId); + + targetItem->setText(0, displayName); + targetItem->setToolTip(0, displayName); targetItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); - targetItem->setData(NAME_COLUMN, Qt::UserRole, t); + targetItem->setData(NAME_COLUMN, Qt::UserRole, targetId); targetItem->setExpanded(true); int pos = -1; foreach (const ImportInfo &i, m_infos) { ++pos; - if (!i.version->supportsTargetId(t)) + if (!i.version->supportsTargetId(targetId)) continue; QTreeWidgetItem *versionItem = new QTreeWidgetItem(targetItem); updateVersionItem(versionItem, pos); @@ -236,58 +248,70 @@ bool TargetSetupPage::setupProject(Qt4ProjectManager::Qt4Project *project) { Q_ASSERT(project->targets().isEmpty()); QtVersionManager *vm = QtVersionManager::instance(); - - // TODO remove again - Qt4TargetFactory *factory = - ExtensionSystem::PluginManager::instance()->getObject<Qt4TargetFactory>(); - for (int i = 0; i < m_ui->versionTree->topLevelItemCount(); ++i) { QTreeWidgetItem *current = m_ui->versionTree->topLevelItem(i); QString targetId = current->data(NAME_COLUMN, Qt::UserRole).toString(); - QList<BuildConfigurationInfo> targetInfos; - for (int j = 0; j < current->childCount(); ++j) { - QTreeWidgetItem *child = current->child(j); - if (child->checkState(0) != Qt::Checked) - continue; - - ImportInfo &info = m_infos[child->data(NAME_COLUMN, Qt::UserRole).toInt()]; + Qt4BaseTargetFactory *qt4TargetFactory = Qt4BaseTargetFactory::qt4BaseTargetFactoryForId(targetId); + if (qt4TargetFactory && qt4TargetFactory->canCreate(project, targetId)) { + QList<BuildConfigurationInfo> targetInfos; + for (int j = 0; j < current->childCount(); ++j) { + QTreeWidgetItem *child = current->child(j); + if (child->checkState(0) != Qt::Checked) + continue; + ImportInfo &info = m_infos[child->data(0, Qt::UserRole).toInt()]; + + // Register temporary Qt version + if (info.isTemporary) { + vm->addVersion(info.version); + info.isTemporary = false; + } - // Register temporary Qt version - if (info.isTemporary) { - vm->addVersion(info.version); - info.isTemporary = false; + targetInfos.append(BuildConfigurationInfo(info.version, info.buildConfig, + info.additionalArguments, info.directory)); } - QString directory = info.directory; - if (!info.isShadowBuild) - directory = project->projectDirectory(); + // create the target: + Qt4BaseTarget *target = 0; + if (!targetInfos.isEmpty()) { + target = qt4TargetFactory->create(project, targetId, targetInfos); + } - // we want to havbe two BCs set up, one to build debug, the other to build release. - targetInfos.append(BuildConfigurationInfo(info.version, info.buildConfig, - info.additionalArguments, directory)); - targetInfos.append(BuildConfigurationInfo(info.version, info.buildConfig ^ QtVersion::DebugBuild, - info.additionalArguments, directory)); + if (target) { + project->addTarget(target); + if (target->id() == QLatin1String(Constants::QT_SIMULATOR_TARGET_ID)) + project->setActiveTarget(target); + } } + } - // create the target: - Qt4Target *target = 0; - if (!targetInfos.isEmpty()) - target = factory->create(project, targetId, targetInfos); - if (target) { - project->addTarget(target); - if (target->id() == QLatin1String(Constants::QT_SIMULATOR_TARGET_ID)) - project->setActiveTarget(target); + // Create a desktop target if nothing else was set up: + if (project->targets().isEmpty()) { + Qt4BaseTargetFactory *tf = Qt4BaseTargetFactory::qt4BaseTargetFactoryForId(Constants::DESKTOP_TARGET_ID); + if (tf) { + Qt4BaseTarget *target = tf->create(project, Constants::DESKTOP_TARGET_ID); + if (target) + project->addTarget(target); } } - // Create the default target if nothing else was set up: - if (project->targets().isEmpty()) { - Qt4Target *target = factory->create(project, Constants::DESKTOP_TARGET_ID); - if (target) - project->addTarget(target); + // Select active target + // a) Simulator target + // b) Desktop target + // c) the first target + ProjectExplorer::Target *activeTarget = 0; + QList<ProjectExplorer::Target *> targets = project->targets(); + foreach (ProjectExplorer::Target *t, targets) { + if (t->id() == Constants::QT_SIMULATOR_TARGET_ID) + activeTarget = t; + else if (!activeTarget && t->id() == Constants::DESKTOP_TARGET_ID) + activeTarget = t; } + if (!activeTarget && !targets.isEmpty()) + activeTarget = targets.first(); + if (activeTarget) + project->setActiveTarget(activeTarget); return !project->targets().isEmpty(); } @@ -330,24 +354,31 @@ void TargetSetupPage::setProFilePath(const QString &path) setImportInfos(tmp); } -QList<TargetSetupPage::ImportInfo> TargetSetupPage::importInfosForKnownQtVersions() +QList<TargetSetupPage::ImportInfo> TargetSetupPage::importInfosForKnownQtVersions(const QString &proFilePath) { - QList<ImportInfo> results; - QtVersionManager * vm = QtVersionManager::instance(); - QList<QtVersion *> validVersions = vm->validVersions(); - // Fallback in case no valid versions are found: - if (validVersions.isEmpty()) - validVersions.append(vm->versions().at(0)); // there is always one! - foreach (QtVersion *v, validVersions) { + QList<Qt4BaseTargetFactory *> factories = + ExtensionSystem::PluginManager::instance()->getObjects<Qt4BaseTargetFactory>(); + + QList<BuildConfigurationInfo> bcinfos; + + foreach(Qt4BaseTargetFactory *fac, factories) + bcinfos.append(fac->availableBuildConfigurations(proFilePath)); + + QList<ImportInfo> infos; + foreach (const BuildConfigurationInfo &info, bcinfos) { + infos.append(ImportInfo(info)); + } + + if (infos.isEmpty()) { + // Fallback to the Qt in Path version ImportInfo info; info.isExistingBuild = false; info.isTemporary = false; - info.isShadowBuild = v->supportsShadowBuilds(); - info.version = v; - info.buildConfig = v->defaultBuildConfig(); - results.append(info); + info.version = QtVersionManager::instance()->versions().at(0); + info.buildConfig = info.version->defaultBuildConfig(); + infos.append(info); } - return results; + return infos; } QList<TargetSetupPage::ImportInfo> TargetSetupPage::filterImportInfos(const QSet<QString> &validTargets, @@ -372,7 +403,8 @@ TargetSetupPage::scanDefaultProjectDirectories(Qt4ProjectManager::Qt4Project *pr project->file()->fileName()); QtVersionManager *vm = QtVersionManager::instance(); foreach(const QString &id, vm->supportedTargetIds()) { - QString location = Qt4Target::defaultShadowBuildDirectory(project->defaultTopLevelBuildDirectory(), id); + Qt4BaseTargetFactory *qt4Factory = Qt4BaseTargetFactory::qt4BaseTargetFactoryForId(id); + QString location = qt4Factory->defaultShadowBuildDirectory(project->defaultTopLevelBuildDirectory(), id); importVersions.append(TargetSetupPage::recursivelyCheckDirectoryForBuild(location, project->file()->fileName())); } @@ -404,7 +436,6 @@ TargetSetupPage::recursivelyCheckDirectoryForBuild(const QString &directory, con QtVersionManager * vm = QtVersionManager::instance(); TargetSetupPage::ImportInfo info; info.directory = dir.absolutePath(); - info.isShadowBuild = (info.directory != QFileInfo(proFile).absolutePath()); // This also means we have a build in there // First get the qt version @@ -513,17 +544,6 @@ void TargetSetupPage::checkOneTriggered() checkOne(true, item); } -void TargetSetupPage::handleDoubleClicks(QTreeWidgetItem *item, int column) -{ - int idx = item->data(NAME_COLUMN, Qt::UserRole).toInt(); - if (column == DIRECTORY_COLUMN && item->parent()) { - if (m_infos[idx].isExistingBuild || !m_infos[idx].version->supportsShadowBuilds()) - return; - m_infos[idx].isShadowBuild = !m_infos[idx].isShadowBuild; - updateVersionItem(item, idx); - } -} - void TargetSetupPage::contextMenuRequested(const QPoint &position) { m_contextMenu->clear(); @@ -596,18 +616,7 @@ QPair<QIcon, QString> TargetSetupPage::reportIssues(Qt4ProjectManager::QtVersion void TargetSetupPage::updateVersionItem(QTreeWidgetItem *versionItem, int index) { ImportInfo &info = m_infos[index]; - const QString target = versionItem->parent()->data(NAME_COLUMN, Qt::UserRole).toString(); - QString dir; - if (info.directory.isEmpty()) { - Q_ASSERT(!info.isTemporary && !info.isExistingBuild); - if (info.isShadowBuild) - dir = Qt4Target::defaultShadowBuildDirectory(Qt4Project::defaultTopLevelBuildDirectory(m_proFilePath), target); - else - dir = Qt4Project::projectDirectory(m_proFilePath); - } else { - dir = info.directory; - } - QPair<QIcon, QString> issues = reportIssues(info.version, dir); + QPair<QIcon, QString> issues = reportIssues(info.version, info.directory); //: We are going to build debug and release QString buildType = tr("debug and release"); @@ -631,7 +640,7 @@ void TargetSetupPage::updateVersionItem(QTreeWidgetItem *versionItem, int index) // Column 0: versionItem->setToolTip(NAME_COLUMN, toolTip); versionItem->setIcon(NAME_COLUMN, issues.first); - versionItem->setText(NAME_COLUMN, info.version->displayName()); + versionItem->setText(NAME_COLUMN, info.version->displayName() + " " + buildType); versionItem->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable); versionItem->setData(NAME_COLUMN, Qt::UserRole, index); @@ -646,6 +655,6 @@ void TargetSetupPage::updateVersionItem(QTreeWidgetItem *versionItem, int index) // Column 2 (directory): Q_ASSERT(versionItem->parent()); - versionItem->setText(DIRECTORY_COLUMN, QDir::toNativeSeparators(dir)); - versionItem->setToolTip(DIRECTORY_COLUMN, QDir::toNativeSeparators(dir)); + versionItem->setText(DIRECTORY_COLUMN, QDir::toNativeSeparators(info.directory)); + versionItem->setToolTip(DIRECTORY_COLUMN, QDir::toNativeSeparators(info.directory)); } diff --git a/src/plugins/qt4projectmanager/wizards/targetsetuppage.h b/src/plugins/qt4projectmanager/wizards/targetsetuppage.h index 257a333f10..47b9c847b8 100644 --- a/src/plugins/qt4projectmanager/wizards/targetsetuppage.h +++ b/src/plugins/qt4projectmanager/wizards/targetsetuppage.h @@ -34,6 +34,7 @@ #ifndef TARGETSETUPPAGE_H #define TARGETSETUPPAGE_H +#include "qt4target.h" #include "qtversionmanager.h" #include <QtCore/QList> @@ -71,21 +72,28 @@ public: version(0), isTemporary(false), buildConfig(QtVersion::QmakeBuildConfig(0)), - isExistingBuild(false), - isShadowBuild(false) + isExistingBuild(false) { if (version && version->isValid()) buildConfig = version->defaultBuildConfig(); } + ImportInfo(const BuildConfigurationInfo &source) + : version(source.version), + isTemporary(false), + buildConfig(source.buildConfig), + additionalArguments(source.additionalArguments), + directory(source.directory), + isExistingBuild(false) + {} + ImportInfo(const ImportInfo &other) : version(other.version), isTemporary(other.isTemporary), buildConfig(other.buildConfig), additionalArguments(other.additionalArguments), directory(other.directory), - isExistingBuild(other.isExistingBuild), - isShadowBuild(other.isShadowBuild) + isExistingBuild(other.isExistingBuild) { } QtVersion *version; @@ -94,7 +102,6 @@ public: QString additionalArguments; QString directory; bool isExistingBuild; - bool isShadowBuild; }; explicit TargetSetupPage(QWidget* parent = 0); @@ -109,7 +116,7 @@ public: void setImportDirectoryBrowsingLocation(const QString &directory); void setPreferMobile(bool mobile); - static QList<ImportInfo> importInfosForKnownQtVersions(); + static QList<ImportInfo> importInfosForKnownQtVersions(const QString &proFilePath); static QList<ImportInfo> filterImportInfos(const QSet<QString> &validTargets, const QList<ImportInfo> &infos); @@ -135,7 +142,6 @@ private slots: void uncheckAllTriggered(); void checkOneTriggered(); void addShadowBuildLocation(); - void handleDoubleClicks(QTreeWidgetItem *, int); void contextMenuRequested(const QPoint & pos); private: |