#pragma once

#include "TaskIcon.hpp"

/*!
 * FWatchユーザインターフェイスの最上位ウィンドウ。
 * このウィンドウは通常は不可視であり、タスクバーの通知領域にアイコンを表示し、
 * そこからダイアログを開くために利用されます。
 */
class FWatchUI {
private:
	FWatchUI( const FWatchUI& ); //<! 実装なし
	FWatchUI& operator=(const FWatchUI& ); //<! 実装なし

public:
	/*!
	 * コンストラクタ。
	 */
	FWatchUI();

	/*!
	 * デストラクタ
	 */
	~FWatchUI();

	/*!
	 * 最上位ウィンドウを作成します。
	 * \return 作成できた場合はtrue、そうでなければfalse
	 */
	bool create();

	/*!
	 * 編集ウィンドウを表示します。
	 */
	void showEditDialog();

	/*!
	 * ウィンドウハンドルを取得します。
	 */
	inline HWND getHWnd() const
	{
		return hWnd_;
	}

private:

	/*!
	 * クローズメッセージをハンドルします。
	 * 閉じる場合はDestroyWindowを呼び出す必要があります。
	 */
	void onClose();

	/*!
	 * 破棄メッセージをハンドルします。
	 */
	void onDestroy();

	/*!
	 * タスクバーが再作成された通知をハンドルします。
	 */
	void onTaskbarCreate();

	/*!
	 * ウィンドウが構築された後処理を行います。
	 */
	void onCreate( LPCREATESTRUCT pCreateStruct );

	/*!
	 * コマンドをハンドルします。
	 */
	void onCommand( UINT wmId );

	/*!
	 * 通知領域のアイコンからのマウス操作を処理します。
	 */
	void onTaskIconNotify( WPARAM wParam, LPARAM lParam );

private:

	/*!
	 * ダイアログが開かれていることを示すロックフラグ。
	 */
	bool lockmenu_;

	/*!
	 * タスクバーの通知領域アイコン
	 */
	CTaskIcon* pTskIcon_;

	/*!
	 * このウィンドウのハンドル
	 */
	HWND hWnd_;

private:

	/*!
	 * ウィンドウクラスを登録します。
	 * \param szWindowClass ウィンドウクラス名
	 */
	static ATOM RegisterClass( LPCTSTR szWindowClass );
	
	/*!
	 * ウィンドウプロシージャ
	 * \param hWnd ウィンドウハンドル
	 * \param message メッセージID
	 * \param wParam パラメータ1
	 * \param lParam パラメータ2
	 * \return 結果
	 */
	static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

	/*!
	 * タスクバーの通知領域からのメッセージID
	 */
	static const UINT WM_USER_NOTIFYTASKICON = WM_USER + 100;

	/*!
	 * シェルが再起動したあとで通知するメッセージID
	 */
	static const UINT WM_TASKBARCREATED;

};
