From f0af0122260a77c6e588f505984dd0b3ebbb683c Mon Sep 17 00:00:00 2001
From: Leandro Melo <leandro.melo@nokia.com>
Date: Fri, 21 May 2010 14:15:04 +0200
Subject: [PATCH] Generic highlighter: Mime type aliases and parents are now
 considered when searching for a definition.

---
 .../texteditor/generichighlighter/manager.cpp | 13 +++-
 .../texteditor/generichighlighter/manager.h   |  1 +
 src/plugins/texteditor/plaintexteditor.cpp    | 67 ++++++++++++++-----
 src/plugins/texteditor/plaintexteditor.h      | 15 ++++-
 4 files changed, 73 insertions(+), 23 deletions(-)

diff --git a/src/plugins/texteditor/generichighlighter/manager.cpp b/src/plugins/texteditor/generichighlighter/manager.cpp
index 1c41983e20f..ede33fc8e81 100644
--- a/src/plugins/texteditor/generichighlighter/manager.cpp
+++ b/src/plugins/texteditor/generichighlighter/manager.cpp
@@ -78,8 +78,6 @@ QString Manager::definitionIdByName(const QString &name) const
 
 QString Manager::definitionIdByMimeType(const QString &mimeType) const
 {
-    Q_ASSERT(!mimeType.isEmpty());
-
     if (m_idByMimeType.count(mimeType) <= 1) {
         return m_idByMimeType.value(mimeType);
     } else {
@@ -94,6 +92,17 @@ QString Manager::definitionIdByMimeType(const QString &mimeType) const
     }
 }
 
+QString Manager::definitionIdByAnyMimeType(const QStringList &mimeTypes) const
+{
+    QString definitionId;
+    foreach (const QString &mimeType, mimeTypes) {
+        definitionId = definitionIdByMimeType(mimeType);
+        if (!definitionId.isEmpty())
+            break;
+    }
+    return definitionId;
+}
+
 const QSharedPointer<HighlightDefinition> &Manager::definition(const QString &id)
 {
     if (!m_definitions.contains(id)) {
diff --git a/src/plugins/texteditor/generichighlighter/manager.h b/src/plugins/texteditor/generichighlighter/manager.h
index 2c0073eecc5..347a86c86b1 100644
--- a/src/plugins/texteditor/generichighlighter/manager.h
+++ b/src/plugins/texteditor/generichighlighter/manager.h
@@ -59,6 +59,7 @@ public:
 
     QString definitionIdByName(const QString &name) const;
     QString definitionIdByMimeType(const QString &mimeType) const;
+    QString definitionIdByAnyMimeType(const QStringList &mimeTypes) const;
     bool isBuildingDefinition(const QString &id) const;
     const QSharedPointer<HighlightDefinition> &definition(const QString &id);
 
diff --git a/src/plugins/texteditor/plaintexteditor.cpp b/src/plugins/texteditor/plaintexteditor.cpp
index 2c748b07384..7b460e4ba5a 100644
--- a/src/plugins/texteditor/plaintexteditor.cpp
+++ b/src/plugins/texteditor/plaintexteditor.cpp
@@ -37,6 +37,7 @@
 #include "highlighter.h"
 #include "highlighterexception.h"
 #include "manager.h"
+#include "normalindenter.h"
 
 #include <coreplugin/coreconstants.h>
 #include <coreplugin/uniqueidmanager.h>
@@ -65,6 +66,7 @@ PlainTextEditor::PlainTextEditor(QWidget *parent)
     setRequestMarkEnabled(false);
     setLineSeparatorsAllowed(true);
 
+    setMimeType(QLatin1String(TextEditor::Constants::C_TEXTEDITOR_MIMETYPE_TEXT));
     setDisplayName(tr(Core::Constants::K_DEFAULT_TEXT_EDITOR_DISPLAY_NAME));
 
     m_commentDefinition.clearCommentStyles();
@@ -72,6 +74,9 @@ PlainTextEditor::PlainTextEditor(QWidget *parent)
     connect(file(), SIGNAL(changed()), this, SLOT(configure()));
 }
 
+PlainTextEditor::~PlainTextEditor()
+{}
+
 QList<int> PlainTextEditorEditable::context() const
 {
     return m_context;
@@ -95,32 +100,42 @@ void PlainTextEditor::unCommentSelection()
     Utils::unCommentSelection(this, m_commentDefinition);
 }
 
-void PlainTextEditor::setFontSettings(const TextEditor::FontSettings & fs)
+void PlainTextEditor::setFontSettings(const FontSettings & fs)
 {
-    TextEditor::BaseTextEditor::setFontSettings(fs);
-
-    Highlighter *highlighter = static_cast<Highlighter *>(baseTextDocument()->syntaxHighlighter());
-    if (!highlighter)
-        return;
+    BaseTextEditor::setFontSettings(fs);
 
-    highlighter->configureFormats(fs);
-    highlighter->rehighlight();
+    if (baseTextDocument()->syntaxHighlighter()) {
+        Highlighter *highlighter =
+                static_cast<Highlighter *>(baseTextDocument()->syntaxHighlighter());
+        highlighter->configureFormats(fs);
+        highlighter->rehighlight();
+    }
 }
 
 void PlainTextEditor::configure()
 {
-    const QString &mimeType = Core::ICore::instance()->mimeDatabase()->findByFile(
-            QFileInfo(file()->fileName())).type();
-    baseTextDocument()->setMimeType(mimeType);
+    configure(Core::ICore::instance()->mimeDatabase()->findByFile(file()->fileName()));
+}
+
+void PlainTextEditor::configure(const Core::MimeType &mimeType)
+{
+    if (mimeType.isNull())
+        return;
+
+    const QString &type = mimeType.type();
+    setMimeType(type);
+
+    QString definitionId = Manager::instance()->definitionIdByMimeType(type);
+    if (definitionId.isEmpty())
+        definitionId = findDefinitionId(mimeType, true);
 
-    const QString &definitionId = Manager::instance()->definitionIdByMimeType(mimeType);
     if (!definitionId.isEmpty()) {
         try {
             const QSharedPointer<HighlightDefinition> &definition =
                     Manager::instance()->definition(definitionId);
 
             Highlighter *highlighter = new Highlighter(definition->initialContext());
-            highlighter->configureFormats(TextEditor::TextEditorSettings::instance()->fontSettings());
+            highlighter->configureFormats(TextEditorSettings::instance()->fontSettings());
 
             baseTextDocument()->setSyntaxHighlighter(highlighter);
 
@@ -132,11 +147,27 @@ void PlainTextEditor::configure()
         }
     }
 
-    // @todo: Indentation specification through the definition files is not really being
-    // used because Kate recommends to configure indentation  through another feature.
-    // Maybe we should provide something similar in Creator? For now, only normal
-    // indentation is supported.
-    m_indenter.reset(new TextEditor::NormalIndenter);
+    // @todo: Indentation specification through the definition files is not really being used
+    // because Kate recommends to configure indentation  through another feature. Maybe we should
+    // provide something similar in Creator? For now, only normal indentation is supported.
+    m_indenter.reset(new NormalIndenter);
+}
+
+QString PlainTextEditor::findDefinitionId(const Core::MimeType &mimeType,
+                                          bool considerParents) const
+{
+    QString definitionId = Manager::instance()->definitionIdByAnyMimeType(mimeType.aliases());
+    if (definitionId.isEmpty() && considerParents) {
+        definitionId = Manager::instance()->definitionIdByAnyMimeType(mimeType.subClassesOf());
+        if (definitionId.isEmpty()) {
+            foreach (const QString &parent, mimeType.subClassesOf()) {
+                const Core::MimeType &parentMimeType =
+                        Core::ICore::instance()->mimeDatabase()->findByType(parent);
+                definitionId = findDefinitionId(parentMimeType, considerParents);
+            }
+        }
+    }
+    return definitionId;
 }
 
 void PlainTextEditor::indentBlock(QTextDocument *doc, QTextBlock block, QChar typedChar)
diff --git a/src/plugins/texteditor/plaintexteditor.h b/src/plugins/texteditor/plaintexteditor.h
index fdc85423d2c..15144752f63 100644
--- a/src/plugins/texteditor/plaintexteditor.h
+++ b/src/plugins/texteditor/plaintexteditor.h
@@ -31,16 +31,20 @@
 #define PLAINTEXTEDITOR_H
 
 #include "basetexteditor.h"
-#include "normalindenter.h"
 
 #include <utils/uncommentselection.h>
 
 #include <QtCore/QList>
 #include <QtCore/QScopedPointer>
 
+namespace Core {
+class MimeType;
+}
+
 namespace TextEditor {
 
 class PlainTextEditor;
+class Indenter;
 
 class TEXTEDITOR_EXPORT PlainTextEditorEditable : public BaseTextEditorEditable
 {
@@ -63,10 +67,13 @@ class TEXTEDITOR_EXPORT PlainTextEditor : public BaseTextEditor
 
 public:
     PlainTextEditor(QWidget *parent);
+    ~PlainTextEditor();
+
+    void configure(const Core::MimeType &mimeType);
 
 public slots:
     virtual void unCommentSelection();
-    virtual void setFontSettings(const TextEditor::FontSettings &);
+    virtual void setFontSettings(const FontSettings &fs);
 
 private slots:
     void configure();
@@ -76,8 +83,10 @@ protected:
     virtual void indentBlock(QTextDocument *doc, QTextBlock block, QChar typedChar);
 
 private:
+    QString findDefinitionId(const Core::MimeType &mimeType, bool considerParents) const;
+
     Utils::CommentDefinition m_commentDefinition;
-    QScopedPointer<TextEditor::Indenter> m_indenter;
+    QScopedPointer<Indenter> m_indenter;
 };
 
 } // namespace TextEditor
-- 
GitLab