wxWidgets/utils/wxPython/modules/lseditor/tdefs.h
Harco de Hilster 4b123bb9cc lots'o' wxpython modules files
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@3345 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
1999-08-11 17:14:49 +00:00

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__