Commit 0894033f authored by Leandro Melo's avatar Leandro Melo
Browse files

Coloring white spaces even if there's no highlight syntax definition set.

Relative to QTCREATORBUG-1225.
parent 54ea41af
......@@ -51,15 +51,12 @@ namespace {
const Highlighter::KateFormatMap Highlighter::m_kateFormats;
Highlighter::Highlighter(const QSharedPointer<Context> &defaultContext,QTextDocument *parent) :
Highlighter::Highlighter(QTextDocument *parent) :
QSyntaxHighlighter(parent),
m_persistentStatesCounter(PersistentsStart),
m_dynamicContextsCounter(0),
m_isBroken(false),
m_defaultContext(defaultContext)
{
m_persistentStates.insert(m_defaultContext->name(), Default);
}
m_isBroken(false)
{}
Highlighter::~Highlighter()
{}
......@@ -88,37 +85,47 @@ Highlighter::KateFormatMap::KateFormatMap()
m_ids.insert(QLatin1String("dsError"), Highlighter::Error);
}
void Highlighter::highlightBlock(const QString &text)
void Highlighter::configureFormat(TextFormatId id, const QTextCharFormat &format)
{
if (m_isBroken)
return;
m_creatorFormats[id] = format;
}
try {
setupDataForBlock(text);
void Highlighter::setDefaultContext(const QSharedPointer<Context> &defaultContext)
{
m_defaultContext = defaultContext;
m_persistentStates.insert(m_defaultContext->name(), Default);
}
handleContextChange(m_currentContext->lineBeginContext(), m_currentContext->definition());
void Highlighter::highlightBlock(const QString &text)
{
if (!m_defaultContext.isNull() && !m_isBroken) {
try {
setupDataForBlock(text);
ProgressData progress;
const int length = text.length();
while (progress.offset() < length) {
handleContextChange(m_currentContext->lineBeginContext(),
m_currentContext->definition());
if (progress.offset() > 0 &&
progress.onlySpacesSoFar() &&
!text.at(progress.offset()).isSpace()) {
progress.setOnlySpacesSoFar(false);
ProgressData progress;
const int length = text.length();
while (progress.offset() < length) {
if (progress.offset() > 0 &&
progress.onlySpacesSoFar() &&
!text.at(progress.offset()).isSpace()) {
progress.setOnlySpacesSoFar(false);
}
iterateThroughRules(text, length, &progress, false, m_currentContext->rules());
}
iterateThroughRules(text, length, &progress, false, m_currentContext->rules());
handleContextChange(m_currentContext->lineEndContext(),
m_currentContext->definition(),
false);
m_contexts.clear();
} catch (const HighlighterException &) {
m_isBroken = true;
}
handleContextChange(m_currentContext->lineEndContext(), m_currentContext->definition(),
false);
} catch (const HighlighterException &) {
m_isBroken = true;
return;
}
m_contexts.clear();
applyVisualWhitespaceFormat(text);
}
......@@ -462,8 +469,3 @@ void Highlighter::setCurrentContext()
}
m_currentContext = m_contexts.back();
}
void Highlighter::configureFormat(TextFormatId id, const QTextCharFormat &format)
{
m_creatorFormats[id] = format;
}
......@@ -51,7 +51,7 @@ class ProgressData;
class Highlighter : public QSyntaxHighlighter
{
public:
Highlighter(const QSharedPointer<Context> &defaultContext, QTextDocument *parent = 0);
Highlighter(QTextDocument *parent = 0);
virtual ~Highlighter();
enum TextFormatId {
......@@ -73,6 +73,8 @@ public:
};
void configureFormat(TextFormatId id, const QTextCharFormat &format);
void setDefaultContext(const QSharedPointer<Context> &defaultContext);
protected:
virtual void highlightBlock(const QString &text);
......
......@@ -160,32 +160,31 @@ void PlainTextEditor::fileChanged()
void PlainTextEditor::configure(const Core::MimeType &mimeType)
{
Highlighter *highlighter = new Highlighter();
baseTextDocument()->setSyntaxHighlighter(highlighter);
m_isMissingSyntaxDefinition = true;
if (mimeType.isNull())
return;
QString definitionId;
if (!mimeType.isNull()) {
const QString &type = mimeType.type();
setMimeType(type);
const QString &type = mimeType.type();
setMimeType(type);
QString definitionId = Manager::instance()->definitionIdByMimeType(type);
if (definitionId.isEmpty())
definitionId = findDefinitionId(mimeType, true);
definitionId = Manager::instance()->definitionIdByMimeType(type);
if (definitionId.isEmpty())
definitionId = findDefinitionId(mimeType, true);
}
if (!definitionId.isEmpty()) {
const QSharedPointer<HighlightDefinition> &definition =
Manager::instance()->definition(definitionId);
if (!definition.isNull()) {
Highlighter *highlighter = new Highlighter(definition->initialContext());
baseTextDocument()->setSyntaxHighlighter(highlighter);
highlighter->setDefaultContext(definition->initialContext());
m_commentDefinition.setAfterWhiteSpaces(definition->isCommentAfterWhiteSpaces());
m_commentDefinition.setSingleLine(definition->singleLineComment());
m_commentDefinition.setMultiLineStart(definition->multiLineCommentStart());
m_commentDefinition.setMultiLineEnd(definition->multiLineCommentEnd());
setFontSettings(TextEditorSettings::instance()->fontSettings());
m_isMissingSyntaxDefinition = false;
}
} else if (file()) {
......@@ -194,6 +193,8 @@ void PlainTextEditor::configure(const Core::MimeType &mimeType)
m_isMissingSyntaxDefinition = false;
}
setFontSettings(TextEditorSettings::instance()->fontSettings());
// @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.
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment