Generic highlighter: Mime type aliases and parents are now considered when searching for a definition.

This commit is contained in:
Leandro Melo
2010-05-21 14:15:04 +02:00
parent 98bc350e32
commit f0af012226
4 changed files with 73 additions and 23 deletions

View File

@@ -78,8 +78,6 @@ QString Manager::definitionIdByName(const QString &name) const
QString Manager::definitionIdByMimeType(const QString &mimeType) const QString Manager::definitionIdByMimeType(const QString &mimeType) const
{ {
Q_ASSERT(!mimeType.isEmpty());
if (m_idByMimeType.count(mimeType) <= 1) { if (m_idByMimeType.count(mimeType) <= 1) {
return m_idByMimeType.value(mimeType); return m_idByMimeType.value(mimeType);
} else { } 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) const QSharedPointer<HighlightDefinition> &Manager::definition(const QString &id)
{ {
if (!m_definitions.contains(id)) { if (!m_definitions.contains(id)) {

View File

@@ -59,6 +59,7 @@ public:
QString definitionIdByName(const QString &name) const; QString definitionIdByName(const QString &name) const;
QString definitionIdByMimeType(const QString &mimeType) const; QString definitionIdByMimeType(const QString &mimeType) const;
QString definitionIdByAnyMimeType(const QStringList &mimeTypes) const;
bool isBuildingDefinition(const QString &id) const; bool isBuildingDefinition(const QString &id) const;
const QSharedPointer<HighlightDefinition> &definition(const QString &id); const QSharedPointer<HighlightDefinition> &definition(const QString &id);

View File

@@ -37,6 +37,7 @@
#include "highlighter.h" #include "highlighter.h"
#include "highlighterexception.h" #include "highlighterexception.h"
#include "manager.h" #include "manager.h"
#include "normalindenter.h"
#include <coreplugin/coreconstants.h> #include <coreplugin/coreconstants.h>
#include <coreplugin/uniqueidmanager.h> #include <coreplugin/uniqueidmanager.h>
@@ -65,6 +66,7 @@ PlainTextEditor::PlainTextEditor(QWidget *parent)
setRequestMarkEnabled(false); setRequestMarkEnabled(false);
setLineSeparatorsAllowed(true); setLineSeparatorsAllowed(true);
setMimeType(QLatin1String(TextEditor::Constants::C_TEXTEDITOR_MIMETYPE_TEXT));
setDisplayName(tr(Core::Constants::K_DEFAULT_TEXT_EDITOR_DISPLAY_NAME)); setDisplayName(tr(Core::Constants::K_DEFAULT_TEXT_EDITOR_DISPLAY_NAME));
m_commentDefinition.clearCommentStyles(); m_commentDefinition.clearCommentStyles();
@@ -72,6 +74,9 @@ PlainTextEditor::PlainTextEditor(QWidget *parent)
connect(file(), SIGNAL(changed()), this, SLOT(configure())); connect(file(), SIGNAL(changed()), this, SLOT(configure()));
} }
PlainTextEditor::~PlainTextEditor()
{}
QList<int> PlainTextEditorEditable::context() const QList<int> PlainTextEditorEditable::context() const
{ {
return m_context; return m_context;
@@ -95,32 +100,42 @@ void PlainTextEditor::unCommentSelection()
Utils::unCommentSelection(this, m_commentDefinition); Utils::unCommentSelection(this, m_commentDefinition);
} }
void PlainTextEditor::setFontSettings(const TextEditor::FontSettings & fs) void PlainTextEditor::setFontSettings(const FontSettings & fs)
{ {
TextEditor::BaseTextEditor::setFontSettings(fs); BaseTextEditor::setFontSettings(fs);
Highlighter *highlighter = static_cast<Highlighter *>(baseTextDocument()->syntaxHighlighter());
if (!highlighter)
return;
if (baseTextDocument()->syntaxHighlighter()) {
Highlighter *highlighter =
static_cast<Highlighter *>(baseTextDocument()->syntaxHighlighter());
highlighter->configureFormats(fs); highlighter->configureFormats(fs);
highlighter->rehighlight(); highlighter->rehighlight();
} }
}
void PlainTextEditor::configure() void PlainTextEditor::configure()
{ {
const QString &mimeType = Core::ICore::instance()->mimeDatabase()->findByFile( configure(Core::ICore::instance()->mimeDatabase()->findByFile(file()->fileName()));
QFileInfo(file()->fileName())).type(); }
baseTextDocument()->setMimeType(mimeType);
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()) { if (!definitionId.isEmpty()) {
try { try {
const QSharedPointer<HighlightDefinition> &definition = const QSharedPointer<HighlightDefinition> &definition =
Manager::instance()->definition(definitionId); Manager::instance()->definition(definitionId);
Highlighter *highlighter = new Highlighter(definition->initialContext()); Highlighter *highlighter = new Highlighter(definition->initialContext());
highlighter->configureFormats(TextEditor::TextEditorSettings::instance()->fontSettings()); highlighter->configureFormats(TextEditorSettings::instance()->fontSettings());
baseTextDocument()->setSyntaxHighlighter(highlighter); baseTextDocument()->setSyntaxHighlighter(highlighter);
@@ -132,11 +147,27 @@ void PlainTextEditor::configure()
} }
} }
// @todo: Indentation specification through the definition files is not really being // @todo: Indentation specification through the definition files is not really being used
// used because Kate recommends to configure indentation through another feature. // because Kate recommends to configure indentation through another feature. Maybe we should
// Maybe we should provide something similar in Creator? For now, only normal // provide something similar in Creator? For now, only normal indentation is supported.
// indentation is supported. m_indenter.reset(new NormalIndenter);
m_indenter.reset(new TextEditor::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) void PlainTextEditor::indentBlock(QTextDocument *doc, QTextBlock block, QChar typedChar)

View File

@@ -31,16 +31,20 @@
#define PLAINTEXTEDITOR_H #define PLAINTEXTEDITOR_H
#include "basetexteditor.h" #include "basetexteditor.h"
#include "normalindenter.h"
#include <utils/uncommentselection.h> #include <utils/uncommentselection.h>
#include <QtCore/QList> #include <QtCore/QList>
#include <QtCore/QScopedPointer> #include <QtCore/QScopedPointer>
namespace Core {
class MimeType;
}
namespace TextEditor { namespace TextEditor {
class PlainTextEditor; class PlainTextEditor;
class Indenter;
class TEXTEDITOR_EXPORT PlainTextEditorEditable : public BaseTextEditorEditable class TEXTEDITOR_EXPORT PlainTextEditorEditable : public BaseTextEditorEditable
{ {
@@ -63,10 +67,13 @@ class TEXTEDITOR_EXPORT PlainTextEditor : public BaseTextEditor
public: public:
PlainTextEditor(QWidget *parent); PlainTextEditor(QWidget *parent);
~PlainTextEditor();
void configure(const Core::MimeType &mimeType);
public slots: public slots:
virtual void unCommentSelection(); virtual void unCommentSelection();
virtual void setFontSettings(const TextEditor::FontSettings &); virtual void setFontSettings(const FontSettings &fs);
private slots: private slots:
void configure(); void configure();
@@ -76,8 +83,10 @@ protected:
virtual void indentBlock(QTextDocument *doc, QTextBlock block, QChar typedChar); virtual void indentBlock(QTextDocument *doc, QTextBlock block, QChar typedChar);
private: private:
QString findDefinitionId(const Core::MimeType &mimeType, bool considerParents) const;
Utils::CommentDefinition m_commentDefinition; Utils::CommentDefinition m_commentDefinition;
QScopedPointer<TextEditor::Indenter> m_indenter; QScopedPointer<Indenter> m_indenter;
}; };
} // namespace TextEditor } // namespace TextEditor