/*********************************************************/
//	NkILSamplePreferenceDlg.cpp
//		Source file of Preference dialog class.
//
//	Copyright(c) 2007, Nikon Corporation - All rights reserved.
/*********************************************************/

#include "stdafx.h"
#include "NkImageLibCtrl.h"
#include "NkILSamplePreferenceDlg.h"

#define MAX_FOLDERPATH 256

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


IMPLEMENT_DYNAMIC(CNkILSamplePreferenceDlg, CDialog)

CNkILSamplePreferenceDlg::CNkILSamplePreferenceDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CNkILSamplePreferenceDlg::IDD, pParent)
{
	// initialize parameter
	m_ulMemSize		= 0;	
	m_strFilePath	= "";
	m_ulDefMemSize	= 0;
}

CNkILSamplePreferenceDlg::~CNkILSamplePreferenceDlg()
{
	// initialize parameter
	m_ulMemSize		= 0;	
	m_strFilePath	= "";
	m_ulDefMemSize	= 0;
}

void CNkILSamplePreferenceDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);

	DDX_Text(pDX, IDC_EDIT_MEMSIZE, m_ulMemSize );
	DDX_Text(pDX, IDC_EDIT_FILEPATH, m_strFilePath );
}


BEGIN_MESSAGE_MAP(CNkILSamplePreferenceDlg, CDialog)
		ON_COMMAND( IDC_BUTTON_FILESELECT, OnSelectFile )
		ON_COMMAND( IDOK, OnOK )
		ON_EN_UPDATE( IDC_EDIT_MEMSIZE, OnUpdateEdit )
		ON_EN_KILLFOCUS( IDC_EDIT_MEMSIZE, OnKillFocusEdit )
END_MESSAGE_MAP()


//////////////////////////////////////////////////////////////////
// OnInitDialog
BOOL CNkILSamplePreferenceDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// set dialog title
	CString strTitle;
	strTitle.LoadString( IDS_TITLE_PREDLG );
	SetWindowText( strTitle );

	// get memorystatus for default value	
	MEMORYSTATUS		MemStatus			= { 0 };
	// set swap file size
	// information about the current state of both physical and virtual memory.
	MemStatus.dwLength = sizeof( MEMORYSTATUS );
	::GlobalMemoryStatus( &MemStatus );

	//set a half of physical memory
	m_ulDefMemSize = (unsigned long)( MemStatus.dwAvailPhys / 2  >> SHIFT_TO_MEGA );	
	if( 0 >= m_ulMemSize )
	{
		m_ulMemSize = m_ulDefMemSize;
		UpdateData(false);
	}

	return true;
}
// OnInitDialog
//////////////////////////////////////////////////////////////////

//====================================================================
// function name		：GetPreferenceData
// function abstract	：get preference data from this object
// parameter			：pstrTempPath	pointer of file path for ImageSDKLib use 
//						  plVMMemSize	pointer of virtual memory size for ImageSDKLib use
// return value			：none
//====================================================================
void CNkILSamplePreferenceDlg::GetPreferenceData( CString* pstrTempPath, unsigned long* pulVMMemSize )
{
	// get value of member parameter 
	*pstrTempPath	= m_strFilePath;
	*pulVMMemSize	= m_ulMemSize;		
}
// GetPreferenceData
//////////////////////////////////////////////////////////////////

//====================================================================
// function name		：SetPreferenceData
// function abstract	：Set preference data to this object
// parameter			：strTempPath	file path for ImageSDKLib use 
//						  ulVMMemSize	virtual memory size for ImageSDKLib use
// return value			：none
//====================================================================
void CNkILSamplePreferenceDlg::SetPreferenceData( CString strTempPath, unsigned long ulVMMemSize )
{
	// set value to member parameter
	m_strFilePath	= strTempPath;
	m_ulMemSize		= ulVMMemSize;	
}
// SetPreferenceData
//////////////////////////////////////////////////////////////////

//====================================================================
// function name		：OnFileSelect
// function abstract	：show filedialog and select temp filepath
// parameter			：none
// return value			：none
//====================================================================
void CNkILSamplePreferenceDlg::OnSelectFile()
{
	// show file dialog
	CFileDialog	clFileDlg(TRUE);
	if(clFileDlg.DoModal()==IDOK) 
	{
		m_strFilePath = clFileDlg.GetPathName();// set selected filepath to member parameter
	}

	UpdateData(false);					// reflect dialog control
}
// OnFileSelect
//////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////
// OnUpdateEdit
void CNkILSamplePreferenceDlg::OnUpdateEdit()
{
	// get value of editbox
	CEdit* pEdit = (CEdit*)GetDlgItem( IDC_EDIT_MEMSIZE );
	CString strEdit;
	pEdit->GetWindowText( strEdit );

	strEdit.TrimLeft();			// trim space of the first part
	int nEdit = atoi( strEdit );// convert to numeric by strtod()
	
	// limit is physical memory size
	if( nEdit > (long)( m_ulDefMemSize * 2 ) )
	{
		// if over limit size, set default memory size
		strEdit.Format( "%d", m_ulDefMemSize * 2);
		pEdit->SetWindowText( strEdit );
	}
	else if( nEdit <= 0 )
	{
		// if under limit size or except numerical value is set, set ""
		if( '0' != strEdit && 0 != strcmp( strEdit, "" ))		
			pEdit->SetWindowText( "" );		
	}
	else
	{
		CString strTmp;
		strTmp.Format( "%d", nEdit );
		if( strTmp != strEdit )		
			pEdit->SetWindowText( strTmp );		
	}
}
// OnUpdateEdit
//////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////
// OnKillFocusEdit
void CNkILSamplePreferenceDlg::OnKillFocusEdit()
{
	CString strEdit;
	((CEdit*)GetDlgItem( IDC_EDIT_MEMSIZE ))->GetWindowText(strEdit);
	strEdit.TrimLeft();														// delete space
	if( 0 == strEdit.GetLength() )
	{		
		strEdit.Format( "%d", 0 );
		((CEdit*)GetDlgItem( IDC_EDIT_MEMSIZE ))->SetWindowText( strEdit );	// set minimum value
	}	
}
// OnKillFocusEdit
//////////////////////////////////////////////////////////////////