diff options
Diffstat (limited to 'src/DocumentAccessor.h')
-rw-r--r-- | src/DocumentAccessor.h | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/src/DocumentAccessor.h b/src/DocumentAccessor.h new file mode 100644 index 000000000..f0577b355 --- /dev/null +++ b/src/DocumentAccessor.h @@ -0,0 +1,71 @@ +// DocumentAccessor.h - implementation of BufferAccess and StylingAccess on a Scintilla rapid easy access to contents of a Scintilla +// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org> +// The License.txt file describes the conditions under which this software may be distributed. + +class Document; + +class DocumentAccessor : public Accessor { +protected: + // bufferSize is a trade off between time taken to copy the characters and SendMessage overhead + // slopSize positions the buffer before the desired position in case there is some backtracking + enum {bufferSize=4000, slopSize=bufferSize/8}; + char buf[bufferSize+1]; + Document *pdoc; + PropSet &props; + int startPos; + int endPos; + int lenDoc; + int codePage; + + char styleBuf[bufferSize]; + int validLen; + char chFlags; + char chWhile; + unsigned int startSeg; + + bool InternalIsLeadByte(char ch); + void Fill(int position); +public: + DocumentAccessor(Document *pdoc_, PropSet &props_) : + pdoc(pdoc_), props(props_), startPos(0x7FFFFFFF), endPos(0), + lenDoc(-1), codePage(0), validLen(0), chFlags(0) { + } + void SetCodePage(int codePage_) { codePage = codePage_; } + char operator[](int position) { + if (position < startPos || position >= endPos) { + Fill(position); + } + return buf[position - startPos]; + } + char SafeGetCharAt(int position, char chDefault=' ') { + // Safe version of operator[], returning a defined value for invalid position + if (position < startPos || position >= endPos) { + Fill(position); + if (position < startPos || position >= endPos) { + // Position is outside range of document + return chDefault; + } + } + return buf[position - startPos]; + } + bool IsLeadByte(char ch) { + return codePage && InternalIsLeadByte(ch); + } + char StyleAt(int position); + int GetLine(int position); + int LineStart(int line); + int LevelAt(int line); + int Length(); + void Flush(); + int GetLineState(int line); + int SetLineState(int line, int state); + PropSet &GetPropSet() { return props; } + + void StartAt(unsigned int start, char chMask=31); + void SetFlags(char chFlags_, char chWhile_) {chFlags = chFlags_; chWhile = chWhile_; }; + unsigned int GetStartSegment() { return startSeg; } + void StartSegment(unsigned int pos); + void ColourTo(unsigned int pos, int chAttr); + void SetLevel(int line, int level); + int IndentAmount(int line, int *flags, PFNIsCommentLeader pfnIsCommentLeader = 0); +}; |