| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- ///////////////////////////////////////////////////////////////////////////////
- // Name: wx/textbuf.h
- // Purpose: class wxTextBuffer to work with text buffers of _small_ size
- // (buffer is fully loaded in memory) and which understands CR/LF
- // differences between platforms.
- // Created: 14.11.01
- // Author: Morten Hanssen, Vadim Zeitlin
- // Copyright: (c) 1998-2001 Morten Hanssen, Vadim Zeitlin
- // Licence: wxWindows licence
- ///////////////////////////////////////////////////////////////////////////////
- #ifndef _WX_TEXTBUFFER_H
- #define _WX_TEXTBUFFER_H
- #include "wx/defs.h"
- #include "wx/arrstr.h"
- #include "wx/convauto.h"
- // ----------------------------------------------------------------------------
- // constants
- // ----------------------------------------------------------------------------
- // the line termination type (kept wxTextFileType name for compatibility)
- enum wxTextFileType
- {
- wxTextFileType_None, // incomplete (the last line of the file only)
- wxTextFileType_Unix, // line is terminated with 'LF' = 0xA = 10 = '\n'
- wxTextFileType_Dos, // 'CR' 'LF'
- wxTextFileType_Mac, // 'CR' = 0xD = 13 = '\r'
- wxTextFileType_Os2 // 'CR' 'LF'
- };
- #include "wx/string.h"
- #if wxUSE_TEXTBUFFER
- #include "wx/dynarray.h"
- // ----------------------------------------------------------------------------
- // wxTextBuffer
- // ----------------------------------------------------------------------------
- WX_DEFINE_USER_EXPORTED_ARRAY_INT(wxTextFileType,
- wxArrayLinesType,
- class WXDLLIMPEXP_BASE);
- #endif // wxUSE_TEXTBUFFER
- class WXDLLIMPEXP_BASE wxTextBuffer
- {
- public:
- // constants and static functions
- // default type for current platform (determined at compile time)
- static const wxTextFileType typeDefault;
- // this function returns a string which is identical to "text" passed in
- // except that the line terminator characters are changed to correspond the
- // given type. Called with the default argument, the function translates
- // the string to the native format (Unix for Unix, DOS for Windows, ...).
- static wxString Translate(const wxString& text,
- wxTextFileType type = typeDefault);
- // get the buffer termination string
- static const wxChar *GetEOL(wxTextFileType type = typeDefault);
- // the static methods of this class are compiled in even when
- // !wxUSE_TEXTBUFFER because they are used by the library itself, but the
- // rest can be left out
- #if wxUSE_TEXTBUFFER
- // buffer operations
- // -----------------
- // buffer exists?
- bool Exists() const;
- // create the buffer if it doesn't already exist
- bool Create();
- // same as Create() but with (another) buffer name
- bool Create(const wxString& strBufferName);
- // Open() also loads buffer in memory on success
- bool Open(const wxMBConv& conv = wxConvAuto());
- // same as Open() but with (another) buffer name
- bool Open(const wxString& strBufferName, const wxMBConv& conv = wxConvAuto());
- // closes the buffer and frees memory, losing all changes
- bool Close();
- // is buffer currently opened?
- bool IsOpened() const { return m_isOpened; }
- // accessors
- // ---------
- // get the number of lines in the buffer
- size_t GetLineCount() const { return m_aLines.size(); }
- // the returned line may be modified (but don't add CR/LF at the end!)
- wxString& GetLine(size_t n) { return m_aLines[n]; }
- const wxString& GetLine(size_t n) const { return m_aLines[n]; }
- wxString& operator[](size_t n) { return m_aLines[n]; }
- const wxString& operator[](size_t n) const { return m_aLines[n]; }
- // the current line has meaning only when you're using
- // GetFirstLine()/GetNextLine() functions, it doesn't get updated when
- // you're using "direct access" i.e. GetLine()
- size_t GetCurrentLine() const { return m_nCurLine; }
- void GoToLine(size_t n) { m_nCurLine = n; }
- bool Eof() const { return m_nCurLine == m_aLines.size(); }
- // these methods allow more "iterator-like" traversal of the list of
- // lines, i.e. you may write something like:
- // for ( str = GetFirstLine(); !Eof(); str = GetNextLine() ) { ... }
- // NB: const is commented out because not all compilers understand
- // 'mutable' keyword yet (m_nCurLine should be mutable)
- wxString& GetFirstLine() /* const */
- { return m_aLines.empty() ? ms_eof : m_aLines[m_nCurLine = 0]; }
- wxString& GetNextLine() /* const */
- { return ++m_nCurLine == m_aLines.size() ? ms_eof
- : m_aLines[m_nCurLine]; }
- wxString& GetPrevLine() /* const */
- { wxASSERT(m_nCurLine > 0); return m_aLines[--m_nCurLine]; }
- wxString& GetLastLine() /* const */
- { m_nCurLine = m_aLines.size() - 1; return m_aLines.Last(); }
- // get the type of the line (see also GetEOL)
- wxTextFileType GetLineType(size_t n) const { return m_aTypes[n]; }
- // guess the type of buffer
- wxTextFileType GuessType() const;
- // get the name of the buffer
- const wxString& GetName() const { return m_strBufferName; }
- // add/remove lines
- // ----------------
- // add a line to the end
- void AddLine(const wxString& str, wxTextFileType type = typeDefault)
- { m_aLines.push_back(str); m_aTypes.push_back(type); }
- // insert a line before the line number n
- void InsertLine(const wxString& str,
- size_t n,
- wxTextFileType type = typeDefault)
- {
- m_aLines.insert(m_aLines.begin() + n, str);
- m_aTypes.insert(m_aTypes.begin()+n, type);
- }
- // delete one line
- void RemoveLine(size_t n)
- {
- m_aLines.erase(m_aLines.begin() + n);
- m_aTypes.erase(m_aTypes.begin() + n);
- }
- // remove all lines
- void Clear() { m_aLines.clear(); m_aTypes.clear(); m_nCurLine = 0; }
- // change the buffer (default argument means "don't change type")
- // possibly in another format
- bool Write(wxTextFileType typeNew = wxTextFileType_None,
- const wxMBConv& conv = wxConvAuto());
- // dtor
- virtual ~wxTextBuffer();
- protected:
- // ctors
- // -----
- // default ctor, use Open(string)
- wxTextBuffer() { m_nCurLine = 0; m_isOpened = false; }
- // ctor from filename
- wxTextBuffer(const wxString& strBufferName);
- enum wxTextBufferOpenMode { ReadAccess, WriteAccess };
- // Must implement these in derived classes.
- virtual bool OnExists() const = 0;
- virtual bool OnOpen(const wxString &strBufferName,
- wxTextBufferOpenMode openmode) = 0;
- virtual bool OnClose() = 0;
- virtual bool OnRead(const wxMBConv& conv) = 0;
- virtual bool OnWrite(wxTextFileType typeNew, const wxMBConv& conv) = 0;
- static wxString ms_eof; // dummy string returned at EOF
- wxString m_strBufferName; // name of the buffer
- private:
- wxArrayLinesType m_aTypes; // type of each line
- wxArrayString m_aLines; // lines of file
- size_t m_nCurLine; // number of current line in the buffer
- bool m_isOpened; // was the buffer successfully opened the last time?
- #endif // wxUSE_TEXTBUFFER
- // copy ctor/assignment operator not implemented
- wxTextBuffer(const wxTextBuffer&);
- wxTextBuffer& operator=(const wxTextBuffer&);
- };
- #endif // _WX_TEXTBUFFER_H
|