mpx/tsrc/public/basic/common/testviewframework/src/testmenuview.cpp
author hgs
Tue, 21 Sep 2010 11:25:55 -0500
changeset 62 b276843a15ba
permissions -rw-r--r--
201037
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
62
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:  part of testviewframework.
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
// INCLUDE FILES
hgs
parents:
diff changeset
    19
#include <e32base.h>
hgs
parents:
diff changeset
    20
#include "testbaseview.h"
hgs
parents:
diff changeset
    21
#include "consolemain.h"
hgs
parents:
diff changeset
    22
#include "testmenuview.h"
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
// CONSTANTS
hgs
parents:
diff changeset
    25
const TInt KMenuOverhead = 4;              // overhead
hgs
parents:
diff changeset
    26
const TInt KMaxLineLength = 80;            // Longest supported line length
hgs
parents:
diff changeset
    27
const TInt KArrGranularity = 4;            // DesC array granularity
hgs
parents:
diff changeset
    28
hgs
parents:
diff changeset
    29
// LOCAL FUNCTION PROTOTYPES
hgs
parents:
diff changeset
    30
LOCAL_C void LimitedAppend( TDes& aOriginal, const TDesC& aAppend);
hgs
parents:
diff changeset
    31
hgs
parents:
diff changeset
    32
// ==================== LOCAL FUNCTIONS =======================================
hgs
parents:
diff changeset
    33
hgs
parents:
diff changeset
    34
LOCAL_C void LimitedAppend( TDes& aOriginal, const TDesC& aAppend)
hgs
parents:
diff changeset
    35
	{
hgs
parents:
diff changeset
    36
hgs
parents:
diff changeset
    37
	TInt spaceLeft = aOriginal.MaxLength() - aOriginal.Length();
hgs
parents:
diff changeset
    38
    
hgs
parents:
diff changeset
    39
	if (spaceLeft > aAppend.Length())
hgs
parents:
diff changeset
    40
		{
hgs
parents:
diff changeset
    41
		aOriginal.Append ( aAppend );
hgs
parents:
diff changeset
    42
		}
hgs
parents:
diff changeset
    43
	else
hgs
parents:
diff changeset
    44
		{		
hgs
parents:
diff changeset
    45
		aOriginal.Append ( aAppend.Left ( spaceLeft ) );
hgs
parents:
diff changeset
    46
		}
hgs
parents:
diff changeset
    47
hgs
parents:
diff changeset
    48
	}
hgs
parents:
diff changeset
    49
hgs
parents:
diff changeset
    50
//
hgs
parents:
diff changeset
    51
//=========================================================================== *
hgs
parents:
diff changeset
    52
//                    Implementation for Class CTestBaseView                     *
hgs
parents:
diff changeset
    53
//=========================================================================== *
hgs
parents:
diff changeset
    54
//
hgs
parents:
diff changeset
    55
hgs
parents:
diff changeset
    56
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    57
//  Method: ~CTestMenuView
hgs
parents:
diff changeset
    58
//  Description: Destructor
hgs
parents:
diff changeset
    59
//  Parameters: None
hgs
parents:
diff changeset
    60
//  Return Values: None
hgs
parents:
diff changeset
    61
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    62
//
hgs
parents:
diff changeset
    63
EXPORT_C CTestMenuView::~CTestMenuView()
hgs
parents:
diff changeset
    64
    {
hgs
parents:
diff changeset
    65
    iItems->Reset();
hgs
parents:
diff changeset
    66
    delete iItems;
hgs
parents:
diff changeset
    67
    }
hgs
parents:
diff changeset
    68
    
hgs
parents:
diff changeset
    69
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    70
//  Method: DisplayViewL
hgs
parents:
diff changeset
    71
//  Description: Prints the menu
hgs
parents:
diff changeset
    72
//  Parameters: None
hgs
parents:
diff changeset
    73
//  Return Values: None
hgs
parents:
diff changeset
    74
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    75
//
hgs
parents:
diff changeset
    76
EXPORT_C void CTestMenuView::DisplayViewL()
hgs
parents:
diff changeset
    77
    {
hgs
parents:
diff changeset
    78
    CTestBaseView::DisplayViewBase();
hgs
parents:
diff changeset
    79
    
hgs
parents:
diff changeset
    80
    TBuf<KMaxLineLength> line;
hgs
parents:
diff changeset
    81
hgs
parents:
diff changeset
    82
    // Clear display
hgs
parents:
diff changeset
    83
    iConsole->ClearScreen();
hgs
parents:
diff changeset
    84
hgs
parents:
diff changeset
    85
    // Print menu title and header
hgs
parents:
diff changeset
    86
    Print( Name() );
hgs
parents:
diff changeset
    87
    
hgs
parents:
diff changeset
    88
    TInt oldItemCount = iItemCount;
hgs
parents:
diff changeset
    89
     
hgs
parents:
diff changeset
    90
    iItemCount = ItemCount();
hgs
parents:
diff changeset
    91
hgs
parents:
diff changeset
    92
    // If first time in view, update start and end positions
hgs
parents:
diff changeset
    93
    if( (iFirst == iLast) ||        // First time here..
hgs
parents:
diff changeset
    94
        ( iLast >= iItemCount ) ||
hgs
parents:
diff changeset
    95
        ( oldItemCount != iItemCount ) )      // View size changed
hgs
parents:
diff changeset
    96
        {
hgs
parents:
diff changeset
    97
        iLast = iItemCount - 1;
hgs
parents:
diff changeset
    98
        iPosOnScreen = 0;
hgs
parents:
diff changeset
    99
hgs
parents:
diff changeset
   100
        // If "overflow", then adjust the end
hgs
parents:
diff changeset
   101
        if (iLast > iScreenSize )
hgs
parents:
diff changeset
   102
            {
hgs
parents:
diff changeset
   103
            iLast = iScreenSize;
hgs
parents:
diff changeset
   104
            }
hgs
parents:
diff changeset
   105
        }
hgs
parents:
diff changeset
   106
    
hgs
parents:
diff changeset
   107
    // Print items
hgs
parents:
diff changeset
   108
    for ( TInt i = iFirst; i <= iLast; i++ )
hgs
parents:
diff changeset
   109
        {
hgs
parents:
diff changeset
   110
        line.Zero();
hgs
parents:
diff changeset
   111
        // Append text before line
hgs
parents:
diff changeset
   112
        AppendBefore( i, line );
hgs
parents:
diff changeset
   113
        // Get the menu line
hgs
parents:
diff changeset
   114
		LimitedAppend ( line, ItemL(i) );
hgs
parents:
diff changeset
   115
		// Print the line
hgs
parents:
diff changeset
   116
        Print(line);
hgs
parents:
diff changeset
   117
        }
hgs
parents:
diff changeset
   118
    }
hgs
parents:
diff changeset
   119
hgs
parents:
diff changeset
   120
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   121
//  Method: SelectL
hgs
parents:
diff changeset
   122
//  Description: Process keypresses in view. updates position
hgs
parents:
diff changeset
   123
//  Parameters: TKeyCode aSelection       :in:      Key
hgs
parents:
diff changeset
   124
//              TBool& aContinue          :out:     Has user pressed "Quit"
hgs
parents:
diff changeset
   125
//  Return Values: None
hgs
parents:
diff changeset
   126
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   127
//
hgs
parents:
diff changeset
   128
EXPORT_C void CTestMenuView::SelectL( TKeyCode aSelection, TBool& aContinue )
hgs
parents:
diff changeset
   129
    {
hgs
parents:
diff changeset
   130
    iKey = aSelection;
hgs
parents:
diff changeset
   131
hgs
parents:
diff changeset
   132
//	iConsole->Printf(_L("%d"),iKey);
hgs
parents:
diff changeset
   133
	
hgs
parents:
diff changeset
   134
    switch ( (TInt) aSelection )
hgs
parents:
diff changeset
   135
    {
hgs
parents:
diff changeset
   136
    // SelectL item
hgs
parents:
diff changeset
   137
    case EKeyEnter:
hgs
parents:
diff changeset
   138
    case EKeyRightArrow:
hgs
parents:
diff changeset
   139
        HandleRightKeyL();
hgs
parents:
diff changeset
   140
        break;
hgs
parents:
diff changeset
   141
    // Going back
hgs
parents:
diff changeset
   142
    case EKeyLeftArrow:
hgs
parents:
diff changeset
   143
        HandleLeftKeyL();
hgs
parents:
diff changeset
   144
        break;
hgs
parents:
diff changeset
   145
    // Number key
hgs
parents:
diff changeset
   146
    case  92: // '1'
hgs
parents:
diff changeset
   147
    case  97: // '2'
hgs
parents:
diff changeset
   148
    case 100: // '3'
hgs
parents:
diff changeset
   149
 //   case '2':
hgs
parents:
diff changeset
   150
 //   case '3':
hgs
parents:
diff changeset
   151
 //   case '4':
hgs
parents:
diff changeset
   152
 //   case '5':
hgs
parents:
diff changeset
   153
 //   case '6':
hgs
parents:
diff changeset
   154
 //   case '7':
hgs
parents:
diff changeset
   155
 //   case '8':
hgs
parents:
diff changeset
   156
 //   case '9':
hgs
parents:
diff changeset
   157
 //   case '0':
hgs
parents:
diff changeset
   158
        HandleNumKeyL();
hgs
parents:
diff changeset
   159
        break;
hgs
parents:
diff changeset
   160
    // Go down
hgs
parents:
diff changeset
   161
    case EKeyDownArrow:
hgs
parents:
diff changeset
   162
        if ( iFirst + iPosOnScreen == iItemCount - 1 )
hgs
parents:
diff changeset
   163
            {
hgs
parents:
diff changeset
   164
            // If end of the list, go to beginning
hgs
parents:
diff changeset
   165
            iLast = iLast - iFirst;
hgs
parents:
diff changeset
   166
            iFirst = 0;
hgs
parents:
diff changeset
   167
            iPosOnScreen = 0;
hgs
parents:
diff changeset
   168
            }
hgs
parents:
diff changeset
   169
        else 
hgs
parents:
diff changeset
   170
            {
hgs
parents:
diff changeset
   171
            if ( iPosOnScreen == iScreenSize )
hgs
parents:
diff changeset
   172
                {
hgs
parents:
diff changeset
   173
                // If in end of screen, update items
hgs
parents:
diff changeset
   174
                if ( iLast != (iItemCount - 1) )
hgs
parents:
diff changeset
   175
                    {
hgs
parents:
diff changeset
   176
                    // If not end of the list, then update first and last
hgs
parents:
diff changeset
   177
                    // but do not update position in screen.
hgs
parents:
diff changeset
   178
                    iLast++;
hgs
parents:
diff changeset
   179
                    iFirst++;
hgs
parents:
diff changeset
   180
                    }
hgs
parents:
diff changeset
   181
                }
hgs
parents:
diff changeset
   182
            else
hgs
parents:
diff changeset
   183
                {
hgs
parents:
diff changeset
   184
                // Going down "in-screen", no need to update items
hgs
parents:
diff changeset
   185
                iPosOnScreen++;
hgs
parents:
diff changeset
   186
                }
hgs
parents:
diff changeset
   187
            }
hgs
parents:
diff changeset
   188
        break;
hgs
parents:
diff changeset
   189
        
hgs
parents:
diff changeset
   190
    // Go Up
hgs
parents:
diff changeset
   191
    case EKeyUpArrow:
hgs
parents:
diff changeset
   192
        if ( iFirst + iPosOnScreen == 0 )
hgs
parents:
diff changeset
   193
            {
hgs
parents:
diff changeset
   194
            // If in the beginning of the list
hgs
parents:
diff changeset
   195
hgs
parents:
diff changeset
   196
            if ( iItemCount <= iScreenSize ) 
hgs
parents:
diff changeset
   197
                {
hgs
parents:
diff changeset
   198
                // Wrap around when the list is not full
hgs
parents:
diff changeset
   199
                iPosOnScreen = iItemCount-1;
hgs
parents:
diff changeset
   200
                }
hgs
parents:
diff changeset
   201
            else
hgs
parents:
diff changeset
   202
                {
hgs
parents:
diff changeset
   203
                // Wrap around when there are more items than
hgs
parents:
diff changeset
   204
                // can be shown at once.            
hgs
parents:
diff changeset
   205
                iPosOnScreen = iScreenSize;
hgs
parents:
diff changeset
   206
                iLast = iItemCount-1;
hgs
parents:
diff changeset
   207
                iFirst = iItemCount - iPosOnScreen - 1;
hgs
parents:
diff changeset
   208
                }
hgs
parents:
diff changeset
   209
            }
hgs
parents:
diff changeset
   210
        else if ( iPosOnScreen == 0 )
hgs
parents:
diff changeset
   211
            {
hgs
parents:
diff changeset
   212
            // If not at the beginning of the list, then update first and
hgs
parents:
diff changeset
   213
            // last  but do not update position in screen.
hgs
parents:
diff changeset
   214
            if ( iFirst != 0 )
hgs
parents:
diff changeset
   215
                {
hgs
parents:
diff changeset
   216
                iLast--;
hgs
parents:
diff changeset
   217
                iFirst--;
hgs
parents:
diff changeset
   218
                }
hgs
parents:
diff changeset
   219
            }
hgs
parents:
diff changeset
   220
        else
hgs
parents:
diff changeset
   221
            {
hgs
parents:
diff changeset
   222
            // Going up "in-screen", no need to update items
hgs
parents:
diff changeset
   223
            iPosOnScreen--;
hgs
parents:
diff changeset
   224
            }
hgs
parents:
diff changeset
   225
        
hgs
parents:
diff changeset
   226
        break;
hgs
parents:
diff changeset
   227
hgs
parents:
diff changeset
   228
	// Additional keys
hgs
parents:
diff changeset
   229
	case EKeyHome:
hgs
parents:
diff changeset
   230
		iPosOnScreen = 0;
hgs
parents:
diff changeset
   231
		iFirst = 0;
hgs
parents:
diff changeset
   232
		iLast = iScreenSize;
hgs
parents:
diff changeset
   233
hgs
parents:
diff changeset
   234
		if (iLast > iItemCount-1 )
hgs
parents:
diff changeset
   235
			{
hgs
parents:
diff changeset
   236
			iLast = iItemCount-1;
hgs
parents:
diff changeset
   237
			}
hgs
parents:
diff changeset
   238
		break;
hgs
parents:
diff changeset
   239
hgs
parents:
diff changeset
   240
	case EKeyEnd:
hgs
parents:
diff changeset
   241
		iPosOnScreen = iScreenSize;
hgs
parents:
diff changeset
   242
		iLast = iItemCount-1;
hgs
parents:
diff changeset
   243
		iFirst = iLast - iScreenSize;
hgs
parents:
diff changeset
   244
hgs
parents:
diff changeset
   245
		if (iFirst < 0)
hgs
parents:
diff changeset
   246
			{
hgs
parents:
diff changeset
   247
			iFirst = 0;
hgs
parents:
diff changeset
   248
			iPosOnScreen = iLast-1;
hgs
parents:
diff changeset
   249
			}
hgs
parents:
diff changeset
   250
		break;
hgs
parents:
diff changeset
   251
hgs
parents:
diff changeset
   252
	case EKeyPageUp:
hgs
parents:
diff changeset
   253
		iFirst = iFirst - iScreenSize - 1;
hgs
parents:
diff changeset
   254
		iLast = iLast - iScreenSize - 1;
hgs
parents:
diff changeset
   255
hgs
parents:
diff changeset
   256
		if ( iFirst < 0 )
hgs
parents:
diff changeset
   257
			{
hgs
parents:
diff changeset
   258
			iFirst = 0;
hgs
parents:
diff changeset
   259
			iPosOnScreen = 0;			
hgs
parents:
diff changeset
   260
			iLast = iScreenSize;
hgs
parents:
diff changeset
   261
			if (iLast > iItemCount-1 )
hgs
parents:
diff changeset
   262
				{
hgs
parents:
diff changeset
   263
				iLast = iItemCount-1;
hgs
parents:
diff changeset
   264
				}
hgs
parents:
diff changeset
   265
			}
hgs
parents:
diff changeset
   266
		break;
hgs
parents:
diff changeset
   267
hgs
parents:
diff changeset
   268
	case EKeyPageDown:
hgs
parents:
diff changeset
   269
		iFirst = iFirst + iScreenSize + 1;
hgs
parents:
diff changeset
   270
		iLast = iLast + iScreenSize + 1;
hgs
parents:
diff changeset
   271
hgs
parents:
diff changeset
   272
		// Going too far
hgs
parents:
diff changeset
   273
		if (iLast > iItemCount-1)
hgs
parents:
diff changeset
   274
			{
hgs
parents:
diff changeset
   275
			iLast = iItemCount-1;
hgs
parents:
diff changeset
   276
			iFirst = iLast - iScreenSize;
hgs
parents:
diff changeset
   277
			iPosOnScreen = iScreenSize;
hgs
parents:
diff changeset
   278
			}
hgs
parents:
diff changeset
   279
hgs
parents:
diff changeset
   280
		// Ok, list is smaller than screen
hgs
parents:
diff changeset
   281
		if (iFirst < 0 )
hgs
parents:
diff changeset
   282
			{
hgs
parents:
diff changeset
   283
			iFirst = 0;
hgs
parents:
diff changeset
   284
			iLast = iItemCount-1;
hgs
parents:
diff changeset
   285
			iPosOnScreen = iLast;
hgs
parents:
diff changeset
   286
			}
hgs
parents:
diff changeset
   287
hgs
parents:
diff changeset
   288
		break;
hgs
parents:
diff changeset
   289
    case EKeyEscape:
hgs
parents:
diff changeset
   290
        aContinue = EFalse;
hgs
parents:
diff changeset
   291
        CurrentViewDoneL();
hgs
parents:
diff changeset
   292
        return;
hgs
parents:
diff changeset
   293
    default:  // Bypass the keypress
hgs
parents:
diff changeset
   294
        break;
hgs
parents:
diff changeset
   295
    }
hgs
parents:
diff changeset
   296
    // Continue normally and keep in the same menu
hgs
parents:
diff changeset
   297
    aContinue = ETrue;
hgs
parents:
diff changeset
   298
    }
hgs
parents:
diff changeset
   299
hgs
parents:
diff changeset
   300
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   301
//  Method: TimerUpdate
hgs
parents:
diff changeset
   302
//  Description: TimerUpdate
hgs
parents:
diff changeset
   303
//  Parameters: None
hgs
parents:
diff changeset
   304
//  Return Values: None
hgs
parents:
diff changeset
   305
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   306
//
hgs
parents:
diff changeset
   307
EXPORT_C void CTestMenuView::TimerUpdate()
hgs
parents:
diff changeset
   308
    {    
hgs
parents:
diff changeset
   309
    TInt count = ItemCount();
hgs
parents:
diff changeset
   310
	// If list is empty, do not scroll.
hgs
parents:
diff changeset
   311
	if ( count < 1 )
hgs
parents:
diff changeset
   312
		{
hgs
parents:
diff changeset
   313
		return;
hgs
parents:
diff changeset
   314
		}
hgs
parents:
diff changeset
   315
    else if( iFirst + iPosOnScreen > count )
hgs
parents:
diff changeset
   316
        {
hgs
parents:
diff changeset
   317
        iFirst = iPosOnScreen = 0;
hgs
parents:
diff changeset
   318
        }
hgs
parents:
diff changeset
   319
hgs
parents:
diff changeset
   320
	// If item selection is updated, then restart scrolling
hgs
parents:
diff changeset
   321
	if (iPrevPos != iFirst + iPosOnScreen)
hgs
parents:
diff changeset
   322
		{
hgs
parents:
diff changeset
   323
		iPrevPos = iFirst + iPosOnScreen;
hgs
parents:
diff changeset
   324
		iStart = 0;
hgs
parents:
diff changeset
   325
		iDirection = 1;
hgs
parents:
diff changeset
   326
		}
hgs
parents:
diff changeset
   327
hgs
parents:
diff changeset
   328
	// If menu item have not been changed after last timer, then
hgs
parents:
diff changeset
   329
	// start scrolling	
hgs
parents:
diff changeset
   330
	TName name(KNullDesC);
hgs
parents:
diff changeset
   331
	TRAPD(err, name = ItemL(iFirst + iPosOnScreen));
hgs
parents:
diff changeset
   332
	if(err != KErrNone)
hgs
parents:
diff changeset
   333
	    return;
hgs
parents:
diff changeset
   334
	if ( name.Length() > iSize.iWidth)
hgs
parents:
diff changeset
   335
		{
hgs
parents:
diff changeset
   336
hgs
parents:
diff changeset
   337
		TInt y = iConsole->WhereY();
hgs
parents:
diff changeset
   338
		TInt x = iConsole->WhereX();
hgs
parents:
diff changeset
   339
		TBuf<80> iTmp;				
hgs
parents:
diff changeset
   340
hgs
parents:
diff changeset
   341
		iStart = iStart + iDirection;
hgs
parents:
diff changeset
   342
hgs
parents:
diff changeset
   343
		// "Right end"
hgs
parents:
diff changeset
   344
		if ( iStart + iSize.iWidth > name.Length() +KMenuOverhead )
hgs
parents:
diff changeset
   345
			{
hgs
parents:
diff changeset
   346
			iStart--;
hgs
parents:
diff changeset
   347
			iDirection = -1;
hgs
parents:
diff changeset
   348
			}
hgs
parents:
diff changeset
   349
		
hgs
parents:
diff changeset
   350
		// "Left end"
hgs
parents:
diff changeset
   351
		if ( iStart == -1 )
hgs
parents:
diff changeset
   352
			{
hgs
parents:
diff changeset
   353
			iStart++;
hgs
parents:
diff changeset
   354
			iDirection = 1;
hgs
parents:
diff changeset
   355
			}
hgs
parents:
diff changeset
   356
hgs
parents:
diff changeset
   357
		iTmp=_L(" *");
hgs
parents:
diff changeset
   358
		LimitedAppend( iTmp, name.Mid ( iStart ) );
hgs
parents:
diff changeset
   359
			
hgs
parents:
diff changeset
   360
		iConsole->SetPos( 0, iPosOnScreen+1);		
hgs
parents:
diff changeset
   361
		iConsole->Printf ( iTmp.Left( iSize.iWidth -2 )  );
hgs
parents:
diff changeset
   362
hgs
parents:
diff changeset
   363
		iConsole->SetPos(x,y);
hgs
parents:
diff changeset
   364
		}    
hgs
parents:
diff changeset
   365
    }
hgs
parents:
diff changeset
   366
hgs
parents:
diff changeset
   367
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   368
//  Method: CTestMenuView
hgs
parents:
diff changeset
   369
//  Description: C++ default constructor
hgs
parents:
diff changeset
   370
//  Parameters: CConsoleMain* aConsole  :in: Pointer to main console
hgs
parents:
diff changeset
   371
//              CTestBaseView* aParent     :in: Parent View
hgs
parents:
diff changeset
   372
//              const TDesC& aName      :in: Menu name
hgs
parents:
diff changeset
   373
//  Return Values: None
hgs
parents:
diff changeset
   374
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   375
//
hgs
parents:
diff changeset
   376
EXPORT_C CTestMenuView::CTestMenuView(CConsoleMain* aConsoleMain,
hgs
parents:
diff changeset
   377
                                   CTestBaseView* aParent,
hgs
parents:
diff changeset
   378
                                   const TDesC& aName)
hgs
parents:
diff changeset
   379
    : CTestBaseView(aConsoleMain, aParent, aName)
hgs
parents:
diff changeset
   380
    {
hgs
parents:
diff changeset
   381
	iDirection = 1;
hgs
parents:
diff changeset
   382
	iPrevPos  = -1;		// Invalid starting value
hgs
parents:
diff changeset
   383
    }
hgs
parents:
diff changeset
   384
    
hgs
parents:
diff changeset
   385
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   386
//  Method: ConstructL
hgs
parents:
diff changeset
   387
//  Description: Second level constructor.
hgs
parents:
diff changeset
   388
//  Parameters: None
hgs
parents:
diff changeset
   389
//  Return Values: None
hgs
parents:
diff changeset
   390
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   391
//
hgs
parents:
diff changeset
   392
EXPORT_C void CTestMenuView::ConstructL()
hgs
parents:
diff changeset
   393
    {
hgs
parents:
diff changeset
   394
    iItems = new (ELeave) CDesCArrayFlat(KArrGranularity);
hgs
parents:
diff changeset
   395
    
hgs
parents:
diff changeset
   396
    // Get display size
hgs
parents:
diff changeset
   397
    const TInt KOverHead = 5;
hgs
parents:
diff changeset
   398
    iSize = iConsole->ScreenSize();
hgs
parents:
diff changeset
   399
    iScreenSize = iSize.iHeight - KOverHead;   // Size available for menus
hgs
parents:
diff changeset
   400
    
hgs
parents:
diff changeset
   401
    InitializeViewL();
hgs
parents:
diff changeset
   402
    }
hgs
parents:
diff changeset
   403
    
hgs
parents:
diff changeset
   404
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   405
//  Method: Print
hgs
parents:
diff changeset
   406
//  Description: Prints one line text and changes to next line. If line is
hgs
parents:
diff changeset
   407
//  too long, overhead is not printed..
hgs
parents:
diff changeset
   408
//  Parameters: TDesC& aPrint   :in:    Text to be printed
hgs
parents:
diff changeset
   409
//  Return Values: None
hgs
parents:
diff changeset
   410
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   411
//
hgs
parents:
diff changeset
   412
EXPORT_C void CTestMenuView::Print( const TDesC& aPrint )
hgs
parents:
diff changeset
   413
    {
hgs
parents:
diff changeset
   414
    iConsole->Printf( aPrint.Left( iSize.iWidth - KMenuOverhead ) );
hgs
parents:
diff changeset
   415
    iConsole->Printf(_L("\n"));
hgs
parents:
diff changeset
   416
    }
hgs
parents:
diff changeset
   417
hgs
parents:
diff changeset
   418
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   419
//  Method: PrintMulti
hgs
parents:
diff changeset
   420
//  Description: Prints text. If line is too long, it will be continued to
hgs
parents:
diff changeset
   421
//  following lines.
hgs
parents:
diff changeset
   422
//  Parameters: const TDesC& aPrint       :in:      Text to print
hgs
parents:
diff changeset
   423
//  Return Values: None
hgs
parents:
diff changeset
   424
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   425
//
hgs
parents:
diff changeset
   426
EXPORT_C void CTestMenuView::PrintMulti( const TDesC& aPrint )
hgs
parents:
diff changeset
   427
    {
hgs
parents:
diff changeset
   428
    // Get current line
hgs
parents:
diff changeset
   429
    const TInt KMenuOverHead = 2;
hgs
parents:
diff changeset
   430
    TInt y = iConsole->WhereY();
hgs
parents:
diff changeset
   431
hgs
parents:
diff changeset
   432
    const TInt KLineLen =iSize.iWidth - 4;
hgs
parents:
diff changeset
   433
    TBuf<KMaxLineLength+1> oneLine;
hgs
parents:
diff changeset
   434
hgs
parents:
diff changeset
   435
    // Loop through the line
hgs
parents:
diff changeset
   436
    for (TInt i = 0; i < aPrint.Length(); i++)
hgs
parents:
diff changeset
   437
        {
hgs
parents:
diff changeset
   438
        oneLine.Append( aPrint[i] );
hgs
parents:
diff changeset
   439
hgs
parents:
diff changeset
   440
        // Print one line
hgs
parents:
diff changeset
   441
        if (oneLine.Length() == KLineLen )
hgs
parents:
diff changeset
   442
            {
hgs
parents:
diff changeset
   443
            oneLine.Append (_L("\n"));
hgs
parents:
diff changeset
   444
            iConsole->Printf(oneLine);
hgs
parents:
diff changeset
   445
            oneLine=_L("");
hgs
parents:
diff changeset
   446
            y++;
hgs
parents:
diff changeset
   447
            }
hgs
parents:
diff changeset
   448
    
hgs
parents:
diff changeset
   449
        // Prevent display scrolling
hgs
parents:
diff changeset
   450
        if ( y == iScreenSize + KMenuOverHead )
hgs
parents:
diff changeset
   451
            {
hgs
parents:
diff changeset
   452
            oneLine=_L("");
hgs
parents:
diff changeset
   453
            break;
hgs
parents:
diff changeset
   454
            }
hgs
parents:
diff changeset
   455
        }
hgs
parents:
diff changeset
   456
hgs
parents:
diff changeset
   457
    // Print last part if required
hgs
parents:
diff changeset
   458
    if ( oneLine.Length() != 0 )
hgs
parents:
diff changeset
   459
        {
hgs
parents:
diff changeset
   460
        oneLine.Append (_L("\n"));
hgs
parents:
diff changeset
   461
        iConsole->Printf(oneLine);
hgs
parents:
diff changeset
   462
        }
hgs
parents:
diff changeset
   463
    }
hgs
parents:
diff changeset
   464
    
hgs
parents:
diff changeset
   465
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   466
//  Method: AddItem
hgs
parents:
diff changeset
   467
//  Description: Add new item to menu
hgs
parents:
diff changeset
   468
//  Parameters: TDesC& aItem              :in:      descriptor to be added
hgs
parents:
diff changeset
   469
//  Return Values: None
hgs
parents:
diff changeset
   470
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   471
//
hgs
parents:
diff changeset
   472
EXPORT_C void CTestMenuView::AddItemL(const TDesC& aItem)
hgs
parents:
diff changeset
   473
    {
hgs
parents:
diff changeset
   474
    iItems->AppendL(aItem);
hgs
parents:
diff changeset
   475
    }
hgs
parents:
diff changeset
   476
hgs
parents:
diff changeset
   477
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   478
//  Method: DeleteItem
hgs
parents:
diff changeset
   479
//  Description: Delete an item from menu
hgs
parents:
diff changeset
   480
//  Parameters: TInt    aIndex  :in:    position of item in Items
hgs
parents:
diff changeset
   481
//  Return Values: None
hgs
parents:
diff changeset
   482
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   483
//
hgs
parents:
diff changeset
   484
EXPORT_C void CTestMenuView::DeleteItem( TInt aIndex )
hgs
parents:
diff changeset
   485
    {
hgs
parents:
diff changeset
   486
    iItems->Delete(aIndex);
hgs
parents:
diff changeset
   487
    iItems->Compress();
hgs
parents:
diff changeset
   488
    }
hgs
parents:
diff changeset
   489
hgs
parents:
diff changeset
   490
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   491
//  Method: LastKeyPressed
hgs
parents:
diff changeset
   492
//  Description: Returns last key pressed
hgs
parents:
diff changeset
   493
//  Parameters: None
hgs
parents:
diff changeset
   494
//  Return Values: TKeyCode     The last key pressed
hgs
parents:
diff changeset
   495
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   496
//
hgs
parents:
diff changeset
   497
EXPORT_C TKeyCode CTestMenuView::LastKeyPressed()
hgs
parents:
diff changeset
   498
    {
hgs
parents:
diff changeset
   499
    return iKey;
hgs
parents:
diff changeset
   500
    }
hgs
parents:
diff changeset
   501
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   502
//  Method: ItemsCreated
hgs
parents:
diff changeset
   503
//  Description: Determine whether there are items added to iItems
hgs
parents:
diff changeset
   504
//  Parameters: None
hgs
parents:
diff changeset
   505
//  Return Values: TBool        Whether iItems contain content
hgs
parents:
diff changeset
   506
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   507
//
hgs
parents:
diff changeset
   508
EXPORT_C TBool CTestMenuView::ItemsCreated()
hgs
parents:
diff changeset
   509
    {
hgs
parents:
diff changeset
   510
    return ( iItems->Count() != 0 );
hgs
parents:
diff changeset
   511
    }
hgs
parents:
diff changeset
   512
hgs
parents:
diff changeset
   513
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   514
//  Method: CurrentIndex
hgs
parents:
diff changeset
   515
//  Description: Get the position that the cursor is point to in the items
hgs
parents:
diff changeset
   516
//  Parameters: None
hgs
parents:
diff changeset
   517
//  Return Values: TInt     Position of cursor in items array
hgs
parents:
diff changeset
   518
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   519
//
hgs
parents:
diff changeset
   520
EXPORT_C TInt CTestMenuView::CurrentIndex()
hgs
parents:
diff changeset
   521
    {
hgs
parents:
diff changeset
   522
    return iFirst + iPosOnScreen;
hgs
parents:
diff changeset
   523
    }
hgs
parents:
diff changeset
   524
hgs
parents:
diff changeset
   525
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   526
//  Method: CurrentPosition
hgs
parents:
diff changeset
   527
//  Description: Get the position that the cursor is point to on the screen
hgs
parents:
diff changeset
   528
//  Parameters: None
hgs
parents:
diff changeset
   529
//  Return Values: TInt     Position of cursor on screen
hgs
parents:
diff changeset
   530
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   531
//
hgs
parents:
diff changeset
   532
EXPORT_C TInt CTestMenuView::CurrentPosition()
hgs
parents:
diff changeset
   533
    {
hgs
parents:
diff changeset
   534
    return iPosOnScreen;
hgs
parents:
diff changeset
   535
    }
hgs
parents:
diff changeset
   536
hgs
parents:
diff changeset
   537
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   538
//  Method: Menu
hgs
parents:
diff changeset
   539
//  Description: Get the item
hgs
parents:
diff changeset
   540
//  Parameters: TInt aIndex     :in     index of the entry
hgs
parents:
diff changeset
   541
//  Return Values: TDesC&       entry descriptor
hgs
parents:
diff changeset
   542
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   543
//
hgs
parents:
diff changeset
   544
EXPORT_C TPtrC CTestMenuView::ItemL(TInt aIndex)
hgs
parents:
diff changeset
   545
    {
hgs
parents:
diff changeset
   546
    if(aIndex < 0 || iItemCount <= aIndex)
hgs
parents:
diff changeset
   547
        {
hgs
parents:
diff changeset
   548
        User::Leave(KErrArgument);
hgs
parents:
diff changeset
   549
        }
hgs
parents:
diff changeset
   550
    //return iItems->operator[](iFirst + aIndex);
hgs
parents:
diff changeset
   551
    return iItems->operator[](aIndex);
hgs
parents:
diff changeset
   552
    }
hgs
parents:
diff changeset
   553
hgs
parents:
diff changeset
   554
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   555
// Method: ItemCount
hgs
parents:
diff changeset
   556
// Count the number of items in the current view
hgs
parents:
diff changeset
   557
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   558
//
hgs
parents:
diff changeset
   559
EXPORT_C TInt CTestMenuView::ItemCount() const
hgs
parents:
diff changeset
   560
    {
hgs
parents:
diff changeset
   561
    return iItems->Count();
hgs
parents:
diff changeset
   562
    }
hgs
parents:
diff changeset
   563
hgs
parents:
diff changeset
   564
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   565
// Method: ReadString
hgs
parents:
diff changeset
   566
// Reads user input into the start of the descriptor aDes
hgs
parents:
diff changeset
   567
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   568
//
hgs
parents:
diff changeset
   569
EXPORT_C void CTestMenuView::ReadString( TDes& aDes )
hgs
parents:
diff changeset
   570
    {
hgs
parents:
diff changeset
   571
    iConsoleMain->ReadString(aDes);
hgs
parents:
diff changeset
   572
    }
hgs
parents:
diff changeset
   573
    
hgs
parents:
diff changeset
   574
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   575
//  Method: AppendBefore
hgs
parents:
diff changeset
   576
//  Description: Append text before line.
hgs
parents:
diff changeset
   577
//  Parameters: TInt aLine  :in: line number 
hgs
parents:
diff changeset
   578
//              TDes& aLine :in: line text
hgs
parents:
diff changeset
   579
//  Return Values: None
hgs
parents:
diff changeset
   580
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   581
//
hgs
parents:
diff changeset
   582
void CTestMenuView::AppendBefore( TInt aLineNum, TDes& aLine )
hgs
parents:
diff changeset
   583
    {
hgs
parents:
diff changeset
   584
    if( ( aLine.MaxLength() - aLine.Length() ) < 2 )
hgs
parents:
diff changeset
   585
        {
hgs
parents:
diff changeset
   586
        return;
hgs
parents:
diff changeset
   587
        }        
hgs
parents:
diff changeset
   588
    
hgs
parents:
diff changeset
   589
    // If printing active line, print the marker
hgs
parents:
diff changeset
   590
    if ( aLineNum == iPosOnScreen + iFirst )
hgs
parents:
diff changeset
   591
        {
hgs
parents:
diff changeset
   592
        aLine.Append( _L(" *") );
hgs
parents:
diff changeset
   593
        }
hgs
parents:
diff changeset
   594
    else
hgs
parents:
diff changeset
   595
        {
hgs
parents:
diff changeset
   596
        aLine.Append( _L("  ") );
hgs
parents:
diff changeset
   597
        }   
hgs
parents:
diff changeset
   598
    }