// DirSelectDialog.cpp : インプリメンテーション ファイル
//

#include "stdafx.h"
#include "spconv.h"
#include "DirSelectDialog.h"

#include <direct.h>

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

/////////////////////////////////////////////////////////////////////////////
// CDirSelectDialog ダイアログ


CDirSelectDialog::CDirSelectDialog(CWnd* pParent /*=NULL*/)
	: CDialog(CDirSelectDialog::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDirSelectDialog)
		// メモ - ClassWizard はこの位置にマッピング用のマクロを追加または削除します。
	//}}AFX_DATA_INIT
	InitialDirectory=CString("");				// 初期のディレクトリをカレントとする
}


void CDirSelectDialog::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDirSelectDialog)
                // メモ - ClassWizard はこの位置にマッピング用のマクロを追加または削除します。
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDirSelectDialog, CDialog)
	//{{AFX_MSG_MAP(CDirSelectDialog)
	ON_LBN_SELCHANGE(IDC_DIRECTORY, OnSelchangeDirectory)
	ON_LBN_DBLCLK(IDC_DIRECTORY, OnDblclkDirectory)
	ON_BN_CLICKED(IDC_ROOT, OnRoot)
	ON_LBN_SELCHANGE(IDC_DRIVE, OnSelchangeDrive)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

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

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

	char temp[256];
	GetCurrentDirectory(256,temp);					// カレントの保存
	OldPath=CString(temp);
	if(InitialDirectory != "")_chdir((LPCTSTR)InitialDirectory);	// 初期のディレクトリが指定されてたら、そこに移動
	if(SetDirInfo()==FALSE){						// ディレクトリの情報をリストボックスへ登録
		MessageBox("ディレクトリ情報は正常に読み込めませんでした","エラー",MB_OK);
		EndDialog(IDCANCEL);						// IDCANCELで終了
	}

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


//------------------------------------------------------<ディレクトリ情報を反映する>
BOOL CDirSelectDialog::SetDirInfo()
{
	char current[256];									// カレントディレクトリを得る
	GetCurrentDirectory(256,current);
	CString str1(current);
	CString str2(current);

	((CListBox*)GetDlgItem(IDC_DRIVE))->ResetContent();		// ドライブボックスの内容を全消去
	if(DlgDirList( (char*)((LPCTSTR)str1) ,IDC_DRIVE,0,DDL_DRIVES|DDL_EXCLUSIVE)==0){		// ドライブをリストボックスへ
		return FALSE;
	}
	char prefix[2];
	prefix[0]=current[0];			// ドライブ名を作る
	prefix[1]=0;
	int index;
	index=((CListBox*)GetDlgItem(IDC_DRIVE))->SelectString(-1,prefix);	// ドライブのインデックスをサーチ

	((CListBox*)GetDlgItem(IDC_DIRECTORY))->ResetContent();		// ディレクトリボックスの内容を全消去
	if(DlgDirList( (char*)((LPCTSTR)str2) ,IDC_DIRECTORY,0,DDL_DIRECTORY|DDL_EXCLUSIVE)==0){	// ディレクトリをリストボックスへ
		return FALSE;
	}
	((CListBox*)GetDlgItem(IDC_DIRECTORY))->InsertString(0,"[.]");	// カレントを先頭につっこむ
	((CListBox*)GetDlgItem(IDC_DIRECTORY))->SetCurSel(0);		// 最初の要素を選択

	OnSelchangeDirectory();
	return TRUE;
}


//-------------------------------------------------------<ディレクトリ選択>
void CDirSelectDialog::OnSelchangeDirectory() 
{
	CString pathname;
	char buffer[256];											// フルパス格納
	char temp[256];												// 選択ディレクトリ格納
	if(((CListBox*)GetDlgItem(IDC_DIRECTORY))->GetCurSel()!=0){	// ルート直接指定でなければ・・・
		DlgDirSelectEx(this->m_hWnd,temp,256,IDC_DIRECTORY);
		_fullpath( buffer, temp , 256 );							// フルパス作成
		pathname=CString(buffer);
	} else {
		_fullpath( buffer, "." , 256 );
		pathname=CString(buffer);
	}

	//SendDlgItemMessage(IDC_PATH,WM_SETTEXT,0,(long)buffer);
	SelectedPath=pathname;										// 選択中のパスを保存
	this->UpdateData(FALSE);
}

//--------------------------------------------------------------------<ドライブをクリック>
void CDirSelectDialog::OnSelchangeDrive() 
{
	char temp[256];
	DlgDirSelectEx(this->m_hWnd,temp,256,IDC_DRIVE);

	if(_chdrive(toupper(temp[0])-'A'+1)	!= 0){						// ドライブを変更
		MessageBox("指定ドライブは現在使用不可のようです","エラー",MB_OK);
	}

	SetDirInfo();											// リストボックスを更新
}

//--------------------------------------------------------------------<ディレクトリをダブルクリック>
void CDirSelectDialog::OnDblclkDirectory() 
{
	char temp[256];											// 選択ディレクトリを得る
	DlgDirSelectEx(this->m_hWnd,temp,256,IDC_DIRECTORY);
	CString pathname;

	if(((CListBox*)GetDlgItem(IDC_DIRECTORY))->GetCurSel()!=0){	// ルート直接指定でなければ・・・
		char buffer[256];											// フルパス格納
		char temp[256];												// 選択ディレクトリ格納
		DlgDirSelectEx(this->m_hWnd,temp,256,IDC_DIRECTORY);
		_fullpath( buffer, temp , 256 );							// フルパス作成
		pathname=CString(buffer);									// CStringにコピー
	} else {
		pathname = ".";
	}

	if(_chdir((LPCTSTR)pathname)!=0){										// ディレクトリ移動
		MessageBox("指定ディレクトリは現在使用不可のようです","エラー",MB_OK);
	}

	SetDirInfo();											// リストボックスを更新
}

//-----------------------------------------------------------------<キャンセルが押された>
void CDirSelectDialog::OnCancel() 
{
	_chdir((LPCTSTR)OldPath);								// 最初のカレントに戻して返る

	CDialog::OnCancel();
}

//---------------------------------------------------------------------<選択が押された>
void CDirSelectDialog::OnOK() 
{
	_chdir((LPCTSTR)OldPath);								// もとのカレントに戻す

	CDialog::OnOK();
}

//-------------------------------------------------------------<￥へジャンプが押された>
void CDirSelectDialog::OnRoot() 
{
	_chdir("\\");											// ルートへカレントを移動
	SetDirInfo();											// 情報を反映する
}
