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

#if !defined( TAEDITSHELL_H_INCLUDED_ )
#define TAEDITSHELL_H_INCLUDED_

#include <Xm/XmAll.h>

#include "TaEdit_std.h"

#include "output/gui.h"
#include "TaEditDoc.h"
#include "TaEditFileSelDlg.h"
#include "TaEditFindDlg.h"
#include "ConfigInfo.h"
#include "TextEdit.h"
#include "CmdOption.h"
#include "lang/LangConfig.h"
#include "Plugin.h"
#include "MsgBox.h"
#include "CompoundStr.h"

class CConsruction;

class CTaEditShell :
	public CAppShell
{
public:
	CTaEditShell();
	~CTaEditShell();

	// 構築されるとき呼ばれる
	void create (Display *display, char *app_name, int app_argc, char **app_argv, char *app_class_name = NULL);

	// 構築
	void OnCreate( Widget argWgt, XtPointer client_data );

	// 初めて画面に表示されるとき呼ばれる
	void OnFirstExpose();

	// メニューのイベント
	void OnWriteFile( Widget argWgt, XtPointer client_data );	// 名前を付けて保存
	void OnSaveFile( Widget argWgt, XtPointer client_data );	// 上書き保存
	void OnOpenFile( Widget argWgt, XtPointer client_data );	// 開く
	void OnNewFile( Widget argWgt, XtPointer client_data );		// 新規作成
	void SetFileTypeTXT( Widget argWgt, XtPointer client_data );	// Textモードに変更
	void SetFileTypeCPP( Widget argWgt, XtPointer client_data );	// C/C++モードに変更
	void SetFileTypeJAVA( Widget argWgt, XtPointer client_data );	// Javaモードに変更
	void SetFileTypeCBL( Widget argWgt, XtPointer client_data );	// COBOLモードに変更
	void SetFileTypeVBS( Widget argWgt, XtPointer client_data );	// VBScriptモードに変更
	void SetFileTypeJS( Widget argWgt, XtPointer client_data );	// JavaScriptモードに変更
	void SetFileTypeCS( Widget argWgt, XtPointer client_data );	// C#モードに変更
	void OnConstruction( Widget argWgt, XtPointer client_data );	// コンストラクションモードに変更
	void OnStandalone( Widget argWgt, XtPointer client_data );		// スタンドアロンモードに変更
	void OnCloseAppMenu( Widget argWgt, XtPointer client_data );	// 終了

	void OnEditMenuShow( Widget argWgt, XtPointer client_data );	// 編集メニューが表示される
	void OnEditRedo( Widget argWgt, XtPointer client_data );	// リドゥメニュー
	void OnEditUndo( Widget argWgt, XtPointer client_data );	// アンドゥメニュー
	void OnEditCut( Widget argWgt, XtPointer client_data );		// 切り取りメニュー
	void OnEditCopy( Widget argWgt, XtPointer client_data );	// コピーメニュー
	void OnEditPaste( Widget argWgt, XtPointer client_data );	// 張り付けメニュー
	void OnEditFullSelect( Widget argWgt, XtPointer client_data );	// 全て選択メニュー
	void OnEditFind( Widget argWgt, XtPointer client_data );	// 検索・置換メニュー
	void OnEditMoveto( Widget argWgt, XtPointer client_data );	// 指定行へ移動

	// ウインドウが閉じられる
	void OnClose( Widget argWgt, XtPointer client_data );

	// メッセージボックスを表示する
	void ShowInformationMsgBox( const CCompoundStr &rStr ) const;
	int ShowQuestionMsgBox( const CCompoundStr &rStr, bool ShowCancel ) const;
	void ShowErrorMsgBox( const CCompoundStr &rStr ) const;

	// ドキュメントオブジェクトの参照
	CTaEditDoc *GetDocument();

	// 設定情報オブジェクトの参照
	VClsPtr< CConfigInfo > GetConfigInfo();

	// コマンド行オプションオブジェクトの参照
	const CCmdOption& GetCmdOption() const;

	// 編集オブジェクトを取得
	VClsPtr< CTextEdit > GetTextEditor();

	// 指定したファイルを開く
	bool OpenFile( const string &rFileName, enumLANGTYPE LangType = LANGTYPE_NAN );

	// ファイルの上書き保存の処理
	bool SaveFileProcedure();

	// ファイルに名前を付けて保存する処理
	bool WriteFileProcedure();

	// コピー・切り取りメニューの有効・無効を設定する
	void SetEnableCopyPasteMenu( bool flg ) const;

	// Undoメニューの有効・無効を設定する
	void SetEnableUndoMenu( bool flg ) const;

	// Redoメニューの有効・無効を設定する
	void SetEnableRedoMenu( bool flg ) const;

	// コピー・切り取りメニューの有効・無効を取得する
	bool GetEnableCopyPasteMenu() const;

	// Undoメニューの有効・無効を取得する
	bool GetEnableUndoMenu() const;

	// Redoメニューの有効・無効を取得する
	bool GetEnableRedoMenu() const;

	// 必要に応じてエラーメッセージを表示する
	bool ProcErrorMsg( CErrorBool r ) const;

	// 言語別情報オブジェクトを取得
	const NLangExt::CLangConfig* GetLangConfig() const;

	// プラグイン管理オブジェクトを参照
	CPlugin& RefPluginMgr();

	// ドラッグアンドドロップされたファイルを開く
	void OpenDnDFiles( int cnt, char **pFileName );

	// 新しいウインドウでファイルを開く
	bool OpenFileInNewWindow( const char *pfile, int Line );

	// ウインドウにフォーカスを設定する
	void RaiseWindow() const
	{
		Display *pDisplay = XtDisplay( m_TaEditShell );
		Window window = XtWindow( m_TaEditShell );
		XMapWindow( pDisplay, window );
		XmUpdateDisplay( m_TaEditShell );
		XSetInputFocus( pDisplay, window, RevertToParent, CurrentTime );
	}

	// カーソル用タイマを遅延させる
	void DelayCursorTimer();

	// タイトルを設定し直す
	void ResetTitle() const;

	// 指定した行番号へ移動
	void MoveTo( int Line );

	// コンストラクション・モードか否か
	bool IsConstructionMode() const;

	// スタンドアロン・モードにする
	CErrorBool SetStandaloneMode();

	// コンストラクション・モードにする
	CErrorBool SetConstructionMode();

private:
	// タイマイベントのエントリ用関数
	static void OnTimer( XtPointer client_data, XtIntervalId *timer );

	// タイマイベント
	void OnTimer();

	// 自動保存用のタイマのエントリ
	static void OnAutoSaveTimer( XtPointer client_data, XtIntervalId *timer );

	// 自動保存用のタイマイベント
	void OnAutoSaveTimer();

protected:

	// ウインドウのタイトルを設定
	void SetWindowTitle( const string &Title ) const;

	// ファイルのパス名からファイル名のみを抽出
	string GetFileNameFromFullPathName( const string& FullPathName ) const;

	// ファイルを保存する必要があるか否か確認する
	bool MakeSure_FileSave();

	// ファイルの読み込み、クローズ、書き込みの時のコマンドを実行
	bool RunFileReadScript( const string& rFileName ) const;
	bool RunFileAfterReadScript( const string& rFileName ) const;
	bool RunFileCloseScript() const;
	bool RunFileBeforeWriteScript( const string& NewFileName ) const;
	bool RunFileWriteScript( const string& OldFileName ) const;

	// プロセスを終了させる
	void ExitProcess( int r );

	// コンストラクション／スタンドアロンモードのメニューを設定する
	void SetCSModeMenu() const;

protected:
	// ドキュメントオブジェクト
	CTaEditDoc theDocument;

	// メッセージボックス管理オブジェクト
	CMsgBox MsgBoxMgr;

	// 設定情報
	VClsPtr< CConfigInfo > pConfigInfo;

	// コマンドのオプション
	CCmdOption m_CmdOption;

	// 言語別の情報オブジェクト
	NLangExt::CLangConfig *pLangConfig;

	// プラグイン管理オブジェクト
	CPlugin m_Plugin;

	// アイコン用ピックスマップ
	Pixmap IconPixmap;

	// カーソル用タイマーのID
	XtIntervalId CursorTimerID;

	// サーバ通信オブジェクト
	CConsruction *pConstruction;
};

#endif // TAEDITSHELL_H_INCLUDED_

