From e485b439bc3a475038d694e3f3cbe1dbec8bd2d2 Mon Sep 17 00:00:00 2001
From: Daniel Teske <daniel.teske@digia.com>
Date: Fri, 1 Nov 2013 16:02:24 +0100
Subject: [PATCH] AndroidManifestEditor: Fix widget hierarchy

Since TextEditorActionHandler has now a virtual function, we can
do a less fancy hierarchy for the AndroidManifestEditor and thus fix

Task-number: QTCREATORBUG-10597
Task-number: QTCREATORBUG-11163

Change-Id: I6c4014ae03b66f0639f8c8973763d690fb062cc4
Reviewed-by: Eike Ziller <eike.ziller@digia.com>
---
 .../android/androidmanifestdocument.cpp       |   2 +
 src/plugins/android/androidmanifesteditor.cpp |  47 ++++--
 src/plugins/android/androidmanifesteditor.h   |  11 +-
 .../android/androidmanifesteditorfactory.cpp  |  20 ++-
 .../android/androidmanifesteditorwidget.cpp   | 137 +++++++++---------
 .../android/androidmanifesteditorwidget.h     |  29 +++-
 6 files changed, 147 insertions(+), 99 deletions(-)

diff --git a/src/plugins/android/androidmanifestdocument.cpp b/src/plugins/android/androidmanifestdocument.cpp
index fd1d484ecf2..26746433f6d 100644
--- a/src/plugins/android/androidmanifestdocument.cpp
+++ b/src/plugins/android/androidmanifestdocument.cpp
@@ -45,6 +45,8 @@ AndroidManifestDocument::AndroidManifestDocument(AndroidManifestEditorWidget *ed
       m_editorWidget(editorWidget)
 {
     setMimeType(QLatin1String(Constants::ANDROID_MANIFEST_MIME_TYPE));
+    connect(editorWidget, SIGNAL(guiChanged()),
+            this, SIGNAL(changed()));
 }
 
 bool AndroidManifestDocument::save(QString *errorString, const QString &fileName, bool autoSave)
diff --git a/src/plugins/android/androidmanifesteditor.cpp b/src/plugins/android/androidmanifesteditor.cpp
index 9909fa10abe..65f4a92b21e 100644
--- a/src/plugins/android/androidmanifesteditor.cpp
+++ b/src/plugins/android/androidmanifesteditor.cpp
@@ -41,31 +41,26 @@ using namespace Android;
 using namespace Internal;
 
 Android::Internal::AndroidManifestEditor::AndroidManifestEditor(AndroidManifestEditorWidget *editorWidget)
-    : BaseTextEditor(editorWidget),
-      m_document(new AndroidManifestDocument(editorWidget))
+    : Core::IEditor(editorWidget), m_toolBar(0)
 {
-    QToolBar *toolBar = new QToolBar;
-
+    m_toolBar = new QToolBar(editorWidget);
     m_actionGroup = new QActionGroup(this);
     connect(m_actionGroup, SIGNAL(triggered(QAction*)), this, SLOT(changeEditorPage(QAction*)));
 
-    QAction *generalAction = toolBar->addAction(tr("General"));
+    QAction *generalAction = m_toolBar->addAction(tr("General"));
     generalAction->setData(AndroidManifestEditorWidget::General);
     generalAction->setCheckable(true);
     m_actionGroup->addAction(generalAction);
 
-    QAction *sourceAction = toolBar->addAction(tr("XML Source"));
+    QAction *sourceAction = m_toolBar->addAction(tr("XML Source"));
     sourceAction->setData(AndroidManifestEditorWidget::Source);
     sourceAction->setCheckable(true);
     m_actionGroup->addAction(sourceAction);
 
     generalAction->setChecked(true);
 
-    insertExtraToolBarWidget(BaseTextEditor::Left, toolBar);
-
-
-    setContext(Core::Context(Constants::ANDROID_MANIFEST_EDITOR_CONTEXT,
-              TextEditor::Constants::C_TEXTEDITOR));
+    setContext(Core::Context(Constants::ANDROID_MANIFEST_EDITOR_CONTEXT));
+    setWidget(editorWidget);
 }
 
 Core::Id AndroidManifestEditor::id() const
@@ -73,12 +68,36 @@ Core::Id AndroidManifestEditor::id() const
     return Constants::ANDROID_MANIFEST_EDITOR_ID;
 }
 
+bool AndroidManifestEditor::open(QString *errorString, const QString &fileName, const QString &realFileName)
+{
+    return widget()->open(errorString, fileName, realFileName);
+}
+
+QWidget *AndroidManifestEditor::toolBar()
+{
+    return m_toolBar;
+}
+
+AndroidManifestEditorWidget *AndroidManifestEditor::widget() const
+{
+    return static_cast<AndroidManifestEditorWidget *>(Core::IEditor::widget());
+}
+
+Core::IDocument *AndroidManifestEditor::document()
+{
+    return textEditor()->baseTextDocument();
+}
+
+TextEditor::BaseTextEditorWidget *AndroidManifestEditor::textEditor() const
+{
+    return widget()->textEditorWidget();
+}
+
 void AndroidManifestEditor::changeEditorPage(QAction *action)
 {
-    AndroidManifestEditorWidget *editorWidget = static_cast<AndroidManifestEditorWidget *>(widget());
-    if (!editorWidget->setActivePage(static_cast<AndroidManifestEditorWidget::EditorPage>(action->data().toInt()))) {
+    if (!widget()->setActivePage(static_cast<AndroidManifestEditorWidget::EditorPage>(action->data().toInt()))) {
         foreach (QAction *action, m_actionGroup->actions()) {
-            if (action->data().toInt() == editorWidget->activePage()) {
+            if (action->data().toInt() == widget()->activePage()) {
                 action->setChecked(true);
                 break;
             }
diff --git a/src/plugins/android/androidmanifesteditor.h b/src/plugins/android/androidmanifesteditor.h
index 98465171c5a..d7f51e91600 100644
--- a/src/plugins/android/androidmanifesteditor.h
+++ b/src/plugins/android/androidmanifesteditor.h
@@ -31,6 +31,7 @@
 #define ANDROIDMANIFESTEDITOR_H
 
 #include "androidmanifestdocument.h"
+#include "androidmanifesteditorwidget.h"
 
 #include <coreplugin/editormanager/ieditor.h>
 #include <texteditor/basetexteditor.h>
@@ -41,9 +42,8 @@ QT_END_NAMESPACE
 
 namespace Android {
 namespace Internal {
-class AndroidManifestEditorWidget;
 
-class AndroidManifestEditor : public TextEditor::BaseTextEditor
+class AndroidManifestEditor : public Core::IEditor
 {
     Q_OBJECT
 
@@ -51,13 +51,18 @@ public:
     explicit AndroidManifestEditor(AndroidManifestEditorWidget *editorWidget);
 
     Core::Id id() const;
+    bool open(QString *errorString, const QString &fileName, const QString &realFileName);
+    QWidget *toolBar();
+    AndroidManifestEditorWidget *widget() const;
+    Core::IDocument *document();
+    TextEditor::BaseTextEditorWidget *textEditor() const;
 
 private slots:
     void changeEditorPage(QAction *action);
 
 private:
-    AndroidManifestDocument *m_document;
     QString m_displayName;
+    QToolBar *m_toolBar;
     QActionGroup *m_actionGroup;
 };
 
diff --git a/src/plugins/android/androidmanifesteditorfactory.cpp b/src/plugins/android/androidmanifesteditorfactory.cpp
index b5767e2edd3..4078dec5ccc 100644
--- a/src/plugins/android/androidmanifesteditorfactory.cpp
+++ b/src/plugins/android/androidmanifesteditorfactory.cpp
@@ -39,6 +39,19 @@
 using namespace Android;
 using namespace Android::Internal;
 
+class AndroidTextEditorActionHandler : public TextEditor::TextEditorActionHandler
+{
+public:
+    explicit AndroidTextEditorActionHandler(QObject *parent)
+        : TextEditorActionHandler(parent, Constants::ANDROID_MANIFEST_EDITOR_CONTEXT)
+    {}
+private:
+    TextEditor::BaseTextEditorWidget *resolveTextEditorWidget(Core::IEditor *editor) const
+    {
+        AndroidManifestEditor *androidManifestEditor = static_cast<AndroidManifestEditor *>(editor);
+        return androidManifestEditor->textEditor();
+    }
+};
 
 AndroidManifestEditorFactory::AndroidManifestEditorFactory(QObject *parent)
     : Core::IEditorFactory(parent)
@@ -46,12 +59,11 @@ AndroidManifestEditorFactory::AndroidManifestEditorFactory(QObject *parent)
     setId(Constants::ANDROID_MANIFEST_EDITOR_ID);
     setDisplayName(tr("Android Manifest editor"));
     addMimeType(Constants::ANDROID_MANIFEST_MIME_TYPE);
-    new TextEditor::TextEditorActionHandler(this, Constants::ANDROID_MANIFEST_EDITOR_CONTEXT);
+    new AndroidTextEditorActionHandler(this);
 }
 
 Core::IEditor *AndroidManifestEditorFactory::createEditor()
 {
-    AndroidManifestEditorWidget *editor = new AndroidManifestEditorWidget();
-    TextEditor::TextEditorSettings::initializeEditor(editor);
-    return editor->editor();
+    AndroidManifestEditorWidget *androidManifestEditorWidget = new AndroidManifestEditorWidget();
+    return androidManifestEditorWidget->editor();
 }
diff --git a/src/plugins/android/androidmanifesteditorwidget.cpp b/src/plugins/android/androidmanifesteditorwidget.cpp
index 2ded8d8635a..70699cf8418 100644
--- a/src/plugins/android/androidmanifesteditorwidget.cpp
+++ b/src/plugins/android/androidmanifesteditorwidget.cpp
@@ -35,6 +35,7 @@
 
 #include <coreplugin/icore.h>
 #include <coreplugin/infobar.h>
+#include <coreplugin/editormanager/ieditor.h>
 #include <texteditor/plaintexteditor.h>
 #include <projectexplorer/project.h>
 #include <projectexplorer/projectwindow.h>
@@ -44,6 +45,7 @@
 #include <projectexplorer/projectexplorer.h>
 #include <projectexplorer/kitinformation.h>
 #include <texteditor/texteditoractionhandler.h>
+#include <texteditor/texteditorsettings.h>
 #include <qmakeprojectmanager/qmakeproject.h>
 
 #include <QLineEdit>
@@ -95,49 +97,44 @@ Project *androidProject(const QString &file)
 
 } // anonymous namespace
 
-AndroidManifestEditorWidget::AndroidManifestEditorWidget(QWidget *parent)
-    : TextEditor::PlainTextEditorWidget(new AndroidManifestDocument(this), parent),
+AndroidManifestEditorWidget::AndroidManifestEditorWidget()
+    : QWidget(),
       m_dirty(false),
       m_stayClean(false),
       m_setAppName(false),
       m_appNameInStringsXml(false)
 {
-    configure(QLatin1String(Constants::ANDROID_MANIFEST_MIME_TYPE));
+    m_textEditorWidget = new AndroidManifestTextEditorWidget(this);
+    TextEditor::TextEditorSettings::initializeEditor(m_textEditorWidget);
 
     initializePage();
 
-    setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
-    setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
-
     m_timerParseCheck.setInterval(800);
     m_timerParseCheck.setSingleShot(true);
 
+    m_editor = new AndroidManifestEditor(this);
+
     connect(&m_timerParseCheck, SIGNAL(timeout()),
             this, SLOT(delayedParseCheck()));
 
-    connect(document(), SIGNAL(contentsChanged()),
+    connect(m_textEditorWidget->document(), SIGNAL(contentsChanged()),
             this, SLOT(startParseCheck()));
 }
 
-TextEditor::BaseTextEditor *AndroidManifestEditorWidget::createEditor()
-{
-    return new AndroidManifestEditor(this);
-}
-
 void AndroidManifestEditorWidget::initializePage()
 {
-    QWidget *mainWidget = new QWidget(this);
-    mainWidget->setAutoFillBackground(true);
-    // If the user clicks on the mainwidget it gets focus, even though that's not visible
-    // This is to prevent the parent, the actual basetexteditorwidget from getting focus
-    mainWidget->setFocusPolicy(Qt::WheelFocus);
-    mainWidget->installEventFilter(this);
+    QHBoxLayout *layout = new QHBoxLayout(this);
+    layout->setMargin(0);
+    m_stackedWidget = new QStackedWidget(this); // simplfy make AndroidManifestEditorWidget a stacked widget
+    layout->addWidget(m_stackedWidget);
 
     Core::IContext *myContext = new Core::IContext(this);
-    myContext->setWidget(mainWidget);
-    myContext->setContext(Core::Context(androidManifestEditorGeneralPaneContextId));
+    myContext->setWidget(m_stackedWidget);
+    myContext->setContext(Core::Context(androidManifestEditorGeneralPaneContextId)); // where is the context used?
     Core::ICore::addContextObject(myContext);
 
+    QWidget *mainWidget = new QWidget; // different name
+
     QVBoxLayout *topLayout = new QVBoxLayout(mainWidget);
 
     QGroupBox *packageGroupBox = new QGroupBox(mainWidget);
@@ -444,7 +441,8 @@ void AndroidManifestEditorWidget::initializePage()
 
     topLayout->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Fixed, QSizePolicy::MinimumExpanding));
 
-    m_overlayWidget = mainWidget;
+    m_stackedWidget->insertWidget(General, mainWidget);
+    m_stackedWidget->insertWidget(Source, m_textEditorWidget);
 }
 
 bool AndroidManifestEditorWidget::eventFilter(QObject *obj, QEvent *event)
@@ -454,18 +452,12 @@ bool AndroidManifestEditorWidget::eventFilter(QObject *obj, QEvent *event)
             QTimer::singleShot(0, this, SLOT(updateTargetComboBox()));
     }
 
-    if (obj == m_overlayWidget)
-        if (event->type() == QEvent::KeyPress
-                || event->type() == QEvent::KeyRelease) {
-            return true;
-        }
-
-    return TextEditor::PlainTextEditorWidget::eventFilter(obj, event);
+    return QWidget::eventFilter(obj, event);
 }
 
 void AndroidManifestEditorWidget::updateTargetComboBox()
 {
-    const QString docPath(baseTextDocument()->filePath());
+    const QString docPath(m_textEditorWidget->baseTextDocument()->filePath());
     ProjectExplorer::Project *project = androidProject(docPath);
     QStringList items;
     if (project) {
@@ -487,28 +479,20 @@ void AndroidManifestEditorWidget::updateTargetComboBox()
     m_targetLineEdit->addItems(items);
 }
 
-void AndroidManifestEditorWidget::resizeEvent(QResizeEvent *event)
-{
-    PlainTextEditorWidget::resizeEvent(event);
-    QSize s = QSize(rect().width(), rect().height());
-    m_overlayWidget->resize(s);
-}
-
 bool AndroidManifestEditorWidget::open(QString *errorString, const QString &fileName, const QString &realFileName)
 {
-    bool result = PlainTextEditorWidget::open(errorString, fileName, realFileName);
+    bool result = m_textEditorWidget->open(errorString, fileName, realFileName);
 
     updateSdkVersions();
 
     if (!result)
         return result;
 
-    Q_UNUSED(errorString);
     QString error;
     int errorLine;
     int errorColumn;
     QDomDocument doc;
-    if (doc.setContent(toPlainText(), &error, &errorLine, &errorColumn)) {
+    if (doc.setContent(m_textEditorWidget->toPlainText(), &error, &errorLine, &errorColumn)) {
         if (checkDocument(doc, &error, &errorLine, &errorColumn)) {
             if (activePage() != Source)
                 syncToWidgets(doc);
@@ -518,7 +502,6 @@ bool AndroidManifestEditorWidget::open(QString *errorString, const QString &file
     // some error occured
     updateInfoBar(error, errorLine, errorColumn);
     setActivePage(Source);
-
     return true;
 }
 
@@ -527,7 +510,7 @@ void AndroidManifestEditorWidget::setDirty(bool dirty)
     if (m_stayClean)
         return;
     m_dirty = dirty;
-    emit changed();
+    emit guiChanged();
 }
 
 bool AndroidManifestEditorWidget::isModified() const
@@ -541,7 +524,7 @@ bool AndroidManifestEditorWidget::isModified() const
 
 AndroidManifestEditorWidget::EditorPage AndroidManifestEditorWidget::activePage() const
 {
-    return m_overlayWidget->isVisibleTo(const_cast<AndroidManifestEditorWidget *>(this)) ? General : Source;
+    return AndroidManifestEditorWidget::EditorPage(m_stackedWidget->currentIndex());
 }
 
 bool AndroidManifestEditorWidget::setActivePage(EditorPage page)
@@ -557,22 +540,15 @@ bool AndroidManifestEditorWidget::setActivePage(EditorPage page)
     } else {
         if (!syncToWidgets())
             return false;
-
-        QWidget *fw = m_overlayWidget->focusWidget();
-        if (fw && fw != m_overlayWidget)
-            fw->setFocus();
-        else
-            m_packageNameLineEdit->setFocus();
+// TODO?
+//        QWidget *fw = m_overlayWidget->focusWidget();
+//        if (fw && fw != m_overlayWidget)
+//            fw->setFocus();
+//        else
+//            m_packageNameLineEdit->setFocus();
     }
 
-    m_overlayWidget->setVisible(page == General);
-    if (page == General) {
-        setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
-        setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
-    } else {
-        setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
-        setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
-    }
+    m_stackedWidget->setCurrentIndex(page);
     return true;
 }
 
@@ -582,7 +558,7 @@ void AndroidManifestEditorWidget::preSave()
         syncToEditor();
 
     if (m_setAppName && m_appNameInStringsXml) {
-        QString baseDir = QFileInfo(baseTextDocument()->filePath()).absolutePath();
+        QString baseDir = QFileInfo(m_textEditorWidget->baseTextDocument()->filePath()).absolutePath();
         QString fileName = baseDir + QLatin1String("/res/values/strings.xml");
         QFile f(fileName);
         if (f.open(QIODevice::ReadOnly)) {
@@ -606,7 +582,7 @@ void AndroidManifestEditorWidget::preSave()
         m_setAppName = false;
     }
 
-    QString baseDir = QFileInfo(baseTextDocument()->filePath()).absolutePath();
+    QString baseDir = QFileInfo(m_textEditorWidget->baseTextDocument()->filePath()).absolutePath();
     if (!m_lIconPath.isEmpty()) {
         copyIcon(LowDPI, baseDir, m_lIconPath);
         m_lIconPath.clear();
@@ -624,12 +600,22 @@ void AndroidManifestEditorWidget::preSave()
     updateInfoBar();
 }
 
+Core::IEditor *AndroidManifestEditorWidget::editor() const
+{
+    return m_editor;
+}
+
+TextEditor::PlainTextEditorWidget *AndroidManifestEditorWidget::textEditorWidget() const
+{
+    return m_textEditorWidget;
+}
+
 bool AndroidManifestEditorWidget::syncToWidgets()
 {
     QDomDocument doc;
     QString errorMessage;
     int errorLine, errorColumn;
-    if (doc.setContent(toPlainText(), &errorMessage, &errorLine, &errorColumn)) {
+    if (doc.setContent(m_textEditorWidget->toPlainText(), &errorMessage, &errorLine, &errorColumn)) {
         if (checkDocument(doc, &errorMessage, &errorLine, &errorColumn)) {
             hideInfoBar();
             syncToWidgets(doc);
@@ -678,7 +664,7 @@ void AndroidManifestEditorWidget::updateInfoBar()
     QDomDocument doc;
     int errorLine, errorColumn;
     QString errorMessage;
-    if (doc.setContent(toPlainText(), &errorMessage, &errorLine, &errorColumn)) {
+    if (doc.setContent(m_textEditorWidget->toPlainText(), &errorMessage, &errorLine, &errorColumn)) {
         if (checkDocument(doc, &errorMessage, &errorLine, &errorColumn)) {
             hideInfoBar();
             return;
@@ -690,7 +676,7 @@ void AndroidManifestEditorWidget::updateInfoBar()
 
 void AndroidManifestEditorWidget::updateSdkVersions()
 {
-    const QString docPath(baseTextDocument()->filePath());
+    const QString docPath(m_textEditorWidget->baseTextDocument()->filePath());
     Project *project = androidProject(docPath);
     QPair<int, int> apiLevels = AndroidManager::apiLevelRange(project ? project->activeTarget() : 0);
     for (int i = apiLevels.first; i < apiLevels.second + 1; ++i)
@@ -708,7 +694,7 @@ void AndroidManifestEditorWidget::updateSdkVersions()
 
 void AndroidManifestEditorWidget::updateInfoBar(const QString &errorMessage, int line, int column)
 {
-    Core::InfoBar *infoBar = baseTextDocument()->infoBar();
+    Core::InfoBar *infoBar = m_textEditorWidget->baseTextDocument()->infoBar();
     QString text;
     if (line < 0)
         text = tr("Could not parse file: '%1'.").arg(errorMessage);
@@ -726,14 +712,14 @@ void AndroidManifestEditorWidget::updateInfoBar(const QString &errorMessage, int
 
 void AndroidManifestEditorWidget::hideInfoBar()
 {
-    Core::InfoBar *infoBar = baseTextDocument()->infoBar();
-    infoBar->removeInfo(infoBarId);
+    Core::InfoBar *infoBar = m_textEditorWidget->baseTextDocument()->infoBar();
+        infoBar->removeInfo(infoBarId);
     m_timerParseCheck.stop();
 }
 
 void AndroidManifestEditorWidget::gotoError()
 {
-    gotoLine(m_errorLine, m_errorColumn);
+    m_textEditorWidget->gotoLine(m_errorLine, m_errorColumn);
 }
 
 void setApiLevel(QComboBox *box, const QDomElement &element, const QString &attribute)
@@ -765,7 +751,7 @@ void AndroidManifestEditorWidget::syncToWidgets(const QDomDocument &doc)
     setApiLevel(m_androidMinSdkVersion, usesSdkElement, QLatin1String("android:minSdkVersion"));
     setApiLevel(m_androidTargetSdkVersion, usesSdkElement, QLatin1String("android:targetSdkVersion"));
 
-    QString baseDir = QFileInfo(baseTextDocument()->filePath()).absolutePath();
+    QString baseDir = QFileInfo(m_textEditorWidget->baseTextDocument()->filePath()).absolutePath();
     QString fileName = baseDir + QLatin1String("/res/values/strings.xml");
 
     QDomElement applicationElement = manifest.firstChildElement(QLatin1String("application"));
@@ -883,7 +869,7 @@ int extractVersion(const QString &string)
 void AndroidManifestEditorWidget::syncToEditor()
 {
     QDomDocument doc;
-    if (!doc.setContent(toPlainText())) {
+    if (!doc.setContent(m_textEditorWidget->toPlainText())) {
         // This should not happen
         updateInfoBar();
         return;
@@ -930,11 +916,11 @@ void AndroidManifestEditorWidget::syncToEditor()
 
 
     QString newText = doc.toString(4);
-    if (newText == toPlainText())
+    if (newText == m_textEditorWidget->toPlainText())
         return;
 
-    setPlainText(newText);
-    document()->setModified(true); // Why is this necessary?
+    m_textEditorWidget->setPlainText(newText);
+    m_textEditorWidget->document()->setModified(true);
 
     m_dirty = false;
 }
@@ -1062,7 +1048,7 @@ void AndroidManifestEditorWidget::removePermission()
 void AndroidManifestEditorWidget::setAppName()
 {
     m_setAppName = true;
-    emit changed();
+    setDirty(true);
 }
 
 void AndroidManifestEditorWidget::setPackageName()
@@ -1154,3 +1140,12 @@ int PermissionsModel::rowCount(const QModelIndex &parent) const
     Q_UNUSED(parent)
     return m_permissions.count();
 }
+
+
+AndroidManifestTextEditorWidget::AndroidManifestTextEditorWidget(AndroidManifestEditorWidget *parent)
+    : TextEditor::PlainTextEditorWidget(new AndroidManifestDocument(parent), parent),
+      m_parent(parent)
+{
+    baseTextDocument()->setMimeType(QLatin1String(Constants::ANDROID_MANIFEST_MIME_TYPE));
+}
+
diff --git a/src/plugins/android/androidmanifesteditorwidget.h b/src/plugins/android/androidmanifesteditorwidget.h
index 1f5932f590d..958a9364160 100644
--- a/src/plugins/android/androidmanifesteditorwidget.h
+++ b/src/plugins/android/androidmanifesteditorwidget.h
@@ -54,6 +54,7 @@ namespace Core { class IEditor; }
 namespace Android {
 namespace Internal {
 class AndroidManifestEditor;
+class AndroidManifestEditorWidget;
 
 
 class PermissionsModel: public QAbstractListModel
@@ -75,16 +76,24 @@ private:
     QStringList m_permissions;
 };
 
-class AndroidManifestEditorWidget : public TextEditor::PlainTextEditorWidget
+class AndroidManifestTextEditorWidget : public TextEditor::PlainTextEditorWidget
+{
+public:
+    AndroidManifestTextEditorWidget(AndroidManifestEditorWidget *parent = 0);
+protected:
+    AndroidManifestEditorWidget *m_parent;
+};
+
+class AndroidManifestEditorWidget : public QWidget
 {
     Q_OBJECT
 public:
     enum EditorPage {
-        General,
-        Source
+        General = 0,
+        Source = 1
     };
 
-    explicit AndroidManifestEditorWidget(QWidget *parent = 0);
+    explicit AndroidManifestEditorWidget();
 
     bool open(QString *errorString, const QString &fileName, const QString &realFileName);
 
@@ -95,12 +104,16 @@ public:
 
     void preSave();
 
+    Core::IEditor *editor() const;
+    TextEditor::PlainTextEditorWidget *textEditorWidget() const;
+
 public slots:
     void setDirty(bool dirty = true);
 
+signals:
+    void guiChanged();
+
 protected:
-    TextEditor::BaseTextEditor *createEditor();
-    void resizeEvent(QResizeEvent *event);
     bool eventFilter(QObject *obj, QEvent *event);
 private slots:
     void setLDPIIcon();
@@ -165,8 +178,10 @@ private:
     QPushButton *m_removePermissionButton;
     QComboBox *m_permissionsComboBox;
 
-    QWidget *m_overlayWidget;
     QTimer m_timerParseCheck;
+    TextEditor::PlainTextEditorWidget *m_textEditorWidget;
+    QStackedWidget *m_stackedWidget;
+    AndroidManifestEditor *m_editor;
 };
 } // namespace Internal
 } // namespace Android
-- 
GitLab