dcdd144598 2011-02-23 kinaba: #ifndef _EDITWING_IP_DOC_H_ dcdd144598 2011-02-23 kinaba: #define _EDITWING_IP_DOC_H_ dcdd144598 2011-02-23 kinaba: #include "ewDoc.h" dcdd144598 2011-02-23 kinaba: using namespace ki; dcdd144598 2011-02-23 kinaba: #ifndef __ccdoc__ dcdd144598 2011-02-23 kinaba: namespace editwing { dcdd144598 2011-02-23 kinaba: namespace doc { dcdd144598 2011-02-23 kinaba: #endif dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ @pkg editwing.Doc.Impl //@} dcdd144598 2011-02-23 kinaba: class Parser; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: //@{ dcdd144598 2011-02-23 kinaba: // 行バッファ構造体 dcdd144598 2011-02-23 kinaba: // dcdd144598 2011-02-23 kinaba: // UCS-2ベタの形式でテキストデータを保持する。またそれと同時に、 dcdd144598 2011-02-23 kinaba: // キーワードファイルによって指定された強調語を区別するための dcdd144598 2011-02-23 kinaba: // 解析処理結果用バッファも管理する。文字データに終端NULは dcdd144598 2011-02-23 kinaba: // 付けないが、解析作業の高速化のため、終端 U+007f が入る。 dcdd144598 2011-02-23 kinaba: //@} dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: class Line : public Object dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 指定テキストで初期化 //@} dcdd144598 2011-02-23 kinaba: Line( const unicode* str, ulong len ) dcdd144598 2011-02-23 kinaba: : alen_( 10>len ? 10 : len ) dcdd144598 2011-02-23 kinaba: , len_ ( len ) dcdd144598 2011-02-23 kinaba: , str_ ( static_cast<unicode*>( mem().Alloc((alen_+1)*2+alen_) ) ) dcdd144598 2011-02-23 kinaba: , flg_ ( reinterpret_cast<uchar*>(str_+alen_+1) ) dcdd144598 2011-02-23 kinaba: , commentBitReady_( false ) dcdd144598 2011-02-23 kinaba: , isLineHeadCommented_( 0 ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: memmove( str_, str, len*2 ); dcdd144598 2011-02-23 kinaba: str_[ len ] = 0x007f; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: ~Line() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: mem().DeAlloc( str_, (alen_+1)*2+alen_ ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ テキスト挿入(指定位置に指定サイズ) //@} dcdd144598 2011-02-23 kinaba: void InsertAt( ulong at, const unicode* buf, ulong siz ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: if( len_+siz > alen_ ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // バッファ拡張 dcdd144598 2011-02-23 kinaba: ulong psiz = (alen_+1)*2+alen_; dcdd144598 2011-02-23 kinaba: alen_ = Max( alen_<<1, len_+siz ); dcdd144598 2011-02-23 kinaba: unicode* tmpS = dcdd144598 2011-02-23 kinaba: static_cast<unicode*>( mem().Alloc((alen_+1)*2+alen_) ); dcdd144598 2011-02-23 kinaba: uchar* tmpF = dcdd144598 2011-02-23 kinaba: reinterpret_cast<uchar*>(tmpS+alen_+1); dcdd144598 2011-02-23 kinaba: // コピー dcdd144598 2011-02-23 kinaba: memmove( tmpS, str_, at*2 ); dcdd144598 2011-02-23 kinaba: memmove( tmpS+at+siz, str_+at, (len_-at+1)*2 ); dcdd144598 2011-02-23 kinaba: memmove( tmpF, flg_, at ); dcdd144598 2011-02-23 kinaba: // 古いのを削除 dcdd144598 2011-02-23 kinaba: mem().DeAlloc( str_, psiz ); dcdd144598 2011-02-23 kinaba: str_ = tmpS; dcdd144598 2011-02-23 kinaba: flg_ = tmpF; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: else dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: memmove( str_+at+siz, str_+at, (len_-at+1)*2 ); dcdd144598 2011-02-23 kinaba: memmove( flg_+at+siz, flg_+at, (len_-at) ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: memmove( str_+at, buf, siz*sizeof(unicode) ); dcdd144598 2011-02-23 kinaba: len_ += siz; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ テキスト挿入(末尾に) //@} dcdd144598 2011-02-23 kinaba: void InsertToTail( const unicode* buf, ulong siz ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: InsertAt( len_, buf, siz ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ テキスト削除(指定位置から指定サイズ) //@} dcdd144598 2011-02-23 kinaba: void RemoveAt( ulong at, ulong siz ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: memmove( str_+at, str_+at+siz, (len_-siz-at+1)*2 ); dcdd144598 2011-02-23 kinaba: memmove( flg_+at, flg_+at+siz, (len_-siz-at) ); dcdd144598 2011-02-23 kinaba: len_ -= siz; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ テキスト削除(指定位置から末尾まで) //@} dcdd144598 2011-02-23 kinaba: void RemoveToTail( ulong at ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: if( at < len_ ) dcdd144598 2011-02-23 kinaba: str_[ len_=at ] = 0x007f; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ バッファにコピー(指定位置から指定サイズ) //@} dcdd144598 2011-02-23 kinaba: ulong CopyAt( ulong at, ulong siz, unicode* buf ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: memmove( buf, str_+at, siz*sizeof(unicode) ); dcdd144598 2011-02-23 kinaba: return siz; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ バッファにコピー(指定位置から末尾まで) //@} dcdd144598 2011-02-23 kinaba: ulong CopyToTail( ulong at, unicode* buf ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: return CopyAt( at, len_-at, buf ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 長さ //@} dcdd144598 2011-02-23 kinaba: ulong size() const dcdd144598 2011-02-23 kinaba: { return len_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ テキスト //@} dcdd144598 2011-02-23 kinaba: unicode* str() dcdd144598 2011-02-23 kinaba: { return str_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ テキスト(const) //@} dcdd144598 2011-02-23 kinaba: const unicode* str() const dcdd144598 2011-02-23 kinaba: { return str_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 解析結果 //@} dcdd144598 2011-02-23 kinaba: uchar* flg() dcdd144598 2011-02-23 kinaba: { return flg_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 解析結果(const) //@} dcdd144598 2011-02-23 kinaba: const uchar* flg() const dcdd144598 2011-02-23 kinaba: { return flg_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // ask dcdd144598 2011-02-23 kinaba: bool isCmtBitReady() const dcdd144598 2011-02-23 kinaba: { return commentBitReady_; } dcdd144598 2011-02-23 kinaba: uchar isLineHeadCmt() const dcdd144598 2011-02-23 kinaba: { return isLineHeadCommented_; } dcdd144598 2011-02-23 kinaba: // for doc dcdd144598 2011-02-23 kinaba: uchar TransitCmt( uchar start ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: isLineHeadCommented_ = start; dcdd144598 2011-02-23 kinaba: commentBitReady_ = false; dcdd144598 2011-02-23 kinaba: return (commentTransition_>>start)&1; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: // for parser dcdd144598 2011-02-23 kinaba: void SetTransitFlag( uchar flag ) dcdd144598 2011-02-23 kinaba: { commentTransition_ = flag; } dcdd144598 2011-02-23 kinaba: void CommentBitUpdated() dcdd144598 2011-02-23 kinaba: { commentBitReady_ = true; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: ulong alen_; dcdd144598 2011-02-23 kinaba: ulong len_; dcdd144598 2011-02-23 kinaba: unicode* str_; dcdd144598 2011-02-23 kinaba: uchar* flg_; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: uchar isLineHeadCommented_; dcdd144598 2011-02-23 kinaba: uchar commentTransition_; dcdd144598 2011-02-23 kinaba: bool commentBitReady_; dcdd144598 2011-02-23 kinaba: }; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: //@{ dcdd144598 2011-02-23 kinaba: // Unicodeテキスト切り分け君 dcdd144598 2011-02-23 kinaba: // dcdd144598 2011-02-23 kinaba: // 行単位で処理を行うことが多いので、その行毎に分ける処理を dcdd144598 2011-02-23 kinaba: // 切り出した。getLine() するたびに、指定したポインタと整数変数へ dcdd144598 2011-02-23 kinaba: // 先頭から順に行のデータを格納して行く。 dcdd144598 2011-02-23 kinaba: //@} dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: class UniReader dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 読みとり元バッファを与えて初期化 //@} dcdd144598 2011-02-23 kinaba: UniReader( dcdd144598 2011-02-23 kinaba: const unicode* str, ulong len, dcdd144598 2011-02-23 kinaba: const unicode** ansstr, ulong* anslen ) dcdd144598 2011-02-23 kinaba: : ptr_ ( str ) dcdd144598 2011-02-23 kinaba: , end_ ( str+len ) dcdd144598 2011-02-23 kinaba: , ans_ ( ansstr ) dcdd144598 2011-02-23 kinaba: , aln_ ( anslen ) dcdd144598 2011-02-23 kinaba: , empty_( false ) {} dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 読み終わったかどうかチェック //@} dcdd144598 2011-02-23 kinaba: bool isEmpty() dcdd144598 2011-02-23 kinaba: { return empty_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 一行取得 //@} dcdd144598 2011-02-23 kinaba: void getLine() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // 次の改行の位置を取得 dcdd144598 2011-02-23 kinaba: const unicode *p=ptr_, *e=end_; dcdd144598 2011-02-23 kinaba: for( ; p<e; ++p ) dcdd144598 2011-02-23 kinaba: if( *p == L'\r' || *p == L'\n' ) dcdd144598 2011-02-23 kinaba: break; dcdd144598 2011-02-23 kinaba: // 記録 dcdd144598 2011-02-23 kinaba: *ans_ = ptr_; dcdd144598 2011-02-23 kinaba: *aln_ = int(p-ptr_); dcdd144598 2011-02-23 kinaba: // 改行コードスキップ dcdd144598 2011-02-23 kinaba: if( p == e ) dcdd144598 2011-02-23 kinaba: empty_ = true; dcdd144598 2011-02-23 kinaba: else dcdd144598 2011-02-23 kinaba: if( *(p++)==L'\r'&& p<e && *p==L'\n' ) dcdd144598 2011-02-23 kinaba: ++p; dcdd144598 2011-02-23 kinaba: ptr_ = p; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: bool empty_; dcdd144598 2011-02-23 kinaba: const unicode *ptr_, *end_, **ans_; dcdd144598 2011-02-23 kinaba: ulong *aln_; dcdd144598 2011-02-23 kinaba: }; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: //@{ dcdd144598 2011-02-23 kinaba: // Undo/Redo用に、Commandオブジェクトを保存しておくクラス dcdd144598 2011-02-23 kinaba: //@} dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: class UnReDoChain : public Object dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ コンストラクタ //@} dcdd144598 2011-02-23 kinaba: UnReDoChain(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ デストラクタ //@} dcdd144598 2011-02-23 kinaba: ~UnReDoChain(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ Undo実行 //@} dcdd144598 2011-02-23 kinaba: void Undo( Document& doc ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ Redo実行 //@} dcdd144598 2011-02-23 kinaba: void Redo( Document& doc ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 新しいコマンドを実行 //@} dcdd144598 2011-02-23 kinaba: void NewlyExec( const Command& cmd, Document& doc ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 初期状態に戻す //@} dcdd144598 2011-02-23 kinaba: void Clear(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 保存位置フラグを現在位置にセット //@} dcdd144598 2011-02-23 kinaba: void SavedHere(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ Undo/Redoの回数制限を指定。-1 = Infinite //@} dcdd144598 2011-02-23 kinaba: void SetLimit( long lim ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ Undo操作が可能か? //@} dcdd144598 2011-02-23 kinaba: bool isUndoAble() const; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ Redo操作が可能か? //@} dcdd144598 2011-02-23 kinaba: bool isRedoAble() const; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 保存後、変更されているか? //@} dcdd144598 2011-02-23 kinaba: bool isModified() const; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: struct Node : public Object dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: Node(); dcdd144598 2011-02-23 kinaba: Node( Command*, Node*, Node* ); dcdd144598 2011-02-23 kinaba: ~Node(); dcdd144598 2011-02-23 kinaba: void ResetCommand( Command* cmd ); dcdd144598 2011-02-23 kinaba: ulong ChainDelete(Node*& savedPos_ref); dcdd144598 2011-02-23 kinaba: Node *next_, *prev_; dcdd144598 2011-02-23 kinaba: Command *cmd_; dcdd144598 2011-02-23 kinaba: }; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: Node headTail_; dcdd144598 2011-02-23 kinaba: Node* savedPos_; dcdd144598 2011-02-23 kinaba: Node* lastOp_; dcdd144598 2011-02-23 kinaba: ulong num_; dcdd144598 2011-02-23 kinaba: ulong limit_; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: NOCOPY(UnReDoChain); dcdd144598 2011-02-23 kinaba: }; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //------------------------------------------------------------------------- dcdd144598 2011-02-23 kinaba: #ifndef __ccdoc__ dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline void UnReDoChain::SavedHere() dcdd144598 2011-02-23 kinaba: { savedPos_ = lastOp_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline bool UnReDoChain::isUndoAble() const dcdd144598 2011-02-23 kinaba: { return (lastOp_ != &headTail_); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline bool UnReDoChain::isRedoAble() const dcdd144598 2011-02-23 kinaba: { return (lastOp_->next_ != &headTail_); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline bool UnReDoChain::isModified() const dcdd144598 2011-02-23 kinaba: { return (lastOp_ != savedPos_); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: #endif // __ccdoc__ dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: //@{ dcdd144598 2011-02-23 kinaba: // Documentクラスの実装部分 dcdd144598 2011-02-23 kinaba: //@} dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: class DocImpl : public Object, EzLockable, Runnable dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: DocImpl( Document& theDoc ); dcdd144598 2011-02-23 kinaba: ~DocImpl(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 操作コマンド実行 //@} dcdd144598 2011-02-23 kinaba: void Execute( const Command& cmd ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ キーワード定義切り替え //@} dcdd144598 2011-02-23 kinaba: void SetKeyword( const unicode* defbuf, ulong siz ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ イベントハンドラ登録 //@} dcdd144598 2011-02-23 kinaba: void AddHandler( DocEvHandler* eh ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ イベントハンドラ解除 //@} dcdd144598 2011-02-23 kinaba: void DelHandler( DocEvHandler* eh ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ ファイルを開く //@} dcdd144598 2011-02-23 kinaba: void OpenFile( aptr<TextFileR> tf ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ ファイルを保存 //@} dcdd144598 2011-02-23 kinaba: void SaveFile( TextFileW& tf ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 内容破棄 //@} dcdd144598 2011-02-23 kinaba: void ClearAll(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ アンドゥ //@] dcdd144598 2011-02-23 kinaba: void Undo(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ リドゥ //@] dcdd144598 2011-02-23 kinaba: void Redo(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ アンドゥ回数制限 //@] dcdd144598 2011-02-23 kinaba: void SetUndoLimit( long lim ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 変更フラグをクリア //@} dcdd144598 2011-02-23 kinaba: void ClearModifyFlag(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 行数 //@} dcdd144598 2011-02-23 kinaba: ulong tln() const; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 行バッファ //@} dcdd144598 2011-02-23 kinaba: const unicode* tl( ulong i ) const; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 行解析結果バッファ //@} dcdd144598 2011-02-23 kinaba: const uchar* pl( ulong i ) const; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 行文字数 //@} dcdd144598 2011-02-23 kinaba: ulong len( ulong i ) const; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 指定範囲のテキストの長さ //@} dcdd144598 2011-02-23 kinaba: ulong getRangeLength( const DPos& stt, const DPos& end ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 指定範囲のテキスト //@} dcdd144598 2011-02-23 kinaba: void getText( unicode* buf, const DPos& stt, const DPos& end ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 指定位置の単語の先頭を取得 //@} dcdd144598 2011-02-23 kinaba: DPos wordStartOf( const DPos& dp ) const; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 指定位置の一つ左の位置を取得 //@} dcdd144598 2011-02-23 kinaba: DPos leftOf( const DPos& dp, bool wide=false ) const; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 指定位置の一つ右の位置を取得 //@} dcdd144598 2011-02-23 kinaba: DPos rightOf( const DPos& dp, bool wide=false ) const; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ アンドゥ可能? //@} dcdd144598 2011-02-23 kinaba: bool isUndoAble() const; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ リドゥ可能? //@} dcdd144598 2011-02-23 kinaba: bool isRedoAble() const; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 変更済み? //@} dcdd144598 2011-02-23 kinaba: bool isModified() const; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: Document& doc_; // 自分 dcdd144598 2011-02-23 kinaba: aptr<Parser> parser_; // 文字列解析役 dcdd144598 2011-02-23 kinaba: gapbufobj<Line> text_; // テキストデータ dcdd144598 2011-02-23 kinaba: mutable storage<DocEvHandler*> pEvHan_; // イベント通知先 dcdd144598 2011-02-23 kinaba: UnReDoChain urdo_; // アンドゥリドゥ dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: aptr<TextFileR> currentOpeningFile_; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 変更通知 dcdd144598 2011-02-23 kinaba: void Fire_KEYWORDCHANGE(); dcdd144598 2011-02-23 kinaba: void Fire_MODIFYFLAGCHANGE(); dcdd144598 2011-02-23 kinaba: void Fire_TEXTUPDATE( const DPos& s, dcdd144598 2011-02-23 kinaba: const DPos& e, const DPos& e2, bool reparsed, bool nmlcmd ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // ヘルパー関数 dcdd144598 2011-02-23 kinaba: bool ReParse( ulong s, ulong e ); dcdd144598 2011-02-23 kinaba: void SetCommentBit( const Line& x ) const; dcdd144598 2011-02-23 kinaba: void CorrectPos( DPos& pos ); dcdd144598 2011-02-23 kinaba: void CorrectPos( DPos& stt, DPos& end ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 挿入・削除作業 dcdd144598 2011-02-23 kinaba: bool InsertingOperation( dcdd144598 2011-02-23 kinaba: DPos& stt, const unicode* str, ulong len, DPos& undoend ); dcdd144598 2011-02-23 kinaba: bool DeletingOperation( dcdd144598 2011-02-23 kinaba: DPos& stt, DPos& end, unicode*& undobuf, ulong& undosiz ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // パラレルリード dcdd144598 2011-02-23 kinaba: virtual void StartThread(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: NOCOPY(DocImpl); dcdd144598 2011-02-23 kinaba: friend class Insert; dcdd144598 2011-02-23 kinaba: friend class Delete; dcdd144598 2011-02-23 kinaba: friend class Replace; dcdd144598 2011-02-23 kinaba: }; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //------------------------------------------------------------------------- dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline ulong DocImpl::tln() const dcdd144598 2011-02-23 kinaba: { return text_.size(); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline const unicode* DocImpl::tl( ulong i ) const dcdd144598 2011-02-23 kinaba: { return text_[i].str(); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline ulong DocImpl::len( ulong i ) const dcdd144598 2011-02-23 kinaba: { return text_[i].size(); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline const uchar* DocImpl::pl( ulong i ) const dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: const Line& x = text_[i]; dcdd144598 2011-02-23 kinaba: if( !x.isCmtBitReady() ) dcdd144598 2011-02-23 kinaba: SetCommentBit( x ); dcdd144598 2011-02-23 kinaba: return x.flg(); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: }} // namespace editwing::doc dcdd144598 2011-02-23 kinaba: #endif // _EDITWING_IP_DOC_H_