From 0befb98c203cac04e85d7cb3b3bc52620b1cbad8 Mon Sep 17 00:00:00 2001
From: Lasse Holmstedt <lasse.holmstedt@nokia.com>
Date: Fri, 26 Mar 2010 12:39:26 +0100
Subject: [PATCH] Fixed crash when opening ui files in design mode QML Designer
 now listens to contextChanged signal instead of modeChanged and checks that
 the context is same as that of qmldesigner.

Reviewed-by: con
---
 src/plugins/coreplugin/designmode.cpp         |  5 ++++
 src/plugins/qmldesigner/designmodewidget.cpp  |  3 ++-
 src/plugins/qmldesigner/qmldesignerplugin.cpp | 27 ++++++++++++-------
 src/plugins/qmldesigner/qmldesignerplugin.h   |  3 ++-
 4 files changed, 26 insertions(+), 12 deletions(-)

diff --git a/src/plugins/coreplugin/designmode.cpp b/src/plugins/coreplugin/designmode.cpp
index 4f8d40a9ca6..34473c5ebb5 100644
--- a/src/plugins/coreplugin/designmode.cpp
+++ b/src/plugins/coreplugin/designmode.cpp
@@ -174,6 +174,11 @@ QStringList DesignMode::registeredMimeTypes() const
     return rc;
 }
 
+/**
+  * Registers a widget to be displayed when an editor with a file specified in
+  * mimeTypes is opened. This also appends the additionalContext in ICore to
+  * the context, specified here.
+  */
 void DesignMode::registerDesignWidget(QWidget *widget,
                                       const QStringList &mimeTypes,
                                       const QList<int> &context,
diff --git a/src/plugins/qmldesigner/designmodewidget.cpp b/src/plugins/qmldesigner/designmodewidget.cpp
index 708860db70e..23572260ccc 100644
--- a/src/plugins/qmldesigner/designmodewidget.cpp
+++ b/src/plugins/qmldesigner/designmodewidget.cpp
@@ -159,7 +159,8 @@ void DesignModeWidget::showEditor(Core::IEditor *editor)
         fileName = editor->file()->fileName();
         textEdit = qobject_cast<QPlainTextEdit*>(editor->widget());
         textEditor = qobject_cast<TextEditor::ITextEditor*>(editor);
-        m_fakeToolBar->addEditor(textEditor);
+        if (textEditor)
+            m_fakeToolBar->addEditor(textEditor);
     }
 
     if (debug)
diff --git a/src/plugins/qmldesigner/qmldesignerplugin.cpp b/src/plugins/qmldesigner/qmldesignerplugin.cpp
index 99cf54933bc..16f1dfe7a8c 100644
--- a/src/plugins/qmldesigner/qmldesignerplugin.cpp
+++ b/src/plugins/qmldesigner/qmldesignerplugin.cpp
@@ -43,6 +43,7 @@
 #include <coreplugin/actionmanager/actioncontainer.h>
 #include <coreplugin/actionmanager/command.h>
 #include <coreplugin/icore.h>
+#include <coreplugin/icontext.h>
 #include <coreplugin/dialogs/iwizard.h>
 #include <coreplugin/editormanager/ieditorfactory.h>
 #include <coreplugin/editormanager/editormanager.h>
@@ -227,8 +228,9 @@ void BauhausPlugin::createDesignModeWidget()
     connect(m_editorManager, SIGNAL(editorsClosed(QList<Core::IEditor*>)),
             this, SLOT(textEditorsClosed(QList<Core::IEditor*>)));
 
-    connect(Core::ModeManager::instance(), SIGNAL(currentModeChanged(Core::IMode*)),
-            this, SLOT(modeChanged(Core::IMode*)));
+    connect(creatorCore, SIGNAL(contextChanged(Core::IContext*,QList<int>)),
+            this, SLOT(contextChanged(Core::IContext*,QList<int>)));
+
 }
 
 void BauhausPlugin::updateEditor(Core::IEditor *editor)
@@ -241,17 +243,22 @@ void BauhausPlugin::updateEditor(Core::IEditor *editor)
     }
 }
 
-void BauhausPlugin::modeChanged(Core::IMode *mode)
+void BauhausPlugin::contextChanged(Core::IContext *context, const QList<int> &additionalContexts)
 {
-    if (mode == m_designMode) {
-        m_isActive = true;
-        m_mainWidget->showEditor(m_editorManager->currentEditor());
-    } else {
-        if (m_isActive) {
-            m_isActive = false;
-            m_mainWidget->showEditor(0);
+    Q_UNUSED(context)
+
+    foreach(int additionalContext, additionalContexts) {
+        if (m_context->context().contains(additionalContext)) {
+            m_isActive = true;
+            m_mainWidget->showEditor(m_editorManager->currentEditor());
+            return;
         }
     }
+
+    if (m_isActive) {
+        m_isActive = false;
+        m_mainWidget->showEditor(0);
+    }
 }
 
 void BauhausPlugin::textEditorsClosed(QList<Core::IEditor*> editors)
diff --git a/src/plugins/qmldesigner/qmldesignerplugin.h b/src/plugins/qmldesigner/qmldesignerplugin.h
index 230535dcfc1..bd1194547ba 100644
--- a/src/plugins/qmldesigner/qmldesignerplugin.h
+++ b/src/plugins/qmldesigner/qmldesignerplugin.h
@@ -42,6 +42,7 @@ class QAction;
 QT_END_NAMESPACE
 
 namespace Core {
+    class IContext;
     class IWizard;
     class ICore;
     class IEditorFactory;
@@ -84,7 +85,7 @@ private slots:
     void textEditorsClosed(QList<Core::IEditor *> editors);
     void updateActions(Core::IEditor* editor);
     void updateEditor(Core::IEditor *editor);
-    void modeChanged(Core::IMode *mode);
+    void contextChanged(Core::IContext *context, const QList<int> &additionalContexts);
 
 private:
     void createDesignModeWidget();
-- 
GitLab