xref: /haiku/src/kits/interface/textview_support/TextGapBuffer.h (revision de20f0facaa2afcc46cde051e683bd65af8e3f84)
1b31b14e0SStefano Ceccherini /*
2b31b14e0SStefano Ceccherini  * Copyright 2001-2006, Haiku, Inc. All Rights Reserved.
3b31b14e0SStefano Ceccherini  * Distributed under the terms of the MIT License.
4b31b14e0SStefano Ceccherini  *
5b31b14e0SStefano Ceccherini  * Authors:
6b31b14e0SStefano Ceccherini  *		Marc Flerackers (mflerackers@androme.be)
7b31b14e0SStefano Ceccherini  */
8b31b14e0SStefano Ceccherini 
9b31b14e0SStefano Ceccherini #ifndef __TEXTGAPBUFFER_H
10b31b14e0SStefano Ceccherini #define __TEXTGAPBUFFER_H
11b31b14e0SStefano Ceccherini 
12b31b14e0SStefano Ceccherini #include <SupportDefs.h>
13b31b14e0SStefano Ceccherini 
14b31b14e0SStefano Ceccherini 
15b31b14e0SStefano Ceccherini class BFile;
16b31b14e0SStefano Ceccherini class _BTextGapBuffer_ {
17b31b14e0SStefano Ceccherini 
18b31b14e0SStefano Ceccherini public:
19b31b14e0SStefano Ceccherini 					_BTextGapBuffer_();
20b31b14e0SStefano Ceccherini virtual				~_BTextGapBuffer_();
21b31b14e0SStefano Ceccherini 
22b31b14e0SStefano Ceccherini 		void		InsertText(const char *inText, int32 inNumItems, int32 inAtIndex);
23b31b14e0SStefano Ceccherini 		void		InsertText(BFile *file, int32 fileOffset, int32 amount, int32 atIndex);
24b31b14e0SStefano Ceccherini 		void		RemoveRange(int32 start, int32 end);
25b31b14e0SStefano Ceccherini 
26b31b14e0SStefano Ceccherini 		void		MoveGapTo(int32 toIndex);
27b31b14e0SStefano Ceccherini 		void		SizeGapTo(int32 inCount);
28b31b14e0SStefano Ceccherini 
29b31b14e0SStefano Ceccherini 		bool		FindChar(char inChar, int32 fromIndex, int32 *ioDelta);
30b31b14e0SStefano Ceccherini 
31b31b14e0SStefano Ceccherini 		const char 	*Text();
32b31b14e0SStefano Ceccherini 		int32		Length() const;
33b31b14e0SStefano Ceccherini 		char		operator[](int32 index) const;
34b31b14e0SStefano Ceccherini 
35b31b14e0SStefano Ceccherini 
36b31b14e0SStefano Ceccherini //		char 		*RealText();
37*de20f0faSStefano Ceccherini 		const char 	*GetString(int32 fromOffset, int32 *numBytes);
38b31b14e0SStefano Ceccherini 		void		GetString(int32 offset, int32 length, char *buffer);
39b31b14e0SStefano Ceccherini 
40b31b14e0SStefano Ceccherini 		char		RealCharAt(int32 offset) const;
41b31b14e0SStefano Ceccherini 
42b31b14e0SStefano Ceccherini 		bool		PasswordMode() const;
43b31b14e0SStefano Ceccherini 		void		SetPasswordMode(bool);
44b31b14e0SStefano Ceccherini 
45b31b14e0SStefano Ceccherini //		void		Resize(int32 size);
46b31b14e0SStefano Ceccherini 
47b31b14e0SStefano Ceccherini protected:
48b31b14e0SStefano Ceccherini 		int32	fExtraCount;		// when realloc()-ing
49b31b14e0SStefano Ceccherini 		int32	fItemCount;		// logical count
50b31b14e0SStefano Ceccherini 		char	*fBuffer;		// allocated memory
51b31b14e0SStefano Ceccherini 		int32	fBufferCount;		// physical count
52b31b14e0SStefano Ceccherini 		int32	fGapIndex;		// gap position
53b31b14e0SStefano Ceccherini 		int32	fGapCount;		// gap count
54b31b14e0SStefano Ceccherini 		char	*fScratchBuffer;	// for GetString
55b31b14e0SStefano Ceccherini 		int32	fScratchSize;		// scratch size
56b31b14e0SStefano Ceccherini 		bool	fPasswordMode;
57b31b14e0SStefano Ceccherini };
58b31b14e0SStefano Ceccherini 
59b31b14e0SStefano Ceccherini 
60b31b14e0SStefano Ceccherini inline int32
61b31b14e0SStefano Ceccherini _BTextGapBuffer_::Length() const
62b31b14e0SStefano Ceccherini {
63b31b14e0SStefano Ceccherini 	return fItemCount;
64b31b14e0SStefano Ceccherini }
65b31b14e0SStefano Ceccherini 
66b31b14e0SStefano Ceccherini 
67b31b14e0SStefano Ceccherini inline char
68b31b14e0SStefano Ceccherini _BTextGapBuffer_::operator[](long index) const
69b31b14e0SStefano Ceccherini {
70b31b14e0SStefano Ceccherini 	return (index < fGapIndex) ? fBuffer[index] : fBuffer[index + fGapCount];
71b31b14e0SStefano Ceccherini }
72b31b14e0SStefano Ceccherini 
73b31b14e0SStefano Ceccherini #endif //__TEXTGAPBUFFER_H
74