////////////////////////////////////////////////////////////////////////////
// CTaEditDoc クラスのインタフェース宣言
//
////////////////////////////////////////////////////////////////////////////

#if !defined( TAEDITDOC_H_INCLUDED_ )
#define TAEDITDOC_H_INCLUDED_

#include <Xm/XmAll.h>

#include "TaEdit_std.h"
#include "LineData.h"
#include "UndoListMgr.h"
#include "EditCommand.h"
#include "lang/TxtColorMgr.h"


using namespace NLangExt;

class CTaEditDoc
{
public:
	CTaEditDoc();
	~CTaEditDoc();

	// ファイルを読み込む
	CErrorBool OnOpenDocument( const string &argFileName, bool *pIsChanged, enumLANGTYPE LangType );

	// ファイルの保存
	CErrorBool OnSaveDocument( const string &argFileName, bool *pColChanged );

	// ファイル名の参照
	const string& GetFileName() const;

	// 初期化
	void Initialize();

	// 文字列の挿入
	CErrorBool Insert( const wstring& rStr, const T_CurPos &rCurPos, const T_SelRange &rSelRange, T_CurPos *pResultCurPos );

	// 特殊記号の挿入
	CErrorBool InsertSpecialCode( KeySym argKeySym, const T_CurPos &rCurPos, const T_SelRange &rSelRange, T_CurPos *pResultCurPos );

	// 複数行へのTABの挿入
	CErrorBool MultiLineTabInsert( const T_SelRange &rSelRange, T_CurPos *pResultCurPos, T_SelRange *pResultSelRange );

	// 複数行のTABの削除
	CErrorBool MultiLineTabDelete( const T_SelRange &rSelRange, T_CurPos *pResultCurPos, T_SelRange *pResultSelRange );

	// 編集の終了
	void EndEdit();

	// 拡張情報の設定
	CErrorBool SetExtendInfo( size_t Line, int idx, bool flg );

	const T_LineData& RefData() const;

	// 更新フラグを取得
	bool GetIsModify() const;

	// アンドゥ可能か否か
	bool EnableUndo() const;

	// リドゥ可能か否か
	bool EnableRedo() const;

	// アンドゥ
	void Undo( T_SelRange *pAfterUndoSelRange, T_CurPos *pAfterUndoCurPos );

	// リドゥ
	void Redo( T_SelRange *pAfterRedoSelRange, T_CurPos *pAfterRedoCurPos );

	// 指定した範囲の文字列を取得
	void GetRangeStr( const T_SelRange &range, wstring *pStr );

	// 言語依存情報オブジェクトを取得
	const NLangExt::CTxtColorMgr* GetTxtColorMgr() const;

	// 言語情報オブジェクトを設定
	bool SetTxtColorMgr( enumLANGTYPE type );

	// 排他的な編集に備えた、特殊な複製
	CTaEditDoc* CopyForExclusiveEditing();

	// 排他的な編集の結果を反映する
	void ReflectionExclusiveEditing( CTaEditDoc *pDoc );
	
protected:

	// 指定した位置に存在する、指定した文字列を削除する
	CErrorBool DelSpecifiedStr( T_CurPos pos, const wstring &rStr );

	// 指定した位置に指定した文字列（改行コードを含む）を追加する
	void InsertSpecifiedStr( T_CurPos pos, const wstring &rStr );

	// 指定した範囲を削除し、編集コマンドオブジェクトを構築する
	CErrorBool Delete_WithCreateEC( T_SelRange DelRange, T_CurPos BeforeCurPos );

	// 改行
	void AddCR( T_CurPos pos );

	// 自動インデントによる調整
	int ExecAutoIndent( int line );

	// 文字列の削除
	CErrorBool Delete( const T_SelRange &rRange );

	// 編集コマンドオブジェクトを生成
	VClsPtr< CEditCommand > CreateEditCommandObj( enumTEC_TYPE argType );

	// ファイルの状態を確認する
	CErrorBool CheckFileStatus( const string &rFileName, bool Exist );

	// 言語依存情報オブジェクトを更新する
	bool UpdateTextColorMgr();

	// 更新フラグを設定する
	void SetModifyFlg( bool flg );

protected:
	// 文字列を保持する
	T_LineData vecLine;

	// ファイル名
	string FileName;

	// 最後に保存されてから変更されたか否か
	bool IsModify;

	// Undoリスト管理オブジェクト
	CUndoListMgr UndoListMgr;

	// 言語依存情報オブジェクト
	NLangExt::CTxtColorMgr *pTxtColorMgr;
};

#endif // TAEDITDOC_H_INCLUDED_

