/* * Copyright 2001-2006, Haiku, Inc. All Rights Reserved. * Distributed under the terms of the MIT License. * * Authors: * Marc Flerackers (mflerackers@androme.be) */ #ifndef __TEXTGAPBUFFER_H #define __TEXTGAPBUFFER_H #include #include class BFile; namespace BPrivate { class TextGapBuffer { public: TextGapBuffer(); ~TextGapBuffer(); void InsertText(const char* inText, int32 inNumItems, int32 inAtIndex); bool InsertText(BFile* file, int32 fileOffset, int32 amount, int32 atIndex); void RemoveRange(int32 start, int32 end); bool FindChar(char inChar, int32 fromIndex, int32* ioDelta); const char* Text(); const char* RealText(); int32 Length() const; const char* GetString(int32 fromOffset, int32* numBytes); void GetString(int32 offset, int32 length, char* buffer); char RealCharAt(int32 offset) const; bool PasswordMode() const; void SetPasswordMode(bool); private: void _MoveGapTo(int32 toIndex); void _EnlargeGapTo(int32 inCount); void _ShrinkGapTo(int32 inCount); int32 fItemCount; // logical count char* fBuffer; // allocated memory int32 fBufferCount; // physical count int32 fGapIndex; // gap position int32 fGapCount; // gap count char* fScratchBuffer; // for GetString int32 fScratchSize; // scratch size bool fPasswordMode; }; inline int32 TextGapBuffer::Length() const { return fItemCount; } inline char TextGapBuffer::RealCharAt(int32 index) const { if (index < 0 || index >= fItemCount) { if (index != fItemCount) debugger("RealCharAt: invalid index supplied"); return 0; } return index < fGapIndex ? fBuffer[index] : fBuffer[index + fGapCount]; } } // namespace BPrivate #endif //__TEXTGAPBUFFER_H