* finish qsynedit MiscProcs
This commit is contained in:
parent
9e51cf2f06
commit
70af9a9120
|
@ -20,7 +20,10 @@ SOURCES += \
|
|||
qsynedit/CodeFolding.cpp \
|
||||
qsynedit/Constants.cpp \
|
||||
qsynedit/MiscClasses.cpp \
|
||||
qsynedit/MiscProcs.cpp \
|
||||
qsynedit/TextBuffer.cpp \
|
||||
qsynedit/highlighter/base.cpp \
|
||||
qsynedit/highlighter/composition.cpp \
|
||||
qsynedit/highlighter/cpp.cpp \
|
||||
settingsdialog/compilersetdirectorieswidget.cpp \
|
||||
settingsdialog/compilersetoptionwidget.cpp \
|
||||
|
@ -42,7 +45,10 @@ HEADERS += \
|
|||
qsynedit/CodeFolding.h \
|
||||
qsynedit/Constants.h \
|
||||
qsynedit/MiscClasses.h \
|
||||
qsynedit/MiscProcs.h \
|
||||
qsynedit/TextBuffer.h \
|
||||
qsynedit/highlighter/base.h \
|
||||
qsynedit/highlighter/composition.h \
|
||||
qsynedit/highlighter/cpp.h \
|
||||
settingsdialog/compilersetdirectorieswidget.h \
|
||||
settingsdialog/compilersetoptionwidget.h \
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
#include "Constants.h"
|
||||
const std::set<QChar> SynWordBreakChars{'.', ',', ';', ':',
|
||||
const QSet<QChar> SynWordBreakChars{'.', ',', ';', ':',
|
||||
'"', '\'', '!', '?', '[', ']', '(', ')', '{', '}', '^', '-', '=', '+',
|
||||
'-', '*', '/', '\\', '|'};
|
||||
const QChar SynTabChar('\t');
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
#ifndef CONSTANTS_H
|
||||
#define CONSTANTS_H
|
||||
#include <set>
|
||||
#include <QSet>
|
||||
#include <QChar>
|
||||
|
||||
extern const std::set<QChar> SynWordBreakChars;
|
||||
extern const QSet<QChar> SynWordBreakChars;
|
||||
extern const QChar SynTabChar;
|
||||
|
||||
#define SYN_ATTR_COMMENT 0
|
||||
|
|
|
@ -0,0 +1,441 @@
|
|||
#include "MiscProcs.h"
|
||||
#include <QPainter>
|
||||
#include <algorithm>
|
||||
|
||||
int MinMax(int x, int mi, int ma)
|
||||
{
|
||||
x = std::min(x, ma );
|
||||
return std::max( x, mi );
|
||||
}
|
||||
|
||||
void SwapInt(int &l, int &r)
|
||||
{
|
||||
int tmp = r;
|
||||
r = l;
|
||||
l = tmp;
|
||||
}
|
||||
|
||||
QPoint MaxPoint(const QPoint &P1, const QPoint &P2)
|
||||
{
|
||||
if ( (P2.y() > P1.y()) || ( (P2.y() == P1.y()) && (P2.x() > P1.x())) ) {
|
||||
return P2;
|
||||
} else {
|
||||
return P1;
|
||||
}
|
||||
}
|
||||
|
||||
QPoint MinPoint(const QPoint &P1, const QPoint &P2)
|
||||
{
|
||||
if ( (P2.y() < P1.y()) || ( (P2.y() == P1.y()) && (P2.x() < P1.x())) ) {
|
||||
return P2;
|
||||
} else {
|
||||
return P1;
|
||||
}
|
||||
}
|
||||
|
||||
PIntArray GetIntArray(size_t Count, int InitialValue)
|
||||
{
|
||||
return std::make_shared<IntArray>(Count,InitialValue);
|
||||
}
|
||||
|
||||
void InternalFillRect(QPainter *painter, const QRect &rcPaint, const QColor& color)
|
||||
{
|
||||
painter->fillRect(rcPaint,color);
|
||||
}
|
||||
|
||||
ConvertTabsProc GetBestConvertTabsProc(int TabWidth)
|
||||
{
|
||||
if (TabWidth < 2)
|
||||
return &ConvertTabs1;
|
||||
else if (IsPowerOfTwo(TabWidth))
|
||||
return &ConvertTabs2n;
|
||||
else
|
||||
return @ConvertTabs;
|
||||
}
|
||||
|
||||
QString ConvertTabs(const QString &Line, int TabWidth)
|
||||
{
|
||||
bool HasTabs;
|
||||
return ConvertTabsEx(Line, TabWidth, HasTabs);
|
||||
}
|
||||
|
||||
ConvertTabsProcEx GetBestConvertTabsProcEx(int TabWidth)
|
||||
{
|
||||
if (TabWidth < 2)
|
||||
return &ConvertTabs1Ex;
|
||||
else if (IsPowerOfTwo(TabWidth))
|
||||
return &ConvertTabs2nEx;
|
||||
else
|
||||
return @ConvertTabsEx;
|
||||
}
|
||||
|
||||
QString ConvertTabsEx(const QString &Line, int TabWidth, bool &HasTabs)
|
||||
{
|
||||
QString Result = Line; // increment reference count only
|
||||
int DestLen;
|
||||
int pSrc;
|
||||
QChar* pDest;
|
||||
if (GetHasTabs(Line, DestLen)) {
|
||||
HasTabs = true;
|
||||
pSrc = (DestLen+1);
|
||||
// We have at least one tab in the string, and the tab width is greater
|
||||
// than 1. pSrc points to the first tab char in Line. We get the number
|
||||
// of tabs and the length of the expanded string now.
|
||||
int TabCount = 0;
|
||||
do {
|
||||
if (Line[pSrc] == '\t') {
|
||||
DestLen = DestLen + TabWidth - DestLen % TabWidth;
|
||||
TabCount++;
|
||||
} else {
|
||||
DestLen ++;
|
||||
}
|
||||
pSrc++;
|
||||
} while (pSrc<Line.size());
|
||||
// Set the length of the expanded string.
|
||||
Result.resize(DestLen);
|
||||
DestLen = 0;
|
||||
pSrc = 0;
|
||||
pDest = Result.data();
|
||||
do {
|
||||
if (Line[pSrc] == '\t') {
|
||||
int i = TabWidth - (DestLen % TabWidth);
|
||||
DestLen+=i;
|
||||
do {
|
||||
*pDest = '\t';
|
||||
pDest++;
|
||||
i--;
|
||||
} while (i != 0);
|
||||
TabCount--;
|
||||
if (TabCount == 0) {
|
||||
do {
|
||||
pSrc++;
|
||||
*pDest = Line[pSrc];
|
||||
pDest++;
|
||||
} while (pSrc<Line.size());
|
||||
return Result;
|
||||
}
|
||||
} else {
|
||||
*pDest = Line[pSrc];
|
||||
pDest++;
|
||||
DestLen++;
|
||||
}
|
||||
pSrc++;
|
||||
} while (pSrc<Line.size());
|
||||
} else
|
||||
HasTabs = false;
|
||||
return Result;
|
||||
}
|
||||
|
||||
bool GetHasTabs(const QString &line, int &CharsBefore)
|
||||
{
|
||||
bool result = false;
|
||||
CharsBefore = 0;
|
||||
if (!line.isEmpty()) {
|
||||
for (const QChar& ch:line) {
|
||||
if (ch == '\t') {
|
||||
result = true;
|
||||
break;
|
||||
}
|
||||
CharsBefore ++;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
int GetExpandedLength(const QString &aStr, int aTabWidth)
|
||||
{
|
||||
int Result = 0;
|
||||
for (const QChar& ch : aStr) {
|
||||
if (ch == '\t') {
|
||||
Result += aTabWidth - (Result % aTabWidth);
|
||||
} else {
|
||||
Result ++;
|
||||
}
|
||||
}
|
||||
return Result;
|
||||
}
|
||||
|
||||
int CharIndex2CaretPos(int Index, int TabWidth, const QString &Line)
|
||||
{
|
||||
int Result;
|
||||
int iChar;
|
||||
if (Index > 1) {
|
||||
if ((TabWidth <= 1) || !GetHasTabs(Line, iChar) ) {
|
||||
Result = Index;
|
||||
} else {
|
||||
if (iChar + 1 >= Index) {
|
||||
Result = Index;
|
||||
} else {
|
||||
// iChar is number of chars before first Tab
|
||||
Result = iChar;
|
||||
// Index is *not* zero-based
|
||||
iChar++;
|
||||
Index -= iChar;
|
||||
int pNext = iChar;
|
||||
while (Index > 0) {
|
||||
if (pNext>=Line.size()) {
|
||||
Result += Index;
|
||||
break;
|
||||
}
|
||||
if (Line[pNext] == '\t') {
|
||||
Result += TabWidth;
|
||||
Result -= Result % TabWidth;
|
||||
} else
|
||||
Result++;
|
||||
Index--;
|
||||
pNext++;
|
||||
}
|
||||
// done with zero-based computation
|
||||
Result++;
|
||||
}
|
||||
}
|
||||
} else
|
||||
Result = 1;
|
||||
return Result;
|
||||
}
|
||||
|
||||
int CaretPos2CharIndex(int Position, int TabWidth, const QString &Line, bool &InsideTabChar)
|
||||
{
|
||||
int Result;
|
||||
int iPos;
|
||||
InsideTabChar = false;
|
||||
if (Position > 1) {
|
||||
if ( (TabWidth <= 1) || !GetHasTabs(Line, iPos) ) {
|
||||
Result = Position;
|
||||
} else {
|
||||
if (iPos + 1 >= Position) {
|
||||
Result = Position;
|
||||
} else {
|
||||
// iPos is number of chars before first #9
|
||||
Result = iPos + 1;
|
||||
int pNext = Result;
|
||||
// for easier computation go zero-based (mod-operation)
|
||||
Position -=1;
|
||||
while (iPos < Position) {
|
||||
if (pNext>=Line.size())
|
||||
break;
|
||||
if (Line[pNext] == '\t') {
|
||||
iPos+=TabWidth;
|
||||
iPos-=iPos % TabWidth;
|
||||
if (iPos > Position) {
|
||||
InsideTabChar = true;
|
||||
break;
|
||||
}
|
||||
} else
|
||||
iPos++;
|
||||
Result++;
|
||||
pNext++;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else
|
||||
Result = Position;
|
||||
return Result;
|
||||
}
|
||||
|
||||
int StrScanForCharInSet(const QString &Line, int Start, const QSet<QChar>& AChars)
|
||||
{
|
||||
for (int i=Start;i<Line.size();i++) {
|
||||
if (AChars.contains(Line[i])) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
int StrRScanForCharInSet(const QString &Line, int Start, const QSet<QChar> &AChars)
|
||||
{
|
||||
for (int i=Line.size()-1;i>=Start;i--) {
|
||||
if (AChars.contains(Line[i])) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
int GetEOL(const QString &Line, int start)
|
||||
{
|
||||
if (start<0 || start>=Line.size()) {
|
||||
return start;
|
||||
}
|
||||
for (int i=start;i<Line.size();i++) {
|
||||
if (Line[i] == '\n' || Line[i] == '\r') {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return Line.size();
|
||||
}
|
||||
|
||||
QString EncodeString(const QString &s)
|
||||
{
|
||||
QString Result;
|
||||
Result.resize(s.length()*2); // worst case
|
||||
int j=0;
|
||||
for (const QChar& ch: s) {
|
||||
if (ch == '\\' ) {
|
||||
Result[j] = '\\';
|
||||
Result[j+1] = '\\';
|
||||
j+=2;
|
||||
} else if (ch == '/') {
|
||||
Result[j] = '\\';
|
||||
Result[j+1] = '.';
|
||||
j+=2;
|
||||
} else {
|
||||
Result[j]=ch;
|
||||
j+=1;
|
||||
}
|
||||
}
|
||||
Result.resize(j);
|
||||
return Result;
|
||||
}
|
||||
|
||||
QString DecodeString(const QString &s)
|
||||
{
|
||||
QString Result;
|
||||
Result.resize(s.length()); // worst case
|
||||
int j = 0;
|
||||
int i = 0;
|
||||
while (i < s.length()) {
|
||||
if (i<s.length()-1 && s[i] == '\\' ) {
|
||||
if (s[i+1] == '\\') {
|
||||
Result[j]= '\\';
|
||||
i+=2;
|
||||
j+=1;
|
||||
continue;
|
||||
} else if (s[i+1] == '.') {
|
||||
Result[j]= '/';
|
||||
i+=2;
|
||||
j+=1;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
Result[j] = Result[i];
|
||||
i+=1;
|
||||
j+=1;
|
||||
}
|
||||
Result.resize(j);
|
||||
return Result;
|
||||
}
|
||||
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
Result := 1;
|
||||
for i := 0 to HighlighterList.Count - 1 do
|
||||
if HighlighterList[i] = Highlighter then
|
||||
Exit
|
||||
else if Assigned(HighlighterList[i]) and (TObject(HighlighterList[i]).ClassType = Highlighter.ClassType) then
|
||||
inc(Result);
|
||||
end;
|
||||
|
||||
bool InternalEnumHighlighterAttris(PSynHighlighter Highlighter,
|
||||
bool SkipDuplicates,
|
||||
HighlighterAttriProc highlighterAttriProc,
|
||||
std::initializer_list<void *>& Params,
|
||||
SynHighlighterList& HighlighterList) {
|
||||
bool Result = true;
|
||||
if (HighlighterList.indexOf(Highlighter)>0) {
|
||||
if (SkipDuplicates)
|
||||
return Result;
|
||||
} else {
|
||||
HighlighterList.append(Highlighter);
|
||||
}
|
||||
if (Highlighter->getClass() == SynHighlighterClass::Composition) {
|
||||
//todo: handle composition highlighter
|
||||
} else if (Highlighter) {
|
||||
for (PSynHighlighterAttribute pAttr: Highlighter->attributes()){
|
||||
QString UniqueAttriName = Highlighter->getName()
|
||||
+ HighlighterList.indexOf(Highlighter) + '.'
|
||||
+ pAttr->name();
|
||||
Result = (*highlighterAttriProc)(Highlighter, pAttr,
|
||||
UniqueAttriName, Params);
|
||||
if (!Result)
|
||||
break;
|
||||
}
|
||||
}
|
||||
return Result;
|
||||
}
|
||||
|
||||
bool EnumHighlighterAttris(PSynHighlighter Highlighter, bool SkipDuplicates,
|
||||
HighlighterAttriProc highlighterAttriProc,
|
||||
std::initializer_list<void *> Params)
|
||||
{
|
||||
if (!Highlighter || !highlighterAttriProc) {
|
||||
return false;
|
||||
}
|
||||
|
||||
SynHighlighterList HighlighterList;
|
||||
return InternalEnumHighlighterAttris(Highlighter, SkipDuplicates,
|
||||
highlighterAttriProc, Params, HighlighterList);
|
||||
}
|
||||
|
||||
uint16_t fcstab[] = {
|
||||
0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
|
||||
0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
|
||||
0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
|
||||
0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
|
||||
0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
|
||||
0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
|
||||
0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
|
||||
0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
|
||||
0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
|
||||
0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
|
||||
0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
|
||||
0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
|
||||
0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
|
||||
0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
|
||||
0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
|
||||
0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
|
||||
0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
|
||||
0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
|
||||
0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
|
||||
0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
|
||||
0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
|
||||
0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
|
||||
0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
|
||||
0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
|
||||
0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
|
||||
0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
|
||||
0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
|
||||
0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
|
||||
0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
|
||||
0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
|
||||
0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
|
||||
0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
|
||||
};
|
||||
|
||||
uint16_t CalcFCS(unsigned char *ABuf, int ABufSize)
|
||||
{
|
||||
uint16_t CurFCS = 0xffff;
|
||||
unsigned char* P = ABuf;
|
||||
while (ABufSize>0) {
|
||||
CurFCS = (CurFCS >> 8) ^ fcstab[(CurFCS ^ *P) & 0xff];
|
||||
ABufSize -- ;
|
||||
P ++ ;
|
||||
}
|
||||
return CurFCS;
|
||||
}
|
||||
|
||||
void SynDrawGradient(QPaintDevice *ACanvas, const QColor &AStartColor, const QColor &AEndColor, int , const QRect &ARect, bool AHorizontal)
|
||||
{
|
||||
QPainter painter(ACanvas);
|
||||
if (AHorizontal) {
|
||||
int Size = ARect.right() - ARect.left();
|
||||
QLinearGradient gradient(0,0,Size,0);
|
||||
gradient.setColorAt(0,AStartColor);
|
||||
gradient.setColorAt(1,AEndColor);
|
||||
painter.fillRect(ARect,gradient);
|
||||
} else {
|
||||
int Size = ARect.bottom() - ARect.top();
|
||||
QLinearGradient gradient(0,0,0,Size);
|
||||
gradient.setColorAt(0,AStartColor);
|
||||
gradient.setColorAt(1,AEndColor);
|
||||
painter.fillRect(ARect,gradient);
|
||||
}
|
||||
}
|
||||
|
||||
int MulDiv(int a, int b, int c)
|
||||
{
|
||||
//todo: handle overflow?
|
||||
return a*b/c;
|
||||
}
|
|
@ -0,0 +1,87 @@
|
|||
#ifndef MISCPROCS_H
|
||||
#define MISCPROCS_H
|
||||
#include <QPoint>
|
||||
#include <vector>
|
||||
#include <memory>
|
||||
#include <QString>
|
||||
#include <QSet>
|
||||
#include "highlighter/base.h"
|
||||
#include <QPaintDevice>
|
||||
#include <QVector>
|
||||
#include <initializer_list>
|
||||
//#include <QRect>
|
||||
//#include <QColor>
|
||||
|
||||
class QPainter;
|
||||
class QRect;
|
||||
class QColor;
|
||||
|
||||
using IntArray = QVector<int>;
|
||||
using PIntArray = std::shared_ptr<IntArray>;
|
||||
|
||||
int MinMax(int x, int mi, int ma);
|
||||
void SwapInt(int& l, int &r);
|
||||
QPoint MaxPoint(const QPoint& P1, const QPoint& P2);
|
||||
QPoint MinPoint(const QPoint& P1, const QPoint& P2);
|
||||
|
||||
PIntArray GetIntArray(size_t Count, int InitialValue);
|
||||
|
||||
void InternalFillRect(QPainter* painter, const QRect& rcPaint, const QColor& color);
|
||||
|
||||
// Converting tabs to spaces: To use the function several times it's better
|
||||
// to use a function pointer that is set to the fastest conversion function.
|
||||
using ConvertTabsProc = QString (*)(const QString& Line, int TabWidth);
|
||||
|
||||
ConvertTabsProc GetBestConvertTabsProc(int TabWidth);
|
||||
|
||||
// This is the slowest conversion function which can handle TabWidth <> 2^n.
|
||||
QString ConvertTabs(const QString& Line, int TabWidth);
|
||||
|
||||
using ConvertTabsProcEx = QString (*)(const QString& Line, int TabWidth, bool& HasTabs);
|
||||
|
||||
ConvertTabsProcEx GetBestConvertTabsProcEx(int TabWidth);
|
||||
// This is the slowest conversion function which can handle TabWidth <> 2^n.
|
||||
QString ConvertTabsEx(const QString& Line, int TabWidth, bool& HasTabs);
|
||||
|
||||
bool GetHasTabs(const QString& line, int& CharsBefore);
|
||||
|
||||
int GetExpandedLength(const QString& aStr, int aTabWidth);
|
||||
|
||||
int CharIndex2CaretPos(int Index, int TabWidth,
|
||||
const QString& Line);
|
||||
|
||||
int CaretPos2CharIndex(int Position, int TabWidth, const QString& Line,
|
||||
bool& InsideTabChar);
|
||||
|
||||
// search for the first char of set AChars in Line, starting at index Start
|
||||
int StrScanForCharInSet(const QString& Line, int Start, const QSet<QChar>& AChars);
|
||||
// the same, but searching backwards
|
||||
int StrRScanForCharInSet(const QString& Line, int Start, const QSet<QChar>& AChars);
|
||||
|
||||
int GetEOL(const QString& Line, int start);
|
||||
|
||||
// Remove all '/' characters from string by changing them into '\.'.
|
||||
// Change all '\' characters into '\\' to allow for unique decoding.
|
||||
QString EncodeString(const QString & s);
|
||||
|
||||
// Decodes string, encoded with EncodeString.
|
||||
QString DecodeString(const QString& s);
|
||||
|
||||
using HighlighterAttriProc = bool (*) (PSynHighlighter Highlighter,
|
||||
PSynHighlighterAttribute Attri, const QString& UniqueAttriName,
|
||||
std::initializer_list<void *> Params);
|
||||
|
||||
// Enums all child highlighters and their attributes of a TSynMultiSyn through a
|
||||
// callback function.
|
||||
// This function also handles nested TSynMultiSyns including their MarkerAttri.
|
||||
bool EnumHighlighterAttris(PSynHighlighter Highlighter,
|
||||
bool SkipDuplicates, HighlighterAttriProc highlighterAttriProc,
|
||||
std::initializer_list<void *> Params);
|
||||
|
||||
|
||||
// Calculates Frame Check Sequence (FCS) 16-bit Checksum (as defined in RFC 1171)
|
||||
uint16_t CalcFCS(unsigned char* ABuf, int ABufSize);
|
||||
|
||||
void SynDrawGradient(QPaintDevice* ACanvas, const QColor& AStartColor, const QColor& AEndColor,
|
||||
int ASteps, const QRect& ARect, bool AHorizontal);
|
||||
#endif // MISCPROCS_H
|
|
@ -0,0 +1,6 @@
|
|||
#include "TextBuffer.h"
|
||||
|
||||
SynEditStringList::SynEditStringList()
|
||||
{
|
||||
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
#ifndef SYNEDITSTRINGLIST_H
|
||||
#define SYNEDITSTRINGLIST_H
|
||||
|
||||
#include <QStringList>
|
||||
#include "highlighter/base.h"
|
||||
#include <memory>
|
||||
|
||||
enum SynEditStringFlag {
|
||||
sfHasTabs = 0x0001,
|
||||
sfHasNoTabs = 0x0002,
|
||||
sfExpandedLengthUnknown = 0x0004
|
||||
};
|
||||
|
||||
typedef int SynEditStringFlags;
|
||||
|
||||
struct SynEditStringRec {
|
||||
QString fString;
|
||||
void * fObject;
|
||||
SynRangeState fRange;
|
||||
int fExpandedLength;
|
||||
SynEditStringFlags fFlags;
|
||||
int fParenthesisLevel;
|
||||
int fBracketLevel;
|
||||
int fBraceLevel;
|
||||
};
|
||||
|
||||
typedef std::shared_ptr<SynEditStringRec> PSynEditStringRec;
|
||||
|
||||
typedef std::vector<PSynEditStringRec> SynEditStringRecList;
|
||||
|
||||
typedef std::shared_ptr<SynEditStringRecList> PSynEditStringRecList;
|
||||
|
||||
class SynEditStringList;
|
||||
|
||||
typedef std::shared_ptr<SynEditStringList> PSynEditStringList;
|
||||
|
||||
using StringListChangeCallback = void (*) (PSynEditStringList* object, int index, int count);
|
||||
|
||||
enum class SynEditFileFormat {
|
||||
Windows,
|
||||
Linux,
|
||||
Mac
|
||||
};// Windows: CRLF, UNIX: LF, Mac: CR
|
||||
|
||||
|
||||
|
||||
class SynEditStringList : public QStringList
|
||||
{
|
||||
|
||||
public:
|
||||
SynEditStringList();
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif // SYNEDITSTRINGLIST_H
|
|
@ -2,19 +2,19 @@
|
|||
#include "../Constants.h"
|
||||
|
||||
SynHighligterBase::SynHighligterBase(QObject *parent) : QObject(parent),
|
||||
mWordBreakChars{ SynWordBreakChars},
|
||||
mWordBreakChars{ SynWordBreakChars },
|
||||
mEnabled(true),
|
||||
mUpdateCount(0)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
std::map<QString, PSynHighlighterAttribute> SynHighligterBase::attributes() const
|
||||
const QMap<QString, PSynHighlighterAttribute>& SynHighligterBase::attributes() const
|
||||
{
|
||||
return mAttributes;
|
||||
}
|
||||
|
||||
std::set<QChar> SynHighligterBase::wordBreakChars() const
|
||||
const QSet<QChar>& SynHighligterBase::wordBreakChars() const
|
||||
{
|
||||
return mWordBreakChars;
|
||||
}
|
||||
|
@ -79,12 +79,7 @@ void SynHighligterBase::endUpdate()
|
|||
|
||||
SynRangeState SynHighligterBase::getRangeState() const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
SynRangeState SynHighligterBase::getSpaceRangeState() const
|
||||
{
|
||||
|
||||
return {0,0};
|
||||
}
|
||||
|
||||
int SynHighligterBase::getBraceLevel() const
|
||||
|
@ -104,7 +99,7 @@ int SynHighligterBase::getParenthesisLevel() const
|
|||
|
||||
SynHighlighterTokenType SynHighligterBase::getTokenType()
|
||||
{
|
||||
return SynHighlighterTokenType::httDefault;
|
||||
return SynHighlighterTokenType::Default;
|
||||
}
|
||||
|
||||
bool SynHighligterBase::isKeyword(const QString &)
|
||||
|
@ -112,6 +107,12 @@ bool SynHighligterBase::isKeyword(const QString &)
|
|||
return false;
|
||||
}
|
||||
|
||||
void SynHighligterBase::nextToEol()
|
||||
{
|
||||
while (!eol())
|
||||
next();
|
||||
}
|
||||
|
||||
bool SynHighligterBase::isSpaceChar(const QChar &ch)
|
||||
{
|
||||
return ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n';
|
||||
|
@ -137,6 +138,8 @@ bool SynHighligterBase::isIdentChar(const QChar &ch) const
|
|||
void SynHighligterBase::addAttribute(PSynHighlighterAttribute attribute)
|
||||
{
|
||||
mAttributes[attribute->name()]=attribute;
|
||||
connect(attribute.get(), &SynHighlighterAttribute::changed,
|
||||
this, &SynHighligterBase::setAttributesChanged);
|
||||
}
|
||||
|
||||
void SynHighligterBase::clearAttributes()
|
||||
|
@ -153,7 +156,7 @@ PSynHighlighterAttribute SynHighligterBase::getAttribute(const QString &name) co
|
|||
{
|
||||
auto search = mAttributes.find(name);
|
||||
if (search!=mAttributes.end()) {
|
||||
return search->second;
|
||||
return search.value();
|
||||
}
|
||||
return PSynHighlighterAttribute();
|
||||
}
|
||||
|
|
|
@ -4,8 +4,9 @@
|
|||
#include <QColor>
|
||||
#include <QObject>
|
||||
#include <memory>
|
||||
#include <map>
|
||||
#include <set>
|
||||
#include <QMap>
|
||||
#include <QSet>
|
||||
#include <QVector>
|
||||
|
||||
typedef struct {
|
||||
int state;
|
||||
|
@ -19,6 +20,11 @@ enum class SynHighlighterTokenType {
|
|||
Identifier, Symbol,
|
||||
Character, Keyword, Number};
|
||||
|
||||
enum class SynHighlighterClass {
|
||||
Composition,
|
||||
CppHighlighter,
|
||||
};
|
||||
|
||||
class SynHighlighterAttribute : public QObject{
|
||||
Q_OBJECT
|
||||
public:
|
||||
|
@ -59,16 +65,17 @@ private:
|
|||
};
|
||||
|
||||
typedef std::shared_ptr<SynHighlighterAttribute> PSynHighlighterAttribute;
|
||||
using SynHighlighterAttributeList = QVector<PSynHighlighterAttribute>;
|
||||
|
||||
class SynHighligterBase : public QObject
|
||||
class SynHighlighter : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit SynHighligterBase(QObject *parent = nullptr);
|
||||
explicit SynHighlighter(QObject *parent = nullptr);
|
||||
|
||||
const std::map<QString, PSynHighlighterAttribute> attributes() const;
|
||||
const QMap<QString, PSynHighlighterAttribute>& attributes() const;
|
||||
|
||||
std::set<QChar> wordBreakChars() const;
|
||||
const QSet<QChar>& wordBreakChars() const;
|
||||
|
||||
|
||||
|
||||
|
@ -86,6 +93,8 @@ public:
|
|||
|
||||
virtual bool isIdentChar(const QChar& ch) const;
|
||||
|
||||
virtual SynHighlighterClass getClass() const = 0;
|
||||
|
||||
void beginUpdate();
|
||||
void endUpdate();
|
||||
virtual bool getTokenFinished() const = 0;
|
||||
|
@ -133,10 +142,13 @@ protected:
|
|||
virtual PSynHighlighterAttribute getAttribute(const QString& name) const;
|
||||
|
||||
private:
|
||||
std::map<QString,PSynHighlighterAttribute> mAttributes;
|
||||
QMap<QString,PSynHighlighterAttribute> mAttributes;
|
||||
int mUpdateCount;
|
||||
bool mEnabled;
|
||||
std::set<QChar> mWordBreakChars;
|
||||
QSet<QChar> mWordBreakChars;
|
||||
};
|
||||
|
||||
using PSynHighlighter = std::shared_ptr<SynHighlighter>;
|
||||
using SynHighlighterList = QList<PSynHighlighter>;
|
||||
|
||||
#endif // SYNHIGHLIGTERBASE_H
|
||||
|
|
|
@ -0,0 +1,93 @@
|
|||
#include "composition.h"
|
||||
#include "../Constants.h"
|
||||
|
||||
SynHighlightComposition::SynHighlightComposition(QObject *parent):
|
||||
SynHighlighter(parent)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
SynHighlighterClass SynHighlightComposition::getClass() const
|
||||
{
|
||||
return SynHighlighterClass::Composition;
|
||||
}
|
||||
|
||||
QString SynHighlightComposition::getName() const
|
||||
{
|
||||
return "SynHighlightComposition";
|
||||
}
|
||||
|
||||
SynScheme::SynScheme(QObject *parent):
|
||||
QObject(parent),
|
||||
mCaseSensitive(true)
|
||||
{
|
||||
mMarkerAttribute = std::make_shared<SynHighlighterAttribute>(SYNS_AttrMarker);
|
||||
connect(mMarkerAttribute.get(),&SynHighlighterAttribute::changed,
|
||||
this, &SynScheme::MarkerAttriChanged);
|
||||
mMarkerAttribute->setBackground(QColorConstants::Yellow);
|
||||
mMarkerAttribute->setBold(true);
|
||||
}
|
||||
|
||||
QString SynScheme::endExpr() const
|
||||
{
|
||||
return mEndExpr;
|
||||
}
|
||||
|
||||
void SynScheme::setEndExpr(const QString &endExpr)
|
||||
{
|
||||
mEndExpr = endExpr;
|
||||
}
|
||||
|
||||
QString SynScheme::getStartExpr() const
|
||||
{
|
||||
return StartExpr;
|
||||
}
|
||||
|
||||
void SynScheme::setStartExpr(const QString &value)
|
||||
{
|
||||
StartExpr = value;
|
||||
}
|
||||
|
||||
PSynHighlighter SynScheme::getHighlighter() const
|
||||
{
|
||||
return mHighlighter;
|
||||
}
|
||||
|
||||
void SynScheme::setHighlighter(const PSynHighlighter &highlighter)
|
||||
{
|
||||
mHighlighter = highlighter;
|
||||
}
|
||||
|
||||
PSynHighlighterAttribute SynScheme::getMarkerAttribute() const
|
||||
{
|
||||
return mMarkerAttribute;
|
||||
}
|
||||
|
||||
QString SynScheme::getSchemeName() const
|
||||
{
|
||||
return mSchemeName;
|
||||
}
|
||||
|
||||
void SynScheme::setSchemeName(const QString &schemeName)
|
||||
{
|
||||
mSchemeName = schemeName;
|
||||
}
|
||||
|
||||
int SynScheme::getCaseSensitive() const
|
||||
{
|
||||
return mCaseSensitive;
|
||||
}
|
||||
|
||||
void SynScheme::setCaseSensitive(int caseSensitive)
|
||||
{
|
||||
mCaseSensitive = caseSensitive;
|
||||
}
|
||||
|
||||
QString SynScheme::ConvertExpression(const QString &Value)
|
||||
{
|
||||
if (!mCaseSensitive) {
|
||||
return Value.toUpper();
|
||||
} else {
|
||||
return Value;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
#ifndef SYNHIGHLIGHTCOMPOSITION_H
|
||||
#define SYNHIGHLIGHTCOMPOSITION_H
|
||||
#include "base.h"
|
||||
#include <memory>
|
||||
#include <QObject>
|
||||
|
||||
class SynSchema;
|
||||
using PSynSchema = std::shared_ptr<SynSchema>;
|
||||
|
||||
using OnCheckMarker = void (*)(PSynSchema Sender,int &StartPos, int &MarkerLen,
|
||||
std::shared_ptr<QString>& MarkerText , int Line);
|
||||
|
||||
class SynScheme : public QObject {
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit SynScheme(QObject& parent=nullptr);
|
||||
private:
|
||||
QString mEndExpr;
|
||||
QString StartExpr;
|
||||
PSynHighligterBase mHighlighter;
|
||||
PSynHighlighterAttribute mMarkerAttribute;
|
||||
QString mSchemeName;
|
||||
int mCaseSensitive;
|
||||
OnCheckMarker mOnCheckStartMarker;
|
||||
OnCheckMarker mOnCheckEndMarker;
|
||||
QString ConvertExpression(const QString& Value);
|
||||
private slots:
|
||||
void MarkerAttriChanged();
|
||||
};
|
||||
|
||||
public
|
||||
constructor Create(Collection: TCollection); override;
|
||||
destructor Destroy; override;
|
||||
published
|
||||
property CaseSensitive: Boolean read fCaseSensitive write SetCaseSensitive
|
||||
default True;
|
||||
property StartExpr: string read fStartExpr write SetStartExpr;
|
||||
property EndExpr: string read fEndExpr write SetEndExpr;
|
||||
property Highlighter: TSynCustomHighlighter read fHighlighter
|
||||
write SetHighlighter;
|
||||
property MarkerAttri: TSynHighlighterAttributes read fMarkerAttri
|
||||
write SetMarkerAttri;
|
||||
property SchemeName: TComponentName read fSchemeName write fSchemeName;
|
||||
property OnCheckStartMarker: TOnCheckMarker read fOnCheckStartMarker write fOnCheckStartMarker;
|
||||
property OnCheckEndMarker: TOnCheckMarker read fOnCheckEndMarker write fOnCheckEndMarker;
|
||||
end;
|
||||
|
||||
|
||||
class SynHighlightComposition : public SynHighligterBase
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit SynHighlightComposition(QObject *parent = nullptr);
|
||||
};
|
||||
|
||||
#endif // SYNHIGHLIGHTCOMPOSITION_H
|
|
@ -110,7 +110,7 @@ const QSet<QString> SynEditCppHighlighter::Keywords {
|
|||
|
||||
"nullptr",
|
||||
};
|
||||
SynEditCppHighlighter::SynEditCppHighlighter(QObject *parent): SynHighligterBase(parent)
|
||||
SynEditCppHighlighter::SynEditCppHighlighter(QObject *parent): SynHighlighter(parent)
|
||||
{
|
||||
mAsmAttribute = std::make_shared<SynHighlighterAttribute>(SYNS_AttrAssembler);
|
||||
addAttribute(mAsmAttribute);
|
||||
|
@ -1560,3 +1560,13 @@ void SynEditCppHighlighter::resetState()
|
|||
mBraceLevel = 0;
|
||||
mParenthesisLevel = 0;
|
||||
}
|
||||
|
||||
SynHighlighterClass SynEditCppHighlighter::getClass() const
|
||||
{
|
||||
return SynHighlighterClass::CppHighlighter;
|
||||
}
|
||||
|
||||
QString SynEditCppHighlighter::getName() const
|
||||
{
|
||||
return "SynCppHighlighter";
|
||||
}
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
#include "base.h"
|
||||
#include <QSet>
|
||||
|
||||
class SynEditCppHighlighter: public SynHighligterBase
|
||||
class SynEditCppHighlighter: public SynHighlighter
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
|
@ -199,6 +199,14 @@ public:
|
|||
// SynHighligterBase interface
|
||||
public:
|
||||
void resetState() override;
|
||||
|
||||
// SynHighligterBase interface
|
||||
public:
|
||||
SynHighlighterClass getClass() const override;
|
||||
|
||||
// SynHighlighter interface
|
||||
public:
|
||||
QString getName() const override;
|
||||
};
|
||||
|
||||
#endif // SYNEDITCPPHIGHLIGHTER_H
|
||||
|
|
Loading…
Reference in New Issue