diff -r 000000000000 -r 8466d47a6819 ipsservices/ipssossettings/src/ipssetuifoldersubscription.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ipsservices/ipssossettings/src/ipssetuifoldersubscription.cpp Thu Dec 17 08:39:21 2009 +0200 @@ -0,0 +1,1270 @@ +/* +* 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: +* folder subscription dialog +* +*/ + + + +#include "emailtrace.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // +#include +#include +#include +#include +#include +// +#include +// +#include "CFSMailCommon.h" +// +#include +#include + +#include "ipssetutilsconsts.h" +#include "ipssetutils.h" +#include "ipssetuictrlsoftkey.h" +#include "ipssetuifolderlistarray.h" +#include "ipssetutilsoperationwait.h" +#include "ipssetui.h" +#include "ipsplgconnectandrefreshfolderlist.h" + +#include "ipssetuifoldersubscription.h" + +#include "FreestyleEmailUiConstants.h" +#include + +// Correct path is added to literal when it is used. +_LIT(KIpsSetUiBitmapFile, "z:muiu.MBM"); +const TInt KImumFolderArrayVisibleItems = 5; +const TInt KImumFolderIconArrayGranularity = 6; + +// ---------------------------------------------------------------------------- +// CIpsSetUiSubscriptionDialog::NewL +// ---------------------------------------------------------------------------- +// +CIpsSetUiSubscriptionDialog* CIpsSetUiSubscriptionDialog::NewL( + TUint64& aFlags, + TMsvId aServiceId, + CMsvSession& aSession, + CAknTitlePane& aTitlePane, + const TDesC& aTitlePaneText ) + { + FUNC_LOG; + CIpsSetUiSubscriptionDialog* self = + new ( ELeave ) CIpsSetUiSubscriptionDialog( + aFlags, + aServiceId, + aSession, + aTitlePane ); + + CleanupStack::PushL(self); + self->ConstructL( aTitlePaneText ); + CleanupStack::Pop( self ); + return self; + } + +// ---------------------------------------------------------------------------- +// CIpsSetUiSubscriptionDialog::~CIpsSetUiSubscriptionDialog +// ---------------------------------------------------------------------------- +// +CIpsSetUiSubscriptionDialog::~CIpsSetUiSubscriptionDialog() + { + FUNC_LOG; + iSession.RemoveObserver(*this); + delete iBaseMtm; + iBaseMtm = NULL; + delete iContextEntry; + iContextEntry = NULL; + delete iFolderListArray; + iFolderListArray = NULL; + delete iSoftkeys; + iSoftkeys = NULL; + delete iMtmRegistry; + iMtmRegistry = NULL; + delete iOldTitlePaneText; + iOldTitlePaneText = NULL; + delete iAsyncWaitNote; + iAsyncWaitNote = NULL; + // + delete iAsyncHelper; + iAsyncHelper = NULL; + if(iEntrySelection) + delete iEntrySelection; + iEntrySelection = NULL; + // + } + +// ---------------------------------------------------------------------------- +// CIpsSetUiSubscriptionDialog::CIpsSetUiSubscriptionDialog +// ---------------------------------------------------------------------------- +// +CIpsSetUiSubscriptionDialog::CIpsSetUiSubscriptionDialog( + TUint64& aFlags, + TMsvId aServiceId, + CMsvSession& aSession, + CAknTitlePane& aTitlePane ) + : + iFlags( aFlags ), + iServiceId( aServiceId ), + iSession( aSession ), + iTitlePane( aTitlePane ) + , iState(CIpsSetUiSubscriptionDialog::EIdle), // + iFetchDialogDismissed(EFalse), iMultipleStarted(EFalse) // + { + FUNC_LOG; + } + +// ---------------------------------------------------------------------------- +// CIpsSetUiSubscriptionDialog::ConstructL +// ---------------------------------------------------------------------------- +// +void CIpsSetUiSubscriptionDialog::ConstructL( const TDesC& aTitlePaneText ) + { + FUNC_LOG; + CAknDialog::ConstructL( R_IPS_SET_SETTINGS_SUBSCRIBE_MENU ); + + // BaseMTM interface is required for subscribing and unsubscribing folders + iMtmRegistry = CClientMtmRegistry::NewL( iSession ); + iBaseMtm = iMtmRegistry->NewMtmL( KSenduiMtmImap4Uid ); + iBaseMtm->SwitchCurrentEntryL(iServiceId); + + iSession.AddObserverL(*this); + iOrdering = TMsvSelectionOrdering(KMsvGroupByType, EMsvSortByDetails, ETrue); + iContextEntry = CMsvEntry::NewL(iSession, iServiceId, iOrdering); + iFolderListArray = CIpsSetUiFolderListArray::NewL( iSession, iServiceId ); + iOpenedFolderId = iServiceId; + delete iOldTitlePaneText; + iOldTitlePaneText = NULL; + iOldTitlePaneText = iTitlePane.Text()->Alloc(); + iTitlePane.SetTextL( aTitlePaneText ); + // + iAsyncHelper = new (ELeave) CSubscriptionDialogActiveHelper(this); + // + } + +/****************************************************************************** + + Init + +******************************************************************************/ + +// ---------------------------------------------------------------------------- +// CIpsSetUiSubscriptionDialog::PreLayoutDynInitL +// ---------------------------------------------------------------------------- +// +void CIpsSetUiSubscriptionDialog::PreLayoutDynInitL() + { + FUNC_LOG; + // + + /*TBool refreshed = EFalse; + CAknQueryDialog* confDialog = CAknQueryDialog::NewL(); + if( confDialog->ExecuteLD( R_IPS_SET_CONNECT_FOR_UPDATE ) ) + { + refreshed = ETrue; + CreateOperationL( EIpsSetUiRefreshFolderList ); + } + + if( refreshed ) + { + iFolderListArray->RefreshFolderListArrayL(); + }*/ + // + CEikColumnListBox* listBox = + static_cast< CEikColumnListBox* >( Control( EIpsSetUiIdFolderListBox ) ); + + listBox->SetListBoxObserver( this ); + + // Create scroll bar + listBox->CreateScrollBarFrameL(); + listBox->ScrollBarFrame()->SetScrollBarVisibilityL( + CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto); + + CTextListBoxModel* model = listBox->Model(); + model->SetItemTextArray( iFolderListArray ); + listBox->Model()->SetOwnershipType( ELbmDoesNotOwnItemArray ); + + HBufC* emptyText = + StringLoader::LoadLC( R_FSE_SETTINGS_MAIL_NOTE_NOTUPDATED ); + + listBox->View()->SetListEmptyTextL( emptyText->Des() ); + + CArrayPtrFlat* icons + = new(ELeave) CAknIconArray( KImumFolderIconArrayGranularity ); + + CleanupStack::PushL( icons ); + + // create icon array + TFileName fileName; + + TParse tp; + tp.Set( KIpsSetUiBitmapFile, &KDC_APP_BITMAP_DIR, NULL ); + fileName.Copy( tp.FullName() ); + + AppendIconsL( fileName, icons ); + + reinterpret_cast( listBox )-> + ItemDrawer()->ColumnData()->SetIconArray( icons ); + + + CleanupStack::Pop( icons ); + CleanupStack::PopAndDestroy( emptyText ); + + } + +// ---------------------------------------------------------------------------- +// CIpsSetUiSubscriptionDialog::PostLayoutDynInitL +// ---------------------------------------------------------------------------- +// +void CIpsSetUiSubscriptionDialog::PostLayoutDynInitL() + { + FUNC_LOG; + iSoftkeys = CIpsSetUiCtrlSoftkey::NewL( ButtonGroupContainer() ); + // Set this dialog for button listening + iSoftkeys->SetMSKLabelling( ETrue ); + iSoftkeys->UpdateMiddleSoftkeyLabelL( + GetResourceForMiddlekey(), EAknSoftkeyOpen, NULL ); + + } + +// ---------------------------------------------------------------------------- +// CIpsSetUiSubscriptionDialog::DynInitMenuPaneL +// ---------------------------------------------------------------------------- +// +void CIpsSetUiSubscriptionDialog::DynInitMenuPaneL( + TInt aResourceId, + CEikMenuPane* aMenuPane ) + { + FUNC_LOG; + TMsvId folderId = CurrentFolder(); + if ( folderId == KErrNotFound ) + { + if ( aResourceId == R_IPS_SET_SETTINGS_SUBSCRIBE_MENUPANE ) + { + if (FeatureManager::FeatureSupported( KFeatureIdFfCmailIntegration )) + { + // remove help support in pf5250 + aMenuPane->SetItemDimmed( EAknCmdHelp, ETrue); + } + + aMenuPane->SetItemDimmed( EIpsSetUiFolderOpenFolder, ETrue ); + aMenuPane->SetItemDimmed( EIpsSetUiFolderSubscribe, ETrue ); + aMenuPane->SetItemDimmed( EIpsSetUiFolderUnsubscribe, ETrue ); + } + } + else + { + TMsvId prevEntry = iContextEntry->Entry().Id(); + iContextEntry->SetEntryL( folderId ); + const TMsvEmailEntry emailEntry( iContextEntry->Entry() ); + + if ( aResourceId == R_IPS_SET_SETTINGS_SUBSCRIBE_MENUPANE ) + { + if (FeatureManager::FeatureSupported( KFeatureIdFfCmailIntegration )) + { + // remove help support in pf5250 + aMenuPane->SetItemDimmed( EAknCmdHelp, ETrue); + } + + if ( !ContextHasChildFolders() ) + { + aMenuPane->SetItemDimmed( EIpsSetUiFolderOpenFolder, ETrue ); + } + if ( IpsSetUtils::IsInbox( iSession, emailEntry ) ) + { + //inbox subscription cannot be changed + aMenuPane->SetItemDimmed( EIpsSetUiFolderSubscribe, ETrue ); + aMenuPane->SetItemDimmed( EIpsSetUiFolderUnsubscribe, ETrue ); + } + else + { + aMenuPane->SetItemDimmed( + EIpsSetUiFolderSubscribe, emailEntry.LocalSubscription() ); + aMenuPane->SetItemDimmed( + EIpsSetUiFolderUnsubscribe, !emailEntry.LocalSubscription() ); + } + } + + iContextEntry->SetEntryL( prevEntry ); + } + + } + +/****************************************************************************** + + Events + +******************************************************************************/ + +// ---------------------------------------------------------------------------- +// CIpsSetUiSubscriptionDialog::HandleSessionEventL +// ---------------------------------------------------------------------------- +// +void CIpsSetUiSubscriptionDialog::HandleSessionEventL(TMsvSessionEvent aEvent, + TAny* aArg1, TAny* /*aArg2*/, TAny* /*aArg3*/) + { + FUNC_LOG; + if(aEvent!=EMsvEntriesChanged) + return; + + CMsvEntrySelection& sel=*static_cast(aArg1); + if(sel.Find(CurrentFolder())!=KErrNotFound) + { + CEikColumnListBox* listBox = static_cast( + Control(EIpsSetUiIdFolderListBox)); + listBox->DrawNow(); + } + } + +// ---------------------------------------------------------------------------- +// CIpsSetUiSubscriptionDialog::OkToExitL +// ---------------------------------------------------------------------------- +// +TBool CIpsSetUiSubscriptionDialog::OkToExitL(TInt aButtonId) + { + FUNC_LOG; + TBool exit=EFalse; + CEikColumnListBox* listBox = static_cast( + Control(EIpsSetUiIdFolderListBox)); + const TInt oldCount = listBox->Model()->NumberOfItems(); + + switch(aButtonId) + { + case EAknSoftkeyOptions: + return CAknDialog::OkToExitL( EAknSoftkeyOptions ); + + case EIpsSetUiFolderSubscribe: + case EIpsSetUiFolderUnsubscribe: + + CreateOperationL( aButtonId ); + break; + + case EAknSoftkeyClose: + exit = ETrue; + break; + + case EIpsSetUiFolderOpenFolder: + // open folder which has subfolders... + iContextEntry->SetEntryL( CurrentFolder() ); + if ( ContextHasChildFolders() ) + { + iOpenedFolderId = CurrentFolder(); + iFolderListArray->ChangEIpsSetUiFolderL( CurrentFolder() ); + if ( listBox->Model()->NumberOfItems() ) + { + listBox->SetTopItemIndex( 0 ); + listBox->SetCurrentItemIndex( 0 ); + } + if ( oldCount > listBox->Model()->NumberOfItems() ) + { + listBox->HandleItemRemovalL(); + } + else + { + listBox->HandleItemAdditionL(); + } + } + break; + + case EIpsSetUiRefreshFolderList: + // Always after successfull update go to root view, + // no matter where in the folder tree we are + iContextEntry->SetEntryL( iServiceId ); + iFolderListArray->ChangEIpsSetUiFolderL( iServiceId ); + if ( listBox->Model()->NumberOfItems() ) + { + listBox->SetTopItemIndex( 0 ); + listBox->SetCurrentItemIndex( 0 ); + } + if ( oldCount > listBox->Model()->NumberOfItems() ) + { + listBox->HandleItemRemovalL(); + } + else + { + listBox->HandleItemAdditionL(); + } + break; + case EAknSoftkeyBack: + { + if( iContextEntry->Entry().iType == KUidMsvServiceEntry ) + { + //Only exit if current folder is service + if ( iOldTitlePaneText ) + { + iTitlePane.SetTextL( *iOldTitlePaneText ); + } + exit = ETrue; + break; + } + + TMsvId folderToBeSelected = iOpenedFolderId; + iContextEntry->SetEntryL( iOpenedFolderId ); + + iOpenedFolderId = iContextEntry->Entry().Parent(); + iFolderListArray->ChangEIpsSetUiFolderL( iOpenedFolderId ); + iContextEntry->SetEntryL( iOpenedFolderId ); + + if ( oldCount > listBox->Model()->NumberOfItems() ) + { + listBox->HandleItemRemovalL(); + } + else + { + listBox->HandleItemAdditionL(); + } + + TInt loop; + for ( loop = iContextEntry->Count()-1; loop >= 0; loop-- ) + { + if ( folderToBeSelected == (*iContextEntry)[loop].Id() ) + { + break; + } + } + if ( loop < 0 ) + { + loop = 0; + } + listBox->SetTopItemIndex( ( loop > KImumFolderArrayVisibleItems ? + loop - KImumFolderArrayVisibleItems : 0 ) ); + listBox->SetCurrentItemIndex( loop ); + } + break; + + case EEikCmdExit: + exit = ETrue; + // Issue exit to the dialog + iFlags |= EIpsSetUiShouldExit; + break; + + default: + break; + }; + + listBox->DrawNow(); + // + if(exit) + { + CancelAllAsyncRequests(); + if(iAsyncWaitNote && (!iFetchDialogDismissed)) + iAsyncWaitNote->ProcessFinishedL(); + } + // + return exit; + } + +// ---------------------------------------------------------------------------- +// CIpsSetUiSubscriptionDialog::HandleListBoxEventL +// ---------------------------------------------------------------------------- +// +void CIpsSetUiSubscriptionDialog::HandleListBoxEventL( + CEikListBox* /*aListBox*/, + TListBoxEvent aEventType ) + { + FUNC_LOG; + if( aEventType == EEventItemSingleClicked || + aEventType == EEventEnterKeyPressed ) + { + TMsvId prevEntry = iContextEntry->Entry().Id(); + + CEikColumnListBox* listBox = + static_cast( + Control( EIpsSetUiIdFolderListBox ) ); + iContextEntry->SetEntryL( CurrentFolder() ); + + if ( listBox->Model()->NumberOfItems() && + ContextHasChildFolders() ) + { + //if has childs, open folder + OkToExitL( EIpsSetUiFolderOpenFolder ); + } + else + { + //if not, change subs state of the folder + const TMsvEmailEntry emailEntry( iContextEntry->Entry() ); + + if ( IpsSetUtils::IsInbox( iSession, emailEntry ) ) + { + //inbox cannot be changed + iContextEntry->SetEntryL( prevEntry ); + return; + } + + if ( emailEntry.LocalSubscription() ) + { + + CreateOperationL( EIpsSetUiFolderUnsubscribe ); + } + else + { + + CreateOperationL( EIpsSetUiFolderSubscribe ); + } + listBox->DrawNow(); + iContextEntry->SetEntryL( prevEntry ); + } + // Don't set prev entry here because we're opening it, + // so it will be valid + } + } + + +// ---------------------------------------------------------------------------- +// CIpsSetUiSubscriptionDialog::OfferKeyEventL +// ---------------------------------------------------------------------------- +// +TKeyResponse CIpsSetUiSubscriptionDialog::OfferKeyEventL( + const TKeyEvent& aKeyEvent, + TEventCode aType ) + { + FUNC_LOG; + // For key up events, update the middle softkey label + if ( aType == EEventKeyDown && aKeyEvent.iScanCode == EStdKeyDevice3 ) + { + switch( CheckMSKState() ) + { + case EIpsSetUiFolderOpenFolder: + ProcessCommandL( EIpsSetUiFolderOpenFolder ); + break; + case EIpsSetUiFolderUnsubscribe: + ProcessCommandL( EIpsSetUiFolderUnsubscribe ); + break; + case EIpsSetUiFolderSubscribe: + ProcessCommandL( EIpsSetUiFolderSubscribe ); + break; + default: + break; + } + } + + if ( aType == EEventKeyUp ) + { + iSoftkeys->UpdateMiddleSoftkeyLabelL( + GetResourceForMiddlekey(), EAknSoftkeyOpen, NULL ); + } + + return CAknDialog::OfferKeyEventL( aKeyEvent, aType ); + } + +// ---------------------------------------------------------------------------- +// CIpsSetUiSubscriptionDialog::ProcessCommandL +// ---------------------------------------------------------------------------- +// +void CIpsSetUiSubscriptionDialog::ProcessCommandL( TInt aCommandId ) + { + FUNC_LOG; + if ( MenuShowing() ) + { + HideMenu(); + } + + CAknDialog::ProcessCommandL(aCommandId); + switch( aCommandId ) + { + case EAknSoftkeyOk: + case EAknSoftkeyOpen: + HandleListBoxEventL( NULL, EEventEnterKeyPressed ); + break; + + case EIpsSetUiFolderOpenFolder: + OkToExitL( EIpsSetUiFolderOpenFolder ); + break; + case EIpsSetUiFolderSubscribe: + case EIpsSetUiFolderUnsubscribe: + { + TMsvEntry tEntry; + TMsvId service; + iSession.GetEntry( CurrentFolder(), service, tEntry ); + const TMsvEmailEntry emailEntry( tEntry ); + + CreateOperationL( aCommandId ); + } + break; + case EIpsSetUiRefreshFolderList: + SynchronisEIpsSetUiFoldersL(); + iFolderListArray->RefreshFolderListArrayL(); + OkToExitL( EIpsSetUiRefreshFolderList ); + break; + + case EAknCmdHelp: + { + LaunchHelpL( KFSE_HLP_LAUNCHER_GRID ); + break; + } + + case EEikCmdExit: + TryExitL( aCommandId ); + break; + default: + iEikonEnv->EikAppUi()->HandleCommandL(aCommandId); + break; + } + } + +/****************************************************************************** + + Tools + +******************************************************************************/ + +// ---------------------------------------------------------------------------- +// CIpsSetUiSubscriptionDialog::SynchronisEIpsSetUiFoldersL +// ---------------------------------------------------------------------------- +// +void CIpsSetUiSubscriptionDialog::SynchronisEIpsSetUiFoldersL() + { + FUNC_LOG; + CreateOperationL( EIpsSetUiRefreshFolderList ); + } + +// ---------------------------------------------------------------------------- +// CIpsSetUiSubscriptionDialog::CreateOperationL +// ---------------------------------------------------------------------------- +// +void CIpsSetUiSubscriptionDialog::CreateOperationL( TInt aButtonId ) + { + FUNC_LOG; + // + //only one outstanding operation at a time is allowed + if ( iState != CIpsSetUiSubscriptionDialog::EIdle) + { + return; + } + if(iEntrySelection) + { + delete iEntrySelection; + iEntrySelection = NULL; + } + iEntrySelection = new (ELeave) CMsvEntrySelection; + //CleanupStack::PushL(mySelection); + TBuf8<1> dummyParam; + + MFSMailRequestObserver* dummyFSObserver = NULL; + CIpsPlgTimerOperation* timer = NULL; + TFSMailMsgId mailboxId; + //CIpsSetUtilsOperationWait* wait = CIpsSetUtilsOperationWait::NewLC(); + // + + switch(aButtonId) + { + case EIpsSetUiFolderSubscribe: + case EIpsSetUiFolderUnsubscribe: + { + //check for child / parent folders for question "want to subscribe/ + //unsub whole tree branch?" eat softkey commands. If user would leave + //while subscription process in progress, it will crash. Only for + //subscribe operations. We need to be able to cancel folder list update + //operation + iSoftkeys->SetAbsorb( ETrue ); + + // + HandleSubscriptionL( aButtonId, *iEntrySelection ); + iCount = iEntrySelection->Count(); + if( iCount > 1 ) + { + //if more than one folder, we need to + //do a batch of subscribe commands + CMsvOperation* aMsvOperation = iBaseMtm->InvokeAsyncFunctionL( KIMAP4MTMStartBatch, + *iEntrySelection, dummyParam, iAsyncHelper->iStatus); + iAsyncHelper->Start(aMsvOperation); //ownership transferred + iMultipleStarted = ETrue; + iState = aButtonId==EIpsSetUiFolderSubscribe? + CIpsSetUiSubscriptionDialog::EMultipleSubscribe: + CIpsSetUiSubscriptionDialog::EMultipleUnsubscribe; + } + else if (iCount) //single operation + { + //for only selected folder, no batch needed + CMsvOperation* aMsvOperation = iBaseMtm->InvokeAsyncFunctionL( + (aButtonId==EIpsSetUiFolderSubscribe? + KIMAP4MTMLocalSubscribe:KIMAP4MTMLocalUnsubscribe), + *iEntrySelection, dummyParam, iAsyncHelper->iStatus); + iAsyncHelper->Start(aMsvOperation);//ownership transferred + iState = ESingleOperation; + } + ShowWaitNoteL(); + } + break; + + case EIpsSetUiRefreshFolderList: + { + mailboxId.SetId( iServiceId ); + iEntrySelection->AppendL(iServiceId); + + CMsvOperation* aMsvOperation = CIpsPlgConnectAndRefreshFolderList::NewL( + iSession, + CActive::EPriorityStandard, + iAsyncHelper->iStatus, + iServiceId, + mailboxId, + *iEntrySelection, + *dummyFSObserver, + *timer ); + + iAsyncHelper->Start(aMsvOperation);//ownership transferred + iState = ESingleOperation; + ShowWaitNoteL(); + } + break; + + default: + break; + }; + + if( aButtonId == EIpsSetUiFolderSubscribe || + aButtonId == EIpsSetUiFolderUnsubscribe ) + { + iSoftkeys->SetAbsorb( EFalse ); + } + // + } + +// ---------------------------------------------------------------------------- +// CIpsSetUiSubscriptionDialog::ContextHasChildFolders +// ---------------------------------------------------------------------------- +// +TBool CIpsSetUiSubscriptionDialog::ContextHasChildFolders() const + { + FUNC_LOG; + TInt index=iContextEntry->Count()-1; + while (index>=0 && (*iContextEntry)[index].iType!=KUidMsvFolderEntry) + index--; + + if(index!=-1) + return ETrue; + + return EFalse; + } + +// ---------------------------------------------------------------------------- +// CIpsSetUiSubscriptionDialog::DisplayFinalProgressDialog +// ---------------------------------------------------------------------------- +// +void CIpsSetUiSubscriptionDialog::DisplayFinalProgressDialog( + CMsvOperation& /* aCompletedOperation */ ) const + { + FUNC_LOG; + //iBaseMtm->DisplayProgressSummary(aCompletedOperation.FinalProgress()); + } + +// ---------------------------------------------------------------------------- +// CIpsSetUiSubscriptionDialog::AppendIconsL +// ---------------------------------------------------------------------------- +// +void CIpsSetUiSubscriptionDialog::AppendIconsL( + TFileName& aFileName, + CArrayPtrFlat* aIcons) + { + FUNC_LOG; + MAknsSkinInstance* skins = AknsUtils::SkinInstance(); + TAknsItemID id; + CFbsBitmap* bitmap; + CFbsBitmap* bitmapMask; + TBool found = ETrue; + + + for( TInt i=EMbmMuiuQgn_prop_folder_small; + iAppendL( icon ); + CleanupStack::Pop( icon ); // icon + } + } + + } + +// ---------------------------------------------------------------------------- +// CIpsSetUiSubscriptionDialog::CurrentFolder +// ---------------------------------------------------------------------------- +// +TMsvId CIpsSetUiSubscriptionDialog::CurrentFolder() + { + FUNC_LOG; + CEikColumnListBox* listBox = + static_cast(Control(EIpsSetUiIdFolderListBox)); + TInt curIndex = listBox->CurrentItemIndex(); + + return ( curIndex == KErrNotFound ? + curIndex : iFolderListArray->Id( curIndex ) ); + } + +// ---------------------------------------------------------------------------- +// CIpsSetUiSubscriptionDialog::LaunchHelpL +// Launch help using context +// +// ---------------------------------------------------------------------------- +// +void CIpsSetUiSubscriptionDialog::LaunchHelpL( const TDesC& aContext ) + { + FUNC_LOG; + CArrayFix< TCoeHelpContext >* cntx = new( ELeave ) CArrayFixFlat< TCoeHelpContext >( 1 ); + CleanupStack::PushL( cntx ); + cntx->AppendL( TCoeHelpContext( KFSEmailUiUid, aContext ) ); + CleanupStack::Pop( cntx ); + HlpLauncher::LaunchHelpApplicationL( CEikonEnv::Static()->WsSession(), cntx ); + + } + +// ---------------------------------------------------------------------------- +// CIpsSetUiSubscriptionDialog::GetHelpContext +// Returns helpcontext as aContext +// +// ---------------------------------------------------------------------------- +// +void CIpsSetUiSubscriptionDialog::GetHelpContext + (TCoeHelpContext& aContext) const + { + FUNC_LOG; + // when this string appears in mce.hlp.hrh, remove this _LIT !!!!! + _LIT(KMCE_HLP_SETT_MAILFOLDER_UPD,"MCE_HLP_SETT_MAILFOLDER_UPD"); + const TUid KUidMce ={0x100058C5}; + aContext.iMajor = KUidMce; + aContext.iContext = KMCE_HLP_SETT_MAILFOLDER_UPD; + } + +// ---------------------------------------------------------------------------- +// CIpsSetUiSubscriptionDialog::HandleSubscriptionL() +// ---------------------------------------------------------------------------- +// +void CIpsSetUiSubscriptionDialog::HandleSubscriptionL( + TInt aSubType, + CMsvEntrySelection& aSelection ) + { + FUNC_LOG; + TMsvId current = CurrentFolder(); + + if( iFolderListArray->ContextHasChildren( current ) ) + { + //CMsvEntry is used this way because GetContextChildrenL is recursive. + //Otherwise CMsvEntry objects would be created several times before the + //first one is deleted which consumes lots of memory. Now we just set + //new CMsvEntry over this one several times. + CMsvEntry* entry = CMsvEntry::NewL(iSession, current, iOrdering); + CleanupStack::PushL( entry ); + CMsvEntrySelection* sel = + iFolderListArray->GetContextChildrenL( current, *entry ); + CleanupStack::PopAndDestroy( entry ); + + CleanupStack::PushL( sel ); + + TBool allFolders = CheckAreAllFoldersIncludedL( aSubType, sel ); + + CAknQueryDialog* subsQuery = new(ELeave) CAknQueryDialog; + + switch( aSubType ) + { + case EIpsSetUiFolderSubscribe: + { + //subscribe also all sub folders? + subsQuery->PrepareLC( R_IPS_SET_DO_SUBS_FOR_SUBFOLDERS ); + } + break; + case EIpsSetUiFolderUnsubscribe: + { + //unsubscribe also all sub folders? + subsQuery->PrepareLC( R_IPS_SET_DO_UNSUBS_FOR_SUBFOLDERS ); + } + break; + default: + User::Leave( KErrNotSupported ); + break; + }//switch + + + TInt ret = 1;//by default do all subfolders + + //if all subfolders already subbed / unsubbed, no need for query + if( !allFolders ) + { + ret = subsQuery->RunLD(); + } + else + { + CleanupStack::PopAndDestroy( subsQuery ); + } + + if( ret ) + { + //append all sub folders + + TInt count = sel->Count(); + + //first append current + aSelection.AppendL( current ); + + //then the children + TInt i; + for( i=0; iAt(i) ); + } + } + else + { + //only selected + aSelection.AppendL( current ); + } + + CleanupStack::PopAndDestroy( sel ); + }//if + else + { + //no children, append only current + aSelection.AppendL( current ); + } + } + +// ---------------------------------------------------------------------------- +// CIpsSetUiSubscriptionDialog::CheckAreAllFoldersIncludedL +// ---------------------------------------------------------------------------- +// +TBool CIpsSetUiSubscriptionDialog::CheckAreAllFoldersIncludedL( + TInt aSubType, + CMsvEntrySelection* sel ) + { + FUNC_LOG; + TMsvEntry tEntry; + TMsvId service; + + TInt count = sel->Count(); + TInt i; + TInt result = 0; + + for( i=0; iAt(i), service, tEntry ); + TMsvEmailEntry emailEntry( tEntry ); + + if( aSubType == EIpsSetUiFolderSubscribe ) + { + //count all subscribed entries + if( emailEntry.LocalSubscription() ) + { + result++; + } + } + else + { + //count all unsubscribed entries + if( !emailEntry.LocalSubscription() ) + { + result++; + } + } + } + + if( count == result ) + { + return ETrue; + } + + return EFalse; + + } + +// ---------------------------------------------------------------------------- +// CIpsSetUiBaseDialog::CheckMSKState() +// ---------------------------------------------------------------------------- +// +TInt CIpsSetUiSubscriptionDialog::CheckMSKState() + { + FUNC_LOG; + TInt ret(KErrNotFound); + + // open subfolder view if current folder have them + if( iFolderListArray->ContextHasChildren( CurrentFolder() ) ) + { + ret = EIpsSetUiFolderOpenFolder; + } + // subscribe/unsubscribe + else + { + TMsvId prevEntry = iContextEntry->Entry().Id(); + TMsvId folderId = CurrentFolder(); + TRAP_IGNORE(iContextEntry->SetEntryL( folderId ) ); + const TMsvEmailEntry emailEntry( iContextEntry->Entry() ); + + if( IpsSetUtils::IsInbox( iSession, emailEntry ) ) + { + ret = KErrNotFound; + } + else if( emailEntry.LocalSubscription() ) + { + ret = EIpsSetUiFolderUnsubscribe; + } + else + { + ret = EIpsSetUiFolderSubscribe; + } + TRAP_IGNORE( iContextEntry->SetEntryL( prevEntry ) ); + } + return ret; + } + + +// ---------------------------------------------------------------------------- +// CIpsSetUiBaseDialog::GetResourceForMiddlekey() +// ---------------------------------------------------------------------------- +// +TInt CIpsSetUiSubscriptionDialog::GetResourceForMiddlekey() + { + FUNC_LOG; +//#ifdef MSK + TInt resource = KErrNotFound; + + switch( CheckMSKState() ) + { + case EIpsSetUiFolderOpenFolder: + resource = R_FSE_SETTINGS_MAIL_FOLDER_OPEN; + break; + case EIpsSetUiFolderUnsubscribe: + resource = R_FSE_SETTINGS_MAIL_FOLDER_UNSUBSCRIBE; + break; + case EIpsSetUiFolderSubscribe: + resource = R_FSE_SETTINGS_MAIL_FOLDER_SUBSCRIBE; + break; + default: + resource = KErrNotFound; + break; + } + + return resource; +/* +#else + return KErrNotFound; +#endif +*/ + } + +// +// ---------------------------------------------------------------------------- +// CIpsSetUiSubscriptionDialog::HandleAsyncRequestCompletedL +// ---------------------------------------------------------------------------- +// +void CIpsSetUiSubscriptionDialog::HandleAsyncRequestCompletedL( TInt /*aErrorId*/ ) + { + FUNC_LOG; + switch (iState) + { + case CIpsSetUiSubscriptionDialog::EIdle: + //just ignore + break; + + case CIpsSetUiSubscriptionDialog::ESingleOperation: + if(iAsyncWaitNote && (!iFetchDialogDismissed)) + iAsyncWaitNote->ProcessFinishedL(); + iState = CIpsSetUiSubscriptionDialog::EIdle; + iSoftkeys->UpdateMiddleSoftkeyLabelL( + GetResourceForMiddlekey(), EAknSoftkeyOpen, NULL ); + break; + + case CIpsSetUiSubscriptionDialog::EMultipleSubscribe: + case CIpsSetUiSubscriptionDialog::EMultipleUnsubscribe: + if(iMultipleStarted) + { + iMultipleStarted = EFalse; + } + else if(iCount) // dont delete in case iCount become 0 + //becausae of messagingfw does not work as specified we can't let iEntrySelection + //empty for KIMAP4MTMEndBatch command + iEntrySelection->Delete(0); + TBuf8<1> dummyParam; + if( iCount ) // if still some entries left for processing + { + CMsvOperation* aMsvOperation = iBaseMtm->InvokeAsyncFunctionL( + (iState==CIpsSetUiSubscriptionDialog::EMultipleSubscribe? + KIMAP4MTMLocalSubscribe:KIMAP4MTMLocalUnsubscribe), + *iEntrySelection, dummyParam, iAsyncHelper->iStatus); + iAsyncHelper->Start(aMsvOperation); + iCount--; + } + else //end processing + { + CMsvOperation* aMsvOperation = iBaseMtm->InvokeAsyncFunctionL( KIMAP4MTMEndBatch, + *iEntrySelection, dummyParam, iAsyncHelper->iStatus); + iState = ESingleOperation; + iAsyncHelper->Start(aMsvOperation); + } + break; + } + } + +// ----------------------------------------------------------------------------- +// CIpsSetUiSubscriptionDialog::DialogDismissedL +// ----------------------------------------------------------------------------- +// +void CIpsSetUiSubscriptionDialog::DialogDismissedL( TInt aButtonId ) + { + FUNC_LOG; + if((aButtonId == EAknSoftkeyCancel) && + (iState!=CIpsSetUiSubscriptionDialog::EIdle)) + { + CancelAllAsyncRequests(); + } + iFetchDialogDismissed = ETrue; + } + +// ----------------------------------------------------------------------------- +// CIpsSetUiSubscriptionDialog::ShowWaitNoteL +// ----------------------------------------------------------------------------- +// +void CIpsSetUiSubscriptionDialog::ShowWaitNoteL() + { + FUNC_LOG; + if ( !iAsyncWaitNote ) + { + iAsyncWaitNote = new(ELeave)CAknWaitDialog( + (REINTERPRET_CAST(CEikDialog**,&iAsyncWaitNote)), EFalse); + iAsyncWaitNote->SetCallback(this); + iFetchDialogDismissed = EFalse; + iAsyncWaitNote->ExecuteLD(R_IPS_SETUI_WAIT_REFRESH_FOLDER_LIST_DIALOG); + } + } + +// ----------------------------------------------------------------------------- +// CIpsSetUiSubscriptionDialog::DialogDismissedL +// ----------------------------------------------------------------------------- +// +void CIpsSetUiSubscriptionDialog::CancelAllAsyncRequests() + { + FUNC_LOG; + iState = CIpsSetUiSubscriptionDialog::EIdle; + if(iAsyncHelper) + iAsyncHelper->Cancel(); + iMultipleStarted = EFalse; + } + +// ---------------------------------------------------------------------------- +// CSubscriptionDialogActiveHelper::CSubscriptionDialogActiveHelper +// ---------------------------------------------------------------------------- +// +CSubscriptionDialogActiveHelper::CSubscriptionDialogActiveHelper + (CIpsSetUiSubscriptionDialog* aSubscriptionDialog): + CActive(CActive::EPriorityStandard), + iMsvOperation(NULL) + { + FUNC_LOG; + iSubscriptionDialog = aSubscriptionDialog; + CActiveScheduler::Add(this); + } + +// ---------------------------------------------------------------------------- +// CSubscriptionDialogActiveHelper::~CSubscriptionDialogActiveHelper() +// ---------------------------------------------------------------------------- +// +CSubscriptionDialogActiveHelper::~CSubscriptionDialogActiveHelper() + { + FUNC_LOG; + //Cancel(); + iSubscriptionDialog = NULL; + if(iMsvOperation) + delete iMsvOperation; + } + +// ---------------------------------------------------------------------------- +// CSubscriptionDialogActiveHelper::Start() +// ---------------------------------------------------------------------------- +// +void CSubscriptionDialogActiveHelper::Start(CMsvOperation* aMsvOperation) + { + FUNC_LOG; + if(iMsvOperation) + delete iMsvOperation; + iMsvOperation = aMsvOperation; + SetActive(); + } + +// ---------------------------------------------------------------------------- +// CSubscriptionDialogActiveHelper::RunL() +// ---------------------------------------------------------------------------- +// +void CSubscriptionDialogActiveHelper::RunL() + { + FUNC_LOG; + if(iSubscriptionDialog) + iSubscriptionDialog->HandleAsyncRequestCompletedL(KErrNone); + } + +// ---------------------------------------------------------------------------- +// CSubscriptionDialogActiveHelper::DoCancel() +// ---------------------------------------------------------------------------- +// +void CSubscriptionDialogActiveHelper::DoCancel() + { + FUNC_LOG; + if(iMsvOperation) + iMsvOperation->Cancel(); + } +// + + +// End of File +