00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00023 #include "longnumber.h"
00024
00030 CLongNumber* CLongNumber::NewL(CConsoleBase* aConsole)
00031 {
00032 CLongNumber* self = new (ELeave) CLongNumber(aConsole);
00033 self->AddToScheduler();
00034 return self;
00035 }
00036
00041 CLongNumber::CLongNumber(CConsoleBase* aConsole):
00042
00043 CActive(CActive::EPriorityUserInput),
00044
00045 iNumber(_FOFF(TDigit,iSLink)),
00046 iConsole(aConsole),
00047
00048 iIterator(iNumber)
00049 {
00050 }
00051
00052
00056 void CLongNumber::AddToScheduler()
00057 {
00058 CActiveScheduler::Add(this);
00059 }
00060
00064 void CLongNumber::RunL()
00065 {
00066
00067 TUint8 option = iConsole->KeyCode();
00068
00069 _LIT(KTextFormat,"%c\n");
00070 iConsole->Printf(KTextFormat,option);
00071
00072 TInt number = option - (TUint)'0';
00073
00074 if(number <10 && number > -1)
00075 {
00076
00077 switch(iOption)
00078 {
00079
00080 case EAddFirst:
00081 {
00082
00083 TDigit* digit = new (ELeave) TDigit;
00084
00085 digit->Set(number);
00086
00087 iNumber.AddFirst(*digit);
00088 iOption = ETOptionNone;
00089 }
00090
00091 PrintNumber();
00092 break;
00093
00094 case EAddLast:
00095 {
00096
00097 TDigit* digit = new (ELeave) TDigit;
00098
00099 digit->Set(number);
00100
00101 iNumber.AddLast(*digit);
00102 iOption = ETOptionNone;
00103 }
00104
00105 PrintNumber();
00106 break;
00107 case ETOptionNone:
00108 _LIT(KInvalidOption,"Invalid Option!\n");
00109 iConsole->Printf(KInvalidOption);
00110 break;
00111 default:
00112 iOption = ETOptionNone;
00113 break;
00114 }
00115
00116 ReadNumber();
00117 }
00118
00119
00120
00121 else
00122 {
00123 switch(option)
00124 {
00125 case 'f':
00126 {
00127
00128 iOption = EAddFirst;
00129 _LIT(KTextEnterDigit,"\nEnter a digit\n");
00130 iConsole->Printf(KTextEnterDigit);
00131
00132 ReadFunc();
00133 }
00134 break;
00135 case 'l':
00136 {
00137
00138 iOption = EAddLast;
00139 _LIT(KTextEnterDigit,"\nEnter a digit\n");
00140 iConsole->Printf(KTextEnterDigit);
00141
00142 ReadFunc();
00143 }
00144 break;
00145 case 'r':
00146 {
00147 if(iNumber.IsEmpty())
00148 {
00149 _LIT(KTextEmpty,"Empty Queue !\n");
00150 iConsole->Printf(KTextEmpty);
00151 ReadNumber();
00152 break;
00153 }
00154
00155 TDigit* ptr = iNumber.Last();
00156 iNumber.Remove(*ptr);
00157 delete ptr;
00158
00159 PrintNumber();
00160
00161 ReadNumber();
00162 }
00163 break;
00164 default:
00165 CActiveScheduler::Stop();
00166 }
00167 }
00168 }
00169
00173 void CLongNumber::ReadFunc()
00174 {
00175
00176 iConsole->Read(iStatus);
00177 SetActive();
00178 }
00179
00183 void CLongNumber::ReadNumber()
00184 {
00185 _LIT(KTextMenu,"\nMenu\n***\nAdd [f]irst digit to number\nAdd [l]ast digit to number\n[r]emove last digit from number\nAny other NON-NUMERIC key to stop\n***\n");
00186 iConsole->Printf(KTextMenu);
00187 ReadFunc();
00188 }
00189
00193 void CLongNumber::PrintNumber()
00194 {
00195 if(iNumber.IsEmpty())
00196 {
00197 _LIT(KTextEmpty,"Empty Queue !\n");
00198 iConsole->Printf(KTextEmpty);
00199 }
00200 _LIT(KTextNumber,"The number is: ");
00201 iConsole->Printf(KTextNumber);
00202
00203 iIterator.SetToFirst();
00204
00205
00206 while(iIterator != NULL)
00207 {
00208
00209 TDigit digit = *iIterator;
00210
00211 _LIT(KTextInt,"%d");
00212 iConsole->Printf(KTextInt,digit.Get());
00213
00214 iIterator++;
00215 }
00216 }
00217
00221 void CLongNumber::InitializeIter()
00222 {
00223 iIterator.SetToFirst();
00224 }
00225
00232 TBool CLongNumber::GetNumber(TInt& aValue)
00233 {
00234 if(iIterator == NULL)
00235 {
00236
00237 return EFalse;
00238 }
00239 TDigit digit = *iIterator;
00240 aValue = digit.Get();
00241 return ETrue;
00242 }
00243
00248 TBool CLongNumber::Slide()
00249 {
00250
00251 iIterator++;
00252 if(iIterator == NULL)
00253 {
00254
00255 return EFalse;
00256 }
00257 return ETrue;
00258 }
00259
00263 void CLongNumber::DoCancel()
00264 {
00265 if(IsActive())
00266 {
00267
00268 iConsole->ReadCancel();
00269 }
00270 }
00271
00277 CLongNumber::~CLongNumber()
00278 {
00279
00280 if(iIterator)
00281 {
00282 iIterator.SetToFirst();
00283
00284 TDigit *ptr = iIterator++;
00285 while (ptr != NULL)
00286 {
00287 delete ptr;
00288 ptr = iIterator++;
00289 }
00290 }
00291 }