// MainStatusBar.cpp :
// ステータスバーに送られるメッセージを横取り

#include "stdafx.h"
#include "RNSF7.h"
#include "MainWindow.h"
#include "MainNavigator.h"
#include "MainListview.h"
#include "commfunc.h"

static WNDPROC OrgStatusBarProc;
static 

// ステータスバーに送られるメッセージを横取り
LRESULT CALLBACK NewStatusBarProc(HWND hWnd, UINT mes, WPARAM wParam, LPARAM lParam)
{
	switch (mes) {
		case WM_MOUSEMOVE:
			MoveMouseOnNavigator( GetParent(hWnd), -1, -1 );
			break;
	}

	return (CallWindowProc(OrgStatusBarProc, hWnd, mes, wParam, lParam));
}

// ステータスバーの生成
HWND createStatusBar( HWND hWnd )
{
	HWND hStatusBar;

	hStatusBar = CreateStatusWindow(WS_CHILD | WS_VISIBLE | (ccpu32_GetComCtl32Ver()>=471?SBT_TOOLTIPS:0), "起動しています...", hWnd, ID_STATUSBAR);

	OrgStatusBarProc = (WNDPROC)GetWindowLongPtr(hStatusBar, GWLP_WNDPROC);
	SetWindowLongPtr(hStatusBar, GWLP_WNDPROC, (LONG_PTR)NewStatusBarProc); // メッセージを受け取るためのフック

	

	if (GetTickCount()%7 == 0) {
		int aWidths[2] = {500, -1};

		SendMessage(hStatusBar, SB_SETPARTS, (WPARAM)2, (LPARAM)aWidths);
		SendMessage(hStatusBar, SB_SETTEXT, (WPARAM)(SBT_POPOUT | 1), (LPARAM)"｢ﾍﾙﾌﾟ｣ﾒﾆｭｰの｢ﾌｨｰﾄﾞﾊﾞｯｸ｣から連絡･感想･改善要望･現状維持要望等お待ちしています｡");
		SendMessage(hStatusBar, SB_SETICON, (WPARAM)1, (LPARAM)hIconMail);
		SendMessage(hStatusBar, SB_SETTIPTEXT, (WPARAM)1, (LPARAM)"｢ﾍﾙﾌﾟ｣ﾒﾆｭｰの｢ﾌｨｰﾄﾞﾊﾞｯｸ｣から連絡･感想･改善要望･現状維持要望等お待ちしています｡");
	}

	return hStatusBar;
}

// ステータスバーに文字列を表示する
LRESULT setStatusBarText( const char *text, short level )
{
	static char *lasttext;

	if ( text == NULL ) { // textがNULLだったら、何もしなくても表示されるときの文字列を設定
		int sel_n = GetLVCursor( hMainListView );
		if ( sel_n < 0 || wLVStyle == 0 ) { // リストビューにカーソルが置かれていないか、表示スタイルが「詳細」である
			text = bCategory?"左のｶﾃｺﾞﾘ一覧から分類名を選択し､右の一覧から編集したい項目を開きます｡ｷｰﾜｰﾄﾞ検索(Ctrl+K)による絞込みもできます｡":
				             "設定を編集したい項目を開いて下さい。キーワード検索(Ctrl+K)による絞り込みもできます。";
		}
		else {
			text = mlvi[(int)lvGetLParam(hMainListView, sel_n)].info;
		}
	}

	{ //if ( ccpu32_GetComCtl32Ver() >= 471 ) {
		SendMessage(hStatusBar, SB_SETTIPTEXT, 0, (LPARAM)text);
	}

	if ( lasttext ) {
		if ( 0 == strcmp( lasttext, text ) ) { // 直前に表示したテキストと、今回表示しようとしたテキストが同じだったら何もしない
			return 0;
		}
		safefree( lasttext );
	}
    
	lasttext = _strdup( text );
	return SendMessage(hStatusBar, SB_SETTEXT, level==1?SBT_NOBORDERS:level==2?SBT_POPOUT:0, (LPARAM)text);
}

// ステータスバーに、メニュー項目のヘルプのための文字列を表示する
bool setStatusBarHelp( UINT uItem )
{
	const char *ptext = NULL;

	switch( uItem ) {
		case ID_SETTINGS_OPEN:
			ptext = "現在選択されている設定項目を編集します。";
			break;

		case ID_SETTINGS_FILEOPEN:
			ptext = "スクリプトファイルを選択して編集ダイアログを開くか、ダイアログ状態定義ファイルを選択して即時適用します。";
			break;

		case ID_SETTINGS_SETTING:
			ptext = SOFTWARENAME"自身の設定を編集します。Rnsf7.rscが必要です。";
			break;

		case ID_SETTINGS_HISTORY:
			ptext = SOFTWARENAME"の編集ダイアログ以外のダイアログの履歴付き入力欄の履歴を編集します。R7hist.rscが必要です。";
			break;

		case IDSAVE:
			ptext = "複数の機能項目のダイアログ状態を一括して指定フォルダへ保存します。";
			break;

		case IDLOAD:
			ptext = "複数の機能項目のダイアログ状態を一括して指定フォルダから読み出します。";
			break;

		case ID_SETTINGS_OPENDIR:
			ptext = "スクリプト一覧の捜索が行われるフォルダ(Rnsf7.exeのあるフォルダ)を開きます。";
			break;

		case ID_SETTINGS_REBOOTWINDOWS:
			ptext = (((isNT || winver >= 490) && rnsf7RegRead("QReboot", 0))?"現在のユーザーをログオフします。設定が有効にならない場合に利用して下さい。":"Windowsを再起動します。設定が有効にならないときなどに使用して下さい。");
			break;

		case ID_SETTINGS_REFRESH:
			ptext = "アイコンの大きさを一瞬だけ変更して、シェルに表示上の更新を促します。";
			break;

		case ID_SETTINGS_NOTIFY:
			ptext = "他のタスクにWM_SETTINGSCHANGEメッセージをブロードキャストします。";
			break;

		case SC_CLOSE:
		case IDM_SETTINGS_EXIT:
			ptext = SOFTWARENAME"を終了します。";
			break;

		case IDC_CONTROLPANEL:
			ptext = "Windowsの一般的な設定を変更できます。";
			break;

		case ID_TOOLS_REGEDIT:
			ptext = "レジストリを直接編集します。";
			break;

		case ID_TOOLS_KEYREGEDIT:
			ptext = "レジストリキーを指定して、レジストリ エディタを開きます。";
			break;

		case ID_TOOLS_SYSEDIT:
			ptext = "システム エディタを起動し、Autoexec.bat, Config.sys, Win.ini, System.ini等を直接編集します。";
			break;

		case ID_TOOLS_MSCONFIG:
			ptext = "システム構成ユーティリティ(Msconfig)を起動します。スタートアップ、サービス等を抑制できます。";
			break;

		case ID_TOOLS_WIN7GM:
			ptext = "Windowsの管理機能を集約した「GodMode」を呼び出します。";
			break;

		case ID_TOOLS_BACKUPREGISTRY:
			ptext = "レジストリバックアップツールを呼び出します。";
			break;

		case ID_TOOLS_RESTOREREGISTRY:
			ptext = "可能なら、以前にとったレジストリのバックアップを復元するツールを呼び出します(または、レジストリ復元の手順を示します)。";
			break;

		case ID_TOOLS_SYSTEMRESTORE:
			ptext = "「システムの復元」を呼び出し、現時点の重要ファイルのバックアップを作成したり、復元したりします。";
			break;

		case ID_TOOLS_MAKERPXP:
			ptext = "「"SOFTWARENAME"」という名称の復元ポイントを作成します。";
			break;

		case ID_TOOLS_OPTIMIZEREGISTRY:
			ptext = "レジストリの修復を行います(または、レジストリ修復手順を示します)。";
			break;

		case ID_TOOLS_LOGOFF:
			ptext = "現在のユーザーからログオフまたはサインアウトします。設定が有効にならない場合などに使用します。";
			break;

		case ID_TOOLS_REBOOT:
			ptext = "Windowsを再起動します。設定が有効にならない場合などに利用します。";
			break;

		case ID_TOOLS_FORCEREBOOT:
			ptext = "通常の再起動がうまくいかない場合に、強制オプション付きで再起動を行います。";
			break;

		case ID_TOOLS_SHUTDOWN:
			ptext = "Windowsを終了します。";
			break;

		case IDM_HELP_HELP:
			ptext = "ヘルプを開きます。Rnsf7.chmが必要です。";
			break;

		case IDHELP_RSCRIPT:
			ptext = "R-Script("SOFTWARENAME"の各機能項目を構成するスクリプト)に関するヘルプを開きます。Rnsf7.chmが必要です。";
			break;

		case IDHELP_DOCLIB:
			ptext = "ドキュメントライブラリ(ヘルプ中の知識・資料編)を開きます。Rnsf7.chmが必要です。";
			break;

		case IDM_FEEDBACK:
			ptext = "作者へ連絡、感想、改善要望あるいは現状維持要望などを気軽に送りたい場合に利用します。インターネット接続が必要です。";
			break;

		case ID_HELP_GOWEBSITE:
			ptext = "INASOFTのWebサイトを開きます。OSに標準設定されたWebブラウザが必要です。";
			break;

		case ID_HELP_UPDATECHECK:
			ptext = "インターネット経由で、最新の「"SOFTWARENAME"」が公開されているかどうかを確認します。";
			break;

		case ID_HELP_UPDATECHECKSET:
			ptext = "インターネット経由の更新確認機能に関する設定を行います。R7update.rscが必要です。";
			break;

		case IDM_HELP_KIFU:
			ptext = "開発支援金の受付について詳細を表示します。";
			break;

		case ID_HELP_CCPU:
			ptext = "ご利用中の環境に関する情報(CCPU)を表示します。作者に障害報告や質問を出す際にご利用下さい。";
			break;

		case IDM_HELP_ABOUT:
			ptext = "このプログラムに関する情報・著作権情報・注意事項などを表示します。";
			break;

		case ICO_LARGE:
			ptext = "各編集項目を大きいアイコンと名前だけで表示します。";
			break;
		case ICO_SMALL:
			ptext = "各編集項目を小さいアイコンと名前だけで表示します。";
			break;
		case ICO_LIST:
			ptext = "各編集項目の名前だけを一覧表示します。";
			break;
		case ICO_REPORT:
			ptext = "各編集項目の説明を表示します。";
			break;
		case IDM_VIEW_RELOAD:
			ptext = "設定項目の一覧を、カレントフォルダから読み出します。";
			break;

		case IDM_VIEW_ITEM:
			ptext = "ウィンドウ内の項目を、項目名で並べ替えます。";
			break;

		case IDM_VIEW_INFORMATION:
			ptext = "ウィンドウ内の項目を、説明で並べ替えます。";
			break;

		case IDM_VIEW_FILE:
			ptext = "ウィンドウ内の項目を、ファイル名で並べ替えます。";
			break;

		case IDM_VIEW_TIME:
			ptext = "ウィンドウ内の項目を、最終更新日時で並べ替えます。";
			break;

		case IDM_VIEW_SIZE:
			ptext = "ウィンドウ内の項目を、サイズで並べ替えます。";
			break;

		case IDM_VIEW_AUTHOR:
			ptext = "ウィンドウ内の項目を、作者名で並べ替えます。";
			break;

		case IDM_VIEW_AUTOCOLUMN:
			ptext = "詳細表示のカラム幅を、各カラムの項目の最大の長さで自動的に調整します。";
			break;

		case IDM_VIEW_FIRSTITEMFILE:
			ptext = "詳細表示の第1項目(他の表示方法では表示される項目そのもの)をファイル名にします。";
			break;

		case IDM_VIEW_GROUPVIEW:
			ptext = "カテゴリでグループ分けして表示します。";
			break;

		case IDM_VIEW_LISTBOX:
			ptext = "機能項目をカテゴリに分類して表示します。";
			break;

		case IDM_VIEW_NAVIGATOR:
			ptext = "メインウィンドウの左側に、機能項目の説明や操作等を表示します。";
			break;

		case IDM_FIND:
			ptext = "一覧に表示できるすべての機能項目のスクリプトから、文字列を検索します。";
			break;

		case IDM_SEARCH:
			ptext = "全機能項目からキーワード検索を行います。1つ以上の文字列による絞り込みができます。";
			break;

		case IDM_ITEMHELP:
			ptext = "この編集項目のヘルプを表示します。";
			break;

		case ID_ITEMWEB:
			ptext = "この編集項目を公開しているWebサイトを開きます。";
			break;

		case IDM_HELP_RNSF7T:
			ptext = "チュートリアルまたは外部提供のヘルプを開きます。呼び出し可能なファイルの一覧と優先順位は、ヘルプを参照して下さい。";
			break;

		case ID_ITEMEDIT:
			{ REG reg;
				if ( reg.OpenKey( HKEY_CLASSES_ROOT, "rscfile\\shell\\edit\\command" ) ) {
					ptext = "この編集項目のスクリプトを編集します。";
					reg.CloseKey();                            
				}
				else {
					ptext = "メニューの「設定」→「オプション」の「rscファイルを編集するアプリケーション」を設定すると、このメニューが利用可能になります。";
				}
			}							
			break;

		case IDM_VIEWSOURCE:
			ptext = "この編集項目のスクリプトと表示します。Includeで指定されたファイルが後に続いて表示されます。";
			break;

		case IDM_ITEMPROP:
			ptext = "この編集項目に関するプロパティを表示します。";
			break;

		case IDM_FAVORITE_ADD:
			ptext = "現在選択中の機能項目を、お気に入りに加えます。";
			break;

		case IDM_FAVORITE_EDIT:
			ptext = "お気に入りを編集(追加/修正/削除)します。ここでは一覧に表示されない機能項目の追加もできます。R7fav.rscが必要です。";
			break;

		case IDM_CREATESHORTCUT:
			ptext = "デスクトップにこの編集項目を直接開くためのショートカットを作成します。";
			break;

		case SC_SIZE:
			ptext = "ウィンドウのサイズを変更します。";
			break;
		case SC_MAXIMIZE:
			ptext = "ウィンドウを最大化します。";
			break;
		case SC_MINIMIZE:
			ptext = "ウィンドウを最小化してタスクバーの中に入れます。";
			break;
		case SC_RESTORE:
			ptext = "ウィンドウの最大化/最小化を解除し、元のサイズに戻します。";
			break;
		case SC_MOVE:
			ptext = "ウィンドウの位置を変更します。";
			break;

		default:
			{
				UINT i;

				for(i=ID_RECENT_1 ; i<=ID_RECENT_10 ; i++) {
					if ( uItem == i ) {
                        ptext = "最近使った機能項目を呼び出します。";
						break;
					}
				}

				if ( ptext == NULL ) {
					for(i=IDM_FAVORITE_001 ; i<=IDM_FAVORITE_100 ; i++) {
						if ( uItem == i ) {
							ptext = "登録された機能項目を呼び出します。";
							break;
						}
					}
				}
			}
			break;
	}

	if ( ptext ) {
		setStatusBarText( ptext, 1 );
		return false;
	}
	else {
        return true; // サーチアウト
	}
}
