diff -r 83e6409f1e6e -r 4cd5f847237f profilesapplication/Profiles/ProfileApp/SettingsViewSrc/CProfileAlertForSettingItem.cpp --- a/profilesapplication/Profiles/ProfileApp/SettingsViewSrc/CProfileAlertForSettingItem.cpp Tue Feb 02 00:10:48 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,446 +0,0 @@ -/* -* Copyright (c) 2002 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: Setting item class for "Alert for" setting. -* -*/ - - - -// INCLUDES -#include "CProfileAlertForSettingItem.h" - -#include -#include -#include -#include -#include -#include -#include - -#include "CProfileAlertForSettingPage.h" - -// CONSTANTS -const TInt KContactItemArrayGranularity( 8 ); - -// ============================ MEMBER FUNCTIONS =============================== - -// ----------------------------------------------------------------------------- -// CProfileAlertForSettingItem::CProfileAlertForSettingItem -// C++ constructor can NOT contain any code, that might leave. -// ----------------------------------------------------------------------------- -// -CProfileAlertForSettingItem::CProfileAlertForSettingItem( - TInt aIdentifier, - RArray& aContactList, - CCoeEnv* aCoeEnv ) - : CAknSettingItem( aIdentifier ), - iPopupArray( KContactItemArrayGranularity ), - iExternalContactArray( aContactList ), - iCoeEnv( aCoeEnv ) - { - } - -// Destructor -CProfileAlertForSettingItem::~CProfileAlertForSettingItem() - { - delete iChangeNotifier; - delete iPbkContactEngine; - delete iTextSeveralGroups; - delete iTextAllCallers; - iFullContactArray.Close(); - iPopupArray.ResetAndDestroy(); - } - -// ----------------------------------------------------------------------------- -// CProfileAlertForSettingItem::CompleteConstructionL -// ----------------------------------------------------------------------------- -// -void CProfileAlertForSettingItem::CompleteConstructionL() - { - // Read localised texts from resource - iTextAllCallers = StringLoader::LoadL( R_PROFILE_TEXT_ALL_CALLERS ); - iTextSeveralGroups = StringLoader::LoadL( R_PROFILE_TEXT_SEVERAL_GROUPS ); - - // Create Phonebook contact engine and change notifier - iPbkContactEngine = CPbkContactEngine::NewL(); - iChangeNotifier = iPbkContactEngine->CreateContactChangeNotifierL( this ); - - PopulatePopupArrayL(); - } - -// ----------------------------------------------------------------------------- -// CProfileAlertForSettingItem::AlertForStatus -// ----------------------------------------------------------------------------- -// -CProfileAlertForSettingItem::TAlertForStatus CProfileAlertForSettingItem::AlertForStatus() const - { - TInt count( iPopupArray.Count() ); - if( count > 1 ) - { - // Array contains 2 or more items - if( SelectionStatus( 0 ) ) - { - // If first item is selected, return EAlertForAllCallers - return EAlertForAllCallers; - } - TInt selectCount( 0 ); - // Start from index 1, because 0 is "All callers" - for( TInt index( 1 ); index < count; index++ ) - { - if( SelectionStatus( index ) ) - { - // Found a selected item, increase counter - selectCount++; - } - } - if( selectCount == 1 ) - { - return EAlertForSingleGroup; - } - return EAlertForSeveralGroups; - } - // Pop-up array is empty or contains only "All callers" - return EAlertForAllCallers; - } - -// ----------------------------------------------------------------------------- -// CProfileAlertForSettingItem::SetSelectionStatus -// ----------------------------------------------------------------------------- -// -void CProfileAlertForSettingItem::SetSelectionStatus( TInt aIndex, TBool aStatus ) - { - if( aIndex < iPopupArray.MdcaCount() ) - { - iPopupArray.At( aIndex )->SetSelectionStatus( aStatus ); - } - } - -// ----------------------------------------------------------------------------- -// CProfileAlertForSettingItem::SelectionStatus -// ----------------------------------------------------------------------------- -// -TBool CProfileAlertForSettingItem::SelectionStatus( TInt aIndex ) const - { - if( aIndex < iPopupArray.MdcaCount() ) - { - return iPopupArray.At( aIndex )->SelectionStatus(); - } - else - { - return EFalse; - } - } - -// ----------------------------------------------------------------------------- -// CProfileAlertForSettingItem::PopulatePopupArrayL -// ----------------------------------------------------------------------------- -// -void CProfileAlertForSettingItem::PopulatePopupArrayL() - { - iPopupArray.ResetAndDestroy(); - iFullContactArray.Reset(); - - // Create first item to popup array, "All callers" - CSelectableItem* item = new( ELeave ) CSelectableItem( - *iTextAllCallers, EFalse ); - CleanupStack::PushL( item ); - item->ConstructL(); - iPopupArray.AppendL( item ); // Ownership is transferred - CleanupStack::Pop( item ); - - CContactIdArray* groupIdArray = iPbkContactEngine->Database().GetGroupIdListL(); - CleanupStack::PushL( groupIdArray ); - TInt count( groupIdArray->Count() ); - TContactItemId contactId; - CContactGroup* contactGroup = NULL; - TPtrC contactGroupName; - for( TInt index( 0 ); index < count; index++ ) - { - contactId = ( *groupIdArray )[ index ]; - - iFullContactArray.Append( contactId ); - contactGroup = iPbkContactEngine->ReadContactGroupL( contactId ); - CleanupStack::PushL( contactGroup ); - contactGroupName.Set( contactGroup->GetGroupLabelL() ); - - item = new( ELeave ) CSelectableItem( contactGroupName, EFalse ); - CleanupStack::PushL( item ); - item->ConstructL(); - iPopupArray.AppendL( item ); // Ownership is transferred - CleanupStack::Pop( item ); - - CleanupStack::PopAndDestroy( contactGroup ); - } - - CleanupStack::PopAndDestroy( groupIdArray ); - } - -// ----------------------------------------------------------------------------- -// CProfileAlertForSettingItem::CheckAllCallersSetting -// ----------------------------------------------------------------------------- -// -void CProfileAlertForSettingItem::CheckAllCallersSetting() - { - TInt count( iPopupArray.Count() ); - if( count > 0 ) - { - // Check whether the first item, "All callers", is selected or not. - if( SelectionStatus( 0 ) ) - { - // "All callers" is selected. - // Set other groups unselected. - for( TInt index( 1 ); index < count; index++ ) - { - SetSelectionStatus( index, EFalse ); - } - } - } - } - -// ----------------------------------------------------------------------------- -// CProfileAlertForSettingItem::UpdateSettingPageL -// ----------------------------------------------------------------------------- -// -void CProfileAlertForSettingItem::UpdateSettingPageL() - { - // Closing and opening the database has because - // the database doesn't update its information otherwise - iPbkContactEngine->Database().CloseTables(); - iPbkContactEngine->Database().OpenTablesL(); - - RArray selectedContacts; - CleanupClosePushL( selectedContacts ); - StoreL( selectedContacts ); - PopulatePopupArrayL(); - LoadL( selectedContacts ); - CleanupStack::PopAndDestroy(); // selectedContacts - - UpdateListBoxTextL(); // Calls SettingTextL() - - if( SettingPage() ) - { - // Pop-up is popped up - CProfileAlertForSettingPage* sp = - static_cast< CProfileAlertForSettingPage* >( SettingPage() ); - TInt lastIndex( iPopupArray.Count() - 1 ); - TInt currentIndex( sp->ListBoxControl()->View()->CurrentItemIndex() ); - if( currentIndex > lastIndex ) - { - sp->ListBoxControl()->SetCurrentItemIndex( lastIndex ); - } - if( currentIndex < 0 ) - { - sp->ListBoxControl()->SetCurrentItemIndex( 0 ); - } - - // Must clear listbox view's selections, because if items have been deleted, - // non existent selections remain in view's selection array. - sp->ListBoxControl()->View()->ClearSelection(); - // Set the new selection array to setting page - sp->SetSelectionItemArrayL( &iPopupArray ); - // Update possibly changed CBA visibility - sp->UpdateCba(); - } - else // Setting page is not visible - { - LoadL(); - } - } - -// ----------------------------------------------------------------------------- -// CProfileAlertForSettingItem::StoreL -// ----------------------------------------------------------------------------- -// -void CProfileAlertForSettingItem::StoreL( RArray& aArray ) const - { - aArray.Reset(); - TInt count( iPopupArray.Count() ); - // Start from index 1 (0 is 'All callers') - for( TInt index( 1 ); index < count; index++ ) - { - // If an item in array is selected - if( SelectionStatus( index ) ) - { - // Add its id to external contact array - aArray.Append( iFullContactArray[ index - 1 ] ); - } - } - } - -// ----------------------------------------------------------------------------- -// CProfileAlertForSettingItem::LoadL -// ----------------------------------------------------------------------------- -// -void CProfileAlertForSettingItem::LoadL( const RArray& aArray ) - { - TInt index( 0 ); - TInt count( iPopupArray.Count() ); - - // Set all selections false - for( ; index < count; index++ ) - { - SetSelectionStatus( index, EFalse ); - } - - TContactItemId contactId; - TInt foundCount( 0 ); - TInt foundIndex; - count = aArray.Count(); - for( index = 0; index < count; index++ ) - { - contactId = aArray[ index ]; - // Try to find contact id from full contact group array - foundIndex = iFullContactArray.Find( contactId ); - if( foundIndex >= 0 ) - { - // Indices in iFullContactArray are the same as in iPopupArray - // except that iPopupArray's 1st item is "All callers". Therefore + 1. - SetSelectionStatus( foundIndex + 1, ETrue ); - // A valid contact id is found, increase counter - foundCount++; - } - } - - // If there were no contact groups selected, - // or selected groups are not longer valid, select "All callers" - if( foundCount == 0 ) - { - SetSelectionStatus( 0, ETrue ); - } - } - -// ----------------------------------------------------------------------------- -// CProfileAlertForSettingItem::StoreL -// ----------------------------------------------------------------------------- -// -void CProfileAlertForSettingItem::StoreL() - { - StoreL( iExternalContactArray ); - } - -// ----------------------------------------------------------------------------- -// CProfileAlertForSettingItem::LoadL -// ----------------------------------------------------------------------------- -// -void CProfileAlertForSettingItem::LoadL() - { - LoadL( iExternalContactArray ); - } - -// ----------------------------------------------------------------------------- -// CProfileAlertForSettingItem::EditItemL -// ----------------------------------------------------------------------------- -// -void CProfileAlertForSettingItem::EditItemL( TBool /* aCalledFromMenu */ ) - { - CProfileAlertForSettingPage* dlg = new( ELeave ) CProfileAlertForSettingPage( - SettingPageResourceId(), &iPopupArray ); - SetSettingPage( dlg ); // Set iSettingPage to indicate that pop-up is displayed - dlg->SetSettingPageObserver( this ); - dlg->ExecuteLD(); - SetSettingPage( NULL ); // iSettingPage is NULL, pop-up is closed - } - -// ----------------------------------------------------------------------------- -// CProfileAlertForSettingItem::SettingTextL -// ----------------------------------------------------------------------------- -// -const TDesC& CProfileAlertForSettingItem::SettingTextL() - { - switch( AlertForStatus() ) - { - case EAlertForAllCallers: - { - iSettingText = *iTextAllCallers; - break; - } - case EAlertForSingleGroup: - { - TInt count( iPopupArray.Count() ); - if( count > 0 ) - { - // Search the selected group - while( !SelectionStatus( --count ) && count > 1 ) {} - // Get its name - iSettingText = iPopupArray.At( count )->ItemText(); - } - break; - } - case EAlertForSeveralGroups: - { - iSettingText = *iTextSeveralGroups; - break; - } - default: - { - break; - } - } - return iSettingText; - } - -// ----------------------------------------------------------------------------- -// CProfileAlertForSettingItem::HandleDatabaseEventL -// ----------------------------------------------------------------------------- -// -void CProfileAlertForSettingItem::HandleDatabaseEventL( TContactDbObserverEvent aEvent ) - { - if( ( aEvent.iType == EContactDbObserverEventGroupAdded ) || // A contact item group has been added. - ( aEvent.iType == EContactDbObserverEventGroupChanged ) || // A contact item group has been updated. - ( aEvent.iType == EContactDbObserverEventGroupDeleted ) ) // A contact item group has been deleted from the database. - { - UpdateSettingPageL(); - } - } - -// ----------------------------------------------------------------------------- -// CProfileAlertForSettingItem::HandleSettingPageEventL -// After settings have been accepted, some checks are made in this method. -// If "Alert for" is selected , all other groups must be unselected. -// If nothing is selected , "Alert for" must be selected. -// ----------------------------------------------------------------------------- -// -void CProfileAlertForSettingItem::HandleSettingPageEventL( - CAknSettingPage* aSettingPage, TAknSettingPageEvent aEventType ) - { - switch( aEventType ) - { - case EEventSettingOked: - { - // Check that "All callers" is in correct state - CheckAllCallersSetting(); - break; - } - case EEventSettingCancelled: - { - // If setting is cancelled, load old values - LoadL(); - break; - } - case EEventSettingChanged: - { - // If setting has changed, update CBA visibility - static_cast( aSettingPage )->UpdateCba(); - break; - } - default: - { - break; - } - } - CAknSettingItem::HandleSettingPageEventL( aSettingPage, aEventType ); - } - - -// End of File