/*
	opendlg.h
	ファイルを開く、ファイルの保存、フォルダを開くダイアログ
*/

#include "stdafx.h"
#include "Rnsf7.h"
#include "opendlg.h"
#include "filetypes.h"

// ファイルを開くダイアログを開く
BOOL openDialog( HWND hWnd, const char *filetypes, char *filename, int maxfilename, const char *title, const char *defext )
{
	OPENFILENAME ofn;

	ZeroMemory(&ofn, sizeof(ofn));
	ofn.lStructSize = sizeof(ofn);
	ofn.hwndOwner = hWnd;
	ofn.lpstrFilter = filetypes;
	ofn.nFilterIndex = 1;
	ofn.lpstrCustomFilter = (LPSTR)NULL;
	ofn.nMaxCustFilter = 0L;
	ofn.lpstrFile = filename;
	ofn.nMaxFile = maxfilename;
	ofn.lpstrFileTitle = NULL;
	ofn.nMaxFileTitle = 0;
	ofn.lpstrInitialDir = NULL;
	ofn.lpstrTitle = title;
	ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_NOCHANGEDIR;
	ofn.nFileOffset = 0;
	ofn.nFileExtension = 0;
	ofn.lpstrDefExt = defext; 

	if ( GetOpenFileName(&ofn) )
		return TRUE;
	else {
		if ((DWORD)FNERR_INVALIDFILENAME == CommDlgExtendedError()) {
			filename[0] = 0;
			if ( GetOpenFileName(&ofn) )
				return TRUE;
		}
		filename[0] = 0;
		return FALSE;
	}
}

// ファイルを保存するダイアログを開く
BOOL saveDialog( HWND hWnd, const char *filetypes, char *filename, int maxfilename, const char *title, const char *defext )
{
	OPENFILENAME ofn;

	ZeroMemory(&ofn, sizeof(ofn));
	ofn.lStructSize = sizeof(ofn);
	ofn.hwndOwner = hWnd;
	ofn.lpstrFilter = filetypes;
	ofn.nFilterIndex = 1;
	ofn.lpstrCustomFilter = (LPSTR)NULL;
	ofn.nMaxCustFilter = 0L;
	ofn.lpstrFile = filename;
	ofn.nMaxFile = maxfilename;
	ofn.lpstrFileTitle = NULL;
	ofn.nMaxFileTitle = 0;
	ofn.lpstrInitialDir = NULL;
	ofn.lpstrTitle = title;
	ofn.Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_NOCHANGEDIR | OFN_OVERWRITEPROMPT;
	ofn.nFileOffset = 0;
	ofn.nFileExtension = 0;
	ofn.lpstrDefExt = defext; 

	if ( GetSaveFileName(&ofn) ) {
		return TRUE;
	}
	else {
		if ((DWORD)FNERR_INVALIDFILENAME == CommDlgExtendedError()) {
			filename[0] = 0;
			if ( GetSaveFileName(&ofn) )
				return TRUE;
		}
		filename[0] = 0;
		return FALSE;
	}
}

// フォルダ選択ダイアログの初期設定を与えるためのコールバック関数
int CALLBACK BrowseCallbackProc(HWND hDlg,UINT uMsg,LPARAM lParam,LPARAM lpData)
{
    if(uMsg == BFFM_INITIALIZED){
        SendMessage(hDlg, BFFM_SETSELECTION, (WPARAM)TRUE, lpData);
    }
    return 0;
}

// フォルダを開くダイアログを開く
BOOL browseFolder( HWND hWnd, char *foldername, const char *info )
{
	BOOL         bRes;
	LPITEMIDLIST pidlRetFolder;
	BROWSEINFO   stBInfo;

	//　構造体を初期化します。
	ZeroMemory(&stBInfo, sizeof(stBInfo));
	stBInfo.pidlRoot = NULL;	// ルートフォルダ
	stBInfo.hwndOwner = hWnd;	// 表示するダイアログの親ウィンドウのハンドル
	stBInfo.pszDisplayName = foldername;	// フォルダ名を取得するバッファのポインタ
	stBInfo.lpszTitle = info;	// ダイアログの中に表示される文字列
	stBInfo.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE;	//表示フラグ
	if (foldername[0] == 0) {
		// フォルダ選択ダイアログに初期設定なし
		stBInfo.lpfn = NULL;
		stBInfo.lParam = 0L;
	}
	else {
		// フォルダ選択ダイアログに初期設定あり
		stBInfo.lpfn = BrowseCallbackProc;
		stBInfo.lParam = (LPARAM)foldername;
	}

	//　ダイアログボックスを表示します。
	pidlRetFolder = SHBrowseForFolder( &stBInfo );

	if( pidlRetFolder != NULL ) {
		//　フルパスを取得します。
		bRes = SHGetPathFromIDList( pidlRetFolder, foldername );
		if ( bRes == FALSE ) {
			foldername[0] = 0;
		}
		CoTaskMemFree( pidlRetFolder );	
		return bRes;
	}
	else {
		foldername[0] = 0;
		return FALSE;
	}
}
