mirror of
https://github.com/sqlitebrowser/sqlitebrowser.git
synced 2026-01-24 12:59:58 -06:00
This is a first rough implementation of QScintilla support as SQL text editor. It should work mostly and build fine with qmake as well as cmake. The new code supports all the features of the old one plus adding a few subtle improvements. The main point of this, however, is reducing the code we have to maintain and making it easier to add new features to the editor.
80 lines
2.2 KiB
C++
80 lines
2.2 KiB
C++
// Scintilla source code edit control
|
|
/** @file KeyWords.cxx
|
|
** Colourise for particular languages.
|
|
**/
|
|
// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>
|
|
// The License.txt file describes the conditions under which this software may be distributed.
|
|
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
#include <stdarg.h>
|
|
#include <assert.h>
|
|
#include <ctype.h>
|
|
|
|
#include "ILexer.h"
|
|
#include "Scintilla.h"
|
|
#include "SciLexer.h"
|
|
|
|
#include "PropSetSimple.h"
|
|
#include "WordList.h"
|
|
#include "LexAccessor.h"
|
|
#include "Accessor.h"
|
|
|
|
#ifdef SCI_NAMESPACE
|
|
using namespace Scintilla;
|
|
#endif
|
|
|
|
Accessor::Accessor(IDocument *pAccess_, PropSetSimple *pprops_) : LexAccessor(pAccess_), pprops(pprops_) {
|
|
}
|
|
|
|
int Accessor::GetPropertyInt(const char *key, int defaultValue) const {
|
|
return pprops->GetInt(key, defaultValue);
|
|
}
|
|
|
|
int Accessor::IndentAmount(int line, int *flags, PFNIsCommentLeader pfnIsCommentLeader) {
|
|
int end = Length();
|
|
int spaceFlags = 0;
|
|
|
|
// Determines the indentation level of the current line and also checks for consistent
|
|
// indentation compared to the previous line.
|
|
// Indentation is judged consistent when the indentation whitespace of each line lines
|
|
// the same or the indentation of one line is a prefix of the other.
|
|
|
|
int pos = LineStart(line);
|
|
char ch = (*this)[pos];
|
|
int indent = 0;
|
|
bool inPrevPrefix = line > 0;
|
|
int posPrev = inPrevPrefix ? LineStart(line-1) : 0;
|
|
while ((ch == ' ' || ch == '\t') && (pos < end)) {
|
|
if (inPrevPrefix) {
|
|
char chPrev = (*this)[posPrev++];
|
|
if (chPrev == ' ' || chPrev == '\t') {
|
|
if (chPrev != ch)
|
|
spaceFlags |= wsInconsistent;
|
|
} else {
|
|
inPrevPrefix = false;
|
|
}
|
|
}
|
|
if (ch == ' ') {
|
|
spaceFlags |= wsSpace;
|
|
indent++;
|
|
} else { // Tab
|
|
spaceFlags |= wsTab;
|
|
if (spaceFlags & wsSpace)
|
|
spaceFlags |= wsSpaceTab;
|
|
indent = (indent / 8 + 1) * 8;
|
|
}
|
|
ch = (*this)[++pos];
|
|
}
|
|
|
|
*flags = spaceFlags;
|
|
indent += SC_FOLDLEVELBASE;
|
|
// if completely empty line or the start of a comment...
|
|
if ((LineStart(line) == Length()) || (ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r') ||
|
|
(pfnIsCommentLeader && (*pfnIsCommentLeader)(*this, pos, end-pos)))
|
|
return indent | SC_FOLDLEVELWHITEFLAG;
|
|
else
|
|
return indent;
|
|
}
|