00001 /* 00002 * Copyright © 2008 Nokia Corporation. 00003 */ 00004 00005 // INCLUDE FILES 00006 #include "SMSExampleMarkableListContainer.h" 00007 #include "SmsExamplePanics.pan" 00008 00009 #include <akniconarray.h> // CAknIcon 00010 #include <aknlists.h> // CAknDoubleGraphicStyleListBox 00011 #include <barsread.h> // TResource Reader 00012 #include <e32def.h> // STATIC_CAST 00013 #include <SMSExample.mbg> // icons 00014 #include <smsexample.rsg> // R_SMSEXAMPLE_MARKABLE_LISTBOX 00015 #include <stringloader.h> // StringLoader 00016 #include <uikon.hrh> // TKeyCode #defines 00017 00018 #ifdef __UI_FRAMEWORKS_V2__ 00019 #include <GULICON.H> 00020 #include <AknIconUtils.h> 00021 #include <FBS.H> //fbscli.lib 00022 #endif 00023 00024 #define KListPosition TPoint(0,0) 00025 00026 const TInt KAknExListAddItemBufLength(512); 00027 const TInt KNumberOfIcons(2); 00028 const TInt KBeginIdx=0; 00029 const TInt KEndIdx=2; 00030 00031 _LIT(KIconSelectedText,"1\t"); 00032 _LIT(KIconNotSelectedText,"0\t"); 00033 00034 // ---------------------------------------------------------------------------- 00035 // CMarkableListContainer::ConstructL(const TRect& aRect) 00036 // 00037 // Symbian OS 2 phase constructor. Creates a Window for the controls, which it 00038 // contains. 00039 // ---------------------------------------------------------------------------- 00040 void CMarkableListContainer::ConstructL(const TRect& aRect) 00041 { 00042 CreateWindowL(); 00043 00044 // Create the list 00045 CreateListL(); 00046 00047 iAddress = 0; 00048 iMessage = 0; 00049 00050 // Set the icons in the list's drawer 00051 SetupListIconsL(); 00052 00053 // Set up scroll bars 00054 SetupScrollBarsL(); 00055 00056 iSelectedIds = new (ELeave) RArray<TMsvId>; 00057 00058 SetRect(aRect); 00059 ActivateL(); 00060 } 00061 00062 // ---------------------------------------------------------------------------- 00063 // CMarkableListContainer::CreateListL() 00064 // 00065 // 2nd phase constructor constructs the iSmsListBox and sets its window. 00066 // ---------------------------------------------------------------------------- 00067 void CMarkableListContainer::CreateListL() 00068 { 00069 // First phase construction 00070 iSmsListBox = new (ELeave) CAknDoubleGraphicStyleListBox(); 00071 iSmsListBox->SetContainerWindowL(*this); 00072 iSmsListBox->SetListBoxObserver(this); 00073 00074 // Second Phase Construction 00075 TResourceReader reader; 00076 CEikonEnv::Static()->CreateResourceReaderLC(reader, 00077 R_SMSEXAMPLE_MARKABLE_LISTBOX); 00078 iSmsListBox->ConstructFromResourceL(reader); 00079 CleanupStack::PopAndDestroy(); // reader 00080 } 00081 00082 // ---------------------------------------------------------------------------- 00083 // CMarkableListContainer::SetupScrollBarsL() 00084 // 00085 // Create scrollbars. Scrollbars appear automatically. 00086 // ---------------------------------------------------------------------------- 00087 void CMarkableListContainer::SetupScrollBarsL() 00088 { 00089 iSmsListBox->CreateScrollBarFrameL(ETrue); 00090 iSmsListBox->ScrollBarFrame()->SetScrollBarVisibilityL( 00091 CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto); 00092 } 00093 00094 // ---------------------------------------------------------------------------- 00095 // CMarkableListContainer::SetArraysL(CDesCArrayFlat* aAddress, 00096 // CDesCArrayFlat* aMessage ) 00097 // 00098 // Insert both lists into listbox. 00099 // ---------------------------------------------------------------------------- 00100 void CMarkableListContainer::SetArraysL(CDesCArrayFlat* aAddress, 00101 CDesCArrayFlat* aMessage ) 00102 { 00103 iAddress = aAddress; 00104 iMessage = aMessage; 00105 00106 for (TInt i = 0; i < aAddress->Count(); i++) 00107 { 00108 AddItemL( (*aAddress)[i], (*aMessage)[i] ); 00109 } 00110 } 00111 00112 // ---------------------------------------------------------------------------- 00113 // CMarkableListContainer::MarkAllL(TBool aSelectionMode) 00114 // 00115 // Select or deselect all messages that ListBox displayes. 00116 // ---------------------------------------------------------------------------- 00117 void CMarkableListContainer::MarkAllL(TBool aSelectionMode) 00118 { 00119 if (iSmsListBox) 00120 { 00121 // Not taking ownership 00122 CTextListBoxModel* model = iSmsListBox->Model(); 00123 model->SetOwnershipType (ELbmOwnsItemArray); 00124 CDesCArray* smsArray = STATIC_CAST(CDesCArray*,model->ItemTextArray()); 00125 00126 // Change all icon values. 00127 for (TInt i = 0; i < smsArray->Count(); i++) 00128 { 00129 TBuf <KAknExListAddItemBufLength> changeItem( (*smsArray)[i] ); 00130 00131 00132 if ( aSelectionMode ) // Select one item 00133 { 00134 // Change the icon to selected 00135 changeItem.Replace(KBeginIdx, KEndIdx, KIconSelectedText); 00136 } 00137 else // Deselect one item 00138 { 00139 // Change the icon to not selected 00140 changeItem.Replace(KBeginIdx, KEndIdx, KIconNotSelectedText); 00141 } 00142 00143 // Delete one item 00144 smsArray->Delete(i); 00145 // Insert changed item back. 00146 smsArray->InsertL(i, changeItem); 00147 } 00148 00149 // Change selected ids array to match the case. 00150 if ( aSelectionMode ) 00151 { 00152 // Select all. 00153 SelectItem( 0, ETrue ); 00154 } 00155 else 00156 { 00157 // Deselect all. 00158 DeSelectItem( 0, ETrue ); 00159 } 00160 00161 iSmsListBox->HandleItemAdditionL(); 00162 } 00163 } 00164 00165 // ---------------------------------------------------------------------------- 00166 // CMarkableListContainer::MarkOrUnMarkL() 00167 // 00168 // Change icon and modify iIdArray to correspond situation. 00169 // The icon is used to display if the item has been selected or not. 00170 // ---------------------------------------------------------------------------- 00171 void CMarkableListContainer::MarkOrUnMarkL() 00172 { 00173 if (iSmsListBox) 00174 { 00175 // Cursor's current position 00176 TInt itemIndex = iSmsListBox->CurrentItemIndex(); 00177 00178 if (itemIndex >= 0) 00179 { 00180 // not taking ownership 00181 CTextListBoxModel* model = iSmsListBox->Model(); 00182 model->SetOwnershipType (ELbmOwnsItemArray); 00183 CDesCArray* smsArray = STATIC_CAST(CDesCArray*, 00184 model->ItemTextArray()); 00185 00186 if( smsArray->Count() <= itemIndex ) 00187 { 00188 User::Leave(KErrTooBig); 00189 } 00190 00191 TBuf <KAknExListAddItemBufLength> changeItem( 00192 (*smsArray)[itemIndex] 00193 ); 00194 00195 // Compare index to see which is the case. Deselected -> Selected 00196 if ( changeItem.Left(KEndIdx) == KIconNotSelectedText ) 00197 { 00198 changeItem.Replace(KBeginIdx, KEndIdx, KIconSelectedText); 00199 // Modify iIdArray 00200 SelectItem( itemIndex, EFalse ); 00201 } // Selected -> Deselected 00202 else if ( changeItem.Left(KEndIdx) == KIconSelectedText ) 00203 { 00204 changeItem.Replace(KBeginIdx, KEndIdx, KIconNotSelectedText); 00205 // Modify iIdArray 00206 DeSelectItem( itemIndex, EFalse ); 00207 } 00208 00209 smsArray->Delete(itemIndex); 00210 smsArray->InsertL(itemIndex, changeItem); 00211 00212 iSmsListBox->HandleItemAdditionL(); 00213 } 00214 } 00215 } 00216 00217 // ---------------------------------------------------------------------------- 00218 // CMarkableListContainer::SelectItem(TInt aIndex, TBool aSelectAll) 00219 // 00220 // Select item. 00221 // ---------------------------------------------------------------------------- 00222 void CMarkableListContainer::SelectItem(TInt aIndex, TBool aSelectAll) 00223 { 00224 // Copy 00225 if ( aSelectAll ) 00226 { 00227 iSelectedIds->Reset(); 00228 for (TInt i = 0; i < iIdArray->Count(); i++) 00229 { 00230 iSelectedIds->Append( (*iIdArray)[i] ); 00231 } 00232 } 00233 else if( iIdArray->Count() > aIndex ) 00234 { 00235 TMsvId id = (*iIdArray)[aIndex]; 00236 // Try to find the id, if not present then append id onto list. 00237 if ( KErrNotFound == iSelectedIds->Find( id ) ) 00238 { 00239 iSelectedIds->Append( id ); 00240 } 00241 } 00242 else 00243 { 00244 Panic(EGuiGeneral); 00245 } 00246 00247 } 00248 00249 // ---------------------------------------------------------------------------- 00250 // CMarkableListContainer::DeSelectItem(TInt aIndex, TBool aDeselectAll) 00251 // 00252 // Deselect item. 00253 // ---------------------------------------------------------------------------- 00254 void CMarkableListContainer::DeSelectItem(TInt aIndex, TBool aDeselectAll) 00255 { 00256 if ( aDeselectAll ) 00257 { 00258 iSelectedIds->Reset(); 00259 } 00260 else if( iIdArray->Count() > aIndex ) 00261 { 00262 TInt index = iSelectedIds->Find( (*iIdArray)[aIndex] ); 00263 00264 if ( index != KErrNotFound ) 00265 { 00266 iSelectedIds->Remove( index ); 00267 } 00268 } 00269 else 00270 { 00271 Panic(EGuiGeneral); 00272 } 00273 00274 } 00275 00276 // ---------------------------------------------------------------------------- 00277 // CMarkableListContainer::SetupListIconsL() 00278 // 00279 // Create icon array. 00280 // ---------------------------------------------------------------------------- 00281 void CMarkableListContainer::SetupListIconsL() 00282 { 00283 // Get the name of the file containing the icons 00284 HBufC* iconFilename = NULL; 00285 iconFilename = StringLoader::LoadLC(R_ICON_FILE_NAME); //#ifdef in loc file 00286 // Create an array of icons, reading them from the file 00287 CArrayPtr<CGulIcon>* icons = new(ELeave) CAknIconArray(KNumberOfIcons); 00288 CleanupStack::PushL(icons); 00289 00290 #ifdef __UI_FRAMEWORKS_V2__ // NOT IN FP3, should executed also there 00291 // because scalable ui is supported 00292 CFbsBitmap* icon = NULL; 00293 CFbsBitmap* iconMask = NULL; 00294 CFbsBitmap* icon2 = NULL; 00295 CFbsBitmap* iconMask2 = NULL; 00296 00297 AknIconUtils::CreateIconLC(icon, iconMask, *iconFilename, 00298 EMbmSmsexampleTock,EMbmSmsexampleTock_mask); 00299 00300 00301 CGulIcon* guiIcon = CGulIcon::NewL( icon, iconMask ); 00302 CleanupStack::PushL(guiIcon); 00303 icons->AppendL( guiIcon ); 00304 CleanupStack::Pop(guiIcon); 00305 CleanupStack::Pop(2); //icon, iconMask 00306 00307 AknIconUtils::CreateIconLC(icon2, iconMask2, *iconFilename, 00308 EMbmSmsexampleTick,EMbmSmsexampleTick_mask); 00309 00310 CGulIcon* guiIcon2 = CGulIcon::NewL( icon2, iconMask2 ); 00311 CleanupStack::PushL(guiIcon2); 00312 icons->AppendL( guiIcon2 ); 00313 CleanupStack::Pop(guiIcon2); 00314 CleanupStack::Pop(2); //icon2, iconMask2 00315 #else 00316 CGulIcon* icon = iEikonEnv->CreateIconL(*iconFilename, 00317 EMbmSmsexampleTock, 00318 EMbmSmsexampleTock_mask); 00319 CleanupStack::PushL(icon); 00320 icons->AppendL(icon); 00321 CleanupStack::Pop(icon); 00322 icon =iEikonEnv->CreateIconL(*iconFilename, EMbmSmsexampleTick, 00323 EMbmSmsexampleTick_mask); 00324 CleanupStack::PushL(icon); 00325 icons->AppendL(icon); 00326 CleanupStack::Pop(icon); 00327 #endif 00328 00329 CleanupStack::Pop(icons); 00330 00331 CleanupStack::PopAndDestroy(iconFilename); 00332 00333 // passing ownership of icons 00334 iSmsListBox->ItemDrawer()->ColumnData()->SetIconArray(icons); 00335 } 00336 00337 // ---------------------------------------------------------------------------- 00338 // CMarkableListContainer::NewL(const TRect& aRect) 00339 // 00340 // Symbian OS 2 phase constructor. 00341 // ---------------------------------------------------------------------------- 00342 CMarkableListContainer* CMarkableListContainer::NewL(const TRect& aRect) 00343 { 00344 CMarkableListContainer* self = CMarkableListContainer::NewLC(aRect); 00345 CleanupStack::Pop(self); 00346 return self; 00347 } 00348 00349 // ---------------------------------------------------------------------------- 00350 // CMarkableListContainer::NewLC(const TRect& aRect) 00351 // 00352 // Symbian OS 2 phase constructor. 00353 // ---------------------------------------------------------------------------- 00354 CMarkableListContainer* CMarkableListContainer::NewLC(const TRect& aRect) 00355 { 00356 CMarkableListContainer* self = new (ELeave) CMarkableListContainer; 00357 CleanupStack::PushL(self); 00358 self->ConstructL(aRect); 00359 return self; 00360 } 00361 00362 // ---------------------------------------------------------------------------- 00363 // CMarkableListContainer::~CMarkableListContainer() 00364 // 00365 // Destructor. 00366 // ---------------------------------------------------------------------------- 00367 CMarkableListContainer::~CMarkableListContainer() 00368 { 00369 Cleanup(); 00370 } 00371 00372 void CMarkableListContainer::Cleanup() 00373 { 00374 iIdArray->Reset(); 00375 delete iIdArray; 00376 iIdArray = 0; 00377 00378 iAddress->Reset(); 00379 delete iAddress; 00380 iAddress = 0; 00381 00382 iMessage->Reset(); 00383 delete iMessage; 00384 iMessage = 0; 00385 00386 delete iSmsListBox; 00387 iSmsListBox = 0; 00388 } 00389 // ---------------------------------------------------------------------------- 00390 // CMarkableListContainer::SizeChanged() 00391 // 00392 // Called by framework when the view size is changed 00393 // ---------------------------------------------------------------------------- 00394 void CMarkableListContainer::SizeChanged() 00395 { 00396 iSmsListBox->SetExtent (KListPosition, iSmsListBox->MinimumSize()); 00397 } 00398 00399 // ---------------------------------------------------------------------------- 00400 // CMarkableListContainer::CountComponentControls() const 00401 // 00402 // Called by the framework in compound controls 00403 // ---------------------------------------------------------------------------- 00404 TInt CMarkableListContainer::CountComponentControls() const 00405 { 00406 return 1; // return number of controls inside this container 00407 } 00408 00409 // ---------------------------------------------------------------------------- 00410 // CMarkableListContainer::ComponentControl(TInt aIndex) const 00411 // 00412 // Called by the framework in compound controls 00413 // ---------------------------------------------------------------------------- 00414 CCoeControl* CMarkableListContainer::ComponentControl(TInt aIndex) const 00415 { 00416 switch (aIndex) 00417 { 00418 case 0: 00419 return iSmsListBox; 00420 default: 00421 return NULL; 00422 } 00423 } 00424 00425 // ---------------------------------------------------------------------------- 00426 // CMarkableListContainer::Draw(const TRect& aRect) const 00427 // 00428 // Called by the framework to draw this control. 00429 // ---------------------------------------------------------------------------- 00430 void CMarkableListContainer::Draw(const TRect& aRect) const 00431 { 00432 CWindowGc& gc = SystemGc(); 00433 gc.Clear(aRect); 00434 } 00435 00436 // ---------------------------------------------------------------------------- 00437 // CMarkableListContainer::OfferKeyEventL(const TKeyEvent& aKeyEvent, 00438 // TEventCode aType) 00439 // 00440 // Called by the framework whenever a key event occurs. 00441 // ---------------------------------------------------------------------------- 00442 TKeyResponse CMarkableListContainer::OfferKeyEventL(const TKeyEvent& aKeyEvent, 00443 TEventCode aType) 00444 { 00445 if (iSmsListBox) 00446 return iSmsListBox->OfferKeyEventL (aKeyEvent, aType); 00447 else 00448 return EKeyWasNotConsumed; 00449 } 00450 00451 // ---------------------------------------------------------------------------- 00452 // CMarkableListContainer::SetIdArray(RArray<TMsvId>* aArray) 00453 // ---------------------------------------------------------------------------- 00454 void CMarkableListContainer::SetIdArray(RArray<TMsvId>* aArray) 00455 { 00456 iIdArray = aArray; 00457 } 00458 00459 // ---------------------------------------------------------------------------- 00460 // CMarkableListContainer::GetSelectedItems() 00461 // 00462 // Return an array of items that have been selected. 00463 // ---------------------------------------------------------------------------- 00464 RArray<TMsvId>* CMarkableListContainer::GetSelectedItems() 00465 { 00466 return iSelectedIds; 00467 } 00468 00469 // ---------------------------------------------------------------------------- 00470 // CMarkableListContainer::HandleListBoxEventL(CEikListBox* /*aListBox*/, 00471 // TListBoxEvent aListBoxEvent) 00472 // 00473 // Called by the framework whenever a list event occurs for which this container 00474 // is an observer. 00475 // ---------------------------------------------------------------------------- 00476 void CMarkableListContainer::HandleListBoxEventL(CEikListBox* /*aListBox*/, 00477 TListBoxEvent aListBoxEvent) 00478 { 00479 // if the Select Key has been pressed 00480 if ((aListBoxEvent == MEikListBoxObserver::EEventEnterKeyPressed) || 00481 (aListBoxEvent == MEikListBoxObserver::EEventItemDoubleClicked)) 00482 { 00483 MarkOrUnMarkL(); 00484 } 00485 } 00486 00487 // ---------------------------------------------------------------------------- 00488 // CMarkableListContainer::AddItemL(const TDesC& aNewItem) 00489 // 00490 // Add an item into the listbox. 00491 // ---------------------------------------------------------------------------- 00492 void CMarkableListContainer::AddItemL(const TDesC& aFirstLabel, 00493 const TDesC& aSecondLabel) 00494 { 00495 CTextListBoxModel* model = iSmsListBox->Model(); 00496 model->SetOwnershipType (ELbmOwnsItemArray); 00497 CDesCArray* smsArray = static_cast <CDesCArray*> (model->ItemTextArray()); 00498 00499 TBuf <KAknExListAddItemBufLength> addedItem( KBeginIdx ); 00500 00501 // List item string format: "0\tFirstLabel\tSecondLabel\t0" 00502 // where 0 is index to icon array 00503 // Listbox icon is required at the beginning of a descriptor, 00504 //" \t" if there is no icon. 00505 _LIT( KBeginning, "0\t"); 00506 addedItem.Append( KBeginning ); 00507 addedItem.Append( aFirstLabel ); 00508 00509 // Second icon is always empty. 00510 _LIT( KEnd, "\t"); 00511 addedItem.Append( KEnd ); 00512 addedItem.Append( aSecondLabel ); 00513 addedItem.Append( KEnd ); 00514 00515 // Insert a new item into the array 00516 smsArray->AppendL( addedItem ); 00517 00518 iSmsListBox->HandleItemAdditionL(); 00519 } 00520 00521 // End of file
Copyright ©2010 Nokia Corporation and/or its subsidiary(-ies).
All rights
reserved. Unless otherwise stated, these materials are provided under the terms of the Eclipse Public License
v1.0.