diff -r 000000000000 -r a41df078684a kerneltest/f32test/bench/t_select.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/f32test/bench/t_select.cpp Mon Oct 19 15:55:17 2009 +0100 @@ -0,0 +1,296 @@ +// Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// f32test\bench\t_select.cpp +// +// + +#include +#include +#include "t_select.h" +// +LOCAL_D const TInt KArrayGranularity=16; +LOCAL_D const TInt KDriveSelector=0; + +CSelectionBox* CSelectionBox::NewL(CConsoleBase* aConsole) +// +// Create a CSelection box +// + { + + CSelectionBox* selBox=new(ELeave) CSelectionBox; + CleanupStack::PushL(selBox); + selBox->iText=new(ELeave) CArrayFixFlat(KArrayGranularity); + TSelBoxEntry firstEntry; + firstEntry.iText=_L("Exit").AllocL(); + CleanupStack::PushL(firstEntry.iText); + selBox->iText->InsertL(0,firstEntry); + CleanupStack::Pop(2); + selBox->iConsole=aConsole; + return(selBox); + } + +CSelectionBox::~CSelectionBox() +// +// Destructor +// + { + + if (iText==NULL) + return; + TInt count=iText->Count(); + while (count--) + User::Free((*iText)[count].iText); + delete iText; + } + +void CSelectionBox::AddLineL(const TDesC& aText,const TCallBack& aCallBack) +// +// Add a line to be displayed +// + { + + TSelBoxEntry entry; + entry.iText=aText.AllocL(); + CleanupStack::PushL(entry.iText); + entry.iCallBack=aCallBack; + iText->InsertL(iText->Count()-1,entry); + CleanupStack::Pop(); + } + +void CSelectionBox::ReplaceTextL(TInt aLine,const TDesC& aText) +// +// Replace text at aLine +// + { + + TSelBoxEntry& entry=(*iText)[aLine]; + User::Free(entry.iText); + entry.iText=aText.AllocL(); + } + +void CSelectionBox::Display() +// +// Display the box +// + { + iConsole->ClearScreen(); + + TSize size=iConsole->ScreenSize(); + TInt widestLine=0; + TInt items=iText->Count(); + + TInt count=items; + while (count--) + widestLine=Max(widestLine,(*iText)[count].iText->Length()); + + iTopLeft=TPoint((size.iWidth-widestLine)/2,(size.iHeight-items)/2-2); + TInt downOffset=iTopLeft.iY; + + for (count=0;countSetCursorPosAbs(TPoint(iTopLeft.iX,downOffset)); + iConsole->Printf(_L("%S"),(*iText)[count].iText); + downOffset++; + } + + iConsole->SetCursorPosAbs(TPoint(iTopLeft.iX-1,iTopLeft.iY+iHighLight)); + } + +void CSelectionBox::DisplayHighLight(TBool aOn) +// +// Draw aHighLight to the left of aLine +// + { + + TBuf<1> cursor(1); + cursor[0]=(TUint8)((aOn) ? 16 : 32); + iConsole->SetCursorPosAbs(TPoint(iTopLeft.iX-2,iTopLeft.iY+iHighLight)); + iConsole->Printf(_L("%S"),&cursor); + } + +TChar CSelectionBox::CurrentKeyPress() + {return(iChar);} + +TInt CSelectionBox::CurrentDrive() + {return(iCurrentDrive);} + +TBool CSelectionBox::MediaPresent(TInt aDrive) +// +// Return ETrue if a media is present in aDrive +// + { + + TDriveInfo driveInfo; + iFs.Drive(driveInfo,aDrive); + if (driveInfo.iType!=EMediaNotPresent) + return(ETrue); + return(EFalse); + } + +TInt CSelectionBox::NextDrive(TInt aDrive) +// +// Find the next drive in the driveList +// + { + + for(TInt i=aDrive+1;i<=EDriveZ;i++) + { + if (iDriveList[i]!=0 && MediaPresent(i)) + return(i); + } + return(aDrive); + } + +TInt CSelectionBox::PreviousDrive(TInt aDrive) +// +// Find the next drive in the driveList +// + { + + for (TInt i=aDrive-1;i>=0;i--) + { + if (iDriveList[i]!=0 && MediaPresent(i)) + return(i); + } + return(aDrive); + } + +void CSelectionBox::SetDriveName() +// +// Set the drive name +// + { + + TBuf<16> driveName; + if (PreviousDrive(iCurrentDrive)!=iCurrentDrive) + driveName+=_L("<-"); + driveName+=_L("Drive "); + driveName.Append('A'+iCurrentDrive); + driveName.Append(':'); + if (NextDrive(iCurrentDrive)!=iCurrentDrive) + driveName+=_L("->"); + while (driveName.Length()<12) + driveName+=_L(" "); + (*iText)[0].iText->Des()=driveName; + } + +void CSelectionBox::DisplayDrive() +// +// Display the drive +// + { + + iConsole->SetCursorPosAbs(iTopLeft); + iConsole->Printf(_L("%S"),(*iText)[0].iText); + iConsole->SetCursorPosAbs(TPoint(iTopLeft.iX-1,iTopLeft.iY)); + } + +GLDEF_C TInt ChangeDrives(TAny* aSelector) +// +// Move to next drive if it is mounted +// + { + CSelectionBox& selBox=*(CSelectionBox*)aSelector; + TChar key=selBox.CurrentKeyPress(); + TInt drive=selBox.iCurrentDrive; + if (key==EKeyLeftArrow) + drive=selBox.PreviousDrive(selBox.iCurrentDrive); + else if (key==EKeyRightArrow) + drive=selBox.NextDrive(selBox.iCurrentDrive); + selBox.iCurrentDrive=drive; + selBox.SetDriveName(); + selBox.DisplayDrive(); + return(KErrNone); + } + +void CSelectionBox::AddDriveSelectorL(RFs aFs) +// +// Add a drive selector to the list +// + { + + if (iDriveSelectorPresent) + return; + iDriveSelectorPresent=ETrue; + iFs=aFs; + iFs.DriveList(iDriveList); + iCurrentDrive=EDriveC; + TSelBoxEntry entry; + entry.iText=_L("<-Drive X:->").AllocL(); + CleanupStack::PushL(entry.iText); + entry.iCallBack=TCallBack(ChangeDrives,this); + iText->InsertL(0,entry); + CleanupStack::Pop(); + SetDriveName(); + } + +void CSelectionBox::Run() +// +// Display the box and handle keypresses +// + { + + Display(); + + FOREVER + { + iChar=iConsole->Getch(); + switch (iChar) + { + case EKeyEscape: + return; + case EKeyHome: + DisplayHighLight(EFalse); + iHighLight=KDriveSelector; + DisplayHighLight(ETrue); + break; + case EKeyLeftArrow: + (*iText)[iHighLight].iCallBack.CallBack(); + break; + case EKeyRightArrow: + (*iText)[iHighLight].iCallBack.CallBack(); + break; + case EKeyUpArrow: + if (iHighLight) + { + DisplayHighLight(EFalse); + iHighLight--; + DisplayHighLight(ETrue); + } + break; + case EKeyDownArrow: + if (iHighLight+1Count()) + { + DisplayHighLight(EFalse); + iHighLight++; + DisplayHighLight(ETrue); + } + break; + case EKeyEnter: + if (iHighLight+1==iText->Count()) + return; + if (iHighLight==KDriveSelector && iDriveSelectorPresent) + break; + iConsole->ClearScreen(); + (*iText)[iHighLight].iCallBack.CallBack(); + Display(); + break; + default: + break; + } + } + } +