--- /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 <f32file.h>
+#include <e32test.h>
+#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<TSelBoxEntry>(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;count<items;count++)
+ {
+ if (count==iHighLight)
+ DisplayHighLight(ETrue);
+ iConsole->SetCursorPosAbs(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+1<iText->Count())
+ {
+ 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;
+ }
+ }
+ }
+