/*-----------------------------------------------------------------------------
[名称]	ShitarabianDoc.h
[概要]	ドキュメントクラスのヘッダ
[備考]	なし
[履歴]	2003-03-11	NC		コメント付加	(moralog)
		2003-10-24	b031031 (3199)修正		(dincom)
-----------------------------------------------------------------------------*/
#if !defined(AFX_SHITARABIANDOC_H_INCLUDED_)
#define AFX_SHITARABIANDOC_H_INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


//-----------------------------------------------------------------------------
// インクルード・不完全定義
//-----------------------------------------------------------------------------
#include <afxtempl.h>
#include "DocumentIF.h"
#include "EmphasisLine.h"
class CSelection;
class CBoxSelection;
class CFloatingSelection;
class CShitarabianView;
class CROISelection;


/*-----------------------------------------------------------------------------
[名称]	操作モード種別
[用途]	操作モードの列挙。
[備考]	なし
-----------------------------------------------------------------------------*/
enum	EOperationMode
{
	OperationNormal = 0,		// 通常編集
	OperationBoxSelect = 1,		// BOX選択
	OperationFloating = 2,		// フローティング
	OperationROI = 3,			// ROI選択
};


//-----------------------------------------------------------------------------
// 定数
//-----------------------------------------------------------------------------
// 表示更新範囲用
const	InitialRow = -1;		// 対象範囲なし
const	AllRow = INT_MAX;		// すべて対象



/*-----------------------------------------------------------------------------
[名称]	トークンリーダ
[用途]	文字列→トークン変換にまつわる処理のカプセル。
[備考]	空白文字設定を反映する。
-----------------------------------------------------------------------------*/
class CShitarabianDoc : public CDocument
{
protected: // シリアライズ機能のみから作成します。
	// 生成
	CShitarabianDoc();
	DECLARE_DYNCREATE(CShitarabianDoc)

// アトリビュート
public:
// メインビュー
	// メインビュー設定
	void	SetMainView( CShitarabianView* pView ){ m_pviewMain = pView; };
	// メインビュー取得
	CShitarabianView*	GetMainView();

// オペレーション
public:

//オーバーライド
	// ClassWizard は仮想関数のオーバーライドを生成します。
	//{{AFX_VIRTUAL(CShitarabianDoc)
	public:
	virtual BOOL OnNewDocument();
	virtual void Serialize(CArchive& ar);
	virtual BOOL OnOpenDocument(LPCTSTR lpszPathName);
	virtual void SetTitle(LPCTSTR lpszTitle);
	//}}AFX_VIRTUAL

// インプリメンテーション
public:
	// 破棄
	virtual ~CShitarabianDoc();

	// デバッグ用の何か
#ifdef _DEBUG
	virtual void AssertValid() const;
	virtual void Dump(CDumpContext& dc) const;
#endif

public:
// 定数
	// 改行文字取得
	static char* ReturnChar()
	{
		static char	aCR[] = { 0x0D, 0x0A, 0x00 };
		return( aCR );
	}

// 文書情報
	// 総行数取得
	int		GetLineCount(){ return( m_lststrEditz.GetCount() ); }
	// 指定行の文字列取得
	CString*	GetLine( long idxRow );
	// 指定行の色つき文字列取得
	CEmphasisLine*	GetEmphasisLine( long idxRow );
	// 行位置取得
	POSITION	GetPosition( long idxRow );

// 表示更新範囲
	// 表示全更新要求
	void	SetAllUpdate(){ SetUpdateStartRow( 0 ); SetUpdateEndRow( AllRow ); };
	// 表示更新開始行設定
	void	SetUpdateStartRow( long idxUpdateStartRow );
	// 表示更新終了行設定
	void	SetUpdateEndRow( long idxUpdateEndRow );
	// 表示更新開始行取得
	long	GetUpdateStartRow(){ return( m_idxUpdateStartRow ); };
	// 表示更新終了行取得
	long	GetUpdateEndRow(){ return( m_idxUpdateEndRow ); };

// 行マーク
	// マーク行数取得
	long	GetMarkCount(){ return( m_nMark ); };
	// マークトグル
	void	Mark( int idxLine ); 
	// マーク設定
	void	SetMark( long idxRow, BOOL bMark );
	// マーク行判定
	BOOL	IsMark( long idxRow );
	// マーク全解除
	void	DeMark();
	// 前のマーク行へ
	void	PrevMark();
	// 後のマーク行へ
	void	NextMark();

// 更新情報
	// 更新状態取得
	BOOL	IsModify( long idxRow );
	// 前の更新行へ
	void	PrevModify();
	// 次の更新行へ
	void	NextModify();

// 文書編集
	// 行削除
	BOOL	DeleteLine( long idxRow );
	// 行群削除
	BOOL	DeleteLinez(
		long		idxStartRow,
		long		nRow
	);
	// 行群挿入
	BOOL	InsertLinez( long idxRow, CStringList& lstAddz );

// キャレット位置情報
	// マルチカラム文字を考慮したキャレットカラム位置の取得
	long MultiColumnSkip(
		long			idxCaretRow,
		long			idxCaretColumn
	);
	// キャレット行位置設定
	void	SetCaretRow( long idxRow ){ m_idxCaretRow = idxRow; };
	// キャレットカラム位置設定
	void	SetCaretColumn( long idxColumn ){ m_idxCaretColumn = idxColumn; };
	// キャレット行位置取得
	long	GetCaretRow(){ return( m_idxCaretRow); };
	// キャレットカラム位置取得
	long	GetCaretColumn(){ return( m_idxCaretColumn); };

// フリーカーソル用処理
	// 行の拡張
	void AppendRow(
		long		idxRow
	);
	// カラムの拡張
	void AppendColumn(
		long		idxRow,
		long		lXColummn
	);

// 選択情報
	// 操作中選択情報取得
	CSelection*			GetSelection();
	// 通常選択情報取得
	CSelection*			GetNormalSelection();
	// BOX選択情報取得
	CBoxSelection*		GetBoxSelection();
	// フローティング情報取得
	CFloatingSelection*	GetFloatingSelection();
	// ROI選択情報取得
	CROISelection*		GetROISelection();
	// 選択範囲の削除
	void				SelectedDelete();

// 操作モード
	// 操作モード設定
	void			SetOperationMode( EOperationMode eMode ){ m_eMode = eMode; };
	// 操作モード取得
	EOperationMode	GetOperationMode(){ return( m_eMode ); };
	// 上書きモード取得
	BOOL	IsOverwriteMode(){ return(m_bOverwrite); };
	// 上書きモード設定
	void	OverwriteMode( BOOL bOverwrite ){ m_bOverwrite = bOverwrite; };

// 表示色
	// 表示色情報全初期化
	void ReflectEmphasis();
	// 表示色解析詳細結果初期化
	void UpdateEmphasis();
	// 複数行強調表示限定解析
	BOOL AnalizeMultiLineEmphasis(
		CEmphasisDefine*	pEmphasisDefine,
		int					iRow
	);
	// 指定範囲行の表示色解析（プログレスバーあり）
	void AnalizeEmphasisLinez(
		const long	idxStart,
		const long	idxEnd
	);
	// 指定行群の表示色解析（プログレスバーあり）
	void AnalizeEmphasisLinez(
		const CDWordArray& adwLinez
	);

// そのた
	// 描画
	void ReDraw(
		CShitarabianView*	pView = NULL
	);

	// プラグイン用インタフェース取得
	CDocumentIF*	GetInterface(){ return( &m_Interface ); };

	// 保存
	void Write(CArchive& ar);

	// バックアップ必要有無
	BOOL	IsNeedBackUp(){ return(m_bNeedBackUp); };
	void	NeedBackUp( BOOL bNeed ){ m_bNeedBackUp = bNeed; };

	// ▼ (3199) BGN 2003.10.24 (dincom) 共有ファイルを強引に開く
	BOOL	OnOpenDocumentCore(LPCTSTR lpszPathName);
	// ▲ (3199) END


protected:
	// 行インデクスの構築
	void	PrepareIndex();

	// 行挿入
	BOOL	InsertLine(
		POSITION	pos,
		CString&	strAdd
	);

protected:
	CList<CEmphasisLine,CEmphasisLine&>	m_lststrEditz;
										// 編集中文書 [-] (-)
	long		m_idxUpdateStartRow;	// 表示更新開始行 [-] (-)
	long		m_idxUpdateEndRow;		// 表示更新終了行 [-] (-)
	long		m_nMark;				// マーク行数 [-] (-)
	CShitarabianView*	m_pviewMain;	// メインビュー [-] (-)
	long		m_idxCaretRow;			// キャレット位置 [行] (-)
	long		m_idxCaretColumn;		// キャレット位置 [列] (-)
	EOperationMode		m_eMode;		// 操作モード [-] (-)
	BOOL		m_bOverwrite;			// 上書きモード [-] (TRUE:上書き、FALSE:挿入)
	POSITION*	m_paIndex;				//
	BOOL		m_bModified;			// 行情報更新状態 [-] (TRUE:更新、FALSE:未更新)
	CDocumentIF	m_Interface;			// ﾌﾟﾗｸﾞｲﾝ用インタフェース
	BOOL		m_bNeedBackUp;			// バックアップ必要有無 [-] (TRUE:更新されたので必要、FALSE:更新されてないので不必要)

// 生成されたメッセージ マップ関数
protected:
	//{{AFX_MSG(CShitarabianDoc)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};


/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ は前行の直前に追加の宣言を挿入します。

#endif // !defined(AFX_SHITARABIANDOC_H_INCLUDED_)
