--- /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 <badesca.h>
+#include <e32std.h>
+
+#include <aknlists.h> // PopupQuery stuff
+#include <aknPopup.h>
+#include <aknpopuplayout.h>
+
+#include <StringLoader.h>
+
+#include <Postcard.rsg>
+#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