--- /dev/null
+/////////////////////////////////////////////////////////////////////////////
+// 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__