~bzoltan/kubuntu-packaging/decouple_cmake_plugin

« back to all changes in this revision

Viewing changes to src/plugins/texteditor/generichighlighter/highlighter.cpp

  • Committer: Timo Jyrinki
  • Date: 2013-12-02 09:16:15 UTC
  • mfrom: (1.1.29)
  • Revision ID: timo.jyrinki@canonical.com-20131202091615-xbj1os1f604ber1m
New upstream release candidate.

Show diffs side-by-side

added added

removed removed

Lines of Context:
50
50
    static const QLatin1Char kHash('#');
51
51
}
52
52
 
 
53
class HighlighterCodeFormatterData : public CodeFormatterData
 
54
{
 
55
public:
 
56
    HighlighterCodeFormatterData() : m_foldingIndentDelta(0), m_originalObservableState(-1) {}
 
57
    ~HighlighterCodeFormatterData() {}
 
58
    int m_foldingIndentDelta;
 
59
    int m_originalObservableState;
 
60
    QStack<QString> m_foldingRegions;
 
61
    QSharedPointer<Internal::Context> m_contextToContinue;
 
62
};
 
63
 
 
64
HighlighterCodeFormatterData *formatterData(const QTextBlock &block)
 
65
{
 
66
    HighlighterCodeFormatterData *data = 0;
 
67
    if (TextBlockUserData *userData = BaseTextDocumentLayout::userData(block)) {
 
68
        data = static_cast<HighlighterCodeFormatterData *>(userData->codeFormatterData());
 
69
        if (!data) {
 
70
            data = new HighlighterCodeFormatterData;
 
71
            userData->setCodeFormatterData(data);
 
72
        }
 
73
    }
 
74
    return data;
 
75
}
 
76
 
53
77
Highlighter::Highlighter(QTextDocument *parent) :
54
78
    TextEditor::SyntaxHighlighter(parent),
55
79
    m_regionDepth(0),
71
95
                   << TextEditor::C_NUMBER
72
96
                   << TextEditor::C_STRING
73
97
                   << TextEditor::C_STRING
74
 
                   << TextEditor::C_TEXT
75
 
                   << TextEditor::C_TEXT
76
 
                   << TextEditor::C_TEXT
77
 
                   << TextEditor::C_TEXT
78
 
                   << TextEditor::C_TEXT;
 
98
                   << TextEditor::C_TEXT // TODO : add style for alert (eg. yellow background)
 
99
                   << TextEditor::C_TEXT // TODO : add style for error (eg. red underline)
 
100
                   << TextEditor::C_FUNCTION
 
101
                   << TextEditor::C_TEXT
 
102
                   << TextEditor::C_TEXT
 
103
                   << TextEditor::C_LOCAL;
79
104
    }
80
105
 
81
106
    setTextFormatCategories(categories);
84
109
Highlighter::~Highlighter()
85
110
{}
86
111
 
87
 
Highlighter::BlockData::BlockData() : m_foldingIndentDelta(0), m_originalObservableState(-1)
88
 
{}
89
 
 
90
 
Highlighter::BlockData::~BlockData()
91
 
{}
92
 
 
93
112
// Mapping from Kate format strings to format ids.
94
113
struct KateFormatMap
95
114
{
113
132
    m_ids.insert(QLatin1String("dsFunction"), Highlighter::Function);
114
133
    m_ids.insert(QLatin1String("dsRegionMarker"), Highlighter::RegionMarker);
115
134
    m_ids.insert(QLatin1String("dsOthers"), Highlighter::Others);
 
135
    m_ids.insert(QLatin1String("dsIdentifier"), Highlighter::Identifier);
116
136
}
117
137
 
118
138
Q_GLOBAL_STATIC(KateFormatMap, kateFormatMap)
133
153
{
134
154
    if (!m_defaultContext.isNull() && !m_isBroken) {
135
155
        try {
136
 
            if (!currentBlockUserData())
137
 
                initializeBlockData();
138
156
            setupDataForBlock(text);
139
157
 
140
158
            handleContextChange(m_currentContext->lineBeginContext(),
186
204
        else
187
205
            setupFromPersistent();
188
206
 
189
 
        blockData(currentBlockUserData())->m_foldingRegions =
190
 
            blockData(currentBlock().previous().userData())->m_foldingRegions;
 
207
        formatterData(currentBlock())->m_foldingRegions =
 
208
                formatterData(currentBlock().previous())->m_foldingRegions;
191
209
    }
192
210
 
193
211
    assignCurrentContext();
202
220
 
203
221
void Highlighter::setupFromWillContinue()
204
222
{
205
 
    BlockData *previousData = blockData(currentBlock().previous().userData());
 
223
    HighlighterCodeFormatterData *previousData = formatterData(currentBlock().previous());
206
224
    if (previousData->m_originalObservableState == Default ||
207
225
        previousData->m_originalObservableState == -1) {
208
226
        m_contexts.push_back(previousData->m_contextToContinue);
210
228
        pushContextSequence(previousData->m_originalObservableState);
211
229
    }
212
230
 
213
 
    BlockData *data = blockData(currentBlock().userData());
 
231
    HighlighterCodeFormatterData *data = formatterData(currentBlock());
214
232
    data->m_originalObservableState = previousData->m_originalObservableState;
215
233
 
216
234
    if (currentBlockState() == -1 || extractObservableState(currentBlockState()) == Default)
219
237
 
220
238
void Highlighter::setupFromContinued()
221
239
{
222
 
    BlockData *previousData = blockData(currentBlock().previous().userData());
 
240
    HighlighterCodeFormatterData *previousData = formatterData(currentBlock().previous());
223
241
 
224
242
    Q_ASSERT(previousData->m_originalObservableState != WillContinue &&
225
243
             previousData->m_originalObservableState != Continued);
262
280
 
263
281
            if (!m_indentationBasedFolding) {
264
282
                if (!rule->beginRegion().isEmpty()) {
265
 
                    blockData(currentBlockUserData())->m_foldingRegions.push(rule->beginRegion());
 
283
                    formatterData(currentBlock())->m_foldingRegions.push(rule->beginRegion());
266
284
                    ++m_regionDepth;
267
285
                    if (progress->isOpeningBraceMatchAtFirstNonSpace())
268
 
                        ++blockData(currentBlockUserData())->m_foldingIndentDelta;
 
286
                        ++formatterData(currentBlock())->m_foldingIndentDelta;
269
287
                }
270
288
                if (!rule->endRegion().isEmpty()) {
271
289
                    QStack<QString> *currentRegions =
272
 
                        &blockData(currentBlockUserData())->m_foldingRegions;
 
290
                        &formatterData(currentBlock())->m_foldingRegions;
273
291
                    if (!currentRegions->isEmpty() && rule->endRegion() == currentRegions->top()) {
274
292
                        currentRegions->pop();
275
293
                        --m_regionDepth;
276
294
                        if (progress->isClosingBraceMatchAtNonEnd())
277
 
                            --blockData(currentBlockUserData())->m_foldingIndentDelta;
 
295
                            --formatterData(currentBlock())->m_foldingIndentDelta;
278
296
                    }
279
297
                }
280
298
                progress->clearBracesMatches();
440
458
 
441
459
void Highlighter::createWillContinueBlock()
442
460
{
443
 
    BlockData *data = blockData(currentBlockUserData());
 
461
    HighlighterCodeFormatterData *data = formatterData(currentBlock());
444
462
    const int currentObservableState = extractObservableState(currentBlockState());
445
463
    if (currentObservableState == Continued) {
446
 
        BlockData *previousData = blockData(currentBlock().previous().userData());
 
464
        HighlighterCodeFormatterData *previousData = formatterData(currentBlock().previous());
447
465
        data->m_originalObservableState = previousData->m_originalObservableState;
448
466
    } else if (currentObservableState != WillContinue) {
449
467
        data->m_originalObservableState = currentObservableState;
462
480
    }
463
481
 
464
482
    if (text.length() == 0 || text.at(text.length() - 1) != kBackSlash) {
465
 
        BlockData *data = blockData(currentBlockUserData());
 
483
        HighlighterCodeFormatterData *data = formatterData(currentBlock());
466
484
        data->m_contextToContinue.clear();
467
485
        setCurrentBlockState(computeState(data->m_originalObservableState));
468
486
    }
501
519
    return sequence;
502
520
}
503
521
 
504
 
Highlighter::BlockData *Highlighter::initializeBlockData()
505
 
{
506
 
    BlockData *data = new BlockData;
507
 
    setCurrentBlockUserData(data);
508
 
    return data;
509
 
}
510
 
 
511
 
Highlighter::BlockData *Highlighter::blockData(QTextBlockUserData *userData)
512
 
{
513
 
    return static_cast<BlockData *>(userData);
514
 
}
515
 
 
516
522
void Highlighter::pushDynamicContext(const QSharedPointer<Context> &baseContext)
517
523
{
518
524
    // A dynamic context is created from another context which serves as its basis. Then,
554
560
void Highlighter::applyRegionBasedFolding() const
555
561
{
556
562
    int folding = 0;
557
 
    BlockData *data = blockData(currentBlockUserData());
558
 
    BlockData *previousData = blockData(currentBlock().previous().userData());
 
563
    TextBlockUserData *currentBlockUserData = BaseTextDocumentLayout::userData(currentBlock());
 
564
    HighlighterCodeFormatterData *data = formatterData(currentBlock());
 
565
    HighlighterCodeFormatterData *previousData = formatterData(currentBlock().previous());
559
566
    if (previousData) {
560
567
        folding = extractRegionDepth(previousBlockState());
561
568
        if (data->m_foldingIndentDelta != 0) {
562
569
            folding += data->m_foldingIndentDelta;
563
570
            if (data->m_foldingIndentDelta > 0)
564
 
                data->setFoldingStartIncluded(true);
 
571
                currentBlockUserData->setFoldingStartIncluded(true);
565
572
            else
566
 
                previousData->setFoldingEndIncluded(false);
 
573
                BaseTextDocumentLayout::userData(currentBlock().previous())->setFoldingEndIncluded(false);
567
574
            data->m_foldingIndentDelta = 0;
568
575
        }
569
576
    }
570
 
    data->setFoldingEndIncluded(true);
571
 
    data->setFoldingIndent(folding);
 
577
    currentBlockUserData->setFoldingEndIncluded(true);
 
578
    currentBlockUserData->setFoldingIndent(folding);
572
579
}
573
580
 
574
581
void Highlighter::applyIndentationBasedFolding(const QString &text) const
575
582
{
576
 
    BlockData *data = blockData(currentBlockUserData());
 
583
    TextBlockUserData *data = BaseTextDocumentLayout::userData(currentBlock());
577
584
    data->setFoldingEndIncluded(true);
578
585
 
579
586
    // If this line is empty, check its neighbours. They all might be part of the same block.