// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010  Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

// create_file_dlg.cpp : implementation file
//

#include "std_afx.h"
#include "object_viewer.h"
#include "create_file_dlg.h"
#include <shlobj.h>


/////////////////////////////////////////////////////////////////////////////
// CCreateFileDlg dialog


CCreateFileDlg::CCreateFileDlg(const CString &title, const std::string &defaultBasePath, const std::string &extension, CWnd* pParent /*=NULL*/)
	: CDialog(CCreateFileDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CCreateFileDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	_Title = title;
	_Extension = extension;
	_DefaultBasePath = defaultBasePath;
}


void CCreateFileDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CCreateFileDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CCreateFileDlg, CDialog)
	//{{AFX_MSG_MAP(CCreateFileDlg)
	ON_BN_CLICKED(IDC_BROWSE, OnBrowse)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCreateFileDlg message handlers

void CCreateFileDlg::OnBrowse() 
{
	CString chosenPath;
	if (browseFolder(getStrRsc(IDS_CHOOSE_BASE_PATH), chosenPath, this->m_hWnd))
	{	
		GetDlgItem(IDC_LOCATION)->SetWindowText((LPCTSTR) chosenPath);
	}
}


//*************************************************************************************************
BOOL CCreateFileDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();	
	SetWindowText((LPCTSTR) _Title);
	GetDlgItem(IDC_LOCATION)->SetWindowText(_DefaultBasePath.c_str());
	if (!_DefaultBasePath.empty())
	{
		GetDlgItem(IDC_FILENAME)->SetFocus();
	}
	else
	{
		GetDlgItem(IDC_LOCATION)->SetFocus();
	}
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

//*************************************************************************************************
void CCreateFileDlg::OnOK()
{
	CString filename;
	GetDlgItem(IDC_FILENAME)->GetWindowText(filename);
	_Filename = (LPCTSTR) filename;
	CString location;
	GetDlgItem(IDC_LOCATION)->GetWindowText(location);
	_Path = (LPCTSTR) location;	
	if (_Path.empty())
	{
		localizedMessageBox(*this, IDS_EMPTY_PATH, IDS_ERROR, MB_ICONEXCLAMATION);
		return;
	}	
	if (_Filename.empty())
	{
		localizedMessageBox(*this, IDS_FILENAME_PATH, IDS_ERROR, MB_ICONEXCLAMATION);
		return;
	}
	// check that filename is valid (should be a single file name)
	if (_Filename != NLMISC::CFile::getFilename(_Filename))
	{
		localizedMessageBox(*this, IDS_INVALID_FILENAME, IDS_ERROR, MB_ICONEXCLAMATION);
		return;
	}
	// attempt to create containing folder
	if (!NLMISC::CFile::isExists(_Path))
	{
		bool result = NLMISC::CFile::createDirectory(_Path);
		if (!result)
		{
			MessageBox((LPCTSTR) (getStrRsc(IDS_COULDNT_CREATE_DIRECTORY) + _Path.c_str()), getStrRsc(IDS_ERROR), MB_ICONEXCLAMATION);
			return;
		}
	}	
	std::string oldPath = NLMISC::CPath::getCurrentPath();
	if (!NLMISC::CPath::setCurrentPath(_Path.c_str()))
	{
		MessageBox((LPCTSTR) (getStrRsc(IDS_COULDNT_CREATE_DIRECTORY) + _Path.c_str()), getStrRsc(IDS_ERROR), MB_ICONEXCLAMATION);
		return;
	}
	_FullPath = NLMISC::CPath::getFullPath(_Filename, false);
	NLMISC::CPath::setCurrentPath(oldPath.c_str());
	// append extension if not present
	if (NLMISC::nlstricmp(NLMISC::CFile::getExtension(_Filename), _Extension) != 0)
	{
		_Filename += "." + _Extension;
		_FullPath += "." + _Extension;
	}
	CDialog::OnOK();
}

void CCreateFileDlg::OnCancel()
{
	_Filename = "";
	_Path = "";
	_FullPath = "";
	CDialog::OnCancel();
}

//*************************************************************************************************
bool CCreateFileDlg::touchFile()
{
	std::string path = getPath();
	std::string filename = getFileName();
	std::string fullPath = getFullPath();		
	// check if file already exists
	if (NLMISC::CFile::isExists(fullPath))
	{
		int result = MessageBox((LPCTSTR) (CString(filename.c_str()) + getStrRsc(IDS_OVERWRITE_FILE)), getStrRsc(IDS_WARNING), MB_ICONEXCLAMATION);
		if (result !=	IDOK) return false;
	}
	// create a dummy file		
	NLMISC::COFile testFile;
	if (!testFile.open(fullPath))
	{
		localizedMessageBox(*this, IDS_CANNOT_CREATE_FILE, IDS_ERROR, MB_ICONEXCLAMATION);
		return false;
	}
	testFile.close();
	return true;
}