File Annotation

Not logged in
dcdd144598 2011-02-23        kinaba: #ifndef _EDITWING_DOC_H_
dcdd144598 2011-02-23        kinaba: #define _EDITWING_DOC_H_
dcdd144598 2011-02-23        kinaba: #include "ewCommon.h"
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: class DocImpl;
dcdd144598 2011-02-23        kinaba: class DocEvHandler;
dcdd144598 2011-02-23        kinaba: class Command;
dcdd144598 2011-02-23        kinaba: class Insert;
dcdd144598 2011-02-23        kinaba: class Delete;
dcdd144598 2011-02-23        kinaba: 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: //@{ @pkg editwing.Doc //@}
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 DocImpl で行う。ので、詳しくはそちらを参照のこと。
dcdd144598 2011-02-23        kinaba: //@}
dcdd144598 2011-02-23        kinaba: //=========================================================================
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: class Document : public ki::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: 	Document();
dcdd144598 2011-02-23        kinaba: 	~Document();
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	//@{ ファイルを開く //@}
dcdd144598 2011-02-23        kinaba: 	void OpenFile( ki::aptr<ki::TextFileR> tf );
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	//@{ ファイルを保存 //@}
dcdd144598 2011-02-23        kinaba: 	void SaveFile( ki::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 Execute( const Command& cmd );
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: 	//@{ イベントハンドラ登録 //@}
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 SetKeyword( const unicode* defbuf, ulong siz=0 );
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: 	DocImpl& impl() { return *impl_; }
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: 	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 ) const;
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 ) 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: 	//@{ ビジーフラグ(マクロコマンド実行中のみ成立) //@}
dcdd144598 2011-02-23        kinaba: 	void setBusyFlag( bool b=true ) { busy_ = b; }
dcdd144598 2011-02-23        kinaba: 	bool isBusy() const { return busy_; }
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: 	ki::dptr<DocImpl> impl_;
dcdd144598 2011-02-23        kinaba: 	bool busy_;
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: private:
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	NOCOPY(Document);
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: //
dcdd144598 2011-02-23        kinaba: //	ドキュメントから発生するイベント(挿入/削除などなど…)を
dcdd144598 2011-02-23        kinaba: //	受け取りたい場合は、このインターフェイスを継承し、適宜ハンドラを
dcdd144598 2011-02-23        kinaba: //	書くこと。Viewの再描画処理などもこれを通じて実行されている。
dcdd144598 2011-02-23        kinaba: //@}
dcdd144598 2011-02-23        kinaba: //=========================================================================
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: class DocEvHandler
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: 	//	@param s        変更範囲の先頭
dcdd144598 2011-02-23        kinaba: 	//	@param e        変更範囲の終端(前)
dcdd144598 2011-02-23        kinaba: 	//	@param e2       変更範囲の終端(後)
dcdd144598 2011-02-23        kinaba: 	//	@param reparsed e2より後ろのコメントアウト状態が変化していたらtrue
dcdd144598 2011-02-23        kinaba: 	//	@param nmlcmd   挿入/削除/置換ならtrue、ファイル開き/全置換ならfalse
dcdd144598 2011-02-23        kinaba: 	//@}
dcdd144598 2011-02-23        kinaba: 	virtual void on_text_update( 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: 	//	キーワードが変更されたときに発生
dcdd144598 2011-02-23        kinaba: 	//@}
dcdd144598 2011-02-23        kinaba: 	virtual void on_keyword_change() {}
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: 	virtual void on_dirtyflag_change( bool dirty ) {}
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: //
dcdd144598 2011-02-23        kinaba: //	ドキュメントは、Command から派生したクラスのインスタンスの
dcdd144598 2011-02-23        kinaba: //	operator() を呼び出すことで、色々な操作を実行する。とりあえず
dcdd144598 2011-02-23        kinaba: //	具体的には Insert/Delete/Replace の3つだけ。あとでマクロコマンド用
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 Command : public ki::Object
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: protected:
dcdd144598 2011-02-23        kinaba: 	friend class UnReDoChain;
dcdd144598 2011-02-23        kinaba: 	friend class MacroCommand;
dcdd144598 2011-02-23        kinaba: 	virtual Command* operator()( Document& doc ) const = 0;
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: //@}
dcdd144598 2011-02-23        kinaba: //=========================================================================
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: class Insert : public Command
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: 	//	@param s 挿入位置
dcdd144598 2011-02-23        kinaba: 	//	@param str 挿入文字列
dcdd144598 2011-02-23        kinaba: 	//	@param len 文字列の長さ
dcdd144598 2011-02-23        kinaba: 	//	@param del コマンド終了時にdelete [] strしてよいか?
dcdd144598 2011-02-23        kinaba: 	//@}
dcdd144598 2011-02-23        kinaba: 	Insert( const DPos& s, const unicode* str, ulong len, bool del=false );
dcdd144598 2011-02-23        kinaba: 	~Insert();
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: private:
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	Command* operator()( Document& doc ) const;
dcdd144598 2011-02-23        kinaba: 	DPos           stt_;
dcdd144598 2011-02-23        kinaba: 	const unicode* buf_;
dcdd144598 2011-02-23        kinaba: 	ulong          len_;
dcdd144598 2011-02-23        kinaba: 	bool           del_;
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: //@}
dcdd144598 2011-02-23        kinaba: //=========================================================================
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: class Delete : public Command
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: 	//	@param s 開始位置
dcdd144598 2011-02-23        kinaba: 	//	@param e 終端位置
dcdd144598 2011-02-23        kinaba: 	//@}
dcdd144598 2011-02-23        kinaba: 	Delete( const DPos& s, const DPos& e );
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: private:
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	Command* operator()( Document& doc ) const;
dcdd144598 2011-02-23        kinaba: 	DPos stt_;
dcdd144598 2011-02-23        kinaba: 	DPos end_;
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: //	置換コマンド
dcdd144598 2011-02-23        kinaba: //@}
dcdd144598 2011-02-23        kinaba: //=========================================================================
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: class Replace : public Command
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: 	//	@param s 開始位置
dcdd144598 2011-02-23        kinaba: 	//	@param e 終端位置
dcdd144598 2011-02-23        kinaba: 	//	@param str 挿入文字列
dcdd144598 2011-02-23        kinaba: 	//	@param len 文字列の長さ
dcdd144598 2011-02-23        kinaba: 	//	@param del コマンド終了時にdelete [] strしてよいか?
dcdd144598 2011-02-23        kinaba: 	//@}
dcdd144598 2011-02-23        kinaba: 	Replace( const DPos& s, const DPos& e,
dcdd144598 2011-02-23        kinaba: 		const unicode* str, ulong len, bool del=false );
dcdd144598 2011-02-23        kinaba: 	~Replace();
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: private:
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	Command* operator()( Document& doc ) const;
dcdd144598 2011-02-23        kinaba: 	DPos           stt_;
dcdd144598 2011-02-23        kinaba: 	DPos           end_;
dcdd144598 2011-02-23        kinaba: 	const unicode* buf_;
dcdd144598 2011-02-23        kinaba: 	ulong          len_;
dcdd144598 2011-02-23        kinaba: 	bool           del_;
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: //
dcdd144598 2011-02-23        kinaba: //	複数のコマンドを一つのコマンドとして連続実行する。
dcdd144598 2011-02-23        kinaba: //	ただし、Insert/Delete/Replaceを一回行うたびに当然
dcdd144598 2011-02-23        kinaba: //	文字列の位置は変化するのだが、それに関する変換処理は
dcdd144598 2011-02-23        kinaba: //	行わない。すなわち、Insert->Delete->Insert みたいな
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: class MacroCommand : public Command
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: public:
dcdd144598 2011-02-23        kinaba: 	//@{ コマンドの追加 //@}
dcdd144598 2011-02-23        kinaba: 	void Add( Command* cmd ) { arr_.Add(cmd); }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	//@{ コマンド数 //@}
dcdd144598 2011-02-23        kinaba: 	ulong size() const { return arr_.size(); }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	//@ デストラクタ //@}
dcdd144598 2011-02-23        kinaba: 	~MacroCommand()
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		for( ulong i=0,e=arr_.size(); i<e; ++i )
dcdd144598 2011-02-23        kinaba: 			delete arr_[i];
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: private:
dcdd144598 2011-02-23        kinaba: 	Command* operator()( Document& doc ) const;
dcdd144598 2011-02-23        kinaba: 	ki::storage<Command*> arr_;
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::document
dcdd144598 2011-02-23        kinaba: #endif // _EDITWING_DOC_H_