diff -r c76ea6caa649 -r b276843a15ba mpx/tsrc/public/basic/common/testviewframework/src/testmenuview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mpx/tsrc/public/basic/common/testviewframework/src/testmenuview.cpp Tue Sep 21 11:25:55 2010 -0500 @@ -0,0 +1,598 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "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: part of testviewframework. +* +*/ + +// INCLUDE FILES +#include +#include "testbaseview.h" +#include "consolemain.h" +#include "testmenuview.h" + +// CONSTANTS +const TInt KMenuOverhead = 4; // overhead +const TInt KMaxLineLength = 80; // Longest supported line length +const TInt KArrGranularity = 4; // DesC array granularity + +// LOCAL FUNCTION PROTOTYPES +LOCAL_C void LimitedAppend( TDes& aOriginal, const TDesC& aAppend); + +// ==================== LOCAL FUNCTIONS ======================================= + +LOCAL_C void LimitedAppend( TDes& aOriginal, const TDesC& aAppend) + { + + TInt spaceLeft = aOriginal.MaxLength() - aOriginal.Length(); + + if (spaceLeft > aAppend.Length()) + { + aOriginal.Append ( aAppend ); + } + else + { + aOriginal.Append ( aAppend.Left ( spaceLeft ) ); + } + + } + +// +//=========================================================================== * +// Implementation for Class CTestBaseView * +//=========================================================================== * +// + +// --------------------------------------------------------------------------- +// Method: ~CTestMenuView +// Description: Destructor +// Parameters: None +// Return Values: None +// --------------------------------------------------------------------------- +// +EXPORT_C CTestMenuView::~CTestMenuView() + { + iItems->Reset(); + delete iItems; + } + +// --------------------------------------------------------------------------- +// Method: DisplayViewL +// Description: Prints the menu +// Parameters: None +// Return Values: None +// --------------------------------------------------------------------------- +// +EXPORT_C void CTestMenuView::DisplayViewL() + { + CTestBaseView::DisplayViewBase(); + + TBuf line; + + // Clear display + iConsole->ClearScreen(); + + // Print menu title and header + Print( Name() ); + + TInt oldItemCount = iItemCount; + + iItemCount = ItemCount(); + + // If first time in view, update start and end positions + if( (iFirst == iLast) || // First time here.. + ( iLast >= iItemCount ) || + ( oldItemCount != iItemCount ) ) // View size changed + { + iLast = iItemCount - 1; + iPosOnScreen = 0; + + // If "overflow", then adjust the end + if (iLast > iScreenSize ) + { + iLast = iScreenSize; + } + } + + // Print items + for ( TInt i = iFirst; i <= iLast; i++ ) + { + line.Zero(); + // Append text before line + AppendBefore( i, line ); + // Get the menu line + LimitedAppend ( line, ItemL(i) ); + // Print the line + Print(line); + } + } + +// ----------------------------------------------------------------------------- +// Method: SelectL +// Description: Process keypresses in view. updates position +// Parameters: TKeyCode aSelection :in: Key +// TBool& aContinue :out: Has user pressed "Quit" +// Return Values: None +// ----------------------------------------------------------------------------- +// +EXPORT_C void CTestMenuView::SelectL( TKeyCode aSelection, TBool& aContinue ) + { + iKey = aSelection; + +// iConsole->Printf(_L("%d"),iKey); + + switch ( (TInt) aSelection ) + { + // SelectL item + case EKeyEnter: + case EKeyRightArrow: + HandleRightKeyL(); + break; + // Going back + case EKeyLeftArrow: + HandleLeftKeyL(); + break; + // Number key + case 92: // '1' + case 97: // '2' + case 100: // '3' + // case '2': + // case '3': + // case '4': + // case '5': + // case '6': + // case '7': + // case '8': + // case '9': + // case '0': + HandleNumKeyL(); + break; + // Go down + case EKeyDownArrow: + if ( iFirst + iPosOnScreen == iItemCount - 1 ) + { + // If end of the list, go to beginning + iLast = iLast - iFirst; + iFirst = 0; + iPosOnScreen = 0; + } + else + { + if ( iPosOnScreen == iScreenSize ) + { + // If in end of screen, update items + if ( iLast != (iItemCount - 1) ) + { + // If not end of the list, then update first and last + // but do not update position in screen. + iLast++; + iFirst++; + } + } + else + { + // Going down "in-screen", no need to update items + iPosOnScreen++; + } + } + break; + + // Go Up + case EKeyUpArrow: + if ( iFirst + iPosOnScreen == 0 ) + { + // If in the beginning of the list + + if ( iItemCount <= iScreenSize ) + { + // Wrap around when the list is not full + iPosOnScreen = iItemCount-1; + } + else + { + // Wrap around when there are more items than + // can be shown at once. + iPosOnScreen = iScreenSize; + iLast = iItemCount-1; + iFirst = iItemCount - iPosOnScreen - 1; + } + } + else if ( iPosOnScreen == 0 ) + { + // If not at the beginning of the list, then update first and + // last but do not update position in screen. + if ( iFirst != 0 ) + { + iLast--; + iFirst--; + } + } + else + { + // Going up "in-screen", no need to update items + iPosOnScreen--; + } + + break; + + // Additional keys + case EKeyHome: + iPosOnScreen = 0; + iFirst = 0; + iLast = iScreenSize; + + if (iLast > iItemCount-1 ) + { + iLast = iItemCount-1; + } + break; + + case EKeyEnd: + iPosOnScreen = iScreenSize; + iLast = iItemCount-1; + iFirst = iLast - iScreenSize; + + if (iFirst < 0) + { + iFirst = 0; + iPosOnScreen = iLast-1; + } + break; + + case EKeyPageUp: + iFirst = iFirst - iScreenSize - 1; + iLast = iLast - iScreenSize - 1; + + if ( iFirst < 0 ) + { + iFirst = 0; + iPosOnScreen = 0; + iLast = iScreenSize; + if (iLast > iItemCount-1 ) + { + iLast = iItemCount-1; + } + } + break; + + case EKeyPageDown: + iFirst = iFirst + iScreenSize + 1; + iLast = iLast + iScreenSize + 1; + + // Going too far + if (iLast > iItemCount-1) + { + iLast = iItemCount-1; + iFirst = iLast - iScreenSize; + iPosOnScreen = iScreenSize; + } + + // Ok, list is smaller than screen + if (iFirst < 0 ) + { + iFirst = 0; + iLast = iItemCount-1; + iPosOnScreen = iLast; + } + + break; + case EKeyEscape: + aContinue = EFalse; + CurrentViewDoneL(); + return; + default: // Bypass the keypress + break; + } + // Continue normally and keep in the same menu + aContinue = ETrue; + } + +// ----------------------------------------------------------------------------- +// Method: TimerUpdate +// Description: TimerUpdate +// Parameters: None +// Return Values: None +// ----------------------------------------------------------------------------- +// +EXPORT_C void CTestMenuView::TimerUpdate() + { + TInt count = ItemCount(); + // If list is empty, do not scroll. + if ( count < 1 ) + { + return; + } + else if( iFirst + iPosOnScreen > count ) + { + iFirst = iPosOnScreen = 0; + } + + // If item selection is updated, then restart scrolling + if (iPrevPos != iFirst + iPosOnScreen) + { + iPrevPos = iFirst + iPosOnScreen; + iStart = 0; + iDirection = 1; + } + + // If menu item have not been changed after last timer, then + // start scrolling + TName name(KNullDesC); + TRAPD(err, name = ItemL(iFirst + iPosOnScreen)); + if(err != KErrNone) + return; + if ( name.Length() > iSize.iWidth) + { + + TInt y = iConsole->WhereY(); + TInt x = iConsole->WhereX(); + TBuf<80> iTmp; + + iStart = iStart + iDirection; + + // "Right end" + if ( iStart + iSize.iWidth > name.Length() +KMenuOverhead ) + { + iStart--; + iDirection = -1; + } + + // "Left end" + if ( iStart == -1 ) + { + iStart++; + iDirection = 1; + } + + iTmp=_L(" *"); + LimitedAppend( iTmp, name.Mid ( iStart ) ); + + iConsole->SetPos( 0, iPosOnScreen+1); + iConsole->Printf ( iTmp.Left( iSize.iWidth -2 ) ); + + iConsole->SetPos(x,y); + } + } + +// --------------------------------------------------------------------------- +// Method: CTestMenuView +// Description: C++ default constructor +// Parameters: CConsoleMain* aConsole :in: Pointer to main console +// CTestBaseView* aParent :in: Parent View +// const TDesC& aName :in: Menu name +// Return Values: None +// --------------------------------------------------------------------------- +// +EXPORT_C CTestMenuView::CTestMenuView(CConsoleMain* aConsoleMain, + CTestBaseView* aParent, + const TDesC& aName) + : CTestBaseView(aConsoleMain, aParent, aName) + { + iDirection = 1; + iPrevPos = -1; // Invalid starting value + } + +// --------------------------------------------------------------------------- +// Method: ConstructL +// Description: Second level constructor. +// Parameters: None +// Return Values: None +// --------------------------------------------------------------------------- +// +EXPORT_C void CTestMenuView::ConstructL() + { + iItems = new (ELeave) CDesCArrayFlat(KArrGranularity); + + // Get display size + const TInt KOverHead = 5; + iSize = iConsole->ScreenSize(); + iScreenSize = iSize.iHeight - KOverHead; // Size available for menus + + InitializeViewL(); + } + +// --------------------------------------------------------------------------- +// Method: Print +// Description: Prints one line text and changes to next line. If line is +// too long, overhead is not printed.. +// Parameters: TDesC& aPrint :in: Text to be printed +// Return Values: None +// --------------------------------------------------------------------------- +// +EXPORT_C void CTestMenuView::Print( const TDesC& aPrint ) + { + iConsole->Printf( aPrint.Left( iSize.iWidth - KMenuOverhead ) ); + iConsole->Printf(_L("\n")); + } + +// --------------------------------------------------------------------------- +// Method: PrintMulti +// Description: Prints text. If line is too long, it will be continued to +// following lines. +// Parameters: const TDesC& aPrint :in: Text to print +// Return Values: None +// --------------------------------------------------------------------------- +// +EXPORT_C void CTestMenuView::PrintMulti( const TDesC& aPrint ) + { + // Get current line + const TInt KMenuOverHead = 2; + TInt y = iConsole->WhereY(); + + const TInt KLineLen =iSize.iWidth - 4; + TBuf oneLine; + + // Loop through the line + for (TInt i = 0; i < aPrint.Length(); i++) + { + oneLine.Append( aPrint[i] ); + + // Print one line + if (oneLine.Length() == KLineLen ) + { + oneLine.Append (_L("\n")); + iConsole->Printf(oneLine); + oneLine=_L(""); + y++; + } + + // Prevent display scrolling + if ( y == iScreenSize + KMenuOverHead ) + { + oneLine=_L(""); + break; + } + } + + // Print last part if required + if ( oneLine.Length() != 0 ) + { + oneLine.Append (_L("\n")); + iConsole->Printf(oneLine); + } + } + +// --------------------------------------------------------------------------- +// Method: AddItem +// Description: Add new item to menu +// Parameters: TDesC& aItem :in: descriptor to be added +// Return Values: None +// --------------------------------------------------------------------------- +// +EXPORT_C void CTestMenuView::AddItemL(const TDesC& aItem) + { + iItems->AppendL(aItem); + } + +// --------------------------------------------------------------------------- +// Method: DeleteItem +// Description: Delete an item from menu +// Parameters: TInt aIndex :in: position of item in Items +// Return Values: None +// --------------------------------------------------------------------------- +// +EXPORT_C void CTestMenuView::DeleteItem( TInt aIndex ) + { + iItems->Delete(aIndex); + iItems->Compress(); + } + +// --------------------------------------------------------------------------- +// Method: LastKeyPressed +// Description: Returns last key pressed +// Parameters: None +// Return Values: TKeyCode The last key pressed +// --------------------------------------------------------------------------- +// +EXPORT_C TKeyCode CTestMenuView::LastKeyPressed() + { + return iKey; + } +// --------------------------------------------------------------------------- +// Method: ItemsCreated +// Description: Determine whether there are items added to iItems +// Parameters: None +// Return Values: TBool Whether iItems contain content +// --------------------------------------------------------------------------- +// +EXPORT_C TBool CTestMenuView::ItemsCreated() + { + return ( iItems->Count() != 0 ); + } + +// --------------------------------------------------------------------------- +// Method: CurrentIndex +// Description: Get the position that the cursor is point to in the items +// Parameters: None +// Return Values: TInt Position of cursor in items array +// --------------------------------------------------------------------------- +// +EXPORT_C TInt CTestMenuView::CurrentIndex() + { + return iFirst + iPosOnScreen; + } + +// --------------------------------------------------------------------------- +// Method: CurrentPosition +// Description: Get the position that the cursor is point to on the screen +// Parameters: None +// Return Values: TInt Position of cursor on screen +// --------------------------------------------------------------------------- +// +EXPORT_C TInt CTestMenuView::CurrentPosition() + { + return iPosOnScreen; + } + +// --------------------------------------------------------------------------- +// Method: Menu +// Description: Get the item +// Parameters: TInt aIndex :in index of the entry +// Return Values: TDesC& entry descriptor +// --------------------------------------------------------------------------- +// +EXPORT_C TPtrC CTestMenuView::ItemL(TInt aIndex) + { + if(aIndex < 0 || iItemCount <= aIndex) + { + User::Leave(KErrArgument); + } + //return iItems->operator[](iFirst + aIndex); + return iItems->operator[](aIndex); + } + +// ----------------------------------------------------------------------------- +// Method: ItemCount +// Count the number of items in the current view +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CTestMenuView::ItemCount() const + { + return iItems->Count(); + } + +// ----------------------------------------------------------------------------- +// Method: ReadString +// Reads user input into the start of the descriptor aDes +// ----------------------------------------------------------------------------- +// +EXPORT_C void CTestMenuView::ReadString( TDes& aDes ) + { + iConsoleMain->ReadString(aDes); + } + +// ----------------------------------------------------------------------------- +// Method: AppendBefore +// Description: Append text before line. +// Parameters: TInt aLine :in: line number +// TDes& aLine :in: line text +// Return Values: None +// ----------------------------------------------------------------------------- +// +void CTestMenuView::AppendBefore( TInt aLineNum, TDes& aLine ) + { + if( ( aLine.MaxLength() - aLine.Length() ) < 2 ) + { + return; + } + + // If printing active line, print the marker + if ( aLineNum == iPosOnScreen + iFirst ) + { + aLine.Append( _L(" *") ); + } + else + { + aLine.Append( _L(" ") ); + } + }