From 2b31dbadcf2eb95248cd55bfe028fb419e48099c Mon Sep 17 00:00:00 2001
From: dt_ <qtc-committer@nokia.com>
Date: Fri, 10 Jun 2011 15:37:10 +0200
Subject: [PATCH] Add a disabled reason to the display of runconfigurations

Also distinguish between qt runconfigurations that are disabled
due to parsing and due to not being parseable

Change-Id: Ia8ce4eaa7b6bfcc2c5290b254bb288c6d4892170
Task-Nr: QTCREATORBUG-5103
Reviewed-on: http://codereview.qt.nokia.com/451
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Daniel Teske <daniel.teske@nokia.com>
Reviewed-by: Christian Kandeler <christian.kandeler@nokia.com>
---
 .../qt-desktop/qt4runconfiguration.cpp        | 64 +++++++++++--------
 .../qt-desktop/qt4runconfiguration.h          | 10 +--
 .../qt-s60/s60deployconfiguration.cpp         | 13 ++--
 .../qt-s60/s60deployconfiguration.h           |  1 +
 .../qt-s60/s60devicerunconfiguration.cpp      | 41 +++++-------
 .../qt-s60/s60devicerunconfiguration.h        |  5 +-
 .../s60devicerunconfigurationwidget.cpp       | 19 +++++-
 .../qt-s60/s60devicerunconfigurationwidget.h  |  3 +
 .../qt-s60/s60emulatorrunconfiguration.cpp    | 60 +++++++++--------
 .../qt-s60/s60emulatorrunconfiguration.h      |  7 +-
 src/plugins/qt4projectmanager/qt4nodes.cpp    | 47 ++++++--------
 src/plugins/qt4projectmanager/qt4nodes.h      |  6 +-
 src/plugins/qt4projectmanager/qt4project.cpp  | 19 ++++--
 src/plugins/qt4projectmanager/qt4project.h    |  4 +-
 src/plugins/remotelinux/maemodeployables.cpp  | 19 ++++--
 src/plugins/remotelinux/maemodeployables.h    |  3 +
 .../maemorunconfigurationwidget.cpp           | 31 +++++++--
 .../remotelinux/maemorunconfigurationwidget.h |  4 ++
 .../remotelinuxrunconfiguration.cpp           | 47 +++++++-------
 .../remotelinux/remotelinuxrunconfiguration.h |  4 +-
 20 files changed, 235 insertions(+), 172 deletions(-)

diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4runconfiguration.cpp b/src/plugins/qt4projectmanager/qt-desktop/qt4runconfiguration.cpp
index 8dd9c2a47d6..534f0d5b940 100644
--- a/src/plugins/qt4projectmanager/qt-desktop/qt4runconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt-desktop/qt4runconfiguration.cpp
@@ -105,7 +105,8 @@ Qt4RunConfiguration::Qt4RunConfiguration(Qt4BaseTarget *parent, const QString &p
     m_runMode(Gui),
     m_isUsingDyldImageSuffix(false),
     m_baseEnvironmentBase(Qt4RunConfiguration::BuildEnvironmentBase),
-    m_parseSuccess(parent->qt4Project()->validParse(m_proFilePath))
+    m_parseSuccess(parent->qt4Project()->validParse(m_proFilePath)),
+    m_parseInProgress(parent->qt4Project()->parseInProgress(m_proFilePath))
 {
     ctor();
 }
@@ -119,7 +120,8 @@ Qt4RunConfiguration::Qt4RunConfiguration(Qt4BaseTarget *parent, Qt4RunConfigurat
     m_userWorkingDirectory(source->m_userWorkingDirectory),
     m_userEnvironmentChanges(source->m_userEnvironmentChanges),
     m_baseEnvironmentBase(source->m_baseEnvironmentBase),
-    m_parseSuccess(source->m_parseSuccess)
+    m_parseSuccess(source->m_parseSuccess),
+    m_parseInProgress(source->m_parseInProgress)
 {
     ctor();
 }
@@ -135,38 +137,33 @@ Qt4DesktopTarget *Qt4RunConfiguration::qt4Target() const
 
 bool Qt4RunConfiguration::isEnabled() const
 {
-    return m_parseSuccess;
+    return m_parseSuccess && !m_parseInProgress;
 }
 
 QString Qt4RunConfiguration::disabledReason() const
 {
+    if (m_parseInProgress)
+        return tr("The .pro file is currently being parsed.");
     if (!m_parseSuccess)
-        return tr("The .pro file could not be parsed");
+        return tr("The .pro file could not be parsed.");
     return QString();
 }
 
-void Qt4RunConfiguration::handleParseState(bool success)
+void Qt4RunConfiguration::proFileUpdated(Qt4ProjectManager::Qt4ProFileNode *pro, bool success, bool parseInProgress)
 {
+    if (m_proFilePath != pro->path())
+        return;
+
     bool enabled = isEnabled();
     m_parseSuccess = success;
+    m_parseInProgress = parseInProgress;
     if (enabled != isEnabled())
         emit isEnabledChanged(!enabled);
-}
 
-void Qt4RunConfiguration::proFileUpdated(Qt4ProjectManager::Qt4ProFileNode *pro, bool success)
-{
-    if (m_proFilePath != pro->path())
-        return;
-    handleParseState(success);
-    emit effectiveTargetInformationChanged();
-    emit baseEnvironmentChanged();
-}
-
-void Qt4RunConfiguration::proFileInvalidated(Qt4ProjectManager::Qt4ProFileNode *pro)
-{
-    if (pro->path() != m_proFilePath)
-        return;
-    handleParseState(false);
+    if (!parseInProgress) {
+        emit effectiveTargetInformationChanged();
+        emit baseEnvironmentChanged();
+    }
 }
 
 void Qt4RunConfiguration::ctor()
@@ -175,11 +172,8 @@ void Qt4RunConfiguration::ctor()
 
     connect(qt4Target(), SIGNAL(environmentChanged()),
             this, SIGNAL(baseEnvironmentChanged()));
-    connect(qt4Target()->qt4Project(), SIGNAL(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode*,bool)),
-            this, SLOT(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode*,bool)));
-
-    connect(qt4Target()->qt4Project(), SIGNAL(proFileInvalidated(Qt4ProjectManager::Qt4ProFileNode*)),
-            this, SLOT(proFileInvalidated(Qt4ProjectManager::Qt4ProFileNode*)));
+    connect(qt4Target()->qt4Project(), SIGNAL(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode*,bool,bool)),
+            this, SLOT(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode*,bool,bool)));
 }
 
 //////
@@ -196,6 +190,17 @@ Qt4RunConfigurationWidget::Qt4RunConfigurationWidget(Qt4RunConfiguration *qt4Run
     QVBoxLayout *vboxTopLayout = new QVBoxLayout(this);
     vboxTopLayout->setMargin(0);
 
+    QHBoxLayout *hl = new QHBoxLayout();
+    hl->addStretch();
+    m_disabledIcon = new QLabel(this);
+    m_disabledIcon->setPixmap(QPixmap(QString::fromUtf8(":/projectexplorer/images/compile_warning.png")));
+    hl->addWidget(m_disabledIcon);
+    m_disabledReason = new QLabel(this);
+    m_disabledReason->setVisible(false);
+    hl->addWidget(m_disabledReason);
+    hl->addStretch();
+    vboxTopLayout->addLayout(hl);
+
     m_detailsContainer = new Utils::DetailsWidget(this);
     m_detailsContainer->setState(Utils::DetailsWidget::NoSummary);
     vboxTopLayout->addWidget(m_detailsContainer);
@@ -285,7 +290,7 @@ Qt4RunConfigurationWidget::Qt4RunConfigurationWidget(Qt4RunConfiguration *qt4Run
     m_environmentWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
     vboxTopLayout->addWidget(m_environmentWidget);
 
-    setEnabled(m_qt4RunConfiguration->isEnabled());
+    runConfigurationEnabledChange(m_qt4RunConfiguration->isEnabled());
 
     connect(m_workingDirectoryEdit, SIGNAL(changed(QString)),
             this, SLOT(workDirectoryEdited()));
@@ -387,7 +392,11 @@ void Qt4RunConfigurationWidget::userChangesEdited()
 
 void Qt4RunConfigurationWidget::runConfigurationEnabledChange(bool enabled)
 {
-    setEnabled(enabled);
+    m_detailsContainer->setEnabled(enabled);
+    m_environmentWidget->setEnabled(enabled);
+    m_disabledIcon->setVisible(!enabled);
+    m_disabledReason->setVisible(!enabled);
+    m_disabledReason->setText(m_qt4RunConfiguration->disabledReason());
 }
 
 void Qt4RunConfigurationWidget::workDirectoryEdited()
@@ -510,6 +519,7 @@ bool Qt4RunConfiguration::fromMap(const QVariantMap &map)
     m_baseEnvironmentBase = static_cast<BaseEnvironmentBase>(map.value(QLatin1String(BASE_ENVIRONMENT_BASE_KEY), static_cast<int>(Qt4RunConfiguration::BuildEnvironmentBase)).toInt());
 
     m_parseSuccess = qt4Target()->qt4Project()->validParse(m_proFilePath);
+    m_parseInProgress = qt4Target()->qt4Project()->parseInProgress(m_proFilePath);
 
     return RunConfiguration::fromMap(map);
 }
diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4runconfiguration.h b/src/plugins/qt4projectmanager/qt-desktop/qt4runconfiguration.h
index 5548d99980b..0b2a18fbcd9 100644
--- a/src/plugins/qt4projectmanager/qt-desktop/qt4runconfiguration.h
+++ b/src/plugins/qt4projectmanager/qt-desktop/qt4runconfiguration.h
@@ -38,8 +38,9 @@
 #include <utils/environment.h>
 
 #include <QtCore/QStringList>
-#include <QtGui/QWidget>
 #include <QtCore/QMetaType>
+#include <QtGui/QLabel>
+#include <QtGui/QWidget>
 
 QT_BEGIN_NAMESPACE
 class QCheckBox;
@@ -117,15 +118,13 @@ signals:
     void effectiveTargetInformationChanged();
 
 private slots:
-    void proFileUpdated(Qt4ProjectManager::Qt4ProFileNode *pro, bool success);
-    void proFileInvalidated(Qt4ProjectManager::Qt4ProFileNode *pro);
+    void proFileUpdated(Qt4ProjectManager::Qt4ProFileNode *pro, bool success, bool parseInProgress);
 
 protected:
     Qt4RunConfiguration(Qt4BaseTarget *parent, Qt4RunConfiguration *source);
     virtual bool fromMap(const QVariantMap &map);
 
 private:
-    void handleParseState(bool success);
     void setBaseWorkingDirectory(const QString &workingDirectory);
     QString baseWorkingDirectory() const;
     void setCommandLineArguments(const QString &argumentsString);
@@ -156,6 +155,7 @@ private:
     QList<Utils::EnvironmentItem> m_userEnvironmentChanges;
     BaseEnvironmentBase m_baseEnvironmentBase;
     bool m_parseSuccess;
+    bool m_parseInProgress;
 };
 
 class Qt4RunConfigurationWidget : public QWidget
@@ -195,6 +195,8 @@ private slots:
 private:
     Qt4RunConfiguration *m_qt4RunConfiguration;
     bool m_ignoreChange;
+    QLabel *m_disabledIcon;
+    QLabel *m_disabledReason;
     QLineEdit *m_executableLineEdit;
     Utils::PathChooser *m_workingDirectoryEdit;
     QLineEdit *m_argumentsLineEdit;
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.cpp
index f79ece25a53..84eee1b0563 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.cpp
@@ -113,10 +113,8 @@ void S60DeployConfiguration::ctor()
     setDefaultDisplayName(defaultDisplayName());
     // TODO disable S60 Deploy Configuration while parsing
     // requires keeping track of the parsing state of the project
-//    connect(qt4Target()->qt4Project(), SIGNAL(proFileInvalidated(Qt4ProjectManager::Qt4ProFileNode*)),
-//            this, SLOT(targetInformationInvalidated()));
-    connect(qt4Target()->qt4Project(), SIGNAL(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode*,bool)),
-            this, SIGNAL(targetInformationChanged()));
+    connect(qt4Target()->qt4Project(), SIGNAL(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode*,bool, bool)),
+            this, SLOT(slotTargetInformationChanged(bool,bool)));
     connect(qt4Target(), SIGNAL(activeBuildConfigurationChanged(ProjectExplorer::BuildConfiguration*)),
             this, SLOT(updateActiveBuildConfiguration(ProjectExplorer::BuildConfiguration*)));
     connect(qt4Target(), SIGNAL(activeRunConfigurationChanged(ProjectExplorer::RunConfiguration*)),
@@ -133,6 +131,13 @@ ProjectExplorer::DeployConfigurationWidget *S60DeployConfiguration::configuratio
     return new S60DeployConfigurationWidget();
 }
 
+void S60DeployConfiguration::slotTargetInformationChanged(bool success, bool parseInProgress)
+{
+    Q_UNUSED(success)
+    if (!parseInProgress)
+        emit targetInformationChanged();
+}
+
 bool S60DeployConfiguration::isStaticLibrary(const Qt4ProFileNode &projectNode) const
 {
     if (projectNode.projectType() == LibraryTemplate) {
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.h b/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.h
index 606695cadd6..f82b655f121 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.h
+++ b/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.h
@@ -115,6 +115,7 @@ signals:
     void installationDriveChanged();
 
 private slots:
+    void slotTargetInformationChanged(bool success, bool parseInProgress);
     void updateActiveBuildConfiguration(ProjectExplorer::BuildConfiguration *buildConfiguration);
     void updateActiveRunConfiguration(ProjectExplorer::RunConfiguration *runConfiguration);
 
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp
index 742fa97171c..2e6d8ea616a 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp
@@ -73,7 +73,8 @@ QString pathFromId(const QString &id)
 S60DeviceRunConfiguration::S60DeviceRunConfiguration(Qt4BaseTarget *parent, const QString &proFilePath) :
     RunConfiguration(parent,  QLatin1String(S60_DEVICE_RC_ID)),
     m_proFilePath(proFilePath),
-    m_validParse(parent->qt4Project()->validParse(proFilePath))
+    m_validParse(parent->qt4Project()->validParse(proFilePath)),
+    m_parseInProgress(parent->qt4Project()->parseInProgress(proFilePath))
 {
     ctor();
 }
@@ -82,7 +83,8 @@ S60DeviceRunConfiguration::S60DeviceRunConfiguration(Qt4BaseTarget *target, S60D
     RunConfiguration(target, source),
     m_proFilePath(source->m_proFilePath),
     m_commandLineArguments(source->m_commandLineArguments),
-    m_validParse(source->m_validParse)
+    m_validParse(source->m_validParse),
+    m_parseInProgress(source->m_parseInProgress)
 {
     ctor();
 }
@@ -97,33 +99,21 @@ void S60DeviceRunConfiguration::ctor()
         setDefaultDisplayName(tr("Run on Symbian device"));
 
     Qt4Project *pro = qt4Target()->qt4Project();
-    connect(pro, SIGNAL(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode*,bool)),
-            this, SLOT(proFileUpdate(Qt4ProjectManager::Qt4ProFileNode*,bool)));
-    connect(pro, SIGNAL(proFileInvalidated(Qt4ProjectManager::Qt4ProFileNode *)),
-            this, SLOT(proFileInvalidated(Qt4ProjectManager::Qt4ProFileNode *)));
+    connect(pro, SIGNAL(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode*,bool,bool)),
+            this, SLOT(proFileUpdate(Qt4ProjectManager::Qt4ProFileNode*,bool,bool)));
 }
 
-void S60DeviceRunConfiguration::handleParserState(bool success)
+void S60DeviceRunConfiguration::proFileUpdate(Qt4ProjectManager::Qt4ProFileNode *pro, bool success, bool parseInProgress)
 {
+    if (m_proFilePath != pro->path())
+        return;
     bool enabled = isEnabled();
     m_validParse = success;
+    m_parseInProgress = parseInProgress;
     if (enabled != isEnabled())
         emit isEnabledChanged(!enabled);
-}
-
-void S60DeviceRunConfiguration::proFileInvalidated(Qt4ProjectManager::Qt4ProFileNode *pro)
-{
-    if (m_proFilePath != pro->path())
-        return;
-    handleParserState(false);
-}
-
-void S60DeviceRunConfiguration::proFileUpdate(Qt4ProjectManager::Qt4ProFileNode *pro, bool success)
-{
-    if (m_proFilePath != pro->path())
-        return;
-    handleParserState(success);
-    emit targetInformationChanged();
+    if (!parseInProgress)
+        emit targetInformationChanged();
 }
 
 S60DeviceRunConfiguration::~S60DeviceRunConfiguration()
@@ -137,13 +127,15 @@ Qt4SymbianTarget *S60DeviceRunConfiguration::qt4Target() const
 
 bool S60DeviceRunConfiguration::isEnabled() const
 {
-    return m_validParse;
+    return m_validParse && !m_parseInProgress;
 }
 
 QString S60DeviceRunConfiguration::disabledReason() const
 {
+    if (m_parseInProgress)
+        return tr("The .pro file is currently being parsed.");
     if (!m_validParse)
-        return tr("The .pro file could not be parsed");
+        return tr("The .pro file could not be parsed.");
     return QString();
 }
 
@@ -181,6 +173,7 @@ bool S60DeviceRunConfiguration::fromMap(const QVariantMap &map)
         return false;
 
     m_validParse = qt4Target()->qt4Project()->validParse(m_proFilePath);
+    m_parseInProgress = qt4Target()->qt4Project()->parseInProgress(m_proFilePath);
 
     setDefaultDisplayName(tr("%1 on Symbian Device").arg(QFileInfo(m_proFilePath).completeBaseName()));
 
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h
index 88e8f037a2d..c69031b77d9 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h
+++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h
@@ -94,18 +94,17 @@ protected:
     virtual bool fromMap(const QVariantMap &map);
 
 private slots:
-    void proFileInvalidated(Qt4ProjectManager::Qt4ProFileNode *pro);
-    void proFileUpdate(Qt4ProjectManager::Qt4ProFileNode *pro, bool success);
+    void proFileUpdate(Qt4ProjectManager::Qt4ProFileNode *pro, bool success, bool parseInProgress);
 
 private:
     void ctor();
-    void handleParserState(bool success);
     Internal::Qt4SymbianTarget *qt4Target() const;
     Internal::SymbianQtVersion *qtVersion() const;
 
     QString m_proFilePath;
     QString m_commandLineArguments;
     bool m_validParse;
+    bool m_parseInProgress;
 };
 
 class S60DeviceRunConfigurationFactory : public ProjectExplorer::IRunConfigurationFactory
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfigurationwidget.cpp b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfigurationwidget.cpp
index 8ea728956d6..219692fbe7b 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfigurationwidget.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfigurationwidget.cpp
@@ -56,6 +56,18 @@ S60DeviceRunConfigurationWidget::S60DeviceRunConfigurationWidget(
     m_detailsWidget->setState(Utils::DetailsWidget::NoSummary);
     QVBoxLayout *mainBoxLayout = new QVBoxLayout();
     mainBoxLayout->setMargin(0);
+
+    QHBoxLayout *hl = new QHBoxLayout();
+    hl->addStretch();
+    m_disabledIcon = new QLabel(this);
+    m_disabledIcon->setPixmap(QPixmap(QString::fromUtf8(":/projectexplorer/images/compile_warning.png")));
+    hl->addWidget(m_disabledIcon);
+    m_disabledReason = new QLabel(this);
+    m_disabledReason->setVisible(false);
+    hl->addWidget(m_disabledReason);
+    hl->addStretch();
+    mainBoxLayout->addLayout(hl);
+
     setLayout(mainBoxLayout);
     mainBoxLayout->addWidget(m_detailsWidget);
     QWidget *detailsContainer = new QWidget;
@@ -93,7 +105,7 @@ S60DeviceRunConfigurationWidget::S60DeviceRunConfigurationWidget(
     connect(m_debuggerLanguageChooser, SIGNAL(qmlDebugServerPortChanged(uint)),
             this, SLOT(qmlDebugServerPortChanged(uint)));
 
-    setEnabled(m_runConfiguration->isEnabled());
+    runConfigurationEnabledChange(m_runConfiguration->isEnabled());
 }
 
 void S60DeviceRunConfigurationWidget::argumentsEdited(const QString &text)
@@ -103,7 +115,10 @@ void S60DeviceRunConfigurationWidget::argumentsEdited(const QString &text)
 
 void S60DeviceRunConfigurationWidget::runConfigurationEnabledChange(bool enabled)
 {
-    setEnabled(enabled);
+    m_detailsWidget->setEnabled(enabled);
+    m_disabledIcon->setVisible(!enabled);
+    m_disabledReason->setVisible(!enabled);
+    m_disabledReason->setText(m_runConfiguration->disabledReason());
 }
 
 void S60DeviceRunConfigurationWidget::useCppDebuggerToggled(bool enabled)
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfigurationwidget.h b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfigurationwidget.h
index b48b5865843..595863d5401 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfigurationwidget.h
+++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfigurationwidget.h
@@ -34,6 +34,7 @@
 #define S60DEVICERUNCONFIGURATIONWIDGET_H
 
 #include <QtGui/QWidget>
+#include <QtGui/QLabel>
 
 QT_BEGIN_NAMESPACE
 class QLineEdit;
@@ -65,6 +66,8 @@ private slots:
 
 private:
     S60DeviceRunConfiguration *m_runConfiguration;
+    QLabel *m_disabledIcon;
+    QLabel *m_disabledReason;
     Utils::DetailsWidget *m_detailsWidget;
     Utils::DebuggerLanguageChooser *m_debuggerLanguageChooser;
     QLineEdit *m_argumentsLineEdit;
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp
index 251f2f58d8c..f98d60b7a63 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp
@@ -73,7 +73,8 @@ QString pathFromId(const QString &id)
 S60EmulatorRunConfiguration::S60EmulatorRunConfiguration(Qt4BaseTarget *parent, const QString &proFilePath) :
     RunConfiguration(parent, QLatin1String(S60_EMULATOR_RC_ID)),
     m_proFilePath(proFilePath),
-    m_validParse(parent->qt4Project()->validParse(proFilePath))
+    m_validParse(parent->qt4Project()->validParse(proFilePath)),
+    m_parseInProgress(parent->qt4Project()->parseInProgress(proFilePath))
 {
     ctor();
 }
@@ -81,7 +82,8 @@ S60EmulatorRunConfiguration::S60EmulatorRunConfiguration(Qt4BaseTarget *parent,
 S60EmulatorRunConfiguration::S60EmulatorRunConfiguration(Qt4BaseTarget *parent, S60EmulatorRunConfiguration *source) :
     RunConfiguration(parent, source),
     m_proFilePath(source->m_proFilePath),
-    m_validParse(source->m_validParse)
+    m_validParse(source->m_validParse),
+    m_parseInProgress(source->m_parseInProgress)
 {
     ctor();
 }
@@ -95,10 +97,8 @@ void S60EmulatorRunConfiguration::ctor()
         //: S60 emulator run configuration default display name (no pro-file name)
         setDefaultDisplayName(tr("Run on Symbian Emulator"));
     Qt4Project *pro = qt4Target()->qt4Project();
-    connect(pro, SIGNAL(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode*,bool)),
-            this, SLOT(proFileUpdate(Qt4ProjectManager::Qt4ProFileNode*,bool)));
-    connect(pro, SIGNAL(proFileInvalidated(Qt4ProjectManager::Qt4ProFileNode *)),
-            this, SLOT(proFileInvalidated(Qt4ProjectManager::Qt4ProFileNode *)));
+    connect(pro, SIGNAL(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode*,bool,bool)),
+            this, SLOT(proFileUpdate(Qt4ProjectManager::Qt4ProFileNode*,bool,bool)));
 }
 
 
@@ -106,28 +106,18 @@ S60EmulatorRunConfiguration::~S60EmulatorRunConfiguration()
 {
 }
 
-void S60EmulatorRunConfiguration::handleParserState(bool success)
+void S60EmulatorRunConfiguration::proFileUpdate(Qt4ProjectManager::Qt4ProFileNode *pro, bool success, bool parseInProgress)
 {
+    if (m_proFilePath != pro->path())
+        return;
     bool enabled = isEnabled();
     m_validParse = success;
+    m_parseInProgress = parseInProgress;
     if (enabled != isEnabled()) {
         emit isEnabledChanged(!enabled);
     }
-}
-
-void S60EmulatorRunConfiguration::proFileInvalidated(Qt4ProjectManager::Qt4ProFileNode *pro)
-{
-    if (m_proFilePath != pro->path())
-        return;
-    handleParserState(false);
-}
-
-void S60EmulatorRunConfiguration::proFileUpdate(Qt4ProjectManager::Qt4ProFileNode *pro, bool success)
-{
-    if (m_proFilePath != pro->path())
-        return;
-    handleParserState(success);
-    emit targetInformationChanged();
+    if (parseInProgress)
+        emit targetInformationChanged();
 }
 
 Qt4SymbianTarget *S60EmulatorRunConfiguration::qt4Target() const
@@ -137,13 +127,15 @@ Qt4SymbianTarget *S60EmulatorRunConfiguration::qt4Target() const
 
 bool S60EmulatorRunConfiguration::isEnabled() const
 {
-    return m_validParse;
+    return m_validParse && !m_parseInProgress;
 }
 
 QString S60EmulatorRunConfiguration::disabledReason() const
 {
+    if (m_parseInProgress)
+        return tr("The .pro file is currently being parsed.");
     if (!m_validParse)
-        return tr("The .pro file could not be parsed");
+        return tr("The .pro file could not be parsed.");
     return QString();
 }
 
@@ -174,6 +166,7 @@ bool S60EmulatorRunConfiguration::fromMap(const QVariantMap &map)
         return false;
 
     m_validParse = qt4Target()->qt4Project()->validParse(m_proFilePath);
+    m_parseInProgress = qt4Target()->qt4Project()->parseInProgress(m_proFilePath);
 
     //: S60 emulator run configuration default display name, %1 is base pro-File name
     setDefaultDisplayName(tr("%1 in Symbian Emulator").arg(QFileInfo(m_proFilePath).completeBaseName()));
@@ -217,6 +210,18 @@ S60EmulatorRunConfigurationWidget::S60EmulatorRunConfigurationWidget(S60Emulator
     m_detailsWidget->setState(Utils::DetailsWidget::NoSummary);
     QVBoxLayout *mainBoxLayout = new QVBoxLayout();
     mainBoxLayout->setMargin(0);
+
+    QHBoxLayout *hl = new QHBoxLayout();
+    hl->addStretch();
+    m_disabledIcon = new QLabel(this);
+    m_disabledIcon->setPixmap(QPixmap(QString::fromUtf8(":/projectexplorer/images/compile_warning.png")));
+    hl->addWidget(m_disabledIcon);
+    m_disabledReason = new QLabel(this);
+    m_disabledReason->setVisible(false);
+    hl->addWidget(m_disabledReason);
+    hl->addStretch();
+    mainBoxLayout->addLayout(hl);
+
     setLayout(mainBoxLayout);
     mainBoxLayout->addWidget(m_detailsWidget);
     QWidget *detailsContainer = new QWidget;
@@ -234,7 +239,7 @@ S60EmulatorRunConfigurationWidget::S60EmulatorRunConfigurationWidget(S60Emulator
     connect(m_runConfiguration, SIGNAL(isEnabledChanged(bool)),
             this, SLOT(runConfigurationEnabledChange(bool)));
 
-    setEnabled(m_runConfiguration->isEnabled());
+    runConfigurationEnabledChange(m_runConfiguration->isEnabled());
 }
 
 void S60EmulatorRunConfigurationWidget::updateTargetInformation()
@@ -244,7 +249,10 @@ void S60EmulatorRunConfigurationWidget::updateTargetInformation()
 
 void S60EmulatorRunConfigurationWidget::runConfigurationEnabledChange(bool enabled)
 {
-    setEnabled(enabled);
+    m_detailsWidget->setEnabled(enabled);
+    m_disabledIcon->setVisible(!enabled);
+    m_disabledReason->setVisible(!enabled);
+    m_disabledReason->setText(m_runConfiguration->disabledReason());
 }
 
 // ======== S60EmulatorRunConfigurationFactory
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.h b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.h
index 6cb24997f22..c9e62293c54 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.h
+++ b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.h
@@ -84,8 +84,7 @@ signals:
     void targetInformationChanged();
 
 private slots:
-    void proFileUpdate(Qt4ProjectManager::Qt4ProFileNode *pro, bool success);
-    void proFileInvalidated(Qt4ProjectManager::Qt4ProFileNode *pro);
+    void proFileUpdate(Qt4ProjectManager::Qt4ProFileNode *pro, bool success, bool parseInProgress);
 
 protected:
     S60EmulatorRunConfiguration(Qt4ProjectManager::Qt4BaseTarget *parent, S60EmulatorRunConfiguration *source);
@@ -93,11 +92,11 @@ protected:
 
 private:
     void ctor();
-    void handleParserState(bool success);
     void updateTarget();
 
     QString m_proFilePath;
     bool m_validParse;
+    bool m_parseInProgress;
 };
 
 class S60EmulatorRunConfigurationWidget : public QWidget
@@ -113,6 +112,8 @@ private slots:
 
 private:
     S60EmulatorRunConfiguration *m_runConfiguration;
+    QLabel *m_disabledIcon;
+    QLabel *m_disabledReason;
     Utils::DetailsWidget *m_detailsWidget;
     QLabel *m_executableLabel;
 };
diff --git a/src/plugins/qt4projectmanager/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp
index 8e963fdb8ef..a1640debb82 100644
--- a/src/plugins/qt4projectmanager/qt4nodes.cpp
+++ b/src/plugins/qt4projectmanager/qt4nodes.cpp
@@ -1374,6 +1374,7 @@ Qt4ProFileNode::Qt4ProFileNode(Qt4Project *project,
         : Qt4PriFileNode(project, this, filePath),
           m_projectType(InvalidProject),
           m_validParse(false),
+          m_parseInProgress(false),
           m_readerExact(0),
           m_readerCumulative(0)
 {
@@ -1447,7 +1448,7 @@ void Qt4ProFileNode::emitProFileUpdated()
 {
     foreach (ProjectExplorer::NodesWatcher *watcher, watchers())
         if (Internal::Qt4NodesWatcher *qt4Watcher = qobject_cast<Internal::Qt4NodesWatcher*>(watcher))
-            emit qt4Watcher->proFileUpdated(this, m_validParse);
+            emit qt4Watcher->proFileUpdated(this, m_validParse, m_parseInProgress);
 
     foreach (ProjectNode *subNode, subProjectNodes()) {
         if (Qt4ProFileNode *node = qobject_cast<Qt4ProFileNode *>(subNode)) {
@@ -1456,30 +1457,20 @@ void Qt4ProFileNode::emitProFileUpdated()
     }
 }
 
-void Qt4ProFileNode::emitProFileInvalidated()
+bool Qt4ProFileNode::validParse() const
 {
-    foreach (ProjectExplorer::NodesWatcher *watcher, watchers())
-        if (Internal::Qt4NodesWatcher *qt4Watcher = qobject_cast<Internal::Qt4NodesWatcher*>(watcher))
-            emit qt4Watcher->proFileInvalidated(this);
-
-    foreach (ProjectNode *subNode, subProjectNodes()) {
-        if (Qt4ProFileNode *node = qobject_cast<Qt4ProFileNode *>(subNode)) {
-            node->emitProFileInvalidated();
-        }
-    }
+    return m_validParse;
 }
 
-bool Qt4ProFileNode::validParse() const
+bool Qt4ProFileNode::parseInProgress() const
 {
-    return m_validParse;
+    return m_parseInProgress;
 }
 
 void Qt4ProFileNode::scheduleUpdate()
 {
-    if (m_validParse) {
-        m_validParse = false;
-        emitProFileInvalidated();
-    }
+    m_parseInProgress = true;
+    emitProFileUpdated();
     m_project->scheduleAsyncUpdate(this);
 }
 
@@ -1494,12 +1485,10 @@ void Qt4ProFileNode::asyncUpdate()
 
 void Qt4ProFileNode::update()
 {
-    if (m_validParse) {
-        m_validParse = false;
-        foreach (ProjectExplorer::NodesWatcher *watcher, watchers())
-            if (Internal::Qt4NodesWatcher *qt4Watcher = qobject_cast<Internal::Qt4NodesWatcher*>(watcher))
-                emit qt4Watcher->proFileInvalidated(this);
-    }
+    m_parseInProgress = true;
+    foreach (ProjectExplorer::NodesWatcher *watcher, watchers())
+        if (Internal::Qt4NodesWatcher *qt4Watcher = qobject_cast<Internal::Qt4NodesWatcher*>(watcher))
+            emit qt4Watcher->proFileUpdated(this, m_validParse, m_parseInProgress);
 
     setupReader();
     EvalResult evalResult = evaluate();
@@ -1558,7 +1547,7 @@ void Qt4ProFileNode::applyEvaluate(EvalResult evalResult, bool async)
         }
         foreach (ProjectExplorer::NodesWatcher *watcher, watchers())
             if (Internal::Qt4NodesWatcher *qt4Watcher = qobject_cast<Internal::Qt4NodesWatcher*>(watcher))
-                emit qt4Watcher->proFileUpdated(this, false);
+                emit qt4Watcher->proFileUpdated(this, false, false);
         return;
     }
 
@@ -1751,7 +1740,8 @@ void Qt4ProFileNode::applyEvaluate(EvalResult evalResult, bool async)
 
     Qt4PriFileNode::update(fileForCurrentProjectExact, m_readerExact, fileForCurrentProjectCumlative, m_readerCumulative);
 
-    if (evalResult == EvalOk) {
+    m_validParse = (evalResult == EvalOk);
+    if (m_validParse) {
 
         // update TargetInformation
         m_qt4targetInformation = targetInformation(m_readerExact);
@@ -1799,17 +1789,16 @@ void Qt4ProFileNode::applyEvaluate(EvalResult evalResult, bool async)
                 if (Internal::Qt4NodesWatcher *qt4Watcher = qobject_cast<Internal::Qt4NodesWatcher*>(watcher))
                     emit qt4Watcher->variablesChanged(this, oldValues, m_varValues);
         }
-
     } // evalResult == EvalOk
 
+    m_parseInProgress = false;
+
     createUiCodeModelSupport();
     updateUiFiles();
 
-    m_validParse = true;
-
     foreach (ProjectExplorer::NodesWatcher *watcher, watchers())
         if (Internal::Qt4NodesWatcher *qt4Watcher = qobject_cast<Internal::Qt4NodesWatcher*>(watcher))
-            emit qt4Watcher->proFileUpdated(this, true);
+            emit qt4Watcher->proFileUpdated(this, true, false);
 
     m_project->destroyProFileReader(m_readerExact);
     m_project->destroyProFileReader(m_readerCumulative);
diff --git a/src/plugins/qt4projectmanager/qt4nodes.h b/src/plugins/qt4projectmanager/qt4nodes.h
index 492b38eb0c5..ccd659abe1f 100644
--- a/src/plugins/qt4projectmanager/qt4nodes.h
+++ b/src/plugins/qt4projectmanager/qt4nodes.h
@@ -242,8 +242,7 @@ signals:
                           const QHash<Qt4Variable, QStringList> &oldValues,
                           const QHash<Qt4Variable, QStringList> &newValues);
 
-    void proFileUpdated(Qt4ProjectManager::Qt4ProFileNode *projectNode, bool success);
-    void proFileInvalidated(Qt4ProjectManager::Qt4ProFileNode *projectNode);
+    void proFileUpdated(Qt4ProjectManager::Qt4ProFileNode *projectNode, bool success, bool parseInProgress);
 
 private:
     // let them emit signals
@@ -347,10 +346,10 @@ public:
     void update();
     void scheduleUpdate();
 
-    void emitProFileInvalidated();
     void emitProFileUpdated();
 
     bool validParse() const;
+    bool parseInProgress() const;
 
     bool hasBuildTargets(Qt4ProjectType projectType) const;
 
@@ -396,6 +395,7 @@ private:
     friend class Qt4NodeHierarchy;
 
     bool m_validParse;
+    bool m_parseInProgress;
 
     // Async stuff
     QFutureWatcher<EvalResult> m_parseFutureWatcher;
diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp
index a9ae9c73ecd..2ac44e0fd6e 100644
--- a/src/plugins/qt4projectmanager/qt4project.cpp
+++ b/src/plugins/qt4projectmanager/qt4project.cpp
@@ -339,11 +339,8 @@ bool Qt4Project::fromMap(const QVariantMap &map)
     foreach (Target *t, targets())
         onAddedTarget(t);
 
-    connect(m_nodesWatcher, SIGNAL(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode*,bool)),
-            this, SIGNAL(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode *,bool)));
-
-    connect(m_nodesWatcher, SIGNAL(proFileInvalidated(Qt4ProjectManager::Qt4ProFileNode*)),
-            this, SIGNAL(proFileInvalidated(Qt4ProjectManager::Qt4ProFileNode*)));
+    connect(m_nodesWatcher, SIGNAL(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode*,bool,bool)),
+            this, SIGNAL(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode *,bool,bool)));
 
     // Now we emit update once :)
     m_rootProjectNode->emitProFileUpdated();
@@ -676,7 +673,7 @@ void Qt4Project::scheduleAsyncUpdate()
         m_cancelEvaluate = true;
         m_asyncUpdateState = AsyncFullUpdatePending;
         activeTarget()->activeBuildConfiguration()->setEnabled(false);
-        m_rootProjectNode->emitProFileInvalidated();
+        m_rootProjectNode->emitProFileUpdated();
         return;
     }
 
@@ -684,7 +681,7 @@ void Qt4Project::scheduleAsyncUpdate()
         qDebug()<<"  starting timer for full update, setting state to full update pending";
     m_partialEvaluate.clear();
     activeTarget()->activeBuildConfiguration()->setEnabled(false);
-    m_rootProjectNode->emitProFileInvalidated();
+    m_rootProjectNode->emitProFileUpdated();
     m_asyncUpdateState = AsyncFullUpdatePending;
     m_asyncUpdateTimer.start();
 
@@ -938,6 +935,14 @@ bool Qt4Project::validParse(const QString &proFilePath) const
     return node && node->validParse();
 }
 
+bool Qt4Project::parseInProgress(const QString &proFilePath) const
+{
+    if (!m_rootProjectNode)
+        return false;
+    const Qt4ProFileNode *node = m_rootProjectNode->findProFileFor(proFilePath);
+    return node && node->parseInProgress();
+}
+
 QList<BuildConfigWidget*> Qt4Project::subConfigWidgets()
 {
     QList<BuildConfigWidget*> subWidgets;
diff --git a/src/plugins/qt4projectmanager/qt4project.h b/src/plugins/qt4projectmanager/qt4project.h
index 169367dc770..920aa871f09 100644
--- a/src/plugins/qt4projectmanager/qt4project.h
+++ b/src/plugins/qt4projectmanager/qt4project.h
@@ -155,6 +155,7 @@ public:
 
     Qt4ProFileNode *rootProjectNode() const;
     bool validParse(const QString &proFilePath) const;
+    bool parseInProgress(const QString &proFilePath) const;
 
     virtual QStringList files(FilesMode fileMode) const;
     virtual QString generatedUiHeader(const QString &formFile) const;
@@ -188,8 +189,7 @@ public:
     void updateFileList();
 
 signals:
-    void proFileUpdated(Qt4ProjectManager::Qt4ProFileNode *node, bool);
-    void proFileInvalidated(Qt4ProjectManager::Qt4ProFileNode *node);
+    void proFileUpdated(Qt4ProjectManager::Qt4ProFileNode *node, bool, bool);
     void buildDirectoryInitialized();
     void fromMapFinished();
 
diff --git a/src/plugins/remotelinux/maemodeployables.cpp b/src/plugins/remotelinux/maemodeployables.cpp
index 9ff3edca33e..e742d461696 100644
--- a/src/plugins/remotelinux/maemodeployables.cpp
+++ b/src/plugins/remotelinux/maemodeployables.cpp
@@ -59,14 +59,21 @@ MaemoDeployables::~MaemoDeployables() {}
 void MaemoDeployables::init()
 {
     Qt4Project * const pro = m_target->qt4Project();
-    connect(pro, SIGNAL(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode*,bool)),
-            m_updateTimer, SLOT(start()));
+    connect(pro, SIGNAL(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode*,bool,bool)),
+            this, SLOT(startTimer(Qt4ProjectManager::Qt4ProFileNode*,bool,bool)));
 
     // TODO do we want to disable the view
 
     createModels();
 }
 
+void MaemoDeployables::startTimer(Qt4ProjectManager::Qt4ProFileNode*, bool success, bool parseInProgress)
+{
+    Q_UNUSED(success)
+    if (!parseInProgress)
+        m_updateTimer->start();
+}
+
 void MaemoDeployables::createModels()
 {
     if (m_target->project()->activeTarget() != m_target)
@@ -77,8 +84,8 @@ void MaemoDeployables::createModels()
         return;
     m_updateTimer->stop();
     disconnect(m_target->qt4Project(),
-        SIGNAL(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode*,bool)),
-        m_updateTimer, SLOT(start()));
+        SIGNAL(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode*,bool,bool)),
+        this, SLOT(startTimer(Qt4ProjectManager::Qt4ProFileNode*,bool,bool)));
     beginResetModel();
     qDeleteAll(m_listModels);
     m_listModels.clear();
@@ -109,8 +116,8 @@ void MaemoDeployables::createModels()
 
     endResetModel();
     connect(m_target->qt4Project(),
-            SIGNAL(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode*,bool)),
-            m_updateTimer, SLOT(start()));
+            SIGNAL(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode*,bool,bool)),
+            this, SLOT(startTimer(Qt4ProjectManager::Qt4ProFileNode*,bool,bool)));
 }
 
 void MaemoDeployables::createModels(const Qt4ProFileNode *proFileNode)
diff --git a/src/plugins/remotelinux/maemodeployables.h b/src/plugins/remotelinux/maemodeployables.h
index 78feff3e851..4df24faa9e2 100644
--- a/src/plugins/remotelinux/maemodeployables.h
+++ b/src/plugins/remotelinux/maemodeployables.h
@@ -64,6 +64,9 @@ public:
     int modelCount() const { return m_listModels.count(); }
     MaemoDeployableListModel *modelAt(int i) const { return m_listModels.at(i); }
 
+private slots:
+    void startTimer(Qt4ProjectManager::Qt4ProFileNode *, bool success, bool parseInProgress);
+
 private:
     typedef QHash<QString, MaemoDeployableListModel::ProFileUpdateSetting> UpdateSettingsMap;
 
diff --git a/src/plugins/remotelinux/maemorunconfigurationwidget.cpp b/src/plugins/remotelinux/maemorunconfigurationwidget.cpp
index 6282be349fe..239be289945 100644
--- a/src/plugins/remotelinux/maemorunconfigurationwidget.cpp
+++ b/src/plugins/remotelinux/maemorunconfigurationwidget.cpp
@@ -81,8 +81,14 @@ MaemoRunConfigurationWidget::MaemoRunConfigurationWidget(
     m_deviceEnvReader(new MaemoDeviceEnvReader(this, runConfiguration)),
     m_deployablesConnected(false)
 {
-    QVBoxLayout *mainLayout = new QVBoxLayout;
-    setLayout(mainLayout);
+    QVBoxLayout *topLayout = new QVBoxLayout(this);
+    topLayout->setMargin(0);
+    addDisabledLabel(topLayout);
+
+    topWidget = new QWidget;
+    topLayout->addWidget(topWidget);
+
+    QVBoxLayout *mainLayout = new QVBoxLayout(topWidget);
     addGenericWidgets(mainLayout);
     mainLayout->addSpacing(20);
     addDebuggingWidgets(mainLayout);
@@ -109,12 +115,29 @@ MaemoRunConfigurationWidget::MaemoRunConfigurationWidget(
     m_debugQmlOnlyButton->setVisible(qmlDebuggingAvailable);
     m_debugCppAndQmlButton->setVisible(qmlDebuggingAvailable);
 
-    setEnabled(m_runConfiguration->isEnabled());
+    runConfigurationEnabledChange(m_runConfiguration->isEnabled());
 }
 
 void MaemoRunConfigurationWidget::runConfigurationEnabledChange(bool enabled)
 {
-    setEnabled(enabled);
+    topWidget->setEnabled(enabled);
+    m_disabledIcon->setVisible(!enabled);
+    m_disabledReason->setVisible(!enabled);
+    m_disabledReason->setText(m_runConfiguration->disabledReason());
+}
+
+void MaemoRunConfigurationWidget::addDisabledLabel(QVBoxLayout *topLayout)
+{
+    QHBoxLayout *hl = new QHBoxLayout();
+    hl->addStretch();
+    m_disabledIcon = new QLabel(this);
+    m_disabledIcon->setPixmap(QPixmap(QString::fromUtf8(":/projectexplorer/images/compile_warning.png")));
+    hl->addWidget(m_disabledIcon);
+    m_disabledReason = new QLabel(this);
+    m_disabledReason->setVisible(false);
+    hl->addWidget(m_disabledReason);
+    hl->addStretch();
+    topLayout->addLayout(hl);
 }
 
 void MaemoRunConfigurationWidget::addGenericWidgets(QVBoxLayout *mainLayout)
diff --git a/src/plugins/remotelinux/maemorunconfigurationwidget.h b/src/plugins/remotelinux/maemorunconfigurationwidget.h
index 11acccd053c..ddbc229eec0 100644
--- a/src/plugins/remotelinux/maemorunconfigurationwidget.h
+++ b/src/plugins/remotelinux/maemorunconfigurationwidget.h
@@ -97,12 +97,16 @@ private slots:
     void handleDeploySpecsChanged();
 
 private:
+    void addDisabledLabel(QVBoxLayout *topLayout);
     void addGenericWidgets(QVBoxLayout *mainLayout);
     void addDebuggingWidgets(QVBoxLayout *mainLayout);
     void addMountWidgets(QVBoxLayout *mainLayout);
     void addEnvironmentWidgets(QVBoxLayout *mainLayout);
     void updateMountWarning();
 
+    QWidget *topWidget;
+    QLabel *m_disabledIcon;
+    QLabel *m_disabledReason;
     QLineEdit *m_argsLineEdit;
     QLabel *m_localExecutableLabel;
     QLabel *m_remoteExecutableLabel;
diff --git a/src/plugins/remotelinux/remotelinuxrunconfiguration.cpp b/src/plugins/remotelinux/remotelinuxrunconfiguration.cpp
index 8d70dac2e0a..fd8d0fee1ff 100644
--- a/src/plugins/remotelinux/remotelinuxrunconfiguration.cpp
+++ b/src/plugins/remotelinux/remotelinuxrunconfiguration.cpp
@@ -78,7 +78,8 @@ public:
     RemoteLinuxRunConfigurationPrivate(const QString &proFilePath, const Qt4BaseTarget *target)
         : proFilePath(proFilePath), useRemoteGdb(DefaultUseRemoteGdbValue),
           baseEnvironmentType(RemoteLinuxRunConfiguration::SystemBaseEnvironment),
-          validParse(target->qt4Project()->validParse(proFilePath))
+          validParse(target->qt4Project()->validParse(proFilePath)),
+          parseInProgress(target->qt4Project()->parseInProgress(proFilePath))
     {
     }
 
@@ -86,7 +87,9 @@ public:
         : proFilePath(other->proFilePath), gdbPath(other->gdbPath), arguments(other->arguments),
           useRemoteGdb(other->useRemoteGdb), baseEnvironmentType(other->baseEnvironmentType),
           systemEnvironment(other->systemEnvironment),
-          userEnvironmentChanges(other->userEnvironmentChanges), validParse(other->validParse)
+          userEnvironmentChanges(other->userEnvironmentChanges),
+          validParse(other->validParse),
+          parseInProgress(other->parseInProgress)
     {
     }
 
@@ -99,6 +102,7 @@ public:
     Utils::Environment systemEnvironment;
     QList<Utils::EnvironmentItem> userEnvironmentChanges;
     bool validParse;
+    bool parseInProgress;
     QString disabledReason;
 };
 } // namespace Internal
@@ -134,10 +138,8 @@ void RemoteLinuxRunConfiguration::init()
     handleDeployConfigChanged();
 
     Qt4Project *pro = qt4Target()->qt4Project();
-    connect(pro, SIGNAL(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode*,bool)),
-            this, SLOT(proFileUpdate(Qt4ProjectManager::Qt4ProFileNode*,bool)));
-    connect(pro, SIGNAL(proFileInvalidated(Qt4ProjectManager::Qt4ProFileNode *)),
-            this, SLOT(proFileInvalidated(Qt4ProjectManager::Qt4ProFileNode*)));
+    connect(pro, SIGNAL(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode*,bool,bool)),
+            this, SLOT(proFileUpdate(Qt4ProjectManager::Qt4ProFileNode*,bool,bool)));
     connect(this, SIGNAL(debuggersChanged()), SLOT(updateEnabledState()));
     connect(m_d->remoteMounts, SIGNAL(rowsInserted(QModelIndex, int, int)), this,
         SLOT(handleRemoteMountsChanged()));
@@ -166,8 +168,12 @@ Qt4BuildConfiguration *RemoteLinuxRunConfiguration::activeQt4BuildConfiguration(
 
 bool RemoteLinuxRunConfiguration::isEnabled() const
 {
+    if (m_d->parseInProgress) {
+        m_d->disabledReason = tr("The .pro file is being parsed.");
+        return false;
+    }
     if (!m_d->validParse) {
-        m_d->disabledReason = tr("The .pro file could not be parsed/");
+        m_d->disabledReason = tr("The .pro file could not be parsed.");
         return false;
     }
     if (!deviceConfig()) {
@@ -205,26 +211,16 @@ Utils::OutputFormatter *RemoteLinuxRunConfiguration::createOutputFormatter() con
     return new QtSupport::QtOutputFormatter(qt4Target()->qt4Project());
 }
 
-void RemoteLinuxRunConfiguration::handleParseState(bool success)
-{
-    bool enabled = isEnabled();
-    m_d->validParse = success;
-    if (enabled != isEnabled())
-        updateEnabledState();
-}
-
-void RemoteLinuxRunConfiguration::proFileInvalidated(Qt4ProjectManager::Qt4ProFileNode *pro)
-{
-    if (m_d->proFilePath != pro->path())
-        return;
-    handleParseState(false);
-}
-
-void RemoteLinuxRunConfiguration::proFileUpdate(Qt4ProjectManager::Qt4ProFileNode *pro, bool success)
+void RemoteLinuxRunConfiguration::proFileUpdate(Qt4ProjectManager::Qt4ProFileNode *pro, bool success, bool parseInProgress)
 {
     if (m_d->proFilePath == pro->path()) {
-        handleParseState(success);
-        emit targetInformationChanged();
+        bool enabled = isEnabled();
+        m_d->validParse = success;
+        m_d->parseInProgress = parseInProgress;
+        if (enabled != isEnabled())
+            updateEnabledState();
+        if (!parseInProgress)
+            emit targetInformationChanged();
     }
 }
 
@@ -259,6 +255,7 @@ bool RemoteLinuxRunConfiguration::fromMap(const QVariantMap &map)
     m_d->remoteMounts->fromMap(map);
 
     m_d->validParse = qt4Target()->qt4Project()->validParse(m_d->proFilePath);
+    m_d->parseInProgress = qt4Target()->qt4Project()->parseInProgress(m_d->proFilePath);
 
     setDefaultDisplayName(defaultDisplayName());
 
diff --git a/src/plugins/remotelinux/remotelinuxrunconfiguration.h b/src/plugins/remotelinux/remotelinuxrunconfiguration.h
index a747fdffa61..3d25e24ecb1 100644
--- a/src/plugins/remotelinux/remotelinuxrunconfiguration.h
+++ b/src/plugins/remotelinux/remotelinuxrunconfiguration.h
@@ -137,8 +137,7 @@ protected:
     QString defaultDisplayName();
 
 private slots:
-    void proFileUpdate(Qt4ProjectManager::Qt4ProFileNode *pro, bool success);
-    void proFileInvalidated(Qt4ProjectManager::Qt4ProFileNode *pro);
+    void proFileUpdate(Qt4ProjectManager::Qt4ProFileNode *pro, bool success, bool parseInProgress);
     void updateDeviceConfigurations();
     void handleDeployConfigChanged();
     void handleDeployablesUpdated();
@@ -147,7 +146,6 @@ private slots:
 
 private:
     void init();
-    void handleParseState(bool success);
     Internal::AbstractLinuxDeviceDeployStep *deployStep() const;
 
     void setArguments(const QString &args);
-- 
GitLab