diff options
Diffstat (limited to 'include/Accessor.h')
| -rw-r--r-- | include/Accessor.h | 76 | 
1 files changed, 76 insertions, 0 deletions
| diff --git a/include/Accessor.h b/include/Accessor.h new file mode 100644 index 000000000..1bba4af55 --- /dev/null +++ b/include/Accessor.h @@ -0,0 +1,76 @@ +// SciTE - Scintilla based Text Editor +// Accessor.h - 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 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]; +	WindowID id; +	PropSet &props; +	int startPos; +	int endPos; +	int lenDoc; +	int offset;	// Optional but including an offset makes GCC generate better code  +	void Fill(int position); +public: +	Accessor(WindowID id_, PropSet &props_, int offset_=0) :  +			id(id_), props(props_), startPos(0x7FFFFFFF), endPos(0),  +			lenDoc(-1), offset(offset_) { +	} +	char operator[](int position) { +		position += offset; +		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  +		position += offset; +		if (position < startPos || position >= endPos) { +			Fill(position); +			if (position < startPos || position >= endPos) { +				// Position is outside range of document  +				return chDefault; +			} +		} +		return buf[position - startPos]; +	} +	char StyleAt(int position); +	int GetLine(int position); +	int LineStart(int line); +	int LevelAt(int line); +	int Length(); +	void Flush() { +		startPos = 0x7FFFFFFF; +		lenDoc = -1; +	} +	int GetLineState(int line); +	int SetLineState(int line, int state); +	PropSet &GetPropSet() { return props; } +}; + +class StylingContext : public Accessor { +	char styleBuf[bufferSize]; +	int validLen; +	char chFlags; +	char chWhile; +	unsigned int startSeg; +public: +	StylingContext(WindowID id_, PropSet &props_, int offset_=0) :  +		Accessor(id_,props_,offset_), validLen(0), chFlags(0) {} +	void StartAt(unsigned int start, char chMask=31); +	void SetFlags(char chFlags_, char chWhile_) {chFlags = chFlags_; chWhile = chWhile_; }; +	void ColourSegment(unsigned int start, unsigned int end, int chAttr); +	unsigned int GetStartSegment() { return startSeg; } +	void StartSegment(unsigned int pos); +	void ColourTo(unsigned int pos, int chAttr); +	int GetLine(int position); +	void SetLevel(int line, int level); +	void Flush(); +}; + | 
