diff -r 000000000000 -r 094583676ce7 wvuing/IMPSConnectionUI/UISrc/ccnuidomainselectionquerydialog.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wvuing/IMPSConnectionUI/UISrc/ccnuidomainselectionquerydialog.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,335 @@ +/* +* Copyright (c) 2006 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: Domain selection query pop-up +* +*/ + + +#include +#include +#include +#include +#include + +#include "ccnuidomainselectionquerydialog.h" + +_LIT( KListItemFormat, "%d\t%S" ); +_LIT( KIMPreviousDomainIndex, "KIMPreviousDomainIndex" ); + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CCnUiDomainSelectionQueryDialog::CCnUiDomainSelectionQueryDialog +// --------------------------------------------------------------------------- +// +CCnUiDomainSelectionQueryDialog::CCnUiDomainSelectionQueryDialog( + TInt* aIndex, CIMPSSAPSettings* aSap ) + : CAknListQueryDialog( aIndex ), + iOwnershipType( ELbmOwnsItemArray ), + iSap( aSap ), + iSapOwned( EFalse ) + { + // No implementation needed + } + +// --------------------------------------------------------------------------- +// CCnUiDomainSelectionQueryDialog::ConstructL +// --------------------------------------------------------------------------- +// +void CCnUiDomainSelectionQueryDialog::ConstructL() + { + TPtrC avkonBmpPath( AknIconUtils::AvkonIconFileName() ); + + // Create icons for radio button and empty A-column icon + AknIconUtils::CreateIconL( + iRadioButton, + iRadioButtonMask, + avkonBmpPath, + EMbmAvkonQgn_indi_radiobutt_on, + EMbmAvkonQgn_indi_radiobutt_on_mask ); + + AknIconUtils::CreateIconL( + iEmpty, + iEmptyMask, + avkonBmpPath, + EMbmAvkonQgn_indi_radiobutt_off, + EMbmAvkonQgn_indi_radiobutt_off_mask ); + + // Try to find stored SAP, needed for accessing previously + // selected domain index when query is displayed again after + // user has emptied user id field in id & password query. + // If stored SAP is not found iSap is used directly. + if ( iSap ) + { + CIMPSSAPSettingsStore* sapStore = CIMPSSAPSettingsStore::NewLC(); + CIMPSSAPSettingsList* sapList = CIMPSSAPSettingsList::NewLC(); + sapStore->PopulateSAPSettingsListL( *sapList, EIMPSIMAccessGroup ); + + // Because logged in SAP has UID of zero, we must + // find the correct UID manually from list + TInt index = KErrNotFound; + TInt retVal = sapList->FindNameL( iSap->SAPName(), index ); + + if ( index != KErrNotFound && retVal != KErrNotFound ) + { + // Found it, use it + CIMPSSAPSettings* storedSap = CIMPSSAPSettings::NewLC(); + + TUint32 sapUid = sapList->UidForIndex( index ); + sapStore->GetSAPL( sapUid, storedSap ); + + iSap = storedSap; + iSapOwned = ETrue; + CleanupStack::Pop( storedSap ); + } + + CleanupStack::PopAndDestroy( 2, sapStore ); + } + } + + +// --------------------------------------------------------------------------- +// CCnUiDomainSelectionQueryDialog::NewL +// --------------------------------------------------------------------------- +// +CCnUiDomainSelectionQueryDialog* CCnUiDomainSelectionQueryDialog::NewL( + TInt* aIndex, + CIMPSSAPSettings* aSap /*= NULL*/ ) + { + CCnUiDomainSelectionQueryDialog* self = + new ( ELeave ) CCnUiDomainSelectionQueryDialog( aIndex, aSap ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CCnUiDomainSelectionQueryDialog::~CCnUiDomainSelectionQueryDialog +// --------------------------------------------------------------------------- +// +CCnUiDomainSelectionQueryDialog::~CCnUiDomainSelectionQueryDialog() + { + delete iRadioButton; + delete iRadioButtonMask; + delete iEmpty; + delete iEmptyMask; + + if ( iOwnershipType == ELbmOwnsItemArray ) + { + delete iItemTextArray; + } + + if ( iSapOwned ) + { + delete iSap; + } + } + +// --------------------------------------------------------------------------- +// From class CAknListQueryDialog. +// CCnUiDomainSelectionQueryDialog::OfferKeyEventL +// --------------------------------------------------------------------------- +// +TKeyResponse CCnUiDomainSelectionQueryDialog::OfferKeyEventL( + const TKeyEvent& aKeyEvent, TEventCode aType ) + { + return CAknListQueryDialog::OfferKeyEventL( aKeyEvent, aType ); + } + +// --------------------------------------------------------------------------- +// From class CAknListQueryDialog. +// CCnUiDomainSelectionQueryDialog::PreLayoutDynInitL +// --------------------------------------------------------------------------- +// +void CCnUiDomainSelectionQueryDialog::PreLayoutDynInitL() + { + // First call PreLayoutDynInitL from base class + CAknListQueryDialog::PreLayoutDynInitL(); + + TInt prevIndex = 0; + + // Get previous selected domain from sap + if ( iSap ) + { + TInt sapError; + sapError = iSap->GetOpaqueInt( KIMPreviousDomainIndex, prevIndex ); + + if ( sapError != KErrNotFound && sapError != KErrNone ) + { + User::Leave( sapError ); + } + } + + // Check prevIndex for array boundaries + // If resources are changed prevIndex may go out of bounds + if ( prevIndex > ( ListBox()->Model()->NumberOfItems() - 1 ) ) + { + prevIndex = 0; + } + + UpdateRadioButtonL( prevIndex ); + ListBox()->SetCurrentItemIndex( prevIndex ); + } + +// --------------------------------------------------------------------------- +// From class CAknListQueryDialog. +// CCnUiDomainSelectionQueryDialog::OkToExitL +// --------------------------------------------------------------------------- +// +TBool CCnUiDomainSelectionQueryDialog::OkToExitL( TInt aButtonId ) + { + // Check reaction of query to button id + TBool exit = CAknListQueryDialog::OkToExitL( aButtonId ); + + if ( exit ) + { + TInt itemIndex = ListBox()->CurrentItemIndex(); + + // Update radio button before exiting + UpdateRadioButtonL( itemIndex, ETrue ); + + // Update selected domain index to SAP + if ( iSap ) + { + CIMPSSAPSettingsStore* sapStore = CIMPSSAPSettingsStore::NewLC(); + CIMPSSAPSettingsList* sapList = CIMPSSAPSettingsList::NewLC(); + sapStore->PopulateSAPSettingsListL( *sapList, EIMPSIMAccessGroup ); + + // Because logged in SAP has UID of zero, we must + // find the correct UID manually from list + TInt index = KErrNotFound; + TInt retVal = sapList->FindNameL( iSap->SAPName(), index ); + + if ( index != KErrNotFound && retVal != KErrNotFound ) + { + // Found it, update the correct SAP + CIMPSSAPSettings* storedSap = CIMPSSAPSettings::NewLC(); + + TUint32 sapUid = sapList->UidForIndex( index ); + sapStore->GetSAPL( sapUid, storedSap ); + storedSap->SetOpaqueInt( KIMPreviousDomainIndex, itemIndex ); + sapStore->UpdateOldSAPL( storedSap, sapUid ); + + CleanupStack::PopAndDestroy( storedSap ); + } + else + { + iSap->SetOpaqueInt( KIMPreviousDomainIndex, itemIndex ); + } + + CleanupStack::PopAndDestroy( 2, sapStore ); + } + } + + return exit; + } + +// --------------------------------------------------------------------------- +// From class CAknListQueryDialog. +// CCnUiDomainSelectionQueryDialog::SetItemTextArray +// --------------------------------------------------------------------------- +// +void CCnUiDomainSelectionQueryDialog::SetItemTextArray( MDesCArray* aItemTextArray ) + { + iItemTextArray = aItemTextArray; + + // Create array with icon indexes + TRAP_IGNORE( + TInt itemCount = iItemTextArray->MdcaCount(); + + CDesCArray* indexedArray = new ( ELeave ) CDesCArrayFlat( itemCount ); + CleanupStack::PushL( indexedArray ); + + for ( TInt i = 0; i < itemCount; ++i ) + { + TPtrC item = iItemTextArray->MdcaPoint( i ); + HBufC* indexedItem = HBufC::NewLC( item.Length() + KListItemFormat().Length() ); + TPtr ptr( indexedItem->Des() ); + ptr.Format( KListItemFormat, i, &item ); + indexedArray->AppendL( *indexedItem ); + CleanupStack::PopAndDestroy( indexedItem ); + } + + // Set indexed array for CAknListQueryDialog + CAknListQueryDialog::SetItemTextArray( indexedArray ); + CAknListQueryDialog::SetOwnershipType( ELbmOwnsItemArray ); + CleanupStack::Pop( indexedArray ); + ); // TRAP_IGNORE + } + +// --------------------------------------------------------------------------- +// From class CAknListQueryDialog. +// CCnUiDomainSelectionQueryDialog::SetOwnershipType +// --------------------------------------------------------------------------- +// +void CCnUiDomainSelectionQueryDialog::SetOwnershipType( + TListBoxModelItemArrayOwnership aOwnershipType ) + { + iOwnershipType = aOwnershipType; + } + +// --------------------------------------------------------------------------- +// CCnUiDomainSelectionQueryDialog::UpdateRadioButtonL +// --------------------------------------------------------------------------- +// +void CCnUiDomainSelectionQueryDialog::UpdateRadioButtonL( + TInt aSelectedIndex, + TBool aForceUpdate /*= EFalse*/ ) + { + TInt itemCount = iItemTextArray->MdcaCount(); + + CArrayPtr* iconsArray = new ( ELeave ) CArrayPtrFlat( itemCount ); + CleanupStack::PushL( TCleanupItem( DestroyCloseArray, iconsArray ) ); + + for ( TInt i = 0; i < itemCount; ++i ) + { + CGulIcon* icon = NULL; + + if ( i == aSelectedIndex ) + { + icon = CGulIcon::NewL( iRadioButton, iRadioButtonMask ); + } + else + { + icon = CGulIcon::NewL( iEmpty, iEmptyMask ); + } + + // Keep ownership of bitmaps + icon->SetBitmapsOwnedExternally( ETrue ); + CleanupStack::PushL( icon ); + iconsArray->AppendL( icon ); // Ownership transferred + CleanupStack::Pop( icon ); + } + + // Set icons to query + SetIconArrayL( iconsArray ); + CleanupStack::Pop( iconsArray ); // Ownership transferred + + if ( aForceUpdate ) + { + // Call DrawNow from list box to avoid flickering of dialog + ListBox()->DrawNow(); + } + } + +// --------------------------------------------------------------------------- +// CCnUiDomainSelectionQueryDialog::DestroyCloseArray +// --------------------------------------------------------------------------- +// +void CCnUiDomainSelectionQueryDialog::DestroyCloseArray( TAny* aObject ) + { + reinterpret_cast< CArrayPtr* >( aObject )->ResetAndDestroy(); + } +