diff -r 000000000000 -r 72b543305e3a mobilemessaging/postcard/postcardsrc/PostcardRecipientWrapper.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mobilemessaging/postcard/postcardsrc/PostcardRecipientWrapper.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,246 @@ +/* +* Copyright (c) 2005 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: +* Helper class for recipient/phonebook handling +* +*/ + + + +// ========== INCLUDE FILES ================================ + +#include +#include + +#include // PopupQuery stuff +#include +#include + +#include + +#include +#include "PostcardAppUi.h" +#include "PostcardContact.h" +#include "PostcardDocument.h" +#include "PostcardRecipientWrapper.h" + +// ========== EXTERNAL DATA STRUCTURES ===================== + +// ========== EXTERNAL FUNCTION PROTOTYPES ================= + +// ========== CONSTANTS ==================================== + +// ========== MACROS ======================================= + +// ========== LOCAL CONSTANTS AND MACROS =================== + +// ========== MODULE DATA STRUCTURES ======================= + +// ========== LOCAL FUNCTION PROTOTYPES ==================== + +// ========== LOCAL FUNCTIONS ============================== + +// ========== MEMBER FUNCTIONS ============================= + +// --------------------------------------------------------- +// CPostcardRecipientWrapper::CPostcardRecipientWrapper +// --------------------------------------------------------- +CPostcardRecipientWrapper::CPostcardRecipientWrapper( + CPostcardDocument& aDocument, + CPostcardAppUi& aAppUi, + CPostcardContact& aContact + ) : + iDocument( aDocument ), + iAppUi( aAppUi ), + iContact( aContact ) + + { + } + +// --------------------------------------------------------- +// CPostcardRecipientWrapper::~CPostcardRecipientWrapper +// --------------------------------------------------------- +CPostcardRecipientWrapper::~CPostcardRecipientWrapper( ) + { + } + +// --------------------------------------------------------- +// CPostcardRecipientWrapper::ConstructL +// --------------------------------------------------------- +void CPostcardRecipientWrapper::ConstructL( ) + { + } + +// --------------------------------------------------------- +// CPostcardRecipientWrapper::NewL +// --------------------------------------------------------- +CPostcardRecipientWrapper* CPostcardRecipientWrapper::NewL( + CPostcardDocument& aDocument, + CPostcardAppUi& aAppUi, + CPostcardContact& aContact + ) + { + CPostcardRecipientWrapper* self = + new ( ELeave ) CPostcardRecipientWrapper( + aDocument, + aAppUi, + aContact + ); + CleanupStack::PushL( self ); + self->ConstructL( ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------- +// CPostcardRecipientWrapper::AskLocationL +// --------------------------------------------------------- +TBool CPostcardRecipientWrapper::AskLocationL( + CPostcardContact::TLocation& aLocation ) + { + static const CPostcardContact::TLocation locations[] = + { + CPostcardContact::ELocationPreferred, + CPostcardContact::ELocationHome, + CPostcardContact::ELocationWork + }; + const TInt KNumLocations = sizeof( locations ) / sizeof( locations[ 0 ] ); + + CPostcardContact::TLocation foundLocations[ KNumLocations ]; + TInt numLocations = 0; + + // Check if contact has address for possible locations + for( TInt i = 0; i < KNumLocations; i++ ) + { + if ( iContact.HasLocationL(locations[i]) ) + { + foundLocations[ numLocations++ ] = locations[ i ]; + } + } + + CPostcardContact::TLocation location = + CPostcardContact::ELocationPreferred; + + if ( numLocations == 0 ) + { + // Import only the name fields + } + else if ( numLocations == 1 ) + { // Only one location used -> use that + location = foundLocations[ 0 ]; + } + else + { + CAknSingleHeadingPopupMenuStyleListBox* listBox = + new(ELeave) CAknSingleHeadingPopupMenuStyleListBox(); + CleanupStack::PushL( listBox ); + CAknPopupList* popupList = CAknPopupList::NewL( listBox, + R_POSTCARD_SOFTKEYS_OK_BACK__OK, + AknPopupLayouts::EMenuGraphicHeadingWindow ); + CleanupStack::PushL( popupList ); + listBox->ConstructL( popupList, CEikListBox::ELeftDownInViewRect ); + listBox->CreateScrollBarFrameL( ETrue ); + listBox->ScrollBarFrame()->SetScrollBarVisibilityL( + CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto ); + + TInt resId = R_POSTCARD_ADDRESS_SELECTION_TITLE; + HBufC* titleText = iAppUi.ReadFromResourceLC( resId ); + popupList->SetTitleL( *titleText ); + CleanupStack::PopAndDestroy( titleText ); // titleText + + CDesCArrayFlat* strings = new (ELeave) CDesCArrayFlat( KNumLocations ); + CleanupStack::PushL( strings ); + + for( TInt i = 0; i < numLocations; i++ ) + { + HBufC* buffer = GetFormattedStringL( foundLocations[ i ] ); + CleanupStack::PushL( buffer ); + strings->AppendL( *buffer ); + CleanupStack::PopAndDestroy( buffer ); + } + + // For each list item replace the %N in the item format with the number + // of the icon, the %0N with the label of the address (Default, Home or + // Business) and the %1N with the actual combined address string. + + CTextListBoxModel* model = listBox->Model(); + model->SetItemTextArray( strings ); + model->SetOwnershipType( ELbmOwnsItemArray ); + CleanupStack::Pop( strings ); + + // And execute the dialog + CleanupStack::Pop( popupList ); + TInt popupOk = popupList->ExecuteLD(); + TInt itemIndex = listBox->CurrentItemIndex(); + CleanupStack::PopAndDestroy( listBox ); // listBox; + + if ( popupOk ) + { + location = foundLocations[ itemIndex ]; + } + else + { + // Nothing was selected so just return.. + return EFalse; + } + } + // Set location as out parameter + aLocation = location; + return ETrue; + } + +// --------------------------------------------------------- +// CPostcardRecipientWrapper::GetFormattedStringL +// --------------------------------------------------------- +HBufC* CPostcardRecipientWrapper::GetFormattedStringL( + CPostcardContact::TLocation aAddressLocation ) + { + _LIT(KPostcardSelectItemFormat, "%0U\t%1U"); + TPtrC itemFormat(KPostcardSelectItemFormat); + + TBuf<64> addressBuffer; + addressBuffer.Zero(); + + static const TInt resIds[] = + { + R_POSTCARD_ADDRESS_SELECTION_NONE, + R_POSTCARD_ADDRESS_SELECTION_HOME, + R_POSTCARD_ADDRESS_SELECTION_WORK + }; + TInt resId = resIds[ aAddressLocation ]; + HBufC* itemText = iAppUi.ReadFromResourceLC( resId ); + iContact.GetContactStringL( addressBuffer, aAddressLocation ); + + TInt formatBufferLength = itemFormat.Length() + itemText->Length() + addressBuffer.Length(); + + HBufC* sourceBuffer = HBufC::NewLC(formatBufferLength); + HBufC* destinationBuffer = HBufC::NewLC(formatBufferLength); + TPtr sourceBufferPtr = sourceBuffer->Des(); + TPtr destinationBufferPtr = destinationBuffer->Des(); + + sourceBufferPtr.Copy(itemFormat); + + // List item label -> location 0, value itemText + StringLoader::Format(destinationBufferPtr, sourceBufferPtr, 0, itemText->Des( ) ); + sourceBufferPtr.Copy(destinationBufferPtr); + + // List item text (address string) -> location 1, value addressBuffer + StringLoader::Format(destinationBufferPtr, sourceBufferPtr, 1, addressBuffer); + + CleanupStack::Pop( destinationBuffer ); + CleanupStack::PopAndDestroy( 2, itemText ); // itemText, sourceBuffer + return destinationBuffer; + } + +// EOF