// ItemProp.cpp :
// アイテムのプロパティ

#include "stdafx.h"
#include "RNSF7.h"
#include "MainWindow.h"
#include "refresh.h"
#include "ItemProp.h"
#include "MainListview.h"
#include "commfunc.h"
#include "pre_interprete.h"

static LPMLVI pmlvi;

static const struct DEFTOOLTIP vertooltips[] = {
	{IDC_EDIT_FNAME, "スクリプトファイルのフルパス"}, 
	{IDC_EDIT_ITEM , "この機能項目の名称(Item)"},
	{IDC_EDIT_INFO , "この機能項目の説明(Information)"},
	{IDC_EDIT_ICON , "この機能項目のアイコンのファイル名と番号(Icon)"},
	{IDC_EDIT_HELP , "ヘルプファイルまたはヘルプの表示方法(Help)"},
	{IDC_EDIT_AUTH , "この機能項目の作者名(Author)"},
	{IDC_EDIT_URL  , "この機能項目の制作元のURL(URL)"},
	{IDC_EDIT_CATE , "この機能項目のカテゴリ分類(Category)"},
	{IDC_EDIT_TRY  , SOFTWARENAME"起動時に、メインウィンドウの一覧に並ぶ条件(Try)"},
	{IDC_EDIT_MUST , "定義部のMustDefVarの値"},
	{IDC_EDIT_SIZE , "スクリプトファイルの大きさ(バイト単位)"},
	{IDC_EDIT_FTIME, "このファイルの最終更新日時(タイムスタンプ)"},
	{IDC_EDIT_CTIME, "このファイルが最初に作成された日時"},
	{IDC_EDIT_ATIME, "このファイルが最後にアクセスされた日時"},
	{IDC_EDIT_INC  , "このスクリプトファイルが取り込んでいるサブスクリプトファイルの一覧(Include)"},
	{IDC_EDIT_ATTR , "スクリプトファイルの属性\n(A:アーカイブ、C:圧縮、E:暗号化、H:隠し、O:オフライン、R:読込専用、S:システム、T:一時)"},
	{IDCANCEL,  "このダイアログを閉じます"},
	{0,0}};

// ステータスバーに送られるメッセージを横取り
LRESULT CALLBACK ItemPropProc(HWND hDlg, UINT mes, WPARAM wParam, LPARAM)
{
	switch (mes) {
		case WM_INITDIALOG:
			// 現在は、ダイアログは MS P ゴシックで固定
			// if ( rnsf7RegRead("NoDefFont", 0) == 0 ) {
			//	SetChildWindowFont( hDlg );
			// }
			makeToolTip(hDlg, vertooltips);
			SendDlgItemMessage( hDlg, IDC_STATIC_ICON, STM_SETICON, (WPARAM)(pmlvi->hicon      ? pmlvi->hicon      :
	                                                                         pmlvi->hSmallIcon ? pmlvi->hSmallIcon :
	                                                                         hDefaultRscIcon), NULL);
			{
				char *title, *tmp;

				title = _strdup( pmlvi->rsc_fname );
				tmp = realloc_strcat( title, "のプロパティ" );
				if ( tmp ) {
					title = tmp;
				}
				SetWindowText( hDlg, title );
                safefree( title );
			}

			// すでに取得済みの各種情報の表示
			{
				char fname[MAX_PATH*2];
				LPTSTR pfname;

				lstrcpy( fname, pmlvi->rsc_fname );
				GetFullPathName( pmlvi->rsc_fname, _countof(fname), fname, &pfname );
				SetDlgItemText( hDlg, IDC_EDIT_FNAME, fname );
			}

			{
				// 定義部の読み出し
				LOAD_RSC lr;
				int      ec;

				if ( LR_OK == lr.source_load(pmlvi->rsc_fname) ) {
					lr.searchItem(LR_SI_LOAD, 0, 0, ec);
					if ( ec == LR_OK ) {
						SetDlgItemText( hDlg, IDC_EDIT_ITEM , pmlvi->item );
						SetDlgItemText( hDlg, IDC_EDIT_INFO , pmlvi->info );
						SetDlgItemText( hDlg, IDC_EDIT_ICON , lr.searchItem(LR_SI_ICON, "", 0, ec) );
						SetDlgItemText( hDlg, IDC_EDIT_HELP , pmlvi->help );
						SetDlgItemText( hDlg, IDC_EDIT_AUTH , pmlvi->author );
						SetDlgItemText( hDlg, IDC_EDIT_URL  , pmlvi->url );
						SetDlgItemText( hDlg, IDC_EDIT_CATE , pmlvi->category );
						SetDlgItemText( hDlg, IDC_EDIT_TRY  , lr.searchItem(LR_SI_TRY, "", 0, ec) );
						SetDlgItemText( hDlg, IDC_EDIT_MUST , lr.searchItem(LR_SI_MUSTDEFVAR, "", 0, ec) );

						char sbuf[60], cmbuf[16];

						wsprintf(sbuf, "%sバイト (%sKB)", commaex(pmlvi->fsize, cmbuf), comma((0 < pmlvi->fsize && pmlvi->fsize < 2048)?1:pmlvi->fsize/1024));
						SetDlgItemText( hDlg, IDC_EDIT_SIZE , sbuf );

						char *includes = NULL, *tmp;
						const char *p;
						int i = 0;

						while ( NULL != (p = lr.searchItem(LR_SI_INCLUDE, NULL, i++, ec)) ) {
							if ( i > 1 ) {
								tmp = realloc_strcat( includes, ", " );
								if ( tmp ) {
									includes = tmp;
								}
							}
							tmp = realloc_strcat( includes, p );
							if ( tmp ) {
								includes = tmp;
							}
						}
						if ( includes ) {
							SetDlgItemText( hDlg, IDC_EDIT_INC , includes );
							safefree(includes);
						}
						else {
							SetDlgItemText( hDlg, IDC_EDIT_INC , "なし" );
						}
					}
				}
			}

			// 取得していない情報の表示（あらたにファイルから取得する）
			{
				char szTimeDate[80], szAttrStr[80];
				SYSTEMTIME st;
				WIN32_FIND_DATA520 wfd;
				HANDLE hFind;

				// いったんシステムタイムに変換してから文字列に変換
				FileTimeToSystemTime(&(pmlvi->ft), &st);
				wsprintf(szTimeDate, "%4d/%2d/%2d %2d:%02d:%02d", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wDay );
				SetDlgItemText( hDlg, IDC_EDIT_FTIME, szTimeDate );

				// 作成日時とアクセス日時はファイルから取得
				hFind = FindFirstFile520( pmlvi->rsc_fname, &wfd );
				if ( hFind != INVALID_HANDLE_VALUE) {
					FileTimeToSystemTime(&(wfd.ftCreationTime), &st);
					wsprintf(szTimeDate, "%4d/%2d/%2d %2d:%02d:%02d", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wDay );
					SetDlgItemText( hDlg, IDC_EDIT_CTIME, szTimeDate );

					FileTimeToSystemTime(&(wfd.ftLastAccessTime), &st);
					wsprintf(szTimeDate, "%4d/%2d/%2d %2d:%02d:%02d", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wDay );
					SetDlgItemText( hDlg, IDC_EDIT_ATIME, szTimeDate );

					FindClose( hFind );

					// ファイル属性の取得
					szAttrStr[0] = 0;
					if ( wfd.dwFileAttributes&FILE_ATTRIBUTE_ARCHIVE ) {
						lstrcat(szAttrStr, "A\r\n");
					}
					if ( wfd.dwFileAttributes&FILE_ATTRIBUTE_COMPRESSED ) {
						lstrcat(szAttrStr, "C\r\n");
					}
					if ( wfd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY ) {
						lstrcat(szAttrStr, "D\r\n");
					}
					if ( wfd.dwFileAttributes&FILE_ATTRIBUTE_ENCRYPTED ) {
						lstrcat(szAttrStr, "E\r\n");
					}
					if ( wfd.dwFileAttributes&FILE_ATTRIBUTE_HIDDEN ) {
						lstrcat(szAttrStr, "H\r\n");
					}
					if ( wfd.dwFileAttributes&FILE_ATTRIBUTE_OFFLINE ) {
						lstrcat(szAttrStr, "O\r\n");
					}
					if ( wfd.dwFileAttributes&FILE_ATTRIBUTE_READONLY ) {
						lstrcat(szAttrStr, "R\r\n");
					}
					if ( wfd.dwFileAttributes&FILE_ATTRIBUTE_SYSTEM ) {
						lstrcat(szAttrStr, "S\r\n");
					}
					if ( wfd.dwFileAttributes&FILE_ATTRIBUTE_TEMPORARY ) {
						lstrcat(szAttrStr, "T\r\n");
					}
					SetDlgItemText( hDlg, IDC_EDIT_ATTR, szAttrStr );
				}
				else {
					char *perrmes = getLastErrorString(GetLastError());

					SetDlgItemText( hDlg, IDC_EDIT_CTIME, perrmes );
					SetDlgItemText( hDlg, IDC_EDIT_ATIME, perrmes );
				}
			}

			return 1;

		case WM_COMMAND:
			switch ( LOWORD(wParam) ) {
				case IDCANCEL:
                    EndDialog(hDlg, 2);
					return 1;
			}
			break;
	}
	return 0;
}

int openItemProp(HWND hWnd, const LPMLVI _pMlvi)
{
	pmlvi = _pMlvi;
	return (int)DialogBox(hInst, (LPCSTR)IDD_ITEMPROP, hWnd, (DLGPROC)ItemPropProc);
}
