wvuing/IMPSConnectionUI/UISrc/ccnuidomainselectionquerydialog.cpp
changeset 0 094583676ce7
--- /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 <akniconutils.h>
+#include <avkon.mbg>
+#include <cimpssapsettings.h>
+#include <cimpssapsettingsstore.h>
+#include <cimpssapsettingslist.h>
+
+#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<CGulIcon>* iconsArray = new ( ELeave ) CArrayPtrFlat<CGulIcon>( 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<CGulIcon>* >( aObject )->ResetAndDestroy();
+    }
+