From 70af9a91205434e16a856141b0de76dec0f48d2d Mon Sep 17 00:00:00 2001 From: "royqh1979@gmail.com" Date: Sat, 1 May 2021 10:57:41 +0800 Subject: [PATCH] * finish qsynedit MiscProcs --- RedPandaIDE/RedPandaIDE.pro | 6 + RedPandaIDE/qsynedit/Constants.cpp | 2 +- RedPandaIDE/qsynedit/Constants.h | 4 +- RedPandaIDE/qsynedit/MiscProcs.cpp | 441 ++++++++++++++++++ RedPandaIDE/qsynedit/MiscProcs.h | 87 ++++ RedPandaIDE/qsynedit/TextBuffer.cpp | 6 + RedPandaIDE/qsynedit/TextBuffer.h | 56 +++ RedPandaIDE/qsynedit/highlighter/base.cpp | 25 +- RedPandaIDE/qsynedit/highlighter/base.h | 28 +- .../qsynedit/highlighter/composition.cpp | 93 ++++ .../qsynedit/highlighter/composition.h | 56 +++ RedPandaIDE/qsynedit/highlighter/cpp.cpp | 12 +- RedPandaIDE/qsynedit/highlighter/cpp.h | 10 +- 13 files changed, 802 insertions(+), 24 deletions(-) create mode 100644 RedPandaIDE/qsynedit/MiscProcs.cpp create mode 100644 RedPandaIDE/qsynedit/MiscProcs.h create mode 100644 RedPandaIDE/qsynedit/TextBuffer.cpp create mode 100644 RedPandaIDE/qsynedit/TextBuffer.h create mode 100644 RedPandaIDE/qsynedit/highlighter/composition.cpp create mode 100644 RedPandaIDE/qsynedit/highlighter/composition.h diff --git a/RedPandaIDE/RedPandaIDE.pro b/RedPandaIDE/RedPandaIDE.pro index 0d9bb18e..b91e3255 100644 --- a/RedPandaIDE/RedPandaIDE.pro +++ b/RedPandaIDE/RedPandaIDE.pro @@ -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 \ diff --git a/RedPandaIDE/qsynedit/Constants.cpp b/RedPandaIDE/qsynedit/Constants.cpp index 61f0260f..38605046 100644 --- a/RedPandaIDE/qsynedit/Constants.cpp +++ b/RedPandaIDE/qsynedit/Constants.cpp @@ -1,5 +1,5 @@ #include "Constants.h" -const std::set SynWordBreakChars{'.', ',', ';', ':', +const QSet SynWordBreakChars{'.', ',', ';', ':', '"', '\'', '!', '?', '[', ']', '(', ')', '{', '}', '^', '-', '=', '+', '-', '*', '/', '\\', '|'}; const QChar SynTabChar('\t'); diff --git a/RedPandaIDE/qsynedit/Constants.h b/RedPandaIDE/qsynedit/Constants.h index 1fb1cc75..7cbf7c8b 100644 --- a/RedPandaIDE/qsynedit/Constants.h +++ b/RedPandaIDE/qsynedit/Constants.h @@ -1,9 +1,9 @@ #ifndef CONSTANTS_H #define CONSTANTS_H -#include +#include #include -extern const std::set SynWordBreakChars; +extern const QSet SynWordBreakChars; extern const QChar SynTabChar; #define SYN_ATTR_COMMENT 0 diff --git a/RedPandaIDE/qsynedit/MiscProcs.cpp b/RedPandaIDE/qsynedit/MiscProcs.cpp new file mode 100644 index 00000000..55bb2e8e --- /dev/null +++ b/RedPandaIDE/qsynedit/MiscProcs.cpp @@ -0,0 +1,441 @@ +#include "MiscProcs.h" +#include +#include + +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(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 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& AChars) +{ + for (int i=Start;i &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& 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 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; +} diff --git a/RedPandaIDE/qsynedit/MiscProcs.h b/RedPandaIDE/qsynedit/MiscProcs.h new file mode 100644 index 00000000..b7492974 --- /dev/null +++ b/RedPandaIDE/qsynedit/MiscProcs.h @@ -0,0 +1,87 @@ +#ifndef MISCPROCS_H +#define MISCPROCS_H +#include +#include +#include +#include +#include +#include "highlighter/base.h" +#include +#include +#include +//#include +//#include + +class QPainter; +class QRect; +class QColor; + +using IntArray = QVector; +using PIntArray = std::shared_ptr; + +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& AChars); +// the same, but searching backwards +int StrRScanForCharInSet(const QString& Line, int Start, const QSet& 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 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 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 diff --git a/RedPandaIDE/qsynedit/TextBuffer.cpp b/RedPandaIDE/qsynedit/TextBuffer.cpp new file mode 100644 index 00000000..c1c22d43 --- /dev/null +++ b/RedPandaIDE/qsynedit/TextBuffer.cpp @@ -0,0 +1,6 @@ +#include "TextBuffer.h" + +SynEditStringList::SynEditStringList() +{ + +} diff --git a/RedPandaIDE/qsynedit/TextBuffer.h b/RedPandaIDE/qsynedit/TextBuffer.h new file mode 100644 index 00000000..0dca3ef4 --- /dev/null +++ b/RedPandaIDE/qsynedit/TextBuffer.h @@ -0,0 +1,56 @@ +#ifndef SYNEDITSTRINGLIST_H +#define SYNEDITSTRINGLIST_H + +#include +#include "highlighter/base.h" +#include + +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 PSynEditStringRec; + +typedef std::vector SynEditStringRecList; + +typedef std::shared_ptr PSynEditStringRecList; + +class SynEditStringList; + +typedef std::shared_ptr 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 diff --git a/RedPandaIDE/qsynedit/highlighter/base.cpp b/RedPandaIDE/qsynedit/highlighter/base.cpp index 5209b7ed..05b90bf8 100644 --- a/RedPandaIDE/qsynedit/highlighter/base.cpp +++ b/RedPandaIDE/qsynedit/highlighter/base.cpp @@ -2,19 +2,19 @@ #include "../Constants.h" SynHighligterBase::SynHighligterBase(QObject *parent) : QObject(parent), - mWordBreakChars{ SynWordBreakChars}, + mWordBreakChars{ SynWordBreakChars }, mEnabled(true), mUpdateCount(0) { } -std::map SynHighligterBase::attributes() const +const QMap& SynHighligterBase::attributes() const { return mAttributes; } -std::set SynHighligterBase::wordBreakChars() const +const QSet& 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(); } diff --git a/RedPandaIDE/qsynedit/highlighter/base.h b/RedPandaIDE/qsynedit/highlighter/base.h index cf54bc91..6b1ac9d6 100644 --- a/RedPandaIDE/qsynedit/highlighter/base.h +++ b/RedPandaIDE/qsynedit/highlighter/base.h @@ -4,8 +4,9 @@ #include #include #include -#include -#include +#include +#include +#include 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 PSynHighlighterAttribute; +using SynHighlighterAttributeList = QVector; -class SynHighligterBase : public QObject +class SynHighlighter : public QObject { Q_OBJECT public: - explicit SynHighligterBase(QObject *parent = nullptr); + explicit SynHighlighter(QObject *parent = nullptr); - const std::map attributes() const; + const QMap& attributes() const; - std::set wordBreakChars() const; + const QSet& 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 mAttributes; + QMap mAttributes; int mUpdateCount; bool mEnabled; - std::set mWordBreakChars; + QSet mWordBreakChars; }; +using PSynHighlighter = std::shared_ptr; +using SynHighlighterList = QList; + #endif // SYNHIGHLIGTERBASE_H diff --git a/RedPandaIDE/qsynedit/highlighter/composition.cpp b/RedPandaIDE/qsynedit/highlighter/composition.cpp new file mode 100644 index 00000000..d8a16a96 --- /dev/null +++ b/RedPandaIDE/qsynedit/highlighter/composition.cpp @@ -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(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; + } +} diff --git a/RedPandaIDE/qsynedit/highlighter/composition.h b/RedPandaIDE/qsynedit/highlighter/composition.h new file mode 100644 index 00000000..a0101df6 --- /dev/null +++ b/RedPandaIDE/qsynedit/highlighter/composition.h @@ -0,0 +1,56 @@ +#ifndef SYNHIGHLIGHTCOMPOSITION_H +#define SYNHIGHLIGHTCOMPOSITION_H +#include "base.h" +#include +#include + +class SynSchema; +using PSynSchema = std::shared_ptr; + +using OnCheckMarker = void (*)(PSynSchema Sender,int &StartPos, int &MarkerLen, + std::shared_ptr& 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 diff --git a/RedPandaIDE/qsynedit/highlighter/cpp.cpp b/RedPandaIDE/qsynedit/highlighter/cpp.cpp index 6f972717..95caa4d3 100644 --- a/RedPandaIDE/qsynedit/highlighter/cpp.cpp +++ b/RedPandaIDE/qsynedit/highlighter/cpp.cpp @@ -110,7 +110,7 @@ const QSet SynEditCppHighlighter::Keywords { "nullptr", }; -SynEditCppHighlighter::SynEditCppHighlighter(QObject *parent): SynHighligterBase(parent) +SynEditCppHighlighter::SynEditCppHighlighter(QObject *parent): SynHighlighter(parent) { mAsmAttribute = std::make_shared(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"; +} diff --git a/RedPandaIDE/qsynedit/highlighter/cpp.h b/RedPandaIDE/qsynedit/highlighter/cpp.h index ca0a008d..99265a42 100644 --- a/RedPandaIDE/qsynedit/highlighter/cpp.h +++ b/RedPandaIDE/qsynedit/highlighter/cpp.h @@ -3,7 +3,7 @@ #include "base.h" #include -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