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

#if !defined( PLUGIN_H_INCLUDED_ )
#define PLUGIN_H_INCLUDED_

#include "TaEdit_std.h"
#include "conf/confman.h"
#include "WorkMemoryMgr.h"
#include <Xm/XmAll.h>

class CTaEditDraw;

class CPlugin
{
	typedef struct tagPLUGININFO {
		wstring SectionName;
		bool IsSeparator;
		string PluginName;
		string LibraryName;
		string FunctionName;
		string MenuLabel;
		Widget wgtMenuBtn;	// メニューのウィジット
	} PLUGIN_INFO;
public:
	CPlugin();
	~CPlugin();

	// プラグインを設定
	CErrorBool ConfigurePlugin( const string& rConfigFile, Widget wgtCascade, Widget wgtPullDown, CTaEditDraw *argpView );

	// カーソル位置の取得
	const T_CurPos& GetCurPos() const;

	// 選択範囲の取得
	const T_SelRange& GetSelRange() const;

	// カーソル位置と選択範囲の設定
	bool SetCurPos_SelRange( const T_CurPos &rCurPos, const T_SelRange& rSelRange );

	// 文字列の置換
	bool Replace( const T_SelRange &rRange, const wchar_t *pStr );

	// 現在実行中のプラグインの設定情報を取得する
	const wchar_t* GetCurPluginConfig( const wchar_t *pName ) const;

	// 拡張情報を設定する
	bool SetExtendInfo( unsigned long Line, int idx, bool flg );

	// 現在実行しているプラグインを識別するIDを取得
	const wchar_t* GetPluginID() const;

	// 作業用メモリ管理オブジェクトを取得する
	CWorkMemoryMgr& GetWorkMemoryMgr();

	// テキスト編集フラグをクリアする
	void ClearModifiedFlg();

private:
	// プラグインの情報を読み込む
	CErrorBool ReadPluginInfo( const string &rConfigFile );
	// 読み込んだプラグインの情報の正当性を確認する
	void CheckPluginInfo();
	// 名前に使用されている文字の正当性を確認
	bool CheckNameStr( const string& r ) const;

	// メニューを構築する
	CErrorBool CreateMenu( Widget wgtCascade, Widget wgtPullDown );

	// メニューが押下されたときのコールバック
	static void PluginMenuCallback( Widget wgt, XtPointer client_data, XtPointer call_data );

	// メニューが選択された時のイベント
	void OnMenu( Widget wgt );
	
	// プラグインの関数を呼び出す
	void CallPlugin( const string &rLibraryName, const string &rFunctionName );

protected:
	vector< PLUGIN_INFO > vPluginInfo;
	CONFMAN pPluginConf;
	const PLUGIN_INFO* pCurPlugin;
	bool Modified;		// プラグイン実行中にテキストを変更したか否か
	CWorkMemoryMgr m_WorkMemoryMgr;	// 作業用メモリ管理オブジェクト
	CTaEditDraw *pView;
};

#endif // PLUGIN_H_INCLUDED_

