1 // Scintilla source code edit control
2 /** @file Accessor.h
3  ** Rapid easy access to contents of a Scintilla.
4  **/
5 // Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
6 // The License.txt file describes the conditions under which this software may be distributed.
7 
8 enum { wsSpace = 1, wsTab = 2, wsSpaceTab = 4, wsInconsistent=8};
9 
10 class Accessor;
11 
12 typedef bool (*PFNIsCommentLeader)(Accessor &styler, int pos, int len);
13 
14 /**
15  * Interface to data in a Scintilla.
16  */
17 class Accessor {
18 protected:
19 	enum {extremePosition=0x7FFFFFFF};
20 	/** @a bufferSize is a trade off between time taken to copy the characters
21 	 * and retrieval overhead.
22 	 * @a slopSize positions the buffer before the desired position
23 	 * in case there is some backtracking. */
24 	enum {bufferSize=4000, slopSize=bufferSize/8};
25 	char buf[bufferSize+1];
26 	int startPos;
27 	int endPos;
28 	int codePage;
29 
30 	virtual bool InternalIsLeadByte(char ch)=0;
31 	virtual void Fill(int position)=0;
32 
33 public:
Accessor()34 	Accessor() : startPos(extremePosition), endPos(0), codePage(0) {}
~Accessor()35 	virtual ~Accessor() {}
36 	char operator[](int position) {
37 		if (position < startPos || position >= endPos) {
38 			Fill(position);
39 		}
40 		return buf[position - startPos];
41 	}
42 	/** Safe version of operator[], returning a defined value for invalid position. */
43 	char SafeGetCharAt(int position, char chDefault=' ') {
44 		if (position < startPos || position >= endPos) {
45 			Fill(position);
46 			if (position < startPos || position >= endPos) {
47 				// Position is outside range of document
48 				return chDefault;
49 			}
50 		}
51 		return buf[position - startPos];
52 	}
IsLeadByte(char ch)53 	bool IsLeadByte(char ch) {
54 		return codePage && InternalIsLeadByte(ch);
55 	}
SetCodePage(int codePage_)56 	void SetCodePage(int codePage_) { codePage = codePage_; }
57 
58 	virtual bool Match(int pos, const char *s)=0;
59 	virtual char StyleAt(int position)=0;
60 	virtual int GetLine(int position)=0;
61 	virtual int LineStart(int line)=0;
62 	virtual int LevelAt(int line)=0;
63 	virtual int Length()=0;
64 	virtual void Flush()=0;
65 	virtual int GetLineState(int line)=0;
66 	virtual int SetLineState(int line, int state)=0;
67 	virtual int GetPropertyInt(const char *key, int defaultValue=0)=0;
68 	virtual char *GetProperties()=0;
69 
70 	// Style setting
71 	virtual void StartAt(unsigned int start, char chMask=31)=0;
72 	virtual void SetFlags(char chFlags_, char chWhile_)=0;
73 	virtual unsigned int GetStartSegment()=0;
74 	virtual void StartSegment(unsigned int pos)=0;
75 	virtual void ColourTo(unsigned int pos, int chAttr)=0;
76 	virtual void SetLevel(int line, int level)=0;
77 	virtual int IndentAmount(int line, int *flags, PFNIsCommentLeader pfnIsCommentLeader = 0)=0;
78 };
79