// ★コメント未記入
// RelationDlg.cpp : インプリメンテーション ファイル
//

#include "stdafx.h"
#include "shitarabian.h"
#include "RelationDlg.h"
#include "SettingPath.h"
#include "Common.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CRelationDlg ダイアログ


CRelationDlg::CRelationDlg(CWnd* pParent /*=NULL*/)
	: COwnerTabPage(CRelationDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CRelationDlg)
	m_bSendTo = FALSE;
	m_bStartMenu = FALSE;
	m_bPrograms = FALSE;
	//}}AFX_DATA_INIT
}


void CRelationDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CRelationDlg)
	DDX_Control(pDX, IDC_RELATION_EXTLIST, m_listExtz);
	DDX_Check(pDX, IDC_SETTING_RELATION_SENDTO, m_bSendTo);
	DDX_Check(pDX, IDC_SETTING_RELATION_STARTMENU, m_bStartMenu);
	DDX_Check(pDX, IDC_SETTING_RELATION_PROGRAMS, m_bPrograms);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CRelationDlg, CDialog)
	//{{AFX_MSG_MAP(CRelationDlg)
	ON_BN_CLICKED(IDC_RELATION_DESELECT, OnRelationDeselect)
	ON_BN_CLICKED(IDC_RELATION_SELECT, OnRelationSelect)
	ON_NOTIFY(NM_CLICK, IDC_RELATION_EXTLIST, OnClickRelationExtlist)
	ON_NOTIFY(LVN_ITEMCHANGING, IDC_RELATION_EXTLIST, OnItemchangingRelationExtlist)
	ON_NOTIFY(LVN_ITEMCHANGED, IDC_RELATION_EXTLIST, OnItemchangedRelationExtlist)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CRelationDlg メッセージ ハンドラ

BOOL CRelationDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();

	m_listExtz.InsertColumn( 0, "拡張子" );
	m_listExtz.InsertColumn( 1, "設定" );

	m_listExtz.SetColumnWidth(	0,	70		);
	m_listExtz.SetColumnWidth(	1,	300		);

	// リストコントロールで１行選択可能にする
	DWORD dwExStyle = ListView_GetExtendedListViewStyle( m_listExtz.m_hWnd );
	dwExStyle |= LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES;
	ListView_SetExtendedListViewStyle( m_listExtz.m_hWnd , dwExStyle );

	// リストに拡張子を列挙する
	int idxFolder;
	for( idxFolder=0 ; idxFolder<CSettingPath::GetInstance()->Count() ; idxFolder++ )
	{
		CStringArray	astrExtz;
		CSettingPath::GetInstance()->GetExtz(
			idxFolder,
			&astrExtz
		);
		int idxExt;
		for( idxExt=0 ; idxExt<astrExtz.GetSize() ; idxExt++ )
		{
			// 拡張子の列挙
			m_listExtz.InsertItem( 0, astrExtz[idxExt], 0 );
			m_listExtz.SetItemText( 0, 1,
				CSettingPath::GetInstance()->GetFolderName( idxFolder  )
			);

			// 関連付けされているかを調査して選択状態に反映
// ▼ (ワーニング回避) BGN 2003.12.29 (moralog) warning C4239
			BOOL	bRelated;
			{
				CString	strExtName = (CString)_T(".") + astrExtz[idxExt];
				CString strDocName = (CString)_T("shitarabian.") + astrExtz[idxExt];
				bRelated = ::IsRelatedFileType(
					strExtName,
					strDocName
				);
			}
// ▽ original BGN
//			BOOL	bRelated = ::IsRelatedFileType(
//				(CString)"." + astrExtz[idxExt],
//				(CString)"shitarabian." + astrExtz[idxExt]
//			);
// △ original END
// ▲ (ワーニング回避) END
			if ( bRelated )
			{
				m_listExtz.SetItemState( 0, LVIS_SELECTED, LVIS_SELECTED );
			}
			else
			{
				m_listExtz.SetItemState( 0, 0, LVIS_SELECTED );
			}
		}
	}

	m_bSendTo = IsExists( CSIDL_SENDTO );
	m_bStartMenu = IsExists( CSIDL_STARTMENU );
	m_bPrograms = IsExists( CSIDL_PROGRAMS );

	UpdateData( FALSE );

	return TRUE;  // コントロールにフォーカスを設定しないとき、戻り値は TRUE となります
	              // 例外: OCX プロパティ ページの戻り値は FALSE となります
}

void CRelationDlg::Confirm() 
{
	UpdateData( TRUE );

	// 実行ファイル名称
	CString	strExeFile = __argv[0];

	int idxExt;
	for( idxExt=0 ; idxExt<m_listExtz.GetItemCount() ; idxExt++ )
	{
		CString	strExt = m_listExtz.GetItemText( idxExt, 0 );
		UINT	uiState = m_listExtz.GetItemState( idxExt, LVIS_SELECTED );
		if ( uiState == LVIS_SELECTED )
		{
// ▼ (ワーニング回避) BGN 2003.12.29 (moralog) warning C4239
			CString	strExtName = (CString)_T(".") + strExt;
			CString	strDocName = (CString)_T("shitarabian.") + strExt;
			CString	strDocType = m_listExtz.GetItemText( idxExt, 1 );
			CString	strAction = _T("したらびあんで開く");
			::SetFileType(
				strExtName,
				strDocName,
				strDocType,
				strAction,
				strExeFile
			);
// ▽ original BGN
//			::SetFileType(
//				(CString)(".") + strExt,
//				(CString)"shitarabian." + strExt,
//				m_listExtz.GetItemText( idxExt, 1 ),
//				(CString)"したらびあんで開く",
//				strExeFile
//			);
// △ original END
// ▲ (ワーニング回避) END
		}
		else
		{
// ▼ (ワーニング回避) BGN 2003.12.29 (moralog) warning C4239
			CString	strExtName = (CString)_T(".") + strExt;
			CString	strDocName = (CString)_T("shitarabian.") + strExt;
			::RemoveFileType(
				strExtName,
				strDocName
			);
// ▽ original BGN
//			::RemoveFileType(
//				(CString)"." + strExt,
//				(CString)"shitarabian." + strExt
//			);
// △ original END
// ▲ (ワーニング回避) END
		}
	}


	// 「送る」メニュー
	if ( m_bSendTo )
	{
		EntrySendTo( CSIDL_SENDTO );
	}
	else
	{
		RemoveSendTo( CSIDL_SENDTO );
	}

	// スタートメニュー
	if ( m_bStartMenu )
	{
		EntrySendTo( CSIDL_STARTMENU );
	}
	else
	{
		RemoveSendTo( CSIDL_STARTMENU );
	}

	// プログラム
	if ( m_bPrograms )
	{
		EntrySendTo( CSIDL_PROGRAMS );
	}
	else
	{
		RemoveSendTo( CSIDL_PROGRAMS );
	}
}

void CRelationDlg::OnRelationDeselect() 
{
	int idxExt;
	for( idxExt=0 ; idxExt<m_listExtz.GetItemCount() ; idxExt++ )
	{
		m_listExtz.SetItemState( idxExt, 0, LVIS_SELECTED );
	}
}



/*
CSIDL_ALTSTARTUP = &H1D                スタートアッププログラムグループ内の
                                       特定ユーザー向けのスタートアップディレクトリ
CSIDL_APPDATA = &H1A                   アプリケーション定義データ用共通ディレクトリ
CSIDL_BITBUCKET = &HA                  ごみ箱
CSIDL_COMMON_ALTSTARTUP = &H1E         スタートアッププログラムグループ内の
                                       全ユーザー向けのスタートアップディレクトリ
CSIDL_COMMON_DESKTOPDIRECTORY = &H19   全ユーザ向けデスクトップディレクトリ
CSIDL_COMMON_FAVORITES = &H1F          同、お気に入り
CSIDL_COMMON_PROGRAMS = &H17           同、スタートメニューに表示される
                                       プログラムグループのディレクトリ
CSIDL_COMMON_STARTMENU = &H16          同、スタートメニューに表示される
                                       プログラムとフォルダを含むのディレクトリ
CSIDL_COMMON_STARTUP = &H18            同、スタートアップフォルダに含まれる
                                       プログラムを含むのディレクトリ
CSIDL_CONTROLS = &H3                   コントロールパネル
CSIDL_DESKTOP = &H0                    デスクトップ
CSIDL_DESKTOPDIRECTORY = &H10          Windows\ﾃﾞｽｸﾄｯﾌﾟ
CSIDL_DRIVES = &H11                    マイコンピュータ
CSIDL_FAVORITIES = &H6                 Favorities
CSIDL_FONTS = &H14                     Windows\Font
CSIDL_HISTORY = &H22                   インターネット履歴ディレクトリ
CSIDL_INTERNET = &H1                   インターネットフォルダ
CSIDL_INTERNET_CACHE = &H20            インターネットキャッシュのディレクトリ
CSIDL_NETHOOD = &H13                   NetHoodディレクトリ
CSIDL_NETWORK = &H12                   NETWORKフォルダ
CSIDL_PERSONAL = &H5                   My Document
CSIDL_PRINTERS = &H4                   プリンタフォルダ
CSIDL_PRINTERHOOD = &H1B               プリンタディレクトリ
CSIDL_PROGRAMS = &H2                   \windows\プログラム
CSIDL_RECENT = &H8                     Recent
CSIDL_SENDTO = &H9                     SendTo
CSIDL_STARTMENU = &HB                  スタートメニュー
CSIDL_STARTUP = &H7                    スタートアップ
CSIDL_TEMPLATES = &H15                 Windows\ShellNew
*/
/*-----------------------------------------------------------------------------
[名称]	「送る」メニューに項目を追加
[機能]	
[戻値]	BOOL	処理結果 [-] (TRUE:成功、FALSE:失敗)
[備考]	なし
-----------------------------------------------------------------------------*/
void CRelationDlg::EntrySendTo(
	long	idFolder
) 
{
	const CString	strLinkFileName = "したらびあん.lnk";

	// 「送る」のフォルダを取得
	CString		strFolder;
	{
		TCHAR szPath[_MAX_PATH];
		LPITEMIDLIST pidl;
		HWND hWnd = NULL;
		IMalloc *pMalloc;
		SHGetMalloc( &pMalloc );
		if( SUCCEEDED(SHGetSpecialFolderLocation(hWnd,idFolder,&pidl)) )
		{ 
			SHGetPathFromIDList(pidl,szPath); // パスに変換する
			pMalloc->Free(pidl);              // 取得したIDLを解放する (CoTaskMemFreeでも可)
		}
		pMalloc->Release();
		strFolder = szPath;
	}

	// 実行ファイル名を得る
	const	iMaxLength( 1028 );	// パス格納バッファ長さ
// ▼ (ワーニング回避) BGN 2003.12.29 (moralog) warning C4101
// ▽ original BGN
//	char	strExeShortPath[ iMaxLength ];
// △ original END
// ▲ (ワーニング回避) END
	char	strExeLongPath[ iMaxLength ];
	{
		::GetModuleFileName(
			NULL,
			strExeLongPath,
			iMaxLength
		);
	}

	CString		strLinkFilePathName = strFolder + "\\" + strLinkFileName;
	CString		strExeFilePathName;
	strExeFilePathName.Format( "\"%s\"", strExeLongPath );
	CreateShellLink(
		strLinkFilePathName,
		strExeFilePathName,
		"",
		CSettingPath::GetInstance()->GetShitarabianFolderPath(),
		SW_SHOWNORMAL
	);	
}

void CRelationDlg::RemoveSendTo(
	long	idFolder
) 
{
	const CString	strLinkFileName = "したらびあん.lnk";

	// 「送る」のフォルダを取得
	CString		strFolder;
	{
		TCHAR szPath[_MAX_PATH];
		LPITEMIDLIST pidl;
		HWND hWnd = NULL;
		IMalloc *pMalloc;
		SHGetMalloc( &pMalloc );
		if( SUCCEEDED(SHGetSpecialFolderLocation(hWnd,idFolder,&pidl)) )
		{ 
			SHGetPathFromIDList(pidl,szPath); // パスに変換する
			pMalloc->Free(pidl);              // 取得したIDLを解放する (CoTaskMemFreeでも可)
		}
		pMalloc->Release();
		strFolder = szPath;
	}

	// 存在していればリンクファイルを削除
	CString		strLinkFilePathName = strFolder + "\\" + strLinkFileName;
	CFileStatus	fs;
	if ( CFile::GetStatus( strLinkFilePathName, fs ) )
	{
		CFile::Remove( strLinkFilePathName );
	}
}

BOOL CRelationDlg::IsExists(
	long	idFolder
) 
{
	const CString	strLinkFileName = "したらびあん.lnk";

	// 「送る」のフォルダを取得
	CString		strFolder;
	{
		TCHAR szPath[_MAX_PATH];
		LPITEMIDLIST pidl;
		HWND hWnd = NULL;
		IMalloc *pMalloc;
		SHGetMalloc( &pMalloc );
		if( SUCCEEDED(SHGetSpecialFolderLocation(hWnd,idFolder,&pidl)) )
		{ 
			SHGetPathFromIDList(pidl,szPath); // パスに変換する
			pMalloc->Free(pidl);              // 取得したIDLを解放する (CoTaskMemFreeでも可)
		}
		pMalloc->Release();
		strFolder = szPath;
	}

	// 存在していればリンクファイルを削除
	CString		strLinkFilePathName = strFolder + "\\" + strLinkFileName;
	CFileStatus	fs;
	return( CFile::GetStatus( strLinkFilePathName, fs ) );
	
}

void CRelationDlg::OnRelationSelect() 
{
	int idxExt;
	for( idxExt=0 ; idxExt<m_listExtz.GetItemCount() ; idxExt++ )
	{
		m_listExtz.SetItemState( idxExt, LVIS_SELECTED, LVIS_SELECTED );
	}
}



void CRelationDlg::OnClickRelationExtlist(NMHDR* pNMHDR, LRESULT* pResult) 
{
// ▼ (ワーニング回避) BGN 2003.12.29 (moralog) warning C4189
	// warning C4100 回避
	pNMHDR;
// ▽ original BGN
//	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// △ original END
// ▲ (ワーニング回避) END

	*pResult = 0;	
}

void CRelationDlg::OnItemchangingRelationExtlist(NMHDR* pNMHDR, LRESULT* pResult) 
{
// ▼ (ワーニング回避) BGN 2003.12.29 (moralog) warning C4189
	// warning C4100 回避
	pNMHDR;
// ▽ original BGN
//	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// △ original END
// ▲ (ワーニング回避) END

	*pResult = 0;
}

void CRelationDlg::OnItemchangedRelationExtlist(NMHDR* pNMHDR, LRESULT* pResult) 
{
// ▼ (ワーニング回避) BGN 2003.12.29 (moralog) warning C4189
	// warning C4100 回避
	pNMHDR;
// ▽ original BGN
//	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// △ original END
// ▲ (ワーニング回避) END
	
	*pResult = 0;
}
