diff -r 05bc53fe583b -r 83ca720e2b9a connectionutilities/ConnectionDialogs/cconndlg/src/SelectConnectionDialog.cpp --- /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 + +#include + +#include +#include +#include +#include +#include +#include + +// 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