diff -r d189ee25cf9d -r 3533d4323edc emailuis/widget/emailwidgetsettings/src/emailwidgetsettingslistviewcontainer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailuis/widget/emailwidgetsettings/src/emailwidgetsettingslistviewcontainer.cpp Wed Sep 01 12:28:57 2010 +0100 @@ -0,0 +1,614 @@ +/* +* Copyright (c) 2009 - 2010 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: CEmailWidgetSettingsListViewContainer implementation +* +*/ + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "emailtrace.h" +#include "emailwidgetsettingslistview.h" +#include "cmailwidgetcenrepkeys.h" +#include "cfsmailclient.h" + +using namespace AknLayout; +using namespace EmailInterface; + +const TInt KMaxMailboxCount = 18; +const TInt KMaxExternalBoxCount = 10; +_LIT( KDissociated,"0"); +const TInt KMaxDescLen = 256; +const TUid KUidWizardApp = { 0x10281c96 }; +const TUid KUidEmailWizardView = { 0x10281C9A }; +_LIT( KMifPath, "z:\\resource\\apps\\emailwidgetsettings.mif"); +_LIT( KMifPrefix, "mif(" ); + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CEmailWidgetSettingsListViewContainer::CEmailWidgetSettingsListViewContainer +// --------------------------------------------------------------------------- +// +CEmailWidgetSettingsListViewContainer::CEmailWidgetSettingsListViewContainer() + { + FUNC_LOG; + } + +// --------------------------------------------------------------------------- +// CEmailWidgetSettingsListViewContainer::ConstructL +// --------------------------------------------------------------------------- +// +void CEmailWidgetSettingsListViewContainer::ConstructL(CEmailWidgetSettingsListView* aView, + const TRect& aRect) + { + FUNC_LOG; + iEnv = CEikonEnv::Static( ); + iMailboxes = CEmailWidgetSettingsMailboxes::NewL(); + CreateWindowL(); + SetBlank(); + + CreateCbaL(aView); + CreateListBoxL(aView); + SetRect(aRect); + ActivateL(); + } + +// --------------------------------------------------------------------------- +// CEmailWidgetSettingsListViewContainer::CreateListBoxL +// --------------------------------------------------------------------------- +// +void CEmailWidgetSettingsListViewContainer::CreateListBoxL(MEikListBoxObserver* aObserver) + { + FUNC_LOG; + + + TInt nativeMailboxCount = iMailboxes->MailboxCount(); + + iListBox = new(ELeave) CAknSingleGraphicStyleListBox; + iListBox->SetContainerWindowL( *this); + iListBox->ConstructL( this, EAknListBoxSelectionList ); + + iAccountNames = new (ELeave) CDesCArrayFlat(nativeMailboxCount + 1); // +1 for creating new mailbox + iDomains = new (ELeave) CDesCArrayFlat(1); + iAccountIds = new ( ELeave ) CArrayFixFlat(1); + + // First items on the selection list are native mailboxes. + // Append name, domain and id information to the arrays. + for (TInt i = 0; i < nativeMailboxCount; i++) + { + TBuf name; + TBuf domain; + TFSMailMsgId id; + iMailboxes->GetMailboxNameL(i, name); + iMailboxes->GetDomainL(i, domain); + iMailboxes->GetMailboxIdL(i, id); + iAccountNames->AppendL(name); + iDomains->AppendL(domain); + iAccountIds->AppendL(id); + } + + // Continue with external mailboxes. + // List plugins implementing the interface. + TUid interfaceUid = TUid::Uid( KEmailObserverInterfaceUid ); + RImplInfoPtrArray pluginArray; + REComSession::ListImplementationsL( interfaceUid, pluginArray); + + const TInt pluginCount = pluginArray.Count(); + INFO_1("***** NUMBER OF plugins == %d", pluginCount); + for ( TInt ii = 0; ii < pluginCount; ii++ ) + { + TUid implUid = pluginArray[ii]->ImplementationUid(); + + // load external email client plugin + INFO_1("***** BEFORE instantiating plugin %d", implUid.iUid); + EmailInterface::CEmailObserverPlugin* plugin = EmailInterface::CEmailObserverPlugin::NewL( implUid, this ); + CleanupStack::PushL( plugin ); + INFO("***** AFTER instantiating plugin "); + + // list mailboxes of the plugin + MEmailData& data( plugin->EmailDataL() ); + RPointerArray extMailboxes = data.MailboxesL(); + + const TInt extMailboxCount = extMailboxes.Count(); + + for ( TInt jj = 0; jj < extMailboxCount; jj++ ) + { + // Append mailbox name using indexed format ( e.g. "1\tMailboxName\t\t" ) + TBuf name; + name.AppendNum(nativeMailboxCount + 1 + jj); + name.Append(_L("\t")); + name.Append(extMailboxes[jj]->Name()); + name.Append(_L("\t\t")); + iAccountNames->AppendL(name); + + // Instead of domain information, external mail clients are requested + // to provide a string containing a mif file path and icon/mask numbers. + // The provided string is stored to domain list. + iDomains->AppendL( extMailboxes[jj]->BrandingIcon()); + + + // Combine plugin uid and mailbox id and add to the list. + TFSMailMsgId uid( implUid, extMailboxes[jj]->MailboxId() ); + iAccountIds->AppendL( uid ); + } + CleanupStack::PopAndDestroy(plugin); + plugin = NULL; + } + pluginArray.ResetAndDestroy(); + + HBufC* createNewMailbox = StringLoader::LoadLC(R_EMAILWIDGETSETTINGS_CREATE_NEW_MAILBOX); + iAccountNames->AppendL(createNewMailbox->Des()); + CleanupStack::PopAndDestroy(createNewMailbox); + iListBox->Model()->SetItemTextArray(iAccountNames); + + iListBox->Model()->SetOwnershipType(ELbmDoesNotOwnItemArray); + iListBox->ItemDrawer()->ColumnData()->EnableMarqueeL(ETrue); + iListBox->SetBorder(TGulBorder::ESingleBlack); + iListBox->CreateScrollBarFrameL(ETrue); + iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto); + iListBox->SetListBoxObserver(aObserver); + + + SetupListIconsL(); + + } + +// --------------------------------------------------------------------------- +// CEmailWidgetSettingsListViewContainer::SetupListIconsL +// --------------------------------------------------------------------------- +// +void CEmailWidgetSettingsListViewContainer::SetupListIconsL() + { + FUNC_LOG; + CFSMailClient* mailClient = CFSMailClient::NewL(); + CleanupClosePushL(*mailClient); + MFSMailBrandManager& brandManager = mailClient->GetBrandManagerL(); + + TInt count = iAccountIds->Count(); + + CArrayPtr* icons = new(ELeave) CArrayPtrFlat( count + 1 ); + CleanupStack::PushL( icons ); + + // Add "new mailbox" icon to the list + AppendIconL(icons, EMbmEmailwidgetsettingsQgn_prop_cmail_new_mailbox, + EMbmEmailwidgetsettingsQgn_prop_cmail_new_mailbox_mask); + + for (TInt i = 0; i < count; i++) + { + CGulIcon* brandIcon; + brandIcon = brandManager.GetGraphicL( EFSMailboxIcon, iDomains->MdcaPoint(i) ); + + if (brandIcon) + { + // Add branded mailbox icon to the list + icons->AppendL(brandIcon); + } + else + { + TInt err(KErrNotFound); + + // Check if domain list item contains mif file path (instead of domain) + // Path follows the format: "mif(z:\\resource\\apps\\myemailplugin.mif N1 N2)" + + TBufC temp( iDomains->MdcaPoint(i) ); + if( temp.Find(KMifPrefix) == 0 ) + { + TInt p1 = KMifPrefix().Length(); + TInt p2 = temp.Locate(' ') + 1; + TInt p3 = temp.LocateReverse(' ') + 1; + TInt end = temp.Length() - 1; + + TInt p1Len = p2-p1-1; + TInt p2Len = p3-p2-1; + TInt p3Len = end-p3; + + // negative lengths not allowed + if ( p1Len > 0 && p2Len > 0 && p3Len > 0 ) + { + TBufC mifPath(temp.Mid( p1, p1Len )); + TBufC<16> iconString(temp.Mid( p2, p2Len )); + TBufC<16> maskString(temp.Mid( p3, p3Len )); + + TLex lexIcon(iconString); + TLex lexMask(maskString); + TInt icon(0), mask(0); + lexIcon.Val(icon); + lexMask.Val(mask); + + // Add 3rd party mailbox icon to the list + err = AppendExternalIconL( icons, mifPath, icon, mask ); + } + } + if ( err ) + { + // Add default mailbox icon to the list + AppendIconL(icons, EMbmEmailwidgetsettingsQgn_indi_cmail_drop_email_account, + EMbmEmailwidgetsettingsQgn_indi_cmail_drop_email_account_mask); + } + } + } + + // clear any previous icon array + CAknIconArray* oldIconArray = static_cast(iListBox->ItemDrawer()->ColumnData()->IconArray()); + if (oldIconArray) + delete oldIconArray; + + iListBox->ItemDrawer()->ColumnData()->SetIconArray(icons); + CleanupStack::Pop(icons); + CleanupStack::PopAndDestroy( mailClient ); + } + +// ----------------------------------------------------------------------------- +// CEmailWidgetSettingsListViewContainer::AppendIconL +// +// Loads and appends an icon to the icon array. +// ----------------------------------------------------------------------------- +// + +void CEmailWidgetSettingsListViewContainer::AppendIconL( + CArrayPtr* aIcons, + const TInt aFileBitmapId, + const TInt aFileMaskId) + { + FUNC_LOG; + CGulIcon* newIcon; + CFbsBitmap* newIconBmp; + CFbsBitmap* newIconMaskBmp; + AknIconUtils::CreateIconLC( newIconBmp, newIconMaskBmp, KMifPath, + aFileBitmapId, + aFileMaskId ); + newIcon = CGulIcon::NewL(newIconBmp, newIconMaskBmp); + CleanupStack::Pop(newIconMaskBmp); + CleanupStack::Pop(newIconBmp); + CleanupStack::PushL(newIcon); + aIcons->AppendL(newIcon); + CleanupStack::Pop(newIcon); + } + +// ----------------------------------------------------------------------------- +// CEmailWidgetSettingsListViewContainer::AppendExternalIconL +// +// Loads and appends an 3rd party icon to the icon array. +// ----------------------------------------------------------------------------- +// +TInt CEmailWidgetSettingsListViewContainer::AppendExternalIconL( + CArrayPtr* aIcons, + const TDesC& aMifPath, + const TInt aFileBitmapId, + const TInt aFileMaskId) + { + FUNC_LOG; + CGulIcon* newIcon; + CFbsBitmap* newIconBmp; + CFbsBitmap* newIconMaskBmp; + // Trap when faulty mif path, missing graphic file, etc. + TRAPD( err, AknIconUtils::CreateIconL( newIconBmp, newIconMaskBmp, aMifPath, + aFileBitmapId, + aFileMaskId ) ); + if (!err) + { + CleanupStack::PushL(newIconBmp); + CleanupStack::PushL(newIconMaskBmp); + newIcon = CGulIcon::NewL(newIconBmp, newIconMaskBmp); + CleanupStack::Pop(newIconMaskBmp); + CleanupStack::Pop(newIconBmp); + CleanupStack::PushL(newIcon); + aIcons->AppendL(newIcon); + CleanupStack::Pop(newIcon); + } + return err; + } + +// --------------------------------------------------------------------------- +// CEmailWidgetSettingsListViewContainer::CreateCbaL +// --------------------------------------------------------------------------- +// +void CEmailWidgetSettingsListViewContainer::CreateCbaL( MEikCommandObserver* aObserver ) + { + FUNC_LOG; + const TSize screenSize= iCoeEnv->ScreenDevice()->SizeInPixels(); + iPopoutCba = CEikButtonGroupContainer::NewL(CEikButtonGroupContainer::ECba, + CEikButtonGroupContainer::EHorizontal, aObserver, R_AVKON_SOFTKEYS_SELECT_CANCEL); + iPopoutCba->SetBoundingRect(TRect(screenSize)); + } + +// --------------------------------------------------------------------------- +// CEmailWidgetSettingsListViewContainer::~CEmailWidgetSettingsListViewContainer +// --------------------------------------------------------------------------- +// +CEmailWidgetSettingsListViewContainer::~CEmailWidgetSettingsListViewContainer() + { + FUNC_LOG; + delete iMailboxes; + delete iPopoutCba; + delete iListBox; + delete iAccountNames; + delete iDomains; + delete iAccountIds; + REComSession::FinalClose(); + } + +// --------------------------------------------------------------------------- +// CEmailWidgetSettingsListViewContainer::SizeChanged +// --------------------------------------------------------------------------- +// +void CEmailWidgetSettingsListViewContainer::SizeChanged() + { + FUNC_LOG; + TRect mainPaneRect; + AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect); + TRect listBoxRect(mainPaneRect.Size()); + iListBox->SetRect(listBoxRect); + } + +// --------------------------------------------------------------------------- +// CEmailWidgetSettingsListViewContainer::CountComponentControls +// --------------------------------------------------------------------------- +// +TInt CEmailWidgetSettingsListViewContainer::CountComponentControls() const + { + FUNC_LOG; + return iListBox ? 1 : 0; + } + +// --------------------------------------------------------------------------- +// CEmailWidgetSettingsListViewContainer::ComponentControl +// --------------------------------------------------------------------------- +// +CCoeControl* CEmailWidgetSettingsListViewContainer::ComponentControl(TInt /*aIndex*/) const + { + FUNC_LOG; + return iListBox; + } + +// --------------------------------------------------------------------------- +// CEmailWidgetSettingsListViewContainer::OfferKeyEventL +// --------------------------------------------------------------------------- +// +TKeyResponse CEmailWidgetSettingsListViewContainer::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType) + { + FUNC_LOG; + return iListBox->OfferKeyEventL(aKeyEvent, aType); + } + +// --------------------------------------------------------------------------- +// CEmailWidgetSettingsListViewContainer::MinimumSize +// --------------------------------------------------------------------------- +// +TSize CEmailWidgetSettingsListViewContainer::MinimumSize() + { + FUNC_LOG; + return iEikonEnv->EikAppUi()->ClientRect().Size(); + } + +// --------------------------------------------------------------------------- +// CEmailWidgetSettingsListViewContainer::CurrentIndex +// --------------------------------------------------------------------------- +// +TInt CEmailWidgetSettingsListViewContainer::CurrentIndex() const + { + FUNC_LOG; + return iListBox->CurrentItemIndex(); + } + +// --------------------------------------------------------------------------- +// CEmailWidgetSettingsListViewContainer::MopSupplyObject +// --------------------------------------------------------------------------- +// +TTypeUid::Ptr CEmailWidgetSettingsListViewContainer::MopSupplyObject(TTypeUid aId) + { + FUNC_LOG; + return SupplyMopObject(aId, iPopoutCba); + } + +// --------------------------------------------------------------------------- +// CEmailWidgetSettingsListViewContainer::SaveSelectedL +// --------------------------------------------------------------------------- +// +void CEmailWidgetSettingsListViewContainer::SaveSelectedL() + { + FUNC_LOG; + + if (CurrentIndex() == iAccountNames->Count() - 1) + { + LaunchEmailWizardL(); + return; + } + + CCommandLineArguments* args = CCommandLineArguments::NewLC(); + const TInt argumentCount = args->Count(); + if (argumentCount!=2) + { + User::LeaveIfError(KErrNotFound); + } + CRepository* cenRep = CRepository::NewL( KCRUidCmailWidget ); + + // Check whether selected box is native or external mailbox + TInt index = CurrentIndex(); + TInt nativeBoxCount = iMailboxes->MailboxCount(); + + TBool nativeBox(ETrue); + if ( index >= nativeBoxCount ) + { + nativeBox = EFalse; + } + + if ( cenRep ) + { + TInt setId ( GetSettingToAssociateL(args->Arg(1), nativeBox, cenRep) ); + if (setId >= 0) + { + TFSMailMsgId msgId = (*iAccountIds)[CurrentIndex()]; + TInt id = msgId.Id(); + TUid pluginId = msgId.PluginId(); + TInt pId(pluginId.iUid); + TInt ret = cenRep->StartTransaction(CRepository::EConcurrentReadWriteTransaction); + + if ( nativeBox ) + { + ResetExtAccountWithSameId( args->Arg(1), cenRep ); + + ret = cenRep->Set( KCMailMailboxIdBase+setId, id ); + ret = cenRep->Set( KCMailPluginIdBase+setId, pId ); + ret = cenRep->Set( KCMailWidgetContentIdBase+setId, args->Arg(1) ); + } + else // external mailbox + { + ResetNatAccountWithSameId( args->Arg(1), cenRep ); + + ret = cenRep->Set( KCMailExtMailboxBase+setId, id ); + ret = cenRep->Set( KCMailExtMailboxBase+KCMailExtPluginIdOffset+setId, pId ); + ret = cenRep->Set( KCMailExtMailboxBase+KCMailExtWidgetCidOffset+setId, args->Arg(1) ); + } + + TUint32 errorKey( 0 ); + cenRep->CommitTransaction(errorKey); + INFO_1("Errorkey == %d", errorKey); + } + } + delete cenRep; + CleanupStack::PopAndDestroy(args); + } + +// --------------------------------------------------------------------------- +// CEmailWidgetSettingsListViewContainer::ResetExtAccountWithSameId +// --------------------------------------------------------------------------- +// +void CEmailWidgetSettingsListViewContainer::ResetExtAccountWithSameId( const TDesC& aContentId, CRepository* aCenRep ) + { + FUNC_LOG; + for ( TInt i = 0; i < KMaxExternalBoxCount; i++ ) + { + TBuf<10> value; + TInt ret = aCenRep->Get( KCMailExtMailboxBase+KCMailExtWidgetCidOffset+i, value ); + if ( !value.Compare( aContentId ) ) + { + // found + ret = aCenRep->Set(KCMailExtMailboxBase+i, 0); + ret = aCenRep->Set(KCMailExtMailboxBase+KCMailExtPluginIdOffset+i, 0); + ret = aCenRep->Set(KCMailExtMailboxBase+KCMailExtWidgetCidOffset+i, KDissociated); + } + } + } + +// --------------------------------------------------------------------------- +// CEmailWidgetSettingsListViewContainer::ResetNatAccountWithSameId +// --------------------------------------------------------------------------- +void CEmailWidgetSettingsListViewContainer::ResetNatAccountWithSameId( const TDesC& aContentId, CRepository* aCenRep ) + { + FUNC_LOG; + for ( TInt i = 0; i < KMaxMailboxCount; i++ ) + { + TBuf<10> value; + TInt ret = aCenRep->Get( KCMailWidgetContentIdBase+i, value ); + if ( !value.Compare( aContentId ) ) + { + // found + ret = aCenRep->Set(KCMailMailboxIdBase+i, 0); + ret = aCenRep->Set(KCMailPluginIdBase+i, 0); + ret = aCenRep->Set(KCMailWidgetContentIdBase+i, KDissociated); + } + } + } + +// --------------------------------------------------------------------------- +// CEmailWidgetSettingsListViewContainer::GetSettingToAssociateL +// --------------------------------------------------------------------------- +// +TInt CEmailWidgetSettingsListViewContainer::GetSettingToAssociateL(const TDesC& aCid, + const TBool aNativeBox, + CRepository* aCenRep) + { + FUNC_LOG; + TUint32 keyBase; + TInt mailboxCount; + if (aNativeBox) + { + keyBase = KCMailWidgetContentIdBase; + mailboxCount = KMaxMailboxCount; + } + else // external mailbox + { + keyBase = KCMailExtMailboxBase + KCMailExtWidgetCidOffset; + mailboxCount = KMaxExternalBoxCount; + } + + TInt ret(KErrNotFound); + + // Search selected widget content id from cenrep settings + for (TInt i = 0; i < mailboxCount; i++) + { + TBuf value; + aCenRep->Get( keyBase+i, value ); + TInt result = value.Compare(aCid); + if (!result) + { + // Content id found + ret = i; + break; + } + } + if (ret < 0 ) + { + // Content id not found. Search first free space. + for (TInt i = 0; i < mailboxCount; i++) + { + TBuf value; + aCenRep->Get( keyBase+i, value ); + TInt result = value.Compare(KDissociated); + if (!result) + { + // Free space found + ret = i; + break; + } + } + } + return ret; + } + +// ----------------------------------------------------------------------------- +// CEmailWidgetSettingsListViewContainer::LaunchEmailWizardL +// Launches Email Settings Wizard +// ----------------------------------------------------------------------------- +// +void CEmailWidgetSettingsListViewContainer::LaunchEmailWizardL() + { + FUNC_LOG; + if ( iEnv ) + { + CCoeAppUi* appui = iEnv-> EikAppUi( ); + if ( appui ) + { + appui->ActivateViewL(TVwsViewId(KUidWizardApp, KUidEmailWizardView)); + } + } + } + +void CEmailWidgetSettingsListViewContainer::EmailObserverEvent( + EmailInterface::MEmailData& /*aEmailData*/ ) + { + FUNC_LOG; + } + +// End of File