// TLBOX1.CPP
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//

#include <basched.h>
#include <coecntrl.h>
#include <eikenv.h>
#include <eikappui.h>
#include <eikfbrow.h>
#include <eikdtlbx.h>
#include <eikdtlbm.h>
#include <eikdclbx.h>
#include <eikdclbm.h>
#include <eikdialg.h>
#include <eikmenup.h>
#include <eikmenu.hrh>
#include <eikcmds.hrh>
#include <eikapp.h>
#include <eikdoc.h>
#include <eikon.rsg>
#include <tlbox1.rsg>
#include "tlbox1.hrh"

//
// class CExtentDialog
//

class CExtentDialog : public CEikDialog
	{
public:
	CExtentDialog(TPoint& aPos,TSize& aSize);
private: // framework
	void PreLayoutDynInitL();
	TBool OkToExitL(TInt aButtonId);
private:
	TPoint& iBrowPos;
	TSize& iBrowSize;
	};

CExtentDialog::CExtentDialog(TPoint& aPos,TSize& aSize)
	: iBrowPos(aPos), iBrowSize(aSize)
	{}

void CExtentDialog::PreLayoutDynInitL()
	{
	SetNumberEditorValue(ExPos,iBrowPos.iX);
	SetNumberEditorValue(EyPos,iBrowPos.iY);
	SetNumberEditorValue(EWidth,iBrowSize.iWidth);
	SetNumberEditorValue(EHeight,iBrowSize.iHeight);
	}

TBool CExtentDialog::OkToExitL(TInt /*aButtonId*/)
	{
	iBrowPos.iX=NumberEditorValue(ExPos);
	iBrowPos.iY=NumberEditorValue(EyPos);
	iBrowSize.iWidth=NumberEditorValue(EWidth);
	iBrowSize.iHeight=NumberEditorValue(EHeight);
	return ETrue;
	}

//
// CFlagsDialog
//

class CFlagsDialog : public CEikDialog
	{
public:
	CFlagsDialog(TBool& aHideRom,TBool& aAllowFolderCreation);
private: // from CEikDialog
	void PreLayoutDynInitL();
	TBool OkToExitL(TInt aButtonId);
private:
	TBool& iHideRom;
	TBool& iAllowFolderCreation;
	};

CFlagsDialog::CFlagsDialog(TBool& aHideRom,TBool& aAllowFolderCreation)
	: iHideRom(aHideRom),
	iAllowFolderCreation(aAllowFolderCreation)
	{}

void CFlagsDialog::PreLayoutDynInitL()
	{
	CEikButtonBase::TState state=(iHideRom? CEikButtonBase::ESet : CEikButtonBase::EClear);
	SetCheckBoxState(ECidHideRom,state);
	state=(iAllowFolderCreation? CEikButtonBase::ESet : CEikButtonBase::EClear);
	SetCheckBoxState(ECidAllowNewFolders,state);
	}

TBool CFlagsDialog::OkToExitL(TInt /*aButtonId*/)
	{
	iHideRom=CheckBoxState(ECidHideRom)==CEikButtonBase::ESet;
	iAllowFolderCreation=CheckBoxState(ECidAllowNewFolders)==CEikButtonBase::ESet;
	return ETrue;
	}


//
// class CSimpleControl
//

class CSimpleControl : public CCoeControl
    {
public:
	~CSimpleControl();
    void ConstructL(const TRect& aRect);
	void HandleCommandL(TInt aCommand);
	void DynInitMenuPaneL(TInt aMenuId,CEikMenuPane* aMenuPane);
private: // from CCoeControl
	TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType);
	TInt CountComponentControls() const;
	CCoeControl* ComponentControl(TInt aIndex) const;
	void FocusChanged(TDrawNow aDrawNow);
private:
	void LaunchBrowserDialogL();
	void CreateFileBrowserL();
private:
	CEikFileBrowser* iFileBrowser;
	TUint iDialogFlags;
	CDirContentsListBoxModel::TSortOrder iSortOrder;
    };

CSimpleControl::~CSimpleControl()
	{
	delete iFileBrowser;
	}

void CSimpleControl::ConstructL(const TRect& aRect)
    {
    CreateWindowL();
    Window().SetShadowDisabled(ETrue);
	SetRectL(aRect);
	CreateFileBrowserL();
    ActivateL();
    }

void CSimpleControl::HandleCommandL(TInt aCommand)
	{
	switch (aCommand)
		{
	case EAppCmdDlg:
		LaunchBrowserDialogL();
		break;
	case EAppCmdDlgFlags:
		{
		TBool hideRom=iDialogFlags&CEikFileBrowser::EHideRom;
		TBool createFolders=iDialogFlags&CEikFileBrowserDialog::EAllowFolderCreation;
		CFlagsDialog* dialog=new(ELeave) CFlagsDialog(hideRom,createFolders);
		if (dialog->ExecuteLD(R_TLBOX1_FLAGS_DIALOG))
			{
			iDialogFlags&=~(CEikFileBrowser::EHideRom|CEikFileBrowserDialog::EAllowFolderCreation);
			if (hideRom)
				iDialogFlags|=CEikFileBrowser::EHideRom;
			if (createFolders)
				iDialogFlags|=CEikFileBrowserDialog::EAllowFolderCreation;
			}
		break;
		}
	case EAppCmdContExtent:
		{
		TPoint pos=iFileBrowser->Position();
		TSize size=iFileBrowser->Size();
		CEikDialog* dlg=new(ELeave) CExtentDialog(pos,size);
		if (dlg->ExecuteLD(R_TLBOX1_EXTENT_DLG))
			{
			iFileBrowser->SetExtentL(pos,size);
			iFileBrowser->DrawNow();
			}
		break;
		}
	case EAppCmdContExpand:
		iFileBrowser->DirTreeList()->DtlModel()->ExpandAllItemsL();
		iFileBrowser->DirTreeList()->View()->CalcBottomItemIndex();
		iFileBrowser->DirTreeList()->ScrollToMakeItemVisible(iFileBrowser->DirTreeList()->CurrentItemIndex());
		iFileBrowser->DirTreeList()->UpdateScrollBarsL();
		iFileBrowser->DirTreeList()->DrawNow();
		break;
	case EAppCmdContCollapse:
		{
		iFileBrowser->DirTreeList()->DtlModel()->CollapseAllItems();
		iFileBrowser->DirTreeList()->View()->CalcBottomItemIndex();
		iFileBrowser->DirTreeList()->SetCurrentItemIndex(0);
		iFileBrowser->DirTreeList()->SetTopItemIndex(0);
		iFileBrowser->DirTreeList()->ScrollToMakeItemVisible(iFileBrowser->DirTreeList()->CurrentItemIndex());
		iFileBrowser->DirTreeList()->UpdateScrollBarsL();
		iFileBrowser->DirTreeList()->DrawNow();
		break;
		}
	case EAppCmdSortAscending:
		iFileBrowser->DirContentsList()->DclModel()->SetSortAscending(ETrue);
		iFileBrowser->DirContentsList()->UpdateL();
		iFileBrowser->DirContentsList()->UpdateScrollBarsL();
		iFileBrowser->DirContentsList()->DrawNow();
		break;
	case EAppCmdSortDescending:
		iFileBrowser->DirContentsList()->DclModel()->SetSortAscending(EFalse);
		iFileBrowser->DirContentsList()->UpdateL();
		iFileBrowser->DirContentsList()->UpdateScrollBarsL();
		iFileBrowser->DirContentsList()->DrawNow();
		break;
	case EAppCmdIncludeUids:
		iFileBrowser->DirContentsList()->DclModel()->SetAllowUid(ETrue);
		break;
	case EAppCmdNoUids:
		iFileBrowser->DirContentsList()->DclModel()->SetAllowUid(EFalse);
		break;
	case EAppCmdSingleF32Connection:
		{
		RFs fs;
		RDebug::ProfileReset(8,1);
		RDebug::ProfileStart(8);
		User::LeaveIfError(fs.Connect());
		RDebug::ProfileEnd(8);
		TProfile profile;
		RDebug::ProfileResult(&profile,8,1);
		TBuf<32> tmp;
		tmp.Format(_L("Connection time: %d ms"),profile.iTime/1000);
		iEikonEnv->InfoMsg(tmp);
		fs.Close();
		}
		break;
	case EAppCmdMultiF32Connections:
		{
		RFs fs[5];
		RDebug::ProfileReset(8,1);
		RDebug::ProfileStart(8);
		for (TInt ii=0;ii<5;ii++)
			{
			const TInt ret=fs[ii].Connect();
			if (ret!=KErrNone)
				{
				TInt count=ii;
				while(count)
					fs[--count].Close();
				User::Leave(ret);
				}
			}
		RDebug::ProfileEnd(8);
		TProfile profile;
		RDebug::ProfileResult(&profile,8,1);
		TBuf<32> tmp;
		tmp.Format(_L("Avg connection time: %d ms"),profile.iTime/5000);
		iEikonEnv->InfoMsg(tmp);
		for (TInt jj=0;jj<5;jj++)
			fs[jj].Close();
		}
		break;
	case EAppCmdUpdate:
		iFileBrowser->UpdateL();
		break;
	case EAppCmdShowSystem:
		if (iDialogFlags&CEikFileBrowser::EShowSystem)
			iDialogFlags&=~CEikFileBrowser::EShowSystem;
		else
			iDialogFlags|=CEikFileBrowser::EShowSystem;
		break;
	case EAppCmdShowHidden:
		if (iDialogFlags&CEikFileBrowser::EShowHidden)
			iDialogFlags&=~CEikFileBrowser::EShowHidden;
		else
			iDialogFlags|=CEikFileBrowser::EShowHidden;
		break;
	case EAppCmdSortName:
		iSortOrder=CDirContentsListBoxModel::EOrderByName;
		break;
	case EAppCmdSortType:
		iSortOrder=CDirContentsListBoxModel::EOrderBySize;
		break;
	case EAppCmdSortSize:
		iSortOrder=CDirContentsListBoxModel::EOrderByDate;
		break;
	case EAppCmdSortDate:
		iSortOrder=CDirContentsListBoxModel::EOrderByType;
		break;
	case EAppCmdSimulateError:
		iFileBrowser->HandleErrorFromFileServerL(KErrArgument);
		break;
		}
	}

void CSimpleControl::DynInitMenuPaneL(TInt aMenuId,CEikMenuPane* aMenuPane)
	{
	switch (aMenuId)
		{
	case R_TLBOX1_CASCADE_SORT:
		{
		TInt id=0;
		switch (iSortOrder)
			{
		case CDirContentsListBoxModel::EOrderByName:
			id=EAppCmdSortName;
			break;
		case CDirContentsListBoxModel::EOrderByType:
			id=EAppCmdSortType;
			break;
		case CDirContentsListBoxModel::EOrderBySize:
			id=EAppCmdSortSize;
			break;
		case CDirContentsListBoxModel::EOrderByDate:
			id=EAppCmdSortDate;
			break;
			}
		aMenuPane->SetItemButtonState(id,EEikMenuItemSymbolOn);
		break;
		}
	default:
		break;
		}
	}
	
void CSimpleControl::CreateFileBrowserL()
	{
	iFileBrowser=new(ELeave) CEikFileBrowser(_L("C:\\"));
	iFileBrowser->ConstructL(CEikFileBrowser::EOwnsWindow,8,175,265);
	iFileBrowser->SetExtentL(TPoint(0,0),Size());
	}

TInt CSimpleControl::CountComponentControls() const
	{
	return 1;
	}

CCoeControl* CSimpleControl::ComponentControl(TInt aIndex) const
	{
	if (!aIndex)
		return iFileBrowser;
	return NULL;
	}

void CSimpleControl::FocusChanged(TDrawNow aDrawNow)
	{
	if (iFileBrowser)
		iFileBrowser->SetFocus(IsFocused(),aDrawNow);
	}

void CSimpleControl::LaunchBrowserDialogL()
	{
	TFileName path=iFileBrowser->CurrentPath();
	CEikFileBrowserDialog* dialog=new(ELeave) CEikFileBrowserDialog(path,iDialogFlags,iSortOrder);
	if (dialog->ExecuteLD(R_EIK_DIALOG_FILE_BROWSE))
		{
		iFileBrowser->SetCurrentPathL(path);
		iFileBrowser->DrawNow();
		}
	}

TKeyResponse CSimpleControl::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)
    {
	if (aKeyEvent.iCode==CTRL('e'))
		CBaActiveScheduler::Exit();
	return iFileBrowser->OfferKeyEventL(aKeyEvent, aType);
    }

//
// CSimpleAppUi
//

class CSimpleAppUi : public CEikAppUi
    {
public:
    void ConstructL();
	~CSimpleAppUi();
private: // framework
	void HandleCommandL(TInt aComand);
	void DynInitMenuPaneL(TInt aMenuId,CEikMenuPane* aMenuPane);
private:
    CSimpleControl* iSimpleControl;
    };

CSimpleAppUi::~CSimpleAppUi()
	{
    delete iSimpleControl;
	}

void CSimpleAppUi::ConstructL()
    {
    BaseConstructL();
    iSimpleControl=new(ELeave) CSimpleControl;
    iSimpleControl->ConstructL(ClientRect());
    AddToStackL(iSimpleControl);
    iSimpleControl->SetFocus(ETrue);
	}

void CSimpleAppUi::HandleCommandL(TInt aCommand)
	{
	if (aCommand==EEikCmdExit)
		CBaActiveScheduler::Exit();
	else
		iSimpleControl->HandleCommandL(aCommand);
	}

void CSimpleAppUi::DynInitMenuPaneL(TInt aMenuId,CEikMenuPane* aMenuPane)
	{
	iSimpleControl->DynInitMenuPaneL(aMenuId,aMenuPane);
	}


//
// CSimpleDocument
//

class CSimpleDocument : public CEikDocument
	{
public:
	CSimpleDocument(CEikApplication& aApp): CEikDocument(aApp) { }
private: // from CApaDocument
	CEikAppUi* CreateAppUiL();
	};

CEikAppUi* CSimpleDocument::CreateAppUiL()
	{
    return(new(ELeave) CSimpleAppUi);
	}

//
// CSimpleApplication
//

class CSimpleApplication : public CEikApplication
	{
private: // from CApaApplication
	CApaDocument* CreateDocumentL();
	TUid AppDllUid() const;
	};

const TUid KUidSimpleApp={206};

TUid CSimpleApplication::AppDllUid() const
	{
	return(KUidSimpleApp);
	}

CApaDocument* CSimpleApplication::CreateDocumentL()
	{
	return(new(ELeave) CSimpleDocument(*this));
	}

//
// EXPORTed functions
//

EXPORT_C CApaApplication* NewApplication()
	{
	return(new CSimpleApplication);
	}

GLDEF_C TInt E32Dll(TDllReason)
	{
	return(KErrNone);
	}
