mpx/tsrc/public/basic/common/testviewframework/src/testmenuview.cpp
changeset 62 b276843a15ba
--- /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 <e32base.h>
+#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<KMaxLineLength> 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<KMaxLineLength+1> 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("  ") );
+        }   
+    }