// TLBX.CPP
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//

#include <basched.h>
#include <eikenv.h>
#include <coecntrl.h>
#include <eikappui.h>
#include <e32keys.h>
#include <eikdef.h>
#include <badesca.h>
#include <eiktxlbx.h>
#include <eiktxlbm.h>
#include <eiklbx.hrh>
#include <eikmenup.h>
#include <eikmenu.hrh>
#include <eikcmds.hrh>
#include <eikgrip.h>
#include <eikdialg.h>
#include <eikapp.h>
#include <eikdoc.h>

#include <tlbx.rsg>
#include "tlbx.hrh" 

class CListBoxDlg : public CEikDialog
    {
public:
	CListBoxDlg(TInt* aItemIndex);
private: // framework
    void PreLayoutDynInitL();
    TBool OkToExitL(TInt aKeycode);
private:
    TInt* iIndexOfSelectedListBoxItem;
    };

// class CListBoxDlg

CListBoxDlg::CListBoxDlg(TInt* aItemIndex)
	{
    iIndexOfSelectedListBoxItem = aItemIndex;
	}

void CListBoxDlg::PreLayoutDynInitL()
    {
	CEikTextListBox* listbox = (CEikTextListBox*)Control(EDlgFruitLbx);
	CEikScrollBarFrame* sbFrame = listbox->CreateScrollBarFrameL();
	sbFrame->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto);
	SetListBoxCurrentItem(EDlgFruitLbx, *iIndexOfSelectedListBoxItem);
	}

TBool CListBoxDlg::OkToExitL(TInt /*aKeycode*/)
    {
	*iIndexOfSelectedListBoxItem = ListBoxCurrentItem(EDlgFruitLbx);
    return(ETrue);
    }


enum TTextListBoxModelDataSetType {ENumberNames, EFruitNames, ERecordIds, EFirstNames};

typedef TBuf<100> TInfoMsgBuffer;


class CShellListBox : public CEikSnakingTextListBox
	{
protected:
	virtual void UpdateCurrentItem(TInt aItemIndex) const;
	virtual void SizeChangedL();
	};

void CShellListBox::UpdateCurrentItem(TInt aItemIndex) const
	{
	TInt oldCurrentItemIndex = iView->CurrentItemIndex();
	if (oldCurrentItemIndex == aItemIndex)
		return;
	iView->SetCurrentItemIndex(aItemIndex);
	iView->UpdateSelectionL(CListBoxView::ESingleSelection);
	DrawItem(aItemIndex);
	}

void CShellListBox::SizeChangedL()
	{
	SetItemHeightL(iSize.iHeight/4);
	}


//
// class CTestListBoxContainer
//

class CTestListBoxContainer : public CCoeControl
    {
public:
    void ConstructL();
	~CTestListBoxContainer();
	void RunTestScript1();
	void RunTestScript2();
	void RunTestScript3();
	void RunTestScript4();
	void CreateSampleStandardListBox();
	void CreateSampleSnakingListBox();
private:
	virtual void Draw(const TRect& aRect) const;
	TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType);
	void DisplayMessage(const TDesC& aDes) const;
	void DestroyAnyExistingListBox();
	void PopulateTextListBoxModelL(CTextListBoxModel* aModel, TTextListBoxModelDataSetType aDataSetType) const;
	TInt IndexOfRandomItemInListBox(CEikListBox* aListBox) const;
	void UpdateSnakingLbxItemHeight(TInt aItemHeight);
	void UpdateSnakingLbxColWidth(TInt aColumnWidth);
private:
	CEikTextListBox* iStdLbx;
	CShellListBox* iSnakingLbx;
	CCoeControl* iFocusControl;
	TInt iSelectedIndexInDialogListBox;
	};

void CTestListBoxContainer::ConstructL()
    {
    CreateWindowL();
    Window().SetShadowDisabled(ETrue);
	Window().SetBackgroundColor(KRgbGray);
    SetExtentToWholeScreenL();
    ActivateL();
	iEikonEnv->WsSession().SetAutoFlush(ETrue);
    }

void CTestListBoxContainer::Draw(const TRect& /*aRect*/) const
	{
	iEikonEnv->FillTexturedRect(Rect());
	}

CTestListBoxContainer::~CTestListBoxContainer()
	{
	DestroyAnyExistingListBox();
	}

void CTestListBoxContainer::DisplayMessage(const TDesC& aMsg) const
	{
	User::After(1000000);
	iEikonEnv->InfoMsg(aMsg);
	User::After(1000000);
	}

void CTestListBoxContainer::DestroyAnyExistingListBox() 
	{
	delete iStdLbx;
	iStdLbx = NULL;
	delete iSnakingLbx;
	iSnakingLbx = NULL;
	iFocusControl = NULL;
	}

TKeyResponse CTestListBoxContainer::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)
    {
	if (iFocusControl)
		{
		iFocusControl->OfferKeyEventL(aKeyEvent,aType);
		return(EKeyWasConsumed);
		}
	else
		return CCoeControl::OfferKeyEventL(aKeyEvent, aType);
    }

void CTestListBoxContainer::PopulateTextListBoxModelL(CTextListBoxModel* aModel, TTextListBoxModelDataSetType aDataSetType) const
	{	
	MDesCArray* itemList = aModel->ItemTextArray();
	CDesCArray* itemArray = (CDesCArray*)itemList;
	switch (aDataSetType)
		{
	case ENumberNames:
		itemArray->AppendL(_L("zero"));
		itemArray->AppendL(_L("one"));
		itemArray->AppendL(_L("two"));
		itemArray->AppendL(_L("three"));
		itemArray->AppendL(_L("four"));
		itemArray->AppendL(_L("five"));
		itemArray->AppendL(_L("six"));
		itemArray->AppendL(_L("seven"));
		itemArray->AppendL(_L("eight"));
		itemArray->AppendL(_L("nine"));
		itemArray->AppendL(_L("ten"));
		itemArray->AppendL(_L("eleven"));
		itemArray->AppendL(_L("twelve"));
		itemArray->AppendL(_L("thirteen"));
		itemArray->AppendL(_L("fourteen"));
		itemArray->AppendL(_L("fifteen"));
		itemArray->AppendL(_L("sixteen"));
		itemArray->AppendL(_L("seventeen"));
		itemArray->AppendL(_L("eighteen"));
		itemArray->AppendL(_L("nineteen"));
		itemArray->AppendL(_L("twenty"));
		itemArray->AppendL(_L("twenty-one"));
		itemArray->AppendL(_L("twenty-two"));
		break;
	case EFruitNames:
		itemArray->AppendL(_L("apple"));
		itemArray->AppendL(_L("banana"));
		itemArray->AppendL(_L("blackberry"));
		itemArray->AppendL(_L("blueberry"));
		itemArray->AppendL(_L("cantelope"));
		itemArray->AppendL(_L("gooseberry"));
		itemArray->AppendL(_L("grape"));
		itemArray->AppendL(_L("greengage"));
		itemArray->AppendL(_L("mango"));
		itemArray->AppendL(_L("nectarine"));
		itemArray->AppendL(_L("papaya"));
		itemArray->AppendL(_L("peach"));
		itemArray->AppendL(_L("pear"));
		itemArray->AppendL(_L("pineapple"));
		itemArray->AppendL(_L("plum"));
		itemArray->AppendL(_L("rasberry"));
		itemArray->AppendL(_L("sharon"));
		itemArray->AppendL(_L("strawberry"));
		itemArray->AppendL(_L("tomato"));
		itemArray->AppendL(_L("watermelon"));
		break;
	case ERecordIds:
		itemArray->AppendL(_L("90210"));
		itemArray->AppendL(_L("90220"));
		itemArray->AppendL(_L("90230"));
		itemArray->AppendL(_L("90240"));
		itemArray->AppendL(_L("90250"));
		itemArray->AppendL(_L("90260"));
		itemArray->AppendL(_L("90270"));
		itemArray->AppendL(_L("90280"));
		itemArray->AppendL(_L("90290"));
		itemArray->AppendL(_L("90300"));
		break;
	case EFirstNames:
		itemArray->AppendL(_L("John"));
		itemArray->AppendL(_L("David"));
		itemArray->AppendL(_L("Mathew"));
		itemArray->AppendL(_L("Abraham"));
		itemArray->AppendL(_L("Joseph"));
		itemArray->AppendL(_L("Issac"));
		itemArray->AppendL(_L("Peter"));
		itemArray->AppendL(_L("Luke"));
		itemArray->AppendL(_L("Mark"));
		}
	}

TInt CTestListBoxContainer::IndexOfRandomItemInListBox(CEikListBox* aListBox) const
	{
	TInt numOfItemsInModel = aListBox->Model()->NumberOfItems();
	TInt upperLimit = numOfItemsInModel - 1;
	TTime time;
	time.HomeTime();
	TInt64 seed = time.Int64();
	// pick a random number in the range [0, upperLimit]
    seed = seed * 214013 + 2531011;
    TInt randomNum = ((seed>>16).GetTInt() & upperLimit);
	return randomNum;
	}

void CTestListBoxContainer::CreateSampleStandardListBox()
	{
	DestroyAnyExistingListBox();
	iStdLbx = new(ELeave) CEikTextListBox;
	iStdLbx->ConstructL(NULL, CEikListBox::EIncrementalMatching | CEikListBox::EMultipleSelection | CEikListBox::ENoExtendedSelection);
	iStdLbx->CreateScrollBarFrameL();
	iStdLbx->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto);
	iStdLbx->SetExtentL(TPoint(100, 60), TSize(100, 180));
	PopulateTextListBoxModelL(iStdLbx->Model(), ENumberNames);
	iStdLbx->HandleItemAdditionL();
	iStdLbx->ActivateL();
	iStdLbx->DrawNow();
    iFocusControl = iStdLbx;
    iFocusControl->SetFocus(ETrue, EDrawNow);
	}

void CTestListBoxContainer::CreateSampleSnakingListBox()
	{
	DestroyAnyExistingListBox();
	iSnakingLbx = new(ELeave) CShellListBox;
	iSnakingLbx->ConstructL(NULL, CEikListBox::EMultipleSelection);
	TInt columnWidth = 110;
	iSnakingLbx->CreateScrollBarFrameL();
	iSnakingLbx->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOn, CEikScrollBarFrame::EOff);
	TPoint listBoxPos(100, 100);
	TSize listBoxSize(3 * columnWidth + 10, 115);
	iSnakingLbx->SetExtentL(listBoxPos, listBoxSize);
	iSnakingLbx->SetColumnWidth(columnWidth);
	PopulateTextListBoxModelL(iSnakingLbx->Model(), ENumberNames);
	iSnakingLbx->HandleItemAdditionL();
	// iSnakingLbx->ScrollBarFrame()->DrawScrollBarsNow();
	iSnakingLbx->ActivateL();
	iSnakingLbx->DrawNow();
	// iSnakingLbx->ScrollBarFrame()->DrawScrollBarsNow();
    iFocusControl = iSnakingLbx;
    iFocusControl->SetFocus(ETrue, EDrawNow);
	}

void CTestListBoxContainer::RunTestScript1()
	{
	DestroyAnyExistingListBox();
	DisplayMessage(_L("Starting script 1 (tests listbox use in dialogs)"));
    CEikDialog* dialog = new(ELeave) CListBoxDlg(&iSelectedIndexInDialogListBox);
    dialog->ExecuteLD(R_TLBX_LBX_DLG);
	DisplayMessage(_L("Script 1 completed."));
	}

void CTestListBoxContainer::RunTestScript2()
	{
	DestroyAnyExistingListBox();
	DisplayMessage(_L("Starting script 2 (simulates listbox use by Data app)"));
	DisplayMessage(_L("Creating a single-selection text listbox"));
	iStdLbx = new(ELeave) CEikTextListBox;
	iStdLbx->ConstructL(NULL, 0);
	DisplayMessage(_L("Adding a vertical scrollbar to listbox"));
	iStdLbx->CreateScrollBarFrameL();
	iStdLbx->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto);
	DisplayMessage(_L("Setting the listbox's extent"));
	iStdLbx->SetExtentL(TPoint(100, 100), TSize(100, 100));
	DisplayMessage(_L("Filling the listbox model with data"));
	PopulateTextListBoxModelL(iStdLbx->Model(), ERecordIds);
	DisplayMessage(_L("telling listbox that items have been added to its model"));
	iStdLbx->HandleItemAdditionL();
	iStdLbx->ScrollBarFrame()->DrawScrollBarsNow();
	// iEikonEnv->Flush();
	DisplayMessage(_L("activating the listbox and drawing it"));
	iStdLbx->ActivateL();
	iStdLbx->DrawNow();
	iStdLbx->ScrollBarFrame()->DrawScrollBarsNow();
	// iEikonEnv->Flush();
	DisplayMessage(_L("giving the focus to the listbox"));
    iFocusControl = iStdLbx;
    iFocusControl->SetFocus(ETrue, EDrawNow);
	// iEikonEnv->Flush();
	DisplayMessage(_L("appending the id 2000000 to the listbox model"));
	MDesCArray* itemList = iStdLbx->Model()->ItemTextArray();
	CDesCArray* itemArray = (CDesCArray*)itemList;
	itemArray->AppendL(_L("2000000"));
	iStdLbx->HandleItemAdditionL();
	iStdLbx->ScrollBarFrame()->DrawScrollBarsNow();
	// iEikonEnv->Flush();
	DisplayMessage(_L("Setting current item to be the last item in model and drawing it"));
	TInt lastItemIndex = iStdLbx->Model()->NumberOfItems() - 1;
	iStdLbx->SetCurrentItemIndexAndDraw(lastItemIndex);
	// iEikonEnv->Flush();
	DisplayMessage(_L("choosing an item to remove at random"));
	TInt indexOfItemToRemove = IndexOfRandomItemInListBox(iStdLbx);
	TInt indexOfNewCurrentItem;
	if (indexOfItemToRemove == lastItemIndex)
		indexOfNewCurrentItem = lastItemIndex - 1;
	else
		indexOfNewCurrentItem = indexOfItemToRemove;
    TInfoMsgBuffer msgBuffer;
    msgBuffer.Format(_L("Removing item %d and reseting listbox's state"), indexOfItemToRemove);
	DisplayMessage(msgBuffer);
	itemArray->Delete(indexOfItemToRemove);
	iStdLbx->Reset();
	msgBuffer.Format(_L("Setting current item index to %d"), indexOfNewCurrentItem);
	DisplayMessage(msgBuffer);
	iStdLbx->SetCurrentItemIndex(indexOfNewCurrentItem);
	DisplayMessage(_L("updating listbox scrollbars and redrawing listbox"));
	iStdLbx->UpdateScrollBarsL();
	iStdLbx->ScrollToMakeItemVisible(indexOfNewCurrentItem);
	iStdLbx->DrawNow();
	iStdLbx->ScrollBarFrame()->DrawScrollBarsNow();
	// iEikonEnv->Flush();
	DisplayMessage(_L("Removing all items from model and reseting listbox's state"));
	itemArray->Reset();
	iStdLbx->Reset();
	DisplayMessage(_L("updating listbox scrollbars and redrawing listbox"));
	iStdLbx->UpdateScrollBarsL();
	iStdLbx->DrawNow();
	iStdLbx->ScrollBarFrame()->DrawScrollBarsNow();
	// iEikonEnv->Flush();
	DisplayMessage(_L("populating listbox model with new data and notifying listbox"));
	PopulateTextListBoxModelL(iStdLbx->Model(), EFirstNames);
	iStdLbx->HandleItemAdditionL();
	iStdLbx->ScrollBarFrame()->DrawScrollBarsNow();
	// iEikonEnv->Flush();
	DisplayMessage(_L("Script 2 completed."));
	}

void CTestListBoxContainer::UpdateSnakingLbxItemHeight(TInt aItemHeight)
	{
	iSnakingLbx->SetItemHeightL(aItemHeight);
	iSnakingLbx->UpdateScrollBarsL();
	iSnakingLbx->DrawNow();
	iSnakingLbx->ScrollToMakeItemVisible(iSnakingLbx->CurrentItemIndex());
	iSnakingLbx->ScrollBarFrame()->DrawScrollBarsNow();
	User::After(200000);
	}

void CTestListBoxContainer::UpdateSnakingLbxColWidth(TInt aColumnWidth)
	{
	iSnakingLbx->SetColumnWidth(aColumnWidth);
	iSnakingLbx->UpdateScrollBarsL();
	iSnakingLbx->DrawNow();
	iSnakingLbx->ScrollToMakeItemVisible(iSnakingLbx->CurrentItemIndex());
	iSnakingLbx->ScrollBarFrame()->DrawScrollBarsNow();
	User::After(200000);
	}

void CTestListBoxContainer::RunTestScript3()
	{
	DestroyAnyExistingListBox();
	TInt i;	// loop index
	DisplayMessage(_L("Starting script 3 (simulates snaking listbox use by the Shell)"));
	DisplayMessage(_L("Creating a multi-selection, snaking text listbox"));
	iSnakingLbx = new(ELeave) CShellListBox;
	iSnakingLbx->ConstructL(NULL, EEikListBoxMultipleSelection);
	DisplayMessage(_L("Adding an automatic horizontal scrollbar to listbox"));
	iSnakingLbx->CreateScrollBarFrameL();
	iSnakingLbx->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EAuto, CEikScrollBarFrame::EOff);
	DisplayMessage(_L("Setting the listbox's extent"));
	TPoint listBoxPos(100, 15);
	TInt columnWidth = 170;
	TSize listBoxSize(2 * columnWidth + 10, 75);
	iSnakingLbx->SetExtentL(listBoxPos, listBoxSize);
	DisplayMessage(_L("Setting the column width to 170 pixels"));
	iSnakingLbx->SetColumnWidth(columnWidth);
	DisplayMessage(_L("Filling the listbox model with data"));
	PopulateTextListBoxModelL(iSnakingLbx->Model(), ENumberNames);
	DisplayMessage(_L("telling listbox that items have been added to its model"));
	iSnakingLbx->HandleItemAdditionL();
	iSnakingLbx->ScrollBarFrame()->DrawScrollBarsNow();
	DisplayMessage(_L("activating the listbox and drawing it"));
	iSnakingLbx->ActivateL();
	iSnakingLbx->DrawNow();
	iSnakingLbx->ScrollBarFrame()->DrawScrollBarsNow();
	DisplayMessage(_L("giving the focus to the listbox"));
    iFocusControl = iSnakingLbx;
    iFocusControl->SetFocus(ETrue, EDrawNow);

	DisplayMessage(_L("increasing listbox height in a loop (in steps of 20)"));
	TInt listBoxHeight = listBoxSize.iHeight;
	for (i = 1; i < 4; i++)
		{
		listBoxHeight += i * 20;
		iSnakingLbx->SetExtentL(listBoxPos, TSize(listBoxSize.iWidth, listBoxHeight));
		iSnakingLbx->DrawNow();
		iSnakingLbx->ScrollBarFrame()->DrawScrollBarsNow();
		User::After(2000000);
		}

	DisplayMessage(_L("resizing listbox back to its original size"));
	iSnakingLbx->SetExtentL(listBoxPos, listBoxSize);
	iSnakingLbx->DrawNow();
	iSnakingLbx->ScrollBarFrame()->DrawScrollBarsNow();

	// assume that two columns and three rows are visible at this size
	// assume that there are 23 items in the model
	// assume top & current item indexes are both 0
	DisplayMessage(_L("making item 22 current/selected & drawing it"));
	iSnakingLbx->SetCurrentItemIndexAndDraw(22);
	DisplayMessage(_L("making item 5 current/selected & drawing it"));
	iSnakingLbx->SetCurrentItemIndexAndDraw(5);
	DisplayMessage(_L("making item 19 current/selected & drawing it"));
	iSnakingLbx->SetCurrentItemIndexAndDraw(19);
	DisplayMessage(_L("making item 0 current/selected & drawing it"));
	iSnakingLbx->SetCurrentItemIndexAndDraw(0);
	DisplayMessage(_L("making item 18 current/selected & drawing it"));
	iSnakingLbx->SetCurrentItemIndexAndDraw(18);
	DisplayMessage(_L("making item 8 current/selected & drawing it"));
	iSnakingLbx->SetCurrentItemIndexAndDraw(8);

	DisplayMessage(_L("setting item height to 20"));
	UpdateSnakingLbxItemHeight(20);

	DisplayMessage(_L("increasing item height in a loop (in steps of 5)"));
	TInt itemHeight = iSnakingLbx->ItemHeight();
	for (i = 1; i < 10; i++)
		{
		itemHeight += 5;
		if (itemHeight > iSnakingLbx->View()->ViewRect().Height())
			if (! iEikonEnv->QueryWinL(_L("setting item height to an invalid value will cause panic."), _L("Is it OK to continue?")))
				break;
		UpdateSnakingLbxItemHeight(itemHeight);
		}

	DisplayMessage(_L("setting item height to 20"));
	UpdateSnakingLbxItemHeight(20);

	DisplayMessage(_L("decreasing item height in a loop (in steps of 5)"));
	for (i = 1; i < 50; i++)
		{
		itemHeight -= 5;
		if (itemHeight <= 0)
			if (! iEikonEnv->QueryWinL(_L("setting item height to an invalid value will cause panic."), _L("Is it OK to continue?")))
				break;
		UpdateSnakingLbxItemHeight(itemHeight);
		}

	DisplayMessage(_L("setting item height to 20"));
	UpdateSnakingLbxItemHeight(20);

	DisplayMessage(_L("decreasing column width in a loop (in steps of 10)"));
	for (i = 1; i < 25; i++)
		{
		columnWidth -= 10;
		if ((columnWidth <= 0) || (columnWidth > iSnakingLbx->View()->ViewRect().Width()))
			if (! iEikonEnv->QueryWinL(_L("setting col width to invalid value will cause panic."), _L("Is it OK to continue?")))
				break;
		UpdateSnakingLbxColWidth(columnWidth);
		}

	DisplayMessage(_L("setting column width to 50"));
	UpdateSnakingLbxColWidth(50);

	DisplayMessage(_L("increasing column width in a loop (in steps of 10)"));
	for (i = 1; i < 50; i++)
		{
		columnWidth += 10;
		if ((columnWidth <= 0) || (columnWidth > iSnakingLbx->View()->ViewRect().Width()))
			if (! iEikonEnv->QueryWinL(_L("setting col width to invalid value will cause panic."), _L("Is it OK to continue?")))
				break;
		UpdateSnakingLbxColWidth(columnWidth);
		}

	DisplayMessage(_L("setting column width to 130"));
	UpdateSnakingLbxColWidth(130);

	DisplayMessage(_L("Script 3 completed."));
	}

void CTestListBoxContainer::RunTestScript4()
	{
	DestroyAnyExistingListBox();
	DisplayMessage(_L("Starting script 4 (regression test for SetItemHeightL & SetColumnWidth)"));
	iSnakingLbx = new(ELeave) CShellListBox;
	iSnakingLbx->ConstructL(NULL, EEikListBoxMultipleSelection);
	iSnakingLbx->CreateScrollBarFrameL();
	iSnakingLbx->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EAuto, CEikScrollBarFrame::EOff);
	TPoint listBoxPos(100, 15);
	TInt columnWidth = 170;
	TSize listBoxSize(2 * columnWidth + 10, 65);
	iSnakingLbx->SetItemHeightL(50);
	iSnakingLbx->SetColumnWidth(1000);
	iSnakingLbx->DrawNow();
	iSnakingLbx->SetExtentL(listBoxPos, listBoxSize);
	iSnakingLbx->SetColumnWidth(columnWidth);
	PopulateTextListBoxModelL(iSnakingLbx->Model(), ENumberNames);
	iSnakingLbx->HandleItemAdditionL();
	iSnakingLbx->ActivateL();
	iSnakingLbx->DrawNow();
	iSnakingLbx->ScrollBarFrame()->DrawScrollBarsNow();
	DisplayMessage(_L("giving the focus to the listbox"));
    iFocusControl = iSnakingLbx;
    iFocusControl->SetFocus(ETrue, EDrawNow);
	DisplayMessage(_L("making item 18 current/selected & drawing it"));
	iSnakingLbx->SetCurrentItemIndexAndDraw(18);
	DisplayMessage(_L("Script 4 completed."));
	}


//
// CSimpleAppUi
//

class CSimpleAppUi : public CEikAppUi
    {
public:
    void ConstructL();
	~CSimpleAppUi();
private: // framework
    void HandleCommandL(TInt aCommand);
private:
    CTestListBoxContainer* iTestListBoxContainer;
    };

void CSimpleAppUi::ConstructL()
    {
    BaseConstructL();
    iTestListBoxContainer=new(ELeave) CTestListBoxContainer;
    iTestListBoxContainer->ConstructL();
    AddToStackL(iTestListBoxContainer);
    }

CSimpleAppUi::~CSimpleAppUi()
	{
    delete iTestListBoxContainer;
	}


void CSimpleAppUi::HandleCommandL(TInt aCommand)
    {
    switch (aCommand)
        {
    case EEikCmdExit:
        CBaActiveScheduler::Exit();
		break;
	case EManualStdLbxTst:
		iTestListBoxContainer->CreateSampleStandardListBox();
		break;
	case EManualMcLbxTst:
		iTestListBoxContainer->CreateSampleSnakingListBox();
		break;
	case ERunTestScript1:
		iTestListBoxContainer->RunTestScript1();
		break;
	case ERunTestScript2:
		iTestListBoxContainer->RunTestScript2();
		break;
	case ERunTestScript3:
		iTestListBoxContainer->RunTestScript3();
		break;
	case ERunTestScript4:
		iTestListBoxContainer->RunTestScript4();
		break;
    default:
		iEikonEnv->InfoMsg(_L("Sorry! Not Implemented yet..."));
        break;
        }
    }

//
// 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={204};

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);
	}
