File Annotation

Not logged in
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_