1/*
2 * Copyright 2001-2006, Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Marc Flerackers (mflerackers@androme.be)
7 */
8#ifndef __TEXTGAPBUFFER_H
9#define __TEXTGAPBUFFER_H
10
11
12#include <SupportDefs.h>
13#include <TextView.h>
14
15
16class BFile;
17
18
19namespace BPrivate {
20
21
22class TextGapBuffer {
23public:
24								TextGapBuffer();
25								~TextGapBuffer();
26
27			void				InsertText(const char* inText, int32 inNumItems,
28									int32 inAtIndex);
29			bool				InsertText(BFile* file, int32 fileOffset,
30									int32 amount, int32 atIndex);
31			void				RemoveRange(int32 start, int32 end);
32
33			bool				FindChar(char inChar, int32 fromIndex,
34									int32* ioDelta);
35
36			const char*			Text();
37			const char*			RealText();
38			int32				Length() const;
39
40			const char*			GetString(int32 fromOffset, int32* numBytes);
41			void				GetString(int32 offset, int32 length,
42									char* buffer);
43
44			char				RealCharAt(int32 offset) const;
45
46			bool				PasswordMode() const;
47			void				SetPasswordMode(bool);
48
49private:
50			void				_MoveGapTo(int32 toIndex);
51			void				_EnlargeGapTo(int32 inCount);
52			void				_ShrinkGapTo(int32 inCount);
53
54			int32				fItemCount;			// logical count
55			char*				fBuffer;			// allocated memory
56			int32				fBufferCount;		// physical count
57			int32				fGapIndex;			// gap position
58			int32				fGapCount;			// gap count
59			char*				fScratchBuffer;		// for GetString
60			int32				fScratchSize;		// scratch size
61			bool				fPasswordMode;
62};
63
64
65inline int32
66TextGapBuffer::Length() const
67{
68	return fItemCount;
69}
70
71
72inline char
73TextGapBuffer::RealCharAt(int32 index) const
74{
75	if (index < 0 || index >= fItemCount) {
76		if (index != fItemCount)
77			debugger("RealCharAt: invalid index supplied");
78		return 0;
79	}
80
81	return index < fGapIndex ? fBuffer[index] : fBuffer[index + fGapCount];
82}
83
84
85} // namespace BPrivate
86
87
88#endif //__TEXTGAPBUFFER_H
89