mirror of
https://github.com/NohamR/Reclass.git
synced 2026-05-10 19:59:21 +00:00
522 lines
13 KiB
C++
522 lines
13 KiB
C++
// This module implements the QsciLexerSQL class.
|
|
//
|
|
// Copyright (c) 2023 Riverbank Computing Limited <info@riverbankcomputing.com>
|
|
//
|
|
// This file is part of QScintilla.
|
|
//
|
|
// This file may be used under the terms of the GNU General Public License
|
|
// version 3.0 as published by the Free Software Foundation and appearing in
|
|
// the file LICENSE included in the packaging of this file. Please review the
|
|
// following information to ensure the GNU General Public License version 3.0
|
|
// requirements will be met: http://www.gnu.org/copyleft/gpl.html.
|
|
//
|
|
// If you do not wish to use this file under the terms of the GPL version 3.0
|
|
// then you may purchase a commercial license. For more information contact
|
|
// info@riverbankcomputing.com.
|
|
//
|
|
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
|
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
|
|
#include "Qsci/qscilexersql.h"
|
|
|
|
#include <qcolor.h>
|
|
#include <qfont.h>
|
|
#include <qsettings.h>
|
|
|
|
|
|
// The ctor.
|
|
QsciLexerSQL::QsciLexerSQL(QObject *parent)
|
|
: QsciLexer(parent),
|
|
at_else(false), fold_comments(false), fold_compact(true),
|
|
only_begin(false), backticks_identifier(false),
|
|
numbersign_comment(false), backslash_escapes(false),
|
|
allow_dotted_word(false)
|
|
{
|
|
}
|
|
|
|
|
|
// The dtor.
|
|
QsciLexerSQL::~QsciLexerSQL()
|
|
{
|
|
}
|
|
|
|
|
|
// Returns the language name.
|
|
const char *QsciLexerSQL::language() const
|
|
{
|
|
return "SQL";
|
|
}
|
|
|
|
|
|
// Returns the lexer name.
|
|
const char *QsciLexerSQL::lexer() const
|
|
{
|
|
return "sql";
|
|
}
|
|
|
|
|
|
// Return the style used for braces.
|
|
int QsciLexerSQL::braceStyle() const
|
|
{
|
|
return Operator;
|
|
}
|
|
|
|
|
|
// Returns the foreground colour of the text for a style.
|
|
QColor QsciLexerSQL::defaultColor(int style) const
|
|
{
|
|
switch (style)
|
|
{
|
|
case Default:
|
|
return QColor(0x80,0x80,0x80);
|
|
|
|
case Comment:
|
|
case CommentLine:
|
|
case PlusPrompt:
|
|
case PlusComment:
|
|
case CommentLineHash:
|
|
return QColor(0x00,0x7f,0x00);
|
|
|
|
case CommentDoc:
|
|
return QColor(0x7f,0x7f,0x7f);
|
|
|
|
case Number:
|
|
return QColor(0x00,0x7f,0x7f);
|
|
|
|
case Keyword:
|
|
return QColor(0x00,0x00,0x7f);
|
|
|
|
case DoubleQuotedString:
|
|
case SingleQuotedString:
|
|
return QColor(0x7f,0x00,0x7f);
|
|
|
|
case PlusKeyword:
|
|
return QColor(0x7f,0x7f,0x00);
|
|
|
|
case Operator:
|
|
case Identifier:
|
|
break;
|
|
|
|
case CommentDocKeyword:
|
|
return QColor(0x30,0x60,0xa0);
|
|
|
|
case CommentDocKeywordError:
|
|
return QColor(0x80,0x40,0x20);
|
|
|
|
case KeywordSet5:
|
|
return QColor(0x4b,0x00,0x82);
|
|
|
|
case KeywordSet6:
|
|
return QColor(0xb0,0x00,0x40);
|
|
|
|
case KeywordSet7:
|
|
return QColor(0x8b,0x00,0x00);
|
|
|
|
case KeywordSet8:
|
|
return QColor(0x80,0x00,0x80);
|
|
}
|
|
|
|
return QsciLexer::defaultColor(style);
|
|
}
|
|
|
|
|
|
// Returns the end-of-line fill for a style.
|
|
bool QsciLexerSQL::defaultEolFill(int style) const
|
|
{
|
|
if (style == PlusPrompt)
|
|
return true;
|
|
|
|
return QsciLexer::defaultEolFill(style);
|
|
}
|
|
|
|
|
|
// Returns the font of the text for a style.
|
|
QFont QsciLexerSQL::defaultFont(int style) const
|
|
{
|
|
QFont f;
|
|
|
|
switch (style)
|
|
{
|
|
case Comment:
|
|
case CommentLine:
|
|
case PlusComment:
|
|
case CommentLineHash:
|
|
case CommentDocKeyword:
|
|
case CommentDocKeywordError:
|
|
#if defined(Q_OS_WIN)
|
|
f = QFont("Comic Sans MS",9);
|
|
#elif defined(Q_OS_MAC)
|
|
f = QFont("Comic Sans MS", 12);
|
|
#else
|
|
f = QFont("Bitstream Vera Serif",9);
|
|
#endif
|
|
break;
|
|
|
|
case Keyword:
|
|
case Operator:
|
|
f = QsciLexer::defaultFont(style);
|
|
f.setBold(true);
|
|
break;
|
|
|
|
case DoubleQuotedString:
|
|
case SingleQuotedString:
|
|
case PlusPrompt:
|
|
#if defined(Q_OS_WIN)
|
|
f = QFont("Courier New",10);
|
|
#elif defined(Q_OS_MAC)
|
|
f = QFont("Courier", 12);
|
|
#else
|
|
f = QFont("Bitstream Vera Sans Mono",9);
|
|
#endif
|
|
break;
|
|
|
|
default:
|
|
f = QsciLexer::defaultFont(style);
|
|
}
|
|
|
|
return f;
|
|
}
|
|
|
|
|
|
// Returns the set of keywords.
|
|
const char *QsciLexerSQL::keywords(int set) const
|
|
{
|
|
if (set == 1)
|
|
return
|
|
"absolute action add admin after aggregate alias all "
|
|
"allocate alter and any are array as asc assertion "
|
|
"at authorization before begin binary bit blob "
|
|
"boolean both breadth by call cascade cascaded case "
|
|
"cast catalog char character check class clob close "
|
|
"collate collation column commit completion connect "
|
|
"connection constraint constraints constructor "
|
|
"continue corresponding create cross cube current "
|
|
"current_date current_path current_role current_time "
|
|
"current_timestamp current_user cursor cycle data "
|
|
"date day deallocate dec decimal declare default "
|
|
"deferrable deferred delete depth deref desc "
|
|
"describe descriptor destroy destructor "
|
|
"deterministic dictionary diagnostics disconnect "
|
|
"distinct domain double drop dynamic each else end "
|
|
"end-exec equals escape every except exception exec "
|
|
"execute external false fetch first float for "
|
|
"foreign found from free full function general get "
|
|
"global go goto grant group grouping having host "
|
|
"hour identity if ignore immediate in indicator "
|
|
"initialize initially inner inout input insert int "
|
|
"integer intersect interval into is isolation "
|
|
"iterate join key language large last lateral "
|
|
"leading left less level like limit local localtime "
|
|
"localtimestamp locator map match minute modifies "
|
|
"modify module month names national natural nchar "
|
|
"nclob new next no none not null numeric object of "
|
|
"off old on only open operation option or order "
|
|
"ordinality out outer output pad parameter "
|
|
"parameters partial path postfix precision prefix "
|
|
"preorder prepare preserve primary prior privileges "
|
|
"procedure public read reads real recursive ref "
|
|
"references referencing relative restrict result "
|
|
"return returns revoke right role rollback rollup "
|
|
"routine row rows savepoint schema scroll scope "
|
|
"search second section select sequence session "
|
|
"session_user set sets size smallint some| space "
|
|
"specific specifictype sql sqlexception sqlstate "
|
|
"sqlwarning start state statement static structure "
|
|
"system_user table temporary terminate than then "
|
|
"time timestamp timezone_hour timezone_minute to "
|
|
"trailing transaction translation treat trigger "
|
|
"true under union unique unknown unnest update usage "
|
|
"user using value values varchar variable varying "
|
|
"view when whenever where with without work write "
|
|
"year zone";
|
|
|
|
if (set == 3)
|
|
return
|
|
"param author since return see deprecated todo";
|
|
|
|
if (set == 4)
|
|
return
|
|
"acc~ept a~ppend archive log attribute bre~ak "
|
|
"bti~tle c~hange cl~ear col~umn comp~ute conn~ect "
|
|
"copy def~ine del desc~ribe disc~onnect e~dit "
|
|
"exec~ute exit get help ho~st i~nput l~ist passw~ord "
|
|
"pau~se pri~nt pro~mpt quit recover rem~ark "
|
|
"repf~ooter reph~eader r~un sav~e set sho~w shutdown "
|
|
"spo~ol sta~rt startup store timi~ng tti~tle "
|
|
"undef~ine var~iable whenever oserror whenever "
|
|
"sqlerror";
|
|
|
|
if (set == 5)
|
|
return
|
|
"dbms_output.disable dbms_output.enable dbms_output.get_line "
|
|
"dbms_output.get_lines dbms_output.new_line dbms_output.put "
|
|
"dbms_output.put_line";
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
// Returns the user name of a style.
|
|
QString QsciLexerSQL::description(int style) const
|
|
{
|
|
switch (style)
|
|
{
|
|
case Default:
|
|
return tr("Default");
|
|
|
|
case Comment:
|
|
return tr("Comment");
|
|
|
|
case CommentLine:
|
|
return tr("Comment line");
|
|
|
|
case CommentDoc:
|
|
return tr("JavaDoc style comment");
|
|
|
|
case Number:
|
|
return tr("Number");
|
|
|
|
case Keyword:
|
|
return tr("Keyword");
|
|
|
|
case DoubleQuotedString:
|
|
return tr("Double-quoted string");
|
|
|
|
case SingleQuotedString:
|
|
return tr("Single-quoted string");
|
|
|
|
case PlusKeyword:
|
|
return tr("SQL*Plus keyword");
|
|
|
|
case PlusPrompt:
|
|
return tr("SQL*Plus prompt");
|
|
|
|
case Operator:
|
|
return tr("Operator");
|
|
|
|
case Identifier:
|
|
return tr("Identifier");
|
|
|
|
case PlusComment:
|
|
return tr("SQL*Plus comment");
|
|
|
|
case CommentLineHash:
|
|
return tr("# comment line");
|
|
|
|
case CommentDocKeyword:
|
|
return tr("JavaDoc keyword");
|
|
|
|
case CommentDocKeywordError:
|
|
return tr("JavaDoc keyword error");
|
|
|
|
case KeywordSet5:
|
|
return tr("User defined 1");
|
|
|
|
case KeywordSet6:
|
|
return tr("User defined 2");
|
|
|
|
case KeywordSet7:
|
|
return tr("User defined 3");
|
|
|
|
case KeywordSet8:
|
|
return tr("User defined 4");
|
|
|
|
case QuotedIdentifier:
|
|
return tr("Quoted identifier");
|
|
|
|
case QuotedOperator:
|
|
return tr("Quoted operator");
|
|
}
|
|
|
|
return QString();
|
|
}
|
|
|
|
|
|
// Returns the background colour of the text for a style.
|
|
QColor QsciLexerSQL::defaultPaper(int style) const
|
|
{
|
|
if (style == PlusPrompt)
|
|
return QColor(0xe0,0xff,0xe0);
|
|
|
|
return QsciLexer::defaultPaper(style);
|
|
}
|
|
|
|
|
|
// Refresh all properties.
|
|
void QsciLexerSQL::refreshProperties()
|
|
{
|
|
setAtElseProp();
|
|
setCommentProp();
|
|
setCompactProp();
|
|
setOnlyBeginProp();
|
|
setBackticksIdentifierProp();
|
|
setNumbersignCommentProp();
|
|
setBackslashEscapesProp();
|
|
setAllowDottedWordProp();
|
|
}
|
|
|
|
|
|
// Read properties from the settings.
|
|
bool QsciLexerSQL::readProperties(QSettings &qs, const QString &prefix)
|
|
{
|
|
int rc = true;
|
|
|
|
at_else = qs.value(prefix + "atelse", false).toBool();
|
|
fold_comments = qs.value(prefix + "foldcomments", false).toBool();
|
|
fold_compact = qs.value(prefix + "foldcompact", true).toBool();
|
|
only_begin = qs.value(prefix + "onlybegin", false).toBool();
|
|
backticks_identifier = qs.value(prefix + "backticksidentifier", false).toBool();
|
|
numbersign_comment = qs.value(prefix + "numbersigncomment", false).toBool();
|
|
backslash_escapes = qs.value(prefix + "backslashescapes", false).toBool();
|
|
allow_dotted_word = qs.value(prefix + "allowdottedword", false).toBool();
|
|
|
|
return rc;
|
|
}
|
|
|
|
|
|
// Write properties to the settings.
|
|
bool QsciLexerSQL::writeProperties(QSettings &qs, const QString &prefix) const
|
|
{
|
|
int rc = true;
|
|
|
|
qs.value(prefix + "atelse", at_else);
|
|
qs.value(prefix + "foldcomments", fold_comments);
|
|
qs.value(prefix + "foldcompact", fold_compact);
|
|
qs.value(prefix + "onlybegin", only_begin);
|
|
qs.value(prefix + "backticksidentifier", backticks_identifier);
|
|
qs.value(prefix + "numbersigncomment", numbersign_comment);
|
|
qs.value(prefix + "backslashescapes", backslash_escapes);
|
|
qs.value(prefix + "allowdottedword", allow_dotted_word);
|
|
|
|
return rc;
|
|
}
|
|
|
|
|
|
// Set if ELSE blocks can be folded.
|
|
void QsciLexerSQL::setFoldAtElse(bool fold)
|
|
{
|
|
at_else = fold;
|
|
|
|
setAtElseProp();
|
|
}
|
|
|
|
|
|
// Set the "fold.sql.at.else" property.
|
|
void QsciLexerSQL::setAtElseProp()
|
|
{
|
|
emit propertyChanged("fold.sql.at.else", (at_else ? "1" : "0"));
|
|
}
|
|
|
|
|
|
// Set if comments can be folded.
|
|
void QsciLexerSQL::setFoldComments(bool fold)
|
|
{
|
|
fold_comments = fold;
|
|
|
|
setCommentProp();
|
|
}
|
|
|
|
|
|
// Set the "fold.comment" property.
|
|
void QsciLexerSQL::setCommentProp()
|
|
{
|
|
emit propertyChanged("fold.comment", (fold_comments ? "1" : "0"));
|
|
}
|
|
|
|
|
|
// Set if folds are compact
|
|
void QsciLexerSQL::setFoldCompact(bool fold)
|
|
{
|
|
fold_compact = fold;
|
|
|
|
setCompactProp();
|
|
}
|
|
|
|
|
|
// Set the "fold.compact" property.
|
|
void QsciLexerSQL::setCompactProp()
|
|
{
|
|
emit propertyChanged("fold.compact", (fold_compact ? "1" : "0"));
|
|
}
|
|
|
|
|
|
// Set if BEGIN blocks only can be folded.
|
|
void QsciLexerSQL::setFoldOnlyBegin(bool fold)
|
|
{
|
|
only_begin = fold;
|
|
|
|
setOnlyBeginProp();
|
|
}
|
|
|
|
|
|
// Set the "fold.sql.only.begin" property.
|
|
void QsciLexerSQL::setOnlyBeginProp()
|
|
{
|
|
emit propertyChanged("fold.sql.only.begin", (only_begin ? "1" : "0"));
|
|
}
|
|
|
|
|
|
// Enable quoted identifiers.
|
|
void QsciLexerSQL::setQuotedIdentifiers(bool enable)
|
|
{
|
|
backticks_identifier = enable;
|
|
|
|
setBackticksIdentifierProp();
|
|
}
|
|
|
|
|
|
// Set the "lexer.sql.backticks.identifier" property.
|
|
void QsciLexerSQL::setBackticksIdentifierProp()
|
|
{
|
|
emit propertyChanged("lexer.sql.backticks.identifier", (backticks_identifier ? "1" : "0"));
|
|
}
|
|
|
|
|
|
// Enable '#' as a comment character.
|
|
void QsciLexerSQL::setHashComments(bool enable)
|
|
{
|
|
numbersign_comment = enable;
|
|
|
|
setNumbersignCommentProp();
|
|
}
|
|
|
|
|
|
// Set the "lexer.sql.numbersign.comment" property.
|
|
void QsciLexerSQL::setNumbersignCommentProp()
|
|
{
|
|
emit propertyChanged("lexer.sql.numbersign.comment", (numbersign_comment ? "1" : "0"));
|
|
}
|
|
|
|
|
|
// Enable/disable backslash escapes.
|
|
void QsciLexerSQL::setBackslashEscapes(bool enable)
|
|
{
|
|
backslash_escapes = enable;
|
|
|
|
setBackslashEscapesProp();
|
|
}
|
|
|
|
|
|
// Set the "sql.backslash.escapes" property.
|
|
void QsciLexerSQL::setBackslashEscapesProp()
|
|
{
|
|
emit propertyChanged("sql.backslash.escapes", (backslash_escapes ? "1" : "0"));
|
|
}
|
|
|
|
|
|
// Enable dotted words.
|
|
void QsciLexerSQL::setDottedWords(bool enable)
|
|
{
|
|
allow_dotted_word = enable;
|
|
|
|
setAllowDottedWordProp();
|
|
}
|
|
|
|
|
|
// Set the "lexer.sql.allow.dotted.word" property.
|
|
void QsciLexerSQL::setAllowDottedWordProp()
|
|
{
|
|
emit propertyChanged("lexer.sql.allow.dotted.word", (allow_dotted_word ? "1" : "0"));
|
|
}
|