connectionutilities/ConnectionDialogs/cconndlg/src/SelectConnectionDialog.cpp
branchRCL_3
changeset 25 83ca720e2b9a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/connectionutilities/ConnectionDialogs/cconndlg/src/SelectConnectionDialog.cpp	Wed Sep 01 12:23:51 2010 +0100
@@ -0,0 +1,594 @@
+/*
+* 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:  Implementation of class CSelectConnectionDialog.
+*
+*/
+
+
+// INCLUDE FILES
+#include "SelectConnectionDialog.h"
+#include "ConnectionInfo.h"
+#include "ConnectionInfoArray.h"
+#include "ConnectionDialogsLogger.h"
+#include "ActiveSelectExplicit.h"
+#include "ExpiryTimer.h"
+#include "ConnectionDialogs.hrh"
+
+
+#include "ConnDlgPlugin.h"
+#include <CConnDlgPlugin.rsg>
+
+#include <uikon/eiksrvui.h>
+
+#include <AknsFrameBackgroundControlContext.h>
+#include <aknsoundsystem.h>
+#include <AknsDrawUtils.h>
+#include <aknnotewrappers.h>
+#include <StringLoader.h>
+#include <eiklbi.h>
+
+// CONST DECLARATIONS
+
+#if defined(_DEBUG)
+_LIT( KErrNullPointer, "NULL pointer" );
+#endif
+
+
+
+// ================= MEMBER FUNCTIONS =======================
+//
+// ---------------------------------------------------------
+// CSelectConnectionDialog::CSelectConnectionDialog
+// ---------------------------------------------------------
+//
+CSelectConnectionDialog::CSelectConnectionDialog( 
+                                        MEikSrvNotifierBase2* aPlugin,
+                                        TInt aRefreshInterval,
+                                        TUint32 aBearerSet, 
+                                        TBool aIsWLANFeatureSupported,
+                                        TUint aDefaultCMId )
+: CAknListQueryDialog( &iDummy ),
+  iPlugin( ( CConnDlgSelectConnectionPlugin* )aPlugin ),
+  iFromOkToExit( EFalse ),
+  iActiveSelectExplicit( NULL ),
+  iRefreshInterval( aRefreshInterval ),
+  iBearerSet( aBearerSet ),
+  iIsWLANFeatureSupported( aIsWLANFeatureSupported ),
+  iDefaultCMId( aDefaultCMId )
+    {
+    }
+
+
+// ---------------------------------------------------------
+// CSelectConnectionDialog::NewL
+// ---------------------------------------------------------
+//
+CSelectConnectionDialog* CSelectConnectionDialog::NewL( 
+                                                MEikSrvNotifierBase2* aPlugin,
+                                                TInt aRefreshInterval,
+                                                TUint32 aBearerSet, 
+                                                TBool aIsWLANFeatureSupported, 
+                                                TUint aDefaultCMId )
+    {
+    CSelectConnectionDialog* self = new( ELeave ) CSelectConnectionDialog( 
+                                                    aPlugin,
+                                                    aRefreshInterval,
+                                                    aBearerSet, 
+                                                    aIsWLANFeatureSupported, 
+                                                    aDefaultCMId );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+
+// ---------------------------------------------------------
+// CSelectConnectionDialog::ConstructL()
+// ---------------------------------------------------------
+//
+void CSelectConnectionDialog::ConstructL()
+    {
+    }
+
+
+// ---------------------------------------------------------
+// CSelectConnectionDialog::~CSelectConnectionDialog()
+// ---------------------------------------------------------
+//
+CSelectConnectionDialog::~CSelectConnectionDialog()
+    {
+    CLOG_ENTERFN( "CSelectConnectionDialog::~CSelectConnectionDialog " );
+    iIapIDs.Close();
+    iDestIDs.Close();
+    STATIC_CAST( CEikServAppUi*, 
+                CCoeEnv::Static()->AppUi() )->SuppressAppSwitching( EFalse );
+    delete iExpiryTimer;
+    CLOG_LEAVEFN( "CSelectConnectionDialog::~CSelectConnectionDialog " );
+    }
+
+
+// ---------------------------------------------------------
+// CSelectConnectionDialog::PreLayoutDynInitL()
+// ---------------------------------------------------------
+//
+void CSelectConnectionDialog::PreLayoutDynInitL()
+    {
+    CLOG_ENTERFN( "CSelectConnectionDialog::PreLayoutDynInitL " );  
+    
+    CAknListQueryDialog::PreLayoutDynInitL();
+
+    SetOwnershipType( ELbmDoesNotOwnItemArray );
+    SetIconArrayL( iIcons );
+
+    STATIC_CAST( CEikServAppUi*, 
+                CCoeEnv::Static()->AppUi() )->SuppressAppSwitching( ETrue );
+    
+    // Hide Options button if single-click enabled
+    //
+    if ( static_cast< CAknAppUi* >( iCoeEnv->AppUi() )->IsSingleClickCompatible() )
+        {
+        CEikButtonGroupContainer* cba = CEikButtonGroupContainer::Current();
+        cba->MakeCommandVisible( EAknSoftkeyOptions, EFalse );
+        cba->DrawDeferred();
+        }
+
+    iExpiryTimer = CExpiryTimer::NewL( *this );
+    iExpiryTimer->Start();
+    
+    CLOG_LEAVEFN( "CSelectConnectionDialog::PreLayoutDynInitL " );      
+    }
+
+
+// ---------------------------------------------------------
+// CSelectConnectionDialog::OkToExitL
+// ---------------------------------------------------------
+//
+TBool CSelectConnectionDialog::OkToExitL( TInt aButtonId )
+    {
+    CLOG_ENTERFN( "CSelectConnectionDialog::OkToExitL " );      
+    
+    TBool result( EFalse );
+    TInt completeCode( KErrNone );
+    
+    if ( aButtonId == EAknSoftkeySelect || aButtonId == EAknSoftkeyOk ||
+         aButtonId == EAknSoftkeyDone )
+        {
+        CLOG_WRITE( "OkToExitL Ok-ed" );  
+        TInt index = ListBox()->CurrentItemIndex();
+        if ( iIapIDs[index] == 0 && iDestIDs[index] == 0 ) 
+            {      // Uncategorized
+            ProcessCommandL( ESelectConnectionCmdChooseMethod );
+            }
+        else
+            {
+            iPlugin->SetElementIDL( iIapIDs[index], iDestIDs[index] );
+            result = ETrue;
+            }
+        }
+    else if ( aButtonId == EAknSoftkeyCancel )
+        {
+        CLOG_WRITE( "OkToExitL Cancel" );  
+        completeCode = KErrCancel;
+        result = ETrue;
+        }
+    else if ( aButtonId == EAknSoftkeyOptions )
+        {
+        DisplayMenuL();
+        }
+        
+    if ( result )
+        {
+        iFromOkToExit = ETrue;        
+        
+        __ASSERT_DEBUG( iPlugin, User::Panic( KErrNullPointer, KErrNone ) );
+        CLOG_WRITE( "OkToExitL Going to CompleteL" );  
+        iPlugin->CompleteL( completeCode );
+        CLOG_WRITE( "OkToExitL Returned from CompleteL" );  
+        }
+
+    CLOG_LEAVEFN( "CSelectConnectionDialog::OkToExitL " );      
+
+    return result;
+    }
+
+
+// ---------------------------------------------------------
+// CSelectConnectionDialog::PrepareAndRunLD
+// ---------------------------------------------------------
+//    
+void CSelectConnectionDialog::PrepareAndRunLD( CConnectionInfoArray* aIAP,
+                                               CArrayPtr< CGulIcon >* aIcons,
+                                               TBool aIsReallyRefreshing,
+                                               const TInt aHighlightedItem )
+    {
+    PrepareLC( R_SELECT_CONNECTION_QUERY );
+    RefreshDialogL( aIAP, aIcons, aIsReallyRefreshing, aHighlightedItem );
+    RunLD();
+    }
+
+
+// ---------------------------------------------------------
+// CSelectConnectionDialog::RefreshDialogL
+// ---------------------------------------------------------
+//    
+void CSelectConnectionDialog::RefreshDialogL( CConnectionInfoArray* aIAP, 
+                                              CArrayPtr< CGulIcon >* aIcons,
+                                              TBool aIsReallyRefreshing,
+                                              const TInt aHighlightedItem )
+    {  
+    CLOG_ENTERFN( "CSelectConnectionDialog::RefreshDialogL " );  
+     
+    if ( aIAP->Count() == 0 )
+        {
+        ListBox()->Reset();	
+        }
+    else
+        {
+        SetItemTextArray( aIAP );	
+        } 
+    
+    iIcons = aIcons;
+
+    iIapIDs.Reset();
+    iDestIDs.Reset();
+
+    // Determine the preferred IAP
+    TInt numAPs = aIAP->Count();
+    for( TInt ii = 0; ii < numAPs; ii++ )
+        {
+        iIapIDs.AppendL( aIAP->At( ii )->Id() );
+        iDestIDs.AppendL( aIAP->At( ii )->DestinationId() );
+        }
+
+    if ( aHighlightedItem >= 0 && aHighlightedItem < numAPs )
+        {
+        ListBox()->SetCurrentItemIndex( aHighlightedItem );
+        if ( aHighlightedItem == 1 )
+            {
+            // To have the Search for Wlan also visible. But this is valid only
+            // if the highlighted item can be the first or the second, 
+            // otherwise we risk to hide the highlighted item!
+            ListBox()->ScrollToMakeItemVisible( 0 );    
+            }
+        }
+
+    ListBox()->HandleItemAdditionL();
+
+    if ( aHighlightedItem >= 0 && aHighlightedItem < numAPs )
+        {
+        CEikButtonGroupContainer& cba = ButtonGroupContainer();
+        HBufC* label;
+
+        if ( iIapIDs[aHighlightedItem] != 0 )
+            {       // Easy Wlan
+            label = StringLoader::LoadL( R_QTN_MSK_SELECT );
+            }
+        else if ( iDestIDs[aHighlightedItem] != 0 )
+            {       // Destination
+            label = StringLoader::LoadL( R_QTN_MSK_CONNECT );
+            }
+        else        // if ( iIapIDs[aHighlightedItem] == 0 && iDestIDs[aHighlightedItem] == 0 )
+            {      // Uncategorized
+            label = StringLoader::LoadL( R_QTN_MSK_OPEN );
+            }
+
+        CleanupStack::PushL( label );
+        cba.SetCommandL( EAknSoftkeyDone, label->Des() );
+        CleanupStack::PopAndDestroy(); // label
+        }
+
+    if ( aIsReallyRefreshing )
+        {   // If we are really making a refresh, we need to recalculate the 
+            // layout, because the number of items could be different and the
+            // dialog should be resized accordingly
+        Layout();   
+        SizeChanged();
+        DrawDeferred();
+        }
+
+    CLOG_LEAVEFN( "CSelectConnectionDialog::RefreshDialogL " );  
+    }
+    
+
+// ----------------------------------------------------------------------------
+// CSelectConnectionDialog::DynInitMenuPaneL
+// ----------------------------------------------------------------------------
+//
+void CSelectConnectionDialog::DynInitMenuPaneL( TInt aResourceId, 
+                                             CEikMenuPane* aMenuPane )
+    {
+    CAknListQueryDialog::DynInitMenuPaneL( aResourceId, aMenuPane );
+
+    if ( aResourceId == R_SELECT_CONNECTION_MENU_PANE )
+        {
+        if ( aMenuPane )
+            {
+            TInt index = ListBox()->CurrentItemIndex();
+
+            if ( iIapIDs[index] != 0 )   
+                {      // Easy Wlan
+                aMenuPane->DeleteMenuItem( ESelectConnectionCmdChooseMethod );
+                aMenuPane->DeleteMenuItem( ESelectConnectionCmdConnect );
+                }
+            else if ( iDestIDs[index] != 0 )
+                {       // Destination
+                aMenuPane->DeleteMenuItem( ESelectConnectionCmdSelect );
+                }
+            else // if ( iIapIDs[index] == 0 && iDestIDs[index] == 0 ) 
+                {      // Uncategorized
+                aMenuPane->DeleteMenuItem( ESelectConnectionCmdSelect );
+                aMenuPane->DeleteMenuItem( ESelectConnectionCmdConnect );
+                }
+            }
+        }
+    }
+
+
+// ----------------------------------------------------------------------------
+// CSelectConnectionDialog::ProcessCommandL
+// ----------------------------------------------------------------------------
+//
+void CSelectConnectionDialog::ProcessCommandL( TInt aCommand )
+    {
+    CLOG_ENTERFN( "CSelectConnectionDialog::ProcessCommandL" );  
+    if ( MenuShowing() )
+        {
+        HideMenu();
+        }
+
+    switch( aCommand )
+        {
+        case ESelectConnectionCmdSelect:
+        case ESelectConnectionCmdConnect:
+            {
+            TryExitL( EAknSoftkeySelect );
+            break;
+            }
+
+        case ESelectConnectionCmdChooseMethod:
+            {
+            if ( !iActiveSelectExplicit )
+                {
+                iActiveSelectExplicit = CActiveSelectExplicit::NewL( this, 
+                                        iDestIDs[ListBox()->CurrentItemIndex()],
+                                        iRefreshInterval,
+                                        iBearerSet, 
+                                        iIsWLANFeatureSupported,
+                                       iDefaultCMId );
+                iActiveSelectExplicit->ShowSelectExplicitL();
+                }
+            break;
+            }
+
+        default:
+            {
+            break;
+            }
+        }
+    CLOG_LEAVEFN( "CSelectConnectionDialog::ProcessCommandL" );  
+    }
+
+
+// ---------------------------------------------------------
+// CNetworksViewContainer::OfferKeyEventL
+// ---------------------------------------------------------
+//
+TKeyResponse CSelectConnectionDialog::OfferKeyEventL( 
+                                                   const TKeyEvent& aKeyEvent,
+                                                   TEventCode aType )
+    {
+    CLOG_ENTERFN( "CSelectConnectionDialog::OfferKeyEventL" );
+    
+    if( aType == EEventKey && aKeyEvent.iCode == EKeyPhoneSend )
+        {
+        // Let's not obscure the Dialer in the background
+        if ( iExpiryTimer && !iActiveSelectExplicit )
+            {
+            iExpiryTimer->Cancel();
+            iExpiryTimer->StartShort();    
+            }
+        }
+
+    TKeyResponse result( EKeyWasNotConsumed );
+    TInt indexBefore = -1;
+    TInt indexAfter = -1;
+
+    if ( aKeyEvent.iScanCode == EStdKeyDownArrow || 
+         aKeyEvent.iScanCode == EStdKeyUpArrow )
+        {
+        CLOG_WRITE( "Arrow pressed" );
+        indexBefore = ListBox()->CurrentItemIndex();
+        }
+
+    result = CAknListQueryDialog::OfferKeyEventL( aKeyEvent, aType );
+    
+    if ( iFromOkToExit )
+        {     
+        return result;
+        }
+    
+    CLOG_WRITEF( _L ( "Returned from CAknListQueryDialog::OfferKeyEventL: %d" ), result );
+
+    if ( aKeyEvent.iScanCode == EStdKeyDownArrow || 
+         aKeyEvent.iScanCode == EStdKeyUpArrow )
+        {
+        indexAfter = ListBox()->CurrentItemIndex();
+        }
+
+    if ( indexBefore != indexAfter )
+        {
+        CLOG_WRITEF( _L ( "IndexBefore = %d, IndexAfter = %d" ), indexBefore, indexAfter );
+        CEikButtonGroupContainer& cba = ButtonGroupContainer();
+        HBufC* label;
+        if ( iIapIDs[indexAfter] != 0 )
+            {       // Easy Wlan
+            label = StringLoader::LoadL( R_QTN_MSK_SELECT );
+            }
+        else if ( iDestIDs[indexAfter] != 0 )
+            {       // Destination
+            label = StringLoader::LoadL( R_QTN_MSK_CONNECT );
+            }
+        else        // if ( iIapIDs[indexAfter] == 0 && iDestIDs[indexAfter] == 0 )
+            {      // Uncategorized
+            label = StringLoader::LoadL( R_QTN_MSK_OPEN );
+            }
+        CleanupStack::PushL( label );
+        cba.SetCommandL( EAknSoftkeyDone, label->Des() );
+        CleanupStack::PopAndDestroy(); // label
+        cba.DrawDeferred();
+        }
+
+    // Show Options button if some listbox row gets highlighted
+    //
+    if ( static_cast< CAknAppUi* >( iCoeEnv->AppUi() )->IsSingleClickCompatible() )
+        {
+        CEikButtonGroupContainer* cba = CEikButtonGroupContainer::Current();
+
+        if ( ( ListBox()->View()->ItemDrawer()->Flags()
+               & CListItemDrawer::ESingleClickDisabledHighlight )
+              )
+            {
+            cba->MakeCommandVisible( EAknSoftkeyOptions, EFalse );
+            }
+        else
+            {
+            cba->MakeCommandVisible( EAknSoftkeyOptions, ETrue );
+            }
+
+        cba->DrawDeferred();
+        }
+    
+    CLOG_LEAVEFN( "CSelectConnectionDialog::OfferKeyEventL" );  
+
+    return result;
+    }
+
+
+// ----------------------------------------------------------------------------
+// CSelectConnectionDialog::RunLD
+// ----------------------------------------------------------------------------
+//
+TInt CSelectConnectionDialog::RunLD()
+    {
+    CLOG_ENTERFN( "CSelectConnectionDialog::RunLD" );  
+    CAknDialog::ConstructL( R_SELECT_CONNECTION_MENUBAR );
+    User::ResetInactivityTime();
+
+    CAknKeySoundSystem* soundSystem = NULL;
+    if ( iSoundSystem )
+        {
+        iSoundSystem->PushContextL( R_AVKON_DEFAULT_SKEY_LIST );
+        // Need to store local copy of iSoundSystem, since it will have been
+        // destroyed when RunLD returns
+        soundSystem = iSoundSystem;
+        }
+
+    CAknsFrameBackgroundControlContext* cc = 
+        ( CAknsFrameBackgroundControlContext* )AknsDrawUtils::ControlContext(
+                                                                        this );
+    cc->SetCenter( KAknsIIDQsnFrPopupCenterQuery );
+
+    TInt ret = CAknDialog::RunLD();
+    if ( soundSystem )
+        {
+        soundSystem->PopContext();
+        }
+    CLOG_LEAVEFN( "CSelectConnectionDialog::RunLD" );  
+    return ret;
+    }
+
+
+// ---------------------------------------------------------
+// CSelectConnectionDialog::SetElementIDL
+// ---------------------------------------------------------
+//    
+void CSelectConnectionDialog::SetElementIDL( TUint32 aIAPId )
+    {
+    iPlugin->SetElementIDL( aIAPId, 0 );
+    }
+
+
+// ---------------------------------------------------------
+// void CSelectConnectionDialog::CompleteL
+// ---------------------------------------------------------
+//
+void CSelectConnectionDialog::CompleteL( TInt aStatus )
+    {
+    CLOG_ENTERFN( "CSelectConnectionDialog::CompleteL" );  
+    delete iActiveSelectExplicit;
+    iActiveSelectExplicit = NULL;
+    iPlugin->CompleteL( aStatus );
+    CLOG_LEAVEFN( "CSelectConnectionDialog::CompleteL" );  
+    }
+
+void CSelectConnectionDialog::HandleTimedOut()
+    {
+    TRAP_IGNORE( TryExitL(EAknSoftkeyCancel) );
+    }
+
+// ---------------------------------------------------------
+// void CSelectConnectionDialog::HandleListBoxEventL
+// ---------------------------------------------------------
+//    
+void CSelectConnectionDialog::HandleListBoxEventL(CEikListBox* aListBox, 
+												TListBoxEvent aEventType)
+	{	
+    if( aEventType == EEventItemClicked )
+        {
+        // Do not forward to the base class. 
+        // The first click must only select the item.        
+        return;
+        }
+    else if( aEventType == EEventItemDoubleClicked )
+        {
+        // Forward as EEventItemClicked to open the item on the second click.
+        CAknListQueryDialog::HandleListBoxEventL( aListBox, EEventItemClicked );
+        }
+	else
+        {
+        // normal forward
+        CAknListQueryDialog::HandleListBoxEventL( aListBox, aEventType );
+        }
+    }
+
+// ---------------------------------------------------------
+// void CSelectConnectionDialog::HandlePointerEventL
+// ---------------------------------------------------------
+//    
+void CSelectConnectionDialog::HandlePointerEventL(const TPointerEvent& aPointerEvent)
+    {
+    if( ListBox()->Rect().Contains( aPointerEvent.iPosition ) )
+        {
+        if ( aPointerEvent.iType == TPointerEvent::EButton1Down )
+            {
+            TInt index;
+            TInt oldIndex = ListBox()->CurrentItemIndex();
+            if ( ListBox()->View()->XYPosToItemIndex( aPointerEvent.iPosition, index ) &&
+                   ( index == oldIndex ) )
+                {
+                // Pressed Down Effect
+                ListBox()->View()->ItemDrawer()->SetFlags( CListItemDrawer::EPressedDownState );
+                }
+            }
+        CAknControl::HandlePointerEventL(aPointerEvent);
+        }
+    else
+        {
+        CAknListQueryDialog::HandlePointerEventL( aPointerEvent );
+        }
+    }
+
+// End of File