// EIKCFDLG.CPP
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//

#include <eikcfdlg.h>
#include <eikcfdlg.hrh>
#include <eikfbrow.h>
#include <eikedwin.h>
#include <eikenv.h>
#include <coeutils.h>
#include <f32file.h>
#include <eikfsel.h>
#include <apparc.h>
#include <eikproc.h>
#include <eikdialg.hrh>
#include <eikinfo.h>
#include <eikon.rsg>
#include <eikfutil.h>
#include <eikappui.h>
#include <eikapp.h>


const TInt KShortErrorMessageLength = 64;
const TInt KDriveNameLength = 1;
const TInt KMaxDisplayedFullNameLen	= 35;


//
// class CEikFileOpenDialog
//

EXPORT_C CEikFileOpenDialog::CEikFileOpenDialog(TDes* aFileName, TInt aTitleId)
	: iFileName(aFileName), iTitleId(aTitleId)
    {
	__DECLARE_NAME(_S("CEikFileOpenDialog"));
    }

EXPORT_C void CEikFileOpenDialog::SetShowSystem(TBool aShowSystem)
	{
	iShowSystem = aShowSystem;
	}

EXPORT_C void CEikFileOpenDialog::SetRequiredUid(const TUidType& aUidType)
	{
	iUidType=aUidType;
	}

EXPORT_C void CEikFileOpenDialog::RestrictToNativeDocumentFiles()
	{
	SetRequiredUid(TUidType(KNullUid, KUidAppDllDoc, iEikonEnv->EikAppUi()->Application()->AppDllUid()));
	}

EXPORT_C void CEikFileOpenDialog::SetRequiredExtension(const TDesC* aExtension)
	{
	iExtension=CONST_CAST(TDesC*,aExtension);
	}
 
EXPORT_C void CEikFileOpenDialog::PreLayoutDynInitL()
    {
	CEikFileNameSelector* fileNameSelector = (CEikFileNameSelector*) (Control(EEikCidFileNameSel));
    CEikFolderNameSelector* folderNameSelector = (CEikFolderNameSelector*) (Control(EEikCidFolderNameSel));
    CEikDriveNameSelector* driveNameSelector = (CEikDriveNameSelector*) (Control(EEikCidDriveNameSel));
	if (iExtension && iExtension->Length() != 0)
		fileNameSelector->SetExtensionL(*iExtension);
	fileNameSelector->SetUidType(iUidType);
	if (iShowSystem)
		folderNameSelector->SetShowSystem(ETrue);
	folderNameSelector->SetFileSelectionObserver(fileNameSelector);
	driveNameSelector->SetFileSelectionObserver(folderNameSelector);
    User::LeaveIfError(EikFileUtils::Parse(*iFileName));
	TParsePtr parse(*iFileName);
	driveNameSelector->SetFullNameL(parse.FullName());
    if (iTitleId)
        SetTitleL(iTitleId);
    }

EXPORT_C void CEikFileOpenDialog::HandleBrowseButtonL()
	{
    CEikFolderNameSelector* folderSel=STATIC_CAST(CEikFolderNameSelector*,Control(EEikCidFolderNameSel));
	TFileName* path=new(ELeave) TFileName;
	CleanupStack::PushL(path);
	*path=folderSel->FullName();
	CDirContentsListBoxModel::TSortOrder order=CDirContentsListBoxModel::EOrderByName;
	TInt flags=CEikFileBrowser::EHideRom;
	if (iShowSystem)
		flags|=CEikFileBrowser::EShowSystem;
	CEikFileBrowserDialog* browseDialog = new(ELeave) CEikFileBrowserDialog(*path,flags,order);
	if (browseDialog->ExecuteLD(R_EIK_DIALOG_FILE_BROWSE))
		STATIC_CAST(CEikDriveNameSelector*,Control(EEikCidDriveNameSel))->SetFullNameL(*path);
	CleanupStack::PopAndDestroy(); // path
	}

EXPORT_C TBool CEikFileOpenDialog::OkToExitL(TInt aButtonId)
    {
	if (aButtonId == EEikBidBrowse)
		{
		HandleBrowseButtonL();
		return EFalse;
		}
	else
		{
		CEikFileNameSelector* fileNameSelector = (CEikFileNameSelector*) (Control(EEikCidFileNameSel));
		fileNameSelector->ValidateStateL();
		*iFileName = fileNameSelector->FullName();
		return ETrue;
		}
    }

//
// class CEikFileSaveAsDialog
//

EXPORT_C CEikFileSaveAsDialog::CEikFileSaveAsDialog(TDes* aFileName, TBool* aUseNewFile, TInt aTitleId, TBool aAppendExtension)
    {
	__DECLARE_NAME(_S("CEikFileSaveAsDialog"));
    iFileName=aFileName;
	iUseNewFile = aUseNewFile;
    iTitleId=aTitleId;
	iAppendExtension = aAppendExtension;
    }

EXPORT_C CEikFileSaveAsDialog::CEikFileSaveAsDialog(TDes* aFileName, const TDesC* aTitle, TBool* aUseNewFile, TBool aAppendExtension)
    {
	__DECLARE_NAME(_S("CEikFileSaveAsDialog"));
    iFileName=aFileName;
	iUseNewFile = aUseNewFile;
    iTitle=aTitle;
	iAppendExtension = aAppendExtension;
    }

EXPORT_C void CEikFileSaveAsDialog::PreLayoutDynInitL()
    {
	CEikFileNameEditor* fileNameEditor = (CEikFileNameEditor*) (Control(EEikCidFileNameEd));
    CEikFolderNameSelector* folderNameSelector = (CEikFolderNameSelector*) (Control(EEikCidFolderNameSel));
    CEikDriveNameSelector* driveNameSelector = (CEikDriveNameSelector*) (Control(EEikCidDriveNameSel));
    User::LeaveIfError(EikFileUtils::Parse(*iFileName));
	TParsePtr parse(*iFileName);
	fileNameEditor->SetAppendExtension(iAppendExtension);
//	fileNameEditor->SetTextLimit(KMaxFileName - parse.DriveAndPath().Length());
	folderNameSelector->SetFileSelectionObserver(fileNameEditor);
	driveNameSelector->SetFileSelectionObserver(folderNameSelector);
	driveNameSelector->SetFullNameL(parse.FullName());
	if (iUseNewFile)
		{
		CEikButtonBase::TState checkBoxState = (*iUseNewFile) ? CEikButtonBase::ESet : CEikButtonBase::EClear;
		SetCheckBoxState(EEikCidUseNewFileChbx, checkBoxState);
		}
	else
		DeleteLine(EEikCidUseNewFileChbx);
    if (iTitleId)
        SetTitleL(iTitleId);
    }

EXPORT_C void CEikFileSaveAsDialog::HandleBrowseButtonL()
	{
    CEikFolderNameSelector* folderSel=STATIC_CAST(CEikFolderNameSelector*,Control(EEikCidFolderNameSel));
	TFileName* path=new(ELeave) TFileName;
	CleanupStack::PushL(path);
	*path=folderSel->FullName();
	CDirContentsListBoxModel::TSortOrder order=CDirContentsListBoxModel::EOrderByName;
	CEikFileBrowserDialog* browseDialog = new(ELeave) CEikFileBrowserDialog(*path,CEikFileBrowser::EHideRom|CEikFileBrowserDialog::EAllowFolderCreation,order);
	if (browseDialog->ExecuteLD(R_EIK_DIALOG_FILE_BROWSE))
		STATIC_CAST(CEikDriveNameSelector*,Control(EEikCidDriveNameSel))->SetFullNameL(*path);
	CleanupStack::PopAndDestroy(); // path
	}

EXPORT_C TBool CEikFileSaveAsDialog::OkToExitL(TInt aButtonId)
    {
	if (aButtonId==EEikBidBrowse)
		{
		HandleBrowseButtonL();
		return EFalse;
		}
	else
		{
		CEikFileNameEditor* fileNameEditor=(CEikFileNameEditor*)(Control(EEikCidFileNameEd));
		TFileName* fullName=new(ELeave) TFileName;
		CleanupStack::PushL(fullName);
		fileNameEditor->GetFullNameL(*fullName);
		TBool replaceExistingFile=ETrue;
		TUint attributes=0;
		if (!ConeUtils::FileExists(*fullName))
			ConeUtils::EnsurePathExistsL(*fullName);
		else
			{
			TBuf<32> infoDialogTitle;
			iEikonEnv->ReadResource(infoDialogTitle,R_EIK_TBUF_DIALOG_TITLE_CONFIRM_FILE_REPLACE);
			TBuf<KShortErrorMessageLength> formatStr;
			User::LeaveIfError(iEikonEnv->FsSession().Att(*fullName,attributes));
			if (attributes&KEntryAttReadOnly)
				iEikonEnv->LeaveWithInfoMsg(R_EIK_TBUF_CANNOT_REPLACE_READONLY_FILE);
			else
				iEikonEnv->ReadResource(formatStr,R_EIK_TBUF_FILE_REPLACE_CONFIRM1);
			TBuf<KMaxDisplayedFullNameLen> abbrevName;
			User::LeaveIfError(EikFileUtils::Parse(*fullName));
			TParsePtr parse(*fullName);
			EikFileUtils::AbbreviateFileName(parse.NameAndExt(),abbrevName);
			TBuf<KShortErrorMessageLength + KMaxDisplayedFullNameLen> textMsg;
			textMsg.Format(formatStr,&abbrevName);
			CEikDialog* infoDialog=new(ELeave) CEikInfoDialog(infoDialogTitle,textMsg,CEikInfoDialog::EIgnoreEnter);
			replaceExistingFile=infoDialog->ExecuteLD(R_EIK_DIALOG_SINGLE_FILE_REPLACE);
			}
		if (!replaceExistingFile)
			{
			CleanupStack::PopAndDestroy(); // fullName
			return EFalse;
			}
		// check disk is present in selected drive
		TParsePtrC parse(*fullName);
		TPtrC drv=parse.Drive();
		TBuf<4> root(drv);
		root.Append(TChar(KPathDelimiter));
		root.Append(_L("*"));
		RDir dir;
		const TInt ret=dir.Open(iEikonEnv->FsSession(),root,EFileRead|EFileShareAny);
		if (ret==KErrNotReady)
			iEikonEnv->LeaveWithInfoMsg(R_EIK_TBUF_DISK_NOT_PRESENT);
		if (ret==KErrNone)
			dir.Close();
		//
		*iFileName=*fullName;
		if (iUseNewFile)
			*iUseNewFile=(CheckBoxState(EEikCidUseNewFileChbx)==CEikButtonBase::ESet);
		CleanupStack::PopAndDestroy(); // fullName
		return ETrue;
		}
    }
