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_