git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@3345 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			904 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			904 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/////////////////////////////////////////////////////////////////////////////
 | 
						|
// Name:        No names yet.
 | 
						|
// Purpose:     Contrib. demo
 | 
						|
// Author:      Aleksandras Gluchovas
 | 
						|
// Modified by:
 | 
						|
// Created:     03/04/1999
 | 
						|
// RCS-ID:      $Id$
 | 
						|
// Copyright:   (c) Aleskandars Gluchovas
 | 
						|
// Licence:   	GNU General Public License 
 | 
						|
/////////////////////////////////////////////////////////////////////////////
 | 
						|
//
 | 
						|
//  This program is free software; you can redistribute it and/or modify
 | 
						|
//  it under the terms of the GNU General Public License as published by
 | 
						|
//  the Free Software Foundation; either version 2 of the License, or
 | 
						|
//  (at your option) any later version.
 | 
						|
//
 | 
						|
//  This program is distributed in the hope that it will be useful,
 | 
						|
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
//  GNU General Public License for more details.
 | 
						|
//
 | 
						|
//  You should have received a copy of the GNU General Public License
 | 
						|
//  along with this program; if not, write to the Free Software
 | 
						|
//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
						|
/////////////////////////////////////////////////////////////////////////////
 | 
						|
 | 
						|
 | 
						|
 | 
						|
#ifndef __TDEFS_G__
 | 
						|
#define __TDEFS_G__
 | 
						|
 | 
						|
// should be compiled with wxSTL-v.1.2 (or higher)
 | 
						|
 | 
						|
#include "wxstldefs.h"
 | 
						|
 | 
						|
#if defined( wxUSE_TEMPLATE_STL )
 | 
						|
	#include <vector>
 | 
						|
	#include <list>
 | 
						|
#else
 | 
						|
	#include "wxstlvec.h"
 | 
						|
	#include "wxstllst.h"
 | 
						|
#endif
 | 
						|
 | 
						|
#include "wx/window.h"
 | 
						|
#include "wx/scrolbar.h"
 | 
						|
 | 
						|
#include "sourcepainter.h"
 | 
						|
 | 
						|
#define NPOS ((size_t)(-1))
 | 
						|
 | 
						|
class wxTextEditorModel;
 | 
						|
class wxTextEditorView;
 | 
						|
 | 
						|
/*
 | 
						|
 * class represents column-row position in the source text,
 | 
						|
 * may refere to the column past the end-of-line,
 | 
						|
 * but should not point past the last-line in the text
 | 
						|
 */
 | 
						|
 | 
						|
class TPosition
 | 
						|
{
 | 
						|
public:
 | 
						|
	size_t mRow;
 | 
						|
	size_t mCol;
 | 
						|
 | 
						|
	inline TPosition() : mRow(0), mCol(0) {}
 | 
						|
 | 
						|
	inline TPosition( size_t row, size_t col )
 | 
						|
 | 
						|
		: mRow( row ), mCol( col ) {}
 | 
						|
 | 
						|
	inline bool operator>( const TPosition& rhs ) const
 | 
						|
	{ 
 | 
						|
		if ( mRow == rhs.mRow ) return mCol > rhs.mCol;
 | 
						|
		else
 | 
						|
			return mRow > rhs.mRow;
 | 
						|
	}
 | 
						|
 | 
						|
	inline bool operator<( const TPosition& rhs ) const
 | 
						|
	{ 
 | 
						|
		if ( mRow == rhs.mRow ) return mCol < rhs.mCol;
 | 
						|
		else
 | 
						|
			return mRow < rhs.mRow;
 | 
						|
	}
 | 
						|
};
 | 
						|
 | 
						|
class TRange
 | 
						|
{
 | 
						|
public:
 | 
						|
	TPosition mFrom;
 | 
						|
	TPosition mTill;
 | 
						|
 | 
						|
	TRange() {}
 | 
						|
	TRange( const TPosition& from, const TPosition& till )
 | 
						|
		: mFrom( from ), mTill( till )
 | 
						|
	{}
 | 
						|
};
 | 
						|
 | 
						|
inline bool operator==( const TPosition& lhs, const TPosition& rhs )
 | 
						|
{
 | 
						|
	return lhs.mRow == rhs.mRow && lhs.mCol == rhs.mCol;
 | 
						|
}
 | 
						|
 | 
						|
// FOR NOW:: bigger ones...
 | 
						|
 | 
						|
#define MAX_BLOCK_LEN      (1024*164)
 | 
						|
#define BALANCED_BLOCK_LEN (1024*152)		 
 | 
						|
#define FILLED_BLOCK_LEN   (1024*148)
 | 
						|
 | 
						|
// FOR NOW::
 | 
						|
#define T_ASSERT( x ) if ( !(x) ) throw;
 | 
						|
 | 
						|
// to speed up debug v. :
 | 
						|
 | 
						|
#define is_eol_char( ch )     ( ch == (char)10 )
 | 
						|
#define is_DOS_eol_char( ch ) ( ch == (char)13 )
 | 
						|
 | 
						|
// the target-platfrom eol-marking is selected when
 | 
						|
// new text document is created or auto-detection
 | 
						|
// failed to determine the text-format (e.g. no EOLs found at all)
 | 
						|
 | 
						|
#if defined(__WINDOWS__) || defined(__WXMSW__)
 | 
						|
 | 
						|
	  #define IS_UNIX_TEXT_BY_DEFAULT FALSE
 | 
						|
#else
 | 
						|
	  #define IS_UNIX_TEXT_BY_DEFAULT TRUE
 | 
						|
#endif
 | 
						|
 | 
						|
//inline bool is_eol_char( char ch ) { return ch == 10 && ch == 13 ; }
 | 
						|
 | 
						|
/*
 | 
						|
 * Class contains single fragment of the source text, which
 | 
						|
 * may grow or shrink in the process of editing. Blocks always
 | 
						|
 * start at the begining of the line and end at eol, i.e. lines
 | 
						|
 * are not broken among blocks
 | 
						|
 */
 | 
						|
 | 
						|
class TBlock
 | 
						|
{
 | 
						|
public:
 | 
						|
	char mBuf[MAX_BLOCK_LEN];
 | 
						|
	size_t mTextLen;
 | 
						|
	size_t mRowCount;
 | 
						|
 | 
						|
	TBlock() : mTextLen(0), mRowCount(0) { mBuf[0] = '\0'; }
 | 
						|
 | 
						|
	void RecalcBlockProperties();
 | 
						|
 | 
						|
	bool operator==( const TBlock& blk ) const { return this == &blk; }
 | 
						|
 | 
						|
        bool operator!=( const TBlock& blk ) const { return this != &blk; }
 | 
						|
 | 
						|
	bool operator<( const TBlock& blk ) const { return TRUE; }
 | 
						|
 | 
						|
        bool operator>( const TBlock& blk ) const { return FALSE; }
 | 
						|
};
 | 
						|
 | 
						|
/*
 | 
						|
 * captures info about mutable command 
 | 
						|
 */
 | 
						|
 | 
						|
class TCommand
 | 
						|
{
 | 
						|
public:
 | 
						|
 | 
						|
	TCommand() : mType(-1) {}
 | 
						|
	TCommand( int type ) : mType( type ) {}
 | 
						|
	~TCommand() {}
 | 
						|
 | 
						|
	int       mType;
 | 
						|
	char*     mData;
 | 
						|
	size_t    mDataLen;
 | 
						|
 | 
						|
	TRange    mRange;
 | 
						|
 | 
						|
	// positions of cursor before and after executions of this command
 | 
						|
	TPosition mPrePos;
 | 
						|
	TPosition mPostPos;
 | 
						|
 | 
						|
};
 | 
						|
 | 
						|
enum TEXT_EDITOR_COMMAND
 | 
						|
{
 | 
						|
	TCMD_INSERT,
 | 
						|
	TCMD_DELETE
 | 
						|
};
 | 
						|
 | 
						|
enum TEXT_CHANGE_TYPE
 | 
						|
{
 | 
						|
	CT_MODIFIED,
 | 
						|
	CT_DELETED,
 | 
						|
	CT_INSERTED
 | 
						|
};
 | 
						|
 | 
						|
class wxTextEditorView;
 | 
						|
 | 
						|
// STL-list is used for managing blocks, since it's alg. collects
 | 
						|
// removed elements into a free-list, from which they
 | 
						|
// can be reclaimed later, that way heap-fragmentation may be reduced
 | 
						|
 | 
						|
#if defined( wxUSE_TEMPLATE_STL )
 | 
						|
	typedef list<TBlock>      TBlockListT;
 | 
						|
	typedef vector<TCommand*> TCommandListT;
 | 
						|
	typedef vector<wxTextEditorView*> TextViewListT;
 | 
						|
#else
 | 
						|
	typedef WXSTL_LIST( TBlock )  TBlockListT;
 | 
						|
 | 
						|
	typedef TCommand* TCommandPtrT;
 | 
						|
	typedef WXSTL_VECTOR_SHALLOW_COPY( TCommandPtrT ) TCommandListT;
 | 
						|
 | 
						|
	typedef wxTextEditorView* TextViewPtrT;
 | 
						|
	typedef WXSTL_VECTOR_SHALLOW_COPY( TextViewPtrT ) TextViewListT;
 | 
						|
#endif
 | 
						|
 | 
						|
typedef TBlockListT::iterator TBlockIteratorT;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 * class shields the higher-level operations from direct access
 | 
						|
 * to blocks of fragmented in-memory buffers
 | 
						|
 */
 | 
						|
 | 
						|
class TTextIterator
 | 
						|
{
 | 
						|
public:
 | 
						|
	TBlockIteratorT   mBlockIter;
 | 
						|
	TBlockIteratorT   mEndOfListIter;
 | 
						|
	TPosition         mPos;
 | 
						|
 | 
						|
	size_t            mActualRow;
 | 
						|
	size_t            mFirstRowInBlock;
 | 
						|
 | 
						|
	char*             mpCurRowStart;
 | 
						|
	bool              mIsEof;
 | 
						|
 | 
						|
public:
 | 
						|
	TTextIterator();
 | 
						|
 | 
						|
	char GetChar();
 | 
						|
	bool IsEol();
 | 
						|
	bool IsEof();
 | 
						|
	bool IsLastLine();
 | 
						|
	int  GetDistFromEol();
 | 
						|
 | 
						|
	void NextChar();
 | 
						|
	void PreviousChar();
 | 
						|
	void NextWord();
 | 
						|
	void PreviousWord();
 | 
						|
	void ToEndOfLine();
 | 
						|
	void ToStartOfLine();
 | 
						|
 | 
						|
	bool IsInLastBlock();
 | 
						|
 | 
						|
	// accesors
 | 
						|
 | 
						|
	size_t    GetLineLen();
 | 
						|
	TPosition GetPosition();
 | 
						|
 | 
						|
	char* GetClosestPos(); 
 | 
						|
	char* GotoClosestPos();
 | 
						|
 | 
						|
	inline char* GetBlockStart() { return (*mBlockIter).mBuf; }
 | 
						|
	inline char* GetBlockEnd()   { return (*mBlockIter).mBuf + (*mBlockIter).mTextLen; }
 | 
						|
 | 
						|
	bool DetectUnixText();
 | 
						|
 | 
						|
	// adjust this member to add specific separators, 
 | 
						|
	// the default value is : ",.()[]\t\\+-*/|=<>:;\t\n~?!%"
 | 
						|
 | 
						|
	static string mSeparators;
 | 
						|
 | 
						|
	static bool IsSeparator( char ch );
 | 
						|
};
 | 
						|
 | 
						|
class wxTextEditorModel;
 | 
						|
 | 
						|
class TTextChangeListenerBase
 | 
						|
{
 | 
						|
public:
 | 
						|
	virtual void OnTextChanged( wxTextEditorModel* pModel, size_t atRow, size_t nRows, TEXT_CHANGE_TYPE ct ) = 0;
 | 
						|
};
 | 
						|
 | 
						|
class TCppJavaHighlightListener : public TTextChangeListenerBase
 | 
						|
{
 | 
						|
protected:
 | 
						|
	wxTextEditorModel* mpModel; // is set up temporarely
 | 
						|
 | 
						|
	enum { IN_COMMENT_STATE, OUT_OF_COMMENT_STATE };
 | 
						|
 | 
						|
public:
 | 
						|
	virtual void OnTextChanged( wxTextEditorModel* pModel, size_t atRow, size_t nRows, TEXT_CHANGE_TYPE ct );
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 * Base class for user-defined "bookmarks" within the source-text, bookmarks
 | 
						|
 * are automatically repositioned or deleted as the text is edited. Class
 | 
						|
 * can be subclassed to add pin-specific data (e.g. breakpoint information)
 | 
						|
 */
 | 
						|
 | 
						|
class TPinBase
 | 
						|
{
 | 
						|
public:
 | 
						|
	int    mTypeCode;
 | 
						|
	size_t mRow;
 | 
						|
 | 
						|
public:
 | 
						|
	TPinBase() 
 | 
						|
		: mTypeCode(-1), mRow(NPOS) {}
 | 
						|
 | 
						|
	TPinBase( int typeCode, size_t row )
 | 
						|
		: mTypeCode( typeCode ), mRow( row ) {}
 | 
						|
 | 
						|
	size_t GetRow()      { return mRow; }
 | 
						|
	int    GetTypeCode() { return mTypeCode; }
 | 
						|
 | 
						|
	virtual ~TPinBase() {}
 | 
						|
};
 | 
						|
 | 
						|
// "recommened" type-code ranges for custom pins
 | 
						|
 | 
						|
#define HIHGLIGHTING_PINS_TC_STARRT 50
 | 
						|
#define OTHER_PINS_TC_START         100
 | 
						|
 | 
						|
inline bool operator<( const TPinBase& lhs, TPinBase& rhs )
 | 
						|
 | 
						|
	{ return lhs.mRow < rhs.mRow; }
 | 
						|
 | 
						|
#if defined( wxUSE_TEMPLATE_STL )
 | 
						|
 | 
						|
	typedef vector<TPinBase*> PinListT;
 | 
						|
	typedef vector<TTextChangeListenerBase*> ChangeListenerListT;
 | 
						|
#else
 | 
						|
	typedef TPinBase* TPinBasePtrT;
 | 
						|
	typedef WXSTL_VECTOR_SHALLOW_COPY( TPinBasePtrT ) PinListT;
 | 
						|
 | 
						|
	typedef TTextChangeListenerBase* TTextChangeListenerBasePtrT;
 | 
						|
	typedef WXSTL_VECTOR_SHALLOW_COPY( TTextChangeListenerBasePtrT ) ChangeListenerListT;
 | 
						|
#endif
 | 
						|
 | 
						|
/* OLD STUFF::
 | 
						|
 | 
						|
struct TPinBaseCompareFunctor
 | 
						|
{
 | 
						|
	inline int operator()(const TPinBasePtrT* x, const TPinBasePtrT*& y ) const 
 | 
						|
	{ 
 | 
						|
		return x->mLine < y->mLine;
 | 
						|
	}
 | 
						|
};
 | 
						|
 | 
						|
typedef WXSTL_MULTIMAP( TPinBasePtrT, TPinBasePtrT, TPinBaseCompareFunctor ) PinMapT;
 | 
						|
typedef PinMapT::iterator PinIteratorT;
 | 
						|
*/
 | 
						|
 | 
						|
/* 
 | 
						|
 * Class manages access and manpulation of in-memory text. Can
 | 
						|
 * be accessed by multiple views, only one of which can be active
 | 
						|
 * at a time.
 | 
						|
 */
 | 
						|
 | 
						|
class wxTextEditorModel
 | 
						|
{
 | 
						|
protected:
 | 
						|
	TBlockListT         mBlocks;
 | 
						|
	
 | 
						|
	TCommandListT       mCommands;
 | 
						|
	size_t              mCurCommand;
 | 
						|
 | 
						|
	TextViewListT       mViews;
 | 
						|
	wxTextEditorView*   mpActiveView;
 | 
						|
 | 
						|
	PinListT            mPins;
 | 
						|
	bool                mIsUnixText;
 | 
						|
 | 
						|
	ChangeListenerListT mChangeListeners;
 | 
						|
 | 
						|
public:
 | 
						|
	/*** public properties ***/
 | 
						|
 | 
						|
	bool          mTextChanged;
 | 
						|
	size_t        mChangedFromRow;
 | 
						|
	size_t        mChangedTillRow;
 | 
						|
 | 
						|
	bool          mWasChanged;			  // TRUE, if any content has been changed
 | 
						|
 | 
						|
	TPosition     mCursorPos;
 | 
						|
 | 
						|
	TPosition	  mPrevSelectionStart;
 | 
						|
	TPosition     mPrevSelectionEnd;
 | 
						|
	TPosition     mPrevCursorPos;
 | 
						|
 | 
						|
	TPosition     mSelectionStart;
 | 
						|
	TPosition     mSelectionEnd;
 | 
						|
	size_t        mRowsPerPage;
 | 
						|
 | 
						|
	bool          mIsReadOnly;           // default: FALSE
 | 
						|
	bool          mIsModified;     
 | 
						|
	bool          mInsertMode;			 // default: TRUE
 | 
						|
	bool          mAutoIndentMode;       // default: TRUE
 | 
						|
	bool          mSmartIndentMode;      // default: TRUE
 | 
						|
 | 
						|
	bool          mIsSelectionEditMode;  // default: TRUE
 | 
						|
	size_t        mTabSize;              // default: 4
 | 
						|
 | 
						|
	StrListT      mSearchExprList;
 | 
						|
	string        mLastFindExpr;
 | 
						|
 | 
						|
	bool          mCheckPointDestroyed;
 | 
						|
	size_t        mCheckPointCmdNo;
 | 
						|
 | 
						|
protected:
 | 
						|
 | 
						|
	size_t GetLineCountInRange( char* from, char* till ); 
 | 
						|
 | 
						|
	// two lowest-level operations
 | 
						|
	void DoInsertText ( const TPosition& pos, char* text, size_t len, TRange& actualRange );
 | 
						|
	void DoDeleteRange( const TPosition& from, const TPosition& till, TRange& actualRange );
 | 
						|
 | 
						|
	void DoExecuteNewCommand( TCommand& cmd );
 | 
						|
 | 
						|
	void DoReexecuteCommand( TCommand& cmd );
 | 
						|
	void DoUnexecuteCommand( TCommand& cmd );
 | 
						|
 | 
						|
 | 
						|
	void ExecuteCommand( TCommand* pCmd );
 | 
						|
 | 
						|
	// to methods enabling grouping of undo-able commands
 | 
						|
	bool CanPrependCommand( TCommand* pCmd );
 | 
						|
	void PrependCommand( TCommand* pCmd );
 | 
						|
 | 
						|
	void SetPostPos( const TPosition& pos );
 | 
						|
 | 
						|
	void UndoImpl();
 | 
						|
	void RedoImpl();
 | 
						|
 | 
						|
	void StartBatch();
 | 
						|
	void FinishBatch();
 | 
						|
 | 
						|
	void CheckSelection();
 | 
						|
	void TrackSelection();
 | 
						|
 | 
						|
	void NotifyView();
 | 
						|
	void NotifyAllViews();
 | 
						|
 | 
						|
	void NotifyTextChanged( size_t atRow, size_t nRows, TEXT_CHANGE_TYPE ct );
 | 
						|
	void NotifyTextChanged( TPosition from, TPosition till, TEXT_CHANGE_TYPE ct );
 | 
						|
 | 
						|
	void ArrangePositions( TPosition& upper, TPosition& lower );
 | 
						|
	void ArrangePositions( size_t& upper, size_t& lower );
 | 
						|
 | 
						|
	void MergeChange( size_t fromRow, size_t nRows );
 | 
						|
 | 
						|
	void PrepreForCommand();
 | 
						|
 | 
						|
	size_t TextToScrColumn( const TPosition& pos );
 | 
						|
	size_t ScrToTextColumn( TPosition pos );
 | 
						|
 | 
						|
	void DoMoveCursor( int rows, int cols );
 | 
						|
 | 
						|
public:
 | 
						|
	wxTextEditorModel();
 | 
						|
	virtual ~wxTextEditorModel();
 | 
						|
 | 
						|
	// utilities
 | 
						|
 | 
						|
	char* AllocCharacters( size_t n );
 | 
						|
	char* AllocCharacters( size_t n, const char* srcBuf );
 | 
						|
	void FreeCharacters( char* buf );
 | 
						|
 | 
						|
	void DeleteSelection();
 | 
						|
	TTextIterator CreateIterator( const TPosition& pos );
 | 
						|
 | 
						|
	void DeleteRange( const TPosition& from, const TPosition& till );
 | 
						|
	void InsertText( const TPosition& pos, const char* text, size_t len );
 | 
						|
	void GetTextFromRange( const TPosition& from, const TPosition& till, char** text, size_t& textLen );
 | 
						|
	void LoadTextFromFile( const wxString& fname );
 | 
						|
	void SaveTextToFile( const wxString& fname );
 | 
						|
	void ResetSelection();
 | 
						|
	void ClearUndoBuffer();
 | 
						|
 | 
						|
 | 
						|
	void DeleteAllText();
 | 
						|
	void GetAllText( char** text, size_t& textLen );
 | 
						|
 | 
						|
	void SetSelectionEditMode( bool editIsOn );
 | 
						|
 | 
						|
	/*** user-level commands ***/
 | 
						|
 | 
						|
	// mutable (undoable) commands
 | 
						|
 | 
						|
	void OnInsertChar( char ch );
 | 
						|
	void OnDelete();
 | 
						|
	void OnDeleteBack();
 | 
						|
	void OnDeleteLine();
 | 
						|
 | 
						|
	void OnShiftSelectionIndent( bool left );
 | 
						|
 | 
						|
	// clipboard functions
 | 
						|
 | 
						|
	void OnCopy();
 | 
						|
	void OnPaste();
 | 
						|
	void OnCut();
 | 
						|
	bool CanCopy();
 | 
						|
	bool CanPaste();
 | 
						|
 | 
						|
	// undo-redo
 | 
						|
 | 
						|
	bool CanUndo();
 | 
						|
	bool CanRedo();
 | 
						|
	void OnUndo();
 | 
						|
	void OnRedo();
 | 
						|
 | 
						|
	// imutable commands
 | 
						|
 | 
						|
	void OnMoveLeft();
 | 
						|
	void OnMoveRight();
 | 
						|
	void OnMoveUp();
 | 
						|
	void OnMoveDown();
 | 
						|
 | 
						|
	void OnWordLeft();
 | 
						|
	void OnWordRight();
 | 
						|
 | 
						|
	void OnMoveToPosition( const TPosition& pos );
 | 
						|
 | 
						|
	void OnEndOfLine();
 | 
						|
	void OnStartOfLine();
 | 
						|
	void OnPageUp();
 | 
						|
	void OnPageDown();
 | 
						|
	void OnSlideUp();
 | 
						|
	void OnSlideDown();
 | 
						|
	void OnStartOfText();
 | 
						|
	void OnEndOfText();
 | 
						|
 | 
						|
	void OnSelectWord();
 | 
						|
	void OnSelectAll();
 | 
						|
 | 
						|
	// bookmarks
 | 
						|
 | 
						|
	void OnToggleBookmark();
 | 
						|
	void OnNextBookmark();
 | 
						|
	void OnPreviousBookmark();
 | 
						|
 | 
						|
	// search
 | 
						|
 | 
						|
	bool OnFind();
 | 
						|
	bool OnFindNext();
 | 
						|
	bool OnFindPrevious();
 | 
						|
	void OnGotoLine( int line, int col );
 | 
						|
	void OnGotoLine();
 | 
						|
 | 
						|
	// status
 | 
						|
 | 
						|
	bool IsReadOnly();
 | 
						|
	bool IsModified();
 | 
						|
	bool IsInsertMode();
 | 
						|
 | 
						|
	// check-pointin
 | 
						|
 | 
						|
	void SetCheckpoint();
 | 
						|
	bool CheckpointModified();
 | 
						|
 | 
						|
	// accessors
 | 
						|
 | 
						|
	TPosition GetStartOfSelection();
 | 
						|
	TPosition GetEndOfSelection();
 | 
						|
	TPosition GetCursor();
 | 
						|
 | 
						|
	size_t    GetTotalRowCount();
 | 
						|
	bool	  SelectionIsEmpty();
 | 
						|
	bool      IsLastLine( const TPosition& pos );
 | 
						|
 | 
						|
	bool      IsUnixText() { return mIsUnixText; }
 | 
						|
 | 
						|
	void GetSelection( char** text, size_t& textLen );
 | 
						|
 | 
						|
	void SetStartOfSelection( const TPosition& pos );
 | 
						|
	void SetEndOfSelection( const TPosition& pos );
 | 
						|
	void SetCursor( const TPosition& pos );
 | 
						|
 | 
						|
	void AddView( wxTextEditorView* pView );
 | 
						|
	void RemoveView( wxTextEditorView* pView );
 | 
						|
	void SetActiveView( wxTextEditorView* pView );
 | 
						|
	wxTextEditorView* GetActiveView();
 | 
						|
 | 
						|
	void SetRowsPerPage( size_t n );
 | 
						|
 | 
						|
	void AddPin( TPinBase* pPin );
 | 
						|
	PinListT& GetPins(); 
 | 
						|
 | 
						|
	// returns NPOS, if non
 | 
						|
	size_t FindFirstPinInRange( size_t fromRow, size_t tillRow );
 | 
						|
	size_t FindNextPinFrom( size_t fromRow );
 | 
						|
	size_t FindPreviousPinFrom( size_t fromRow );
 | 
						|
 | 
						|
	size_t GetPinNoAt( size_t row, int pinTypeCode );
 | 
						|
	TPinBase* GetPinAt( size_t row, int pinTypeCode );
 | 
						|
	void RemovePinAt( size_t row, int pinTypeCode );
 | 
						|
 | 
						|
	void AddChangeListener( TTextChangeListenerBase* pListener );
 | 
						|
};
 | 
						|
 | 
						|
class TCursorTimer;
 | 
						|
class wxTextEditorView;
 | 
						|
 | 
						|
class TPinPainterBase : public wxObject
 | 
						|
{
 | 
						|
public:
 | 
						|
	int    mPinTypeCode;
 | 
						|
 | 
						|
public:
 | 
						|
	TPinPainterBase( int pinTc ) : mPinTypeCode( pinTc ) {}
 | 
						|
	TPinPainterBase() : mPinTypeCode( -1 ) {}
 | 
						|
 | 
						|
	inline int GetPinTypeCode() { return mPinTypeCode; }
 | 
						|
 | 
						|
	virtual void DrawPin( TPinBase* pPin, wxTextEditorView& view, wxDC& dc, 
 | 
						|
						  const wxPoint& pos, const wxSize& dim ) = 0;
 | 
						|
};
 | 
						|
 | 
						|
/*
 | 
						|
 * a couple very common ping objects/painters
 | 
						|
 */
 | 
						|
 | 
						|
#define BOOKMARK_PIN_TC  (OTHER_PINS_TC_START)
 | 
						|
#define BRKPOINT_PIN_TC  (BOOKMARK_PIN_TC + 1)
 | 
						|
 | 
						|
class TBookmarkPainter : public TPinPainterBase
 | 
						|
{
 | 
						|
protected:
 | 
						|
	wxBrush mBkBrush;
 | 
						|
 | 
						|
public:
 | 
						|
	TBookmarkPainter();
 | 
						|
 | 
						|
	virtual void DrawPin( TPinBase* pPin, wxTextEditorView& view, wxDC& dc, 
 | 
						|
						  const wxPoint& pos, const wxSize& dim );
 | 
						|
};
 | 
						|
 | 
						|
class TBookmarkPin : public TPinBase
 | 
						|
{
 | 
						|
public:
 | 
						|
	TBookmarkPin( size_t row )
 | 
						|
		: TPinBase( BOOKMARK_PIN_TC, row )
 | 
						|
	{}
 | 
						|
 | 
						|
	static int GetPinTypeCode() { return BOOKMARK_PIN_TC; }
 | 
						|
};
 | 
						|
 | 
						|
class TBreakpointPainter : public TPinPainterBase
 | 
						|
{
 | 
						|
protected:
 | 
						|
	wxBrush mBkBrush;
 | 
						|
 | 
						|
public:
 | 
						|
	TBreakpointPainter();
 | 
						|
 | 
						|
	virtual void DrawPin( TPinBase* pPin, wxTextEditorView& view, wxDC& dc, 
 | 
						|
						  const wxPoint& pos, const wxSize& dim );
 | 
						|
};
 | 
						|
 | 
						|
class TBreakpointPin : public TPinBase
 | 
						|
{
 | 
						|
public:
 | 
						|
	TBreakpointPin( size_t row )
 | 
						|
		: TPinBase( BRKPOINT_PIN_TC, row )
 | 
						|
	{}
 | 
						|
 | 
						|
	static int GetPinTypeCode() { return BRKPOINT_PIN_TC; }
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
#if defined( wxUSE_TEMPLATE_STL )
 | 
						|
	typedef vector<TPinPainterBase*> PinPainterListT;
 | 
						|
#else
 | 
						|
	typedef TPinPainterBase* TPinPainterBasePtrT;
 | 
						|
	typedef WXSTL_VECTOR_SHALLOW_COPY( TPinPainterBasePtrT ) PinPainterListT;
 | 
						|
#endif
 | 
						|
 | 
						|
/*
 | 
						|
 * Class displays graphical view of data contained in wxTextModel
 | 
						|
 */
 | 
						|
 | 
						|
class wxTextEditorView : public wxScrolledWindow
 | 
						|
{
 | 
						|
protected:
 | 
						|
 | 
						|
	wxTextEditorModel*  mpModel;
 | 
						|
	TPosition           mSelectionStart;
 | 
						|
	TPosition           mSelectionEnd;
 | 
						|
	TPosition           mCursorPos;
 | 
						|
 | 
						|
	TPosition           mLastViewStart;
 | 
						|
	size_t              mLastRowsTotal;
 | 
						|
 | 
						|
	size_t              mRowsPerPage;
 | 
						|
	size_t              mColsPerPage;
 | 
						|
 | 
						|
	static char*        mpLineBuffer;
 | 
						|
	static size_t       mpLineBufferLen;
 | 
						|
 | 
						|
	bool                mFullRefreshPending;
 | 
						|
	bool                mAdjustScrollPending;
 | 
						|
 | 
						|
	wxFont              mFont;
 | 
						|
 | 
						|
	bool                mScrollingOn; // default: TRUE
 | 
						|
	bool                mCursorOn;   // default: TRUE;
 | 
						|
 | 
						|
	bool                mLTMode; // line-tracking mode
 | 
						|
								 // (when the whole line is coloured,
 | 
						|
	                             //  instead of showing blinking cursor position)
 | 
						|
 | 
						|
	wxColour            mLTColour; // fill-colour for LT-mode
 | 
						|
 | 
						|
	bool                mDragStarted;
 | 
						|
	char*               mpDraggedText;
 | 
						|
 | 
						|
	bool                mOwnsModel;
 | 
						|
 | 
						|
	wxString            mFragment; // reused heap-buffer 
 | 
						|
								   // for coloured fragments
 | 
						|
	SourcePainter*      mpPainter;
 | 
						|
	PinPainterListT     mPinPainters;
 | 
						|
	TTextIterator       mCashedIter;
 | 
						|
 | 
						|
	static TCursorTimer* mpTimer;
 | 
						|
 | 
						|
public: /*** public properties ***/
 | 
						|
 | 
						|
	int                mLeftMargin;		// default: 20
 | 
						|
	int                mRightMargin;	// default: 0
 | 
						|
	int                mTopMargin;		// default: 0
 | 
						|
	int                mBottomMargin;	// default: 0
 | 
						|
	int                mMaxColumns;     // default: 500
 | 
						|
 | 
						|
	TPosition          mPagePos;
 | 
						|
 | 
						|
	// color-scheme properties
 | 
						|
 | 
						|
	wxColour           mNormalTextCol;
 | 
						|
	wxColour           mIndentifierTextCol;
 | 
						|
	wxColour           mReservedWordTextCol;
 | 
						|
	wxColour           mCommentTextCol;
 | 
						|
 | 
						|
	wxColour           mNormalBkCol;
 | 
						|
	wxColour           mSelectionFgCol;
 | 
						|
	wxColour           mSelectionBkCol;
 | 
						|
 | 
						|
	wxBrush            mNormalBkBrush;
 | 
						|
	wxBrush            mSelectedBkBrush;
 | 
						|
 | 
						|
	// accessed by timer
 | 
						|
 | 
						|
	TPosition           mCursorScrPos;
 | 
						|
	wxSize              mCharDim;
 | 
						|
 | 
						|
protected:
 | 
						|
 | 
						|
	char* GetLineBuffer( size_t len );
 | 
						|
 | 
						|
	virtual void PaintDecorations( size_t fromRow, size_t tillRow, wxDC& dc, TTextIterator& iter );
 | 
						|
	virtual void PaintRows( size_t fromRow, size_t tillRow, wxDC& dc );
 | 
						|
 | 
						|
	void ObtainFontProperties();
 | 
						|
 | 
						|
	bool IsActiveView();
 | 
						|
	void SetTextDefaults();
 | 
						|
	void RecalcPagingInfo();
 | 
						|
 | 
						|
	TPinPainterBase* FindPainterForPin( TPinBase& pin );
 | 
						|
 | 
						|
public:
 | 
						|
	wxTextEditorView( wxWindow* parent, wxWindowID id = -1, 
 | 
						|
					  wxTextEditorModel* pModel = NULL, 
 | 
						|
					  int wndStyle = wxSUNKEN_BORDER,
 | 
						|
					  bool ownsModel = TRUE );
 | 
						|
	~wxTextEditorView();
 | 
						|
 | 
						|
	/*** setup methods ***/
 | 
						|
 | 
						|
	void SetModel( wxTextEditorModel* pModel );
 | 
						|
 | 
						|
	// sets custom syntax-higlighting implementation
 | 
						|
	void SetSourcePainter( SourcePainter* pPainter );
 | 
						|
	void AddPinPainter( TPinPainterBase* pPainter );
 | 
						|
 | 
						|
	void SetDefaultFont( const wxFont& font );
 | 
						|
	wxFont& GetDefaultFont(); 
 | 
						|
 | 
						|
	wxSize GetCharacterSize() { return mCharDim; }
 | 
						|
 | 
						|
	size_t GetRowsPerPage() { return mRowsPerPage; }
 | 
						|
	void SetRowsPerPage( size_t n );
 | 
						|
	void SetMaxColumns( size_t n );
 | 
						|
 | 
						|
	void SetLineTrackingMode( bool on, const wxColour& col = wxColour(255,255,0) );
 | 
						|
 | 
						|
	void EnableCursor( bool enable );
 | 
						|
	void EnableScrollbars( bool enable );
 | 
						|
 | 
						|
	void SetColours( const wxColour& normalBkCol,
 | 
						|
					 const wxColour& selectedBkCol,
 | 
						|
					 const wxColour& selectedTextCol );
 | 
						|
 | 
						|
	void SetHeighlightingColours( const wxColour& normalTextCol,
 | 
						|
								  const wxColour& identifierTextCol,
 | 
						|
								  const wxColour& reservedWordTextCol,
 | 
						|
								  const wxColour& commentTextCol );
 | 
						|
 | 
						|
	void SetMargins( int top, int left, int bottom, int right );
 | 
						|
 | 
						|
	// notifications from editor-model:
 | 
						|
 | 
						|
	void OnModelChanged();
 | 
						|
	void ScrollView( int rows, int cols );
 | 
						|
 | 
						|
	// accessors
 | 
						|
 | 
						|
	void Activate();
 | 
						|
	void Deactivate();
 | 
						|
 | 
						|
	// event handlers
 | 
						|
 | 
						|
#if (( wxVERSION_NUMBER < 2100 ) || (( wxVERSION_NUMBER == 2100 ) && (wxBETA_NUMBER <= 4)))
 | 
						|
	void OnScroll( wxScrollEvent& event );
 | 
						|
#else
 | 
						|
        void OnScroll( wxScrollWinEvent& event );
 | 
						|
#endif
 | 
						|
	void OnPaint ( wxPaintEvent& event );
 | 
						|
	void OnSize  ( wxSizeEvent& event );
 | 
						|
	void OnEraseBackground( wxEraseEvent& event );
 | 
						|
 | 
						|
	void OnLButtonDown( wxMouseEvent& event );
 | 
						|
	void OnLButtonUp  ( wxMouseEvent& event );
 | 
						|
	void OnMotion     ( wxMouseEvent& event );
 | 
						|
	void OnDblClick   ( wxMouseEvent& event );
 | 
						|
 | 
						|
	void OnSetFocus( wxFocusEvent& event );
 | 
						|
	void OnKillFocus( wxFocusEvent& event );
 | 
						|
 | 
						|
	// requests editor to keep cursor blinking, even when
 | 
						|
	// the window has lost it's focus
 | 
						|
 | 
						|
	void HoldCursor( bool hold );
 | 
						|
 | 
						|
	// FOR NOW:: hard-coded key-bindings
 | 
						|
 | 
						|
	void OnChar( wxKeyEvent& event );
 | 
						|
	void OnKeyDown( wxKeyEvent& event );
 | 
						|
 | 
						|
	// utilities
 | 
						|
 | 
						|
	virtual void SyncViewPortPosition();
 | 
						|
	virtual void SyncScrollbars();
 | 
						|
	virtual void PositionCursor();
 | 
						|
 | 
						|
	void TextPosToScreenPos( const TPosition& txtPos, TPosition& scrPos );
 | 
						|
	void ScreenPosToTextPos( const TPosition& scrPos, TPosition& txtPos );
 | 
						|
	void ScreenPosToPixels ( const TPosition& scrPos, int& x, int& y );
 | 
						|
	void PixelsToScrPos    ( int x, int y, int& scrRow, int& scrCol );
 | 
						|
	void PixelsToTextPos   ( int x, int y, TPosition& textPos );
 | 
						|
 | 
						|
	bool IsClipboardCmd( wxKeyEvent& key );
 | 
						|
 | 
						|
	TPosition GetPagePos() { return mPagePos; }
 | 
						|
 | 
						|
	DECLARE_EVENT_TABLE()
 | 
						|
};
 | 
						|
 | 
						|
// TODO:: mutex class should be used to avoid race on updates
 | 
						|
 | 
						|
class TCursorTimer : public wxTimer
 | 
						|
{
 | 
						|
protected:
 | 
						|
	wxTextEditorView* mpView;
 | 
						|
	volatile bool mIsLocked;
 | 
						|
	volatile bool mIsShown;
 | 
						|
	volatile bool mStarted;
 | 
						|
	wxBrush       mBrush;
 | 
						|
	bool          mMissOneTick;
 | 
						|
 | 
						|
	int           mBlinkInterval;  // default: 500mills
 | 
						|
protected:
 | 
						|
 | 
						|
	void DrawCursor();
 | 
						|
 | 
						|
public:
 | 
						|
 | 
						|
	TCursorTimer();
 | 
						|
 | 
						|
	virtual void Notify();
 | 
						|
 | 
						|
	void SetView( wxTextEditorView* pView );
 | 
						|
	wxTextEditorView* GetView();
 | 
						|
	void HideCursor( bool forceHide = FALSE );
 | 
						|
	void ShowCursor( bool forceShow = FALSE );
 | 
						|
 | 
						|
	void SetIsShown( bool isShown );
 | 
						|
	void Lock();
 | 
						|
	void Unlock();
 | 
						|
};
 | 
						|
 | 
						|
#endif // __TDEFS_G__
 |