diff -r 000000000000 -r 72b543305e3a mobilemessaging/postcard/postcardsrc/PostcardAddressForm.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mobilemessaging/postcard/postcardsrc/PostcardAddressForm.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,980 @@ +/* +* 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: +* Methods for Postcard Address form. +* +*/ + + + +// INCLUDE FILES + +#include // CEikStatusPane +#include +#include // for CEikLabel + +#include +#include // CAknNavigationControlContainer +#include // CAknNavigationDecorator +#include // for CAknIndicatorContainer +#include // for MAknEditStateIndicator +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include +#include "Postcard.hrh" +#include "PostcardLaf.h" +#include "PostcardDocument.h" +#include "PostcardAppUi.h" +#include "PostcardAddressForm.h" +#include "PostcardUtils.h" +#include "PostcardRecipientWrapper.h" + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// Two-phased constructor +// --------------------------------------------------------- +CPostcardAddressForm* CPostcardAddressForm::NewL( CPostcardAppUi& aAppUi, CPostcardDocument& aDocument, CContactCard& aContactItem, TInt& aRetValue, TInt aFirstActive, TKeyEvent aKeyEvent ) + { + CPostcardAddressForm* self = + new (ELeave) CPostcardAddressForm( aAppUi, aDocument, aContactItem, aRetValue, aFirstActive, aKeyEvent ); + CleanupStack::PushL( self ); + self->ConstructL( ); + CleanupStack::Pop( ); + return self; + } + +// --------------------------------------------------------- +// Default destructor +// --------------------------------------------------------- +CPostcardAddressForm::~CPostcardAddressForm() + { + delete iContact; + + // Remove the navidecorator from status pane + CEikStatusPane *sp = iEikonEnv->AppUiFactory( )->StatusPane( ); + TRAP_IGNORE( static_cast + ( sp->ControlL( TUid::Uid( EEikStatusPaneUidNavi ) ) )->Pop( iNaviDecorator ); + ); // TRAP_IGNORE + delete iNaviDecorator; + } + +// --------------------------------------------------------- +// CPostcardAddressForm +// --------------------------------------------------------- +CPostcardAddressForm::CPostcardAddressForm + ( CPostcardAppUi& aAppUi, + CPostcardDocument& aDocument, + CContactCard& aContactItem, + TInt& aRetValue, + TInt aFirstActive, + TKeyEvent aKeyEvent ) : + iContactItem( aContactItem ), + iAppUi( aAppUi ), + iDocument( aDocument ), + iNaviDecorator( NULL ), + iKeyEvent( aKeyEvent ), + iRetValue( aRetValue ), + iPreviousControl( NULL ), + iFirstActive( aFirstActive ) + { + } + + +// --------------------------------------------------------- +// ExecuteLD() +// --------------------------------------------------------- +TInt CPostcardAddressForm::ExecLD( ) + { + PrepareLC( R_POSTCARD_ADDRESS_DIALOG ); + return CAknForm::RunLD( ); + } + +// --------------------------------------------------------- +// ConstructL +// --------------------------------------------------------- +void CPostcardAddressForm::ConstructL( ) + { + + // Feature manager + FeatureManager::InitializeLibL( ); + + if( FeatureManager::FeatureSupported( KFeatureIdHelp ) ) + { + iAddrFlags |= EPostcardAddressHelpSupported; + } + + FeatureManager::UnInitializeLib( ); + + CleanNavipane(); + + // Call the base class' two-phased constructor + CAknDialog::ConstructL( R_POSTCARD_ADDRESS_MENUBAR ); + } + +// --------------------------------------------------------- +// OfferKeyEventL +// --------------------------------------------------------- +TKeyResponse CPostcardAddressForm::OfferKeyEventL + (const TKeyEvent& aKeyEvent, + TEventCode aType) + { + // Only interested in standard key events + if ( aType != EEventKey ) + { + return EKeyWasNotConsumed; + } + + // If a menu is showing offer key events to it. + if ( CAknForm::MenuShowing( ) ) + { + return CAknForm::OfferKeyEventL( aKeyEvent, aType ); + } + + TUint code = aKeyEvent.iCode; + + TKeyResponse resp=EKeyWasNotConsumed; + + switch ( code ) + { + case EKeyOK: + { + DoSelectionKeyL( ); + resp=EKeyWasConsumed; + break; + } + + case EKeyBackspace: + case EKeyDelete: + { + resp = CAknForm::OfferKeyEventL( aKeyEvent, aType ); + break; + } + + case EKeyYes: + { + if( iDocument.MessageType( ) != EPostcardSent ) + { // This is draft message + if( IsEmpty( ) ) + { + DoAddRecipientL( ); + } + else + { + SendL(); + } + resp=EKeyWasConsumed; + break; + } + // If message is sent -> intentionally let it fall thru + } + //lint -fallthrough + case EKeyEscape: + // Update recipient to entry + UpdateRecipientToEntryL(); + // Escape dismisses (destroys) the dialog + return CAknForm::OfferKeyEventL( aKeyEvent, aType ); + + case EKeyApplication: + case EKeyPhoneEnd: + case EKeyPowerOff: + case EKeyGripOpen: + case EKeyGripClose: + case EKeySide: + default: + resp=CAknForm::OfferKeyEventL( aKeyEvent, aType ); + CheckTextExceedingL(); + break; + + } + + return resp; + } + +// --------------------------------------------------------- +// UpdateRecipientToEntryL +// --------------------------------------------------------- +void CPostcardAddressForm::UpdateRecipientToEntryL() + { + if( iDocument.MessageType( ) != EPostcardSent ) + { + // Create an empty (ie. no fields) contact card + CContactCard* card = CContactCard::NewLC(); + + for(TInt loop = EPostcardAddressName; loop<=EPostcardAddressCountry; loop++ ) + { + CEikEdwin* edwin = static_cast< CEikEdwin* >(ControlOrNull( loop ) ); + if( edwin && edwin->TextLength( ) > 0 ) + { // The field is not empty: lets add field with right label + TPostcardUtils::AddContactFieldL( *card, + TPostcardUtils::ContactItemNameFromId( loop ), + edwin->Text()->Read( 0, edwin->TextLength() ) ); + } + } + CleanupStack::Pop( card ); + // Update AppUi's contact. + iAppUi.SetRecipientL( *card ); + // Recipient changed, so we can change field to modified. + iDocument.SetChanged( EPostcardRecipient ); + } + } + +// --------------------------------------------------------- +// PreLayoutDynInitL +// --------------------------------------------------------- +void CPostcardAddressForm::PreLayoutDynInitL() + { + SetEditableL(ETrue); + } + +// --------------------------------------------------------- +// PostLayoutDynInitL +// --------------------------------------------------------- +void CPostcardAddressForm::PostLayoutDynInitL() + { + + // Read the mandatory fields + TInt mandatories = iAppUi.MandatoryAddressFields( ); + + for(TInt loop = EPostcardAddressName; loop<=EPostcardAddressCountry; loop++ ) + { + CEikEdwin* edwin = static_cast< CEikEdwin* >(ControlOrNull( loop ) ); + if( edwin ) + { + TInt max = iAppUi.MaxTextLength(loop); + edwin->SetMaxLength( max ); + if( max < 1 ) + { // If max is less than 1 -> make it invisible + DeleteLine( loop, ETrue ); + } + else + { + if( loop == EPostcardAddressZip ) + { + edwin->SetAknEditorInputMode( EAknEditorNumericInputMode ); + } + // Field is visible, let's see if it's mandatory too + TInt bit = 1 << ( loop - EPostcardAddressName ); + if ( bit & mandatories ) + { // This control is mandatory so lets add asterisk + CEikLabel* label = ControlCaption( loop ); + HBufC* mandLabel = HBufC::NewLC( label->Text()->Length() + 2 ); + TPtr labelPtr = mandLabel->Des( ); + labelPtr.Zero( ); + labelPtr.Append( _L("* ") ); + labelPtr.Append( *label->Text( ) ); + SetControlCaptionL( loop, *mandLabel ); + CleanupStack::PopAndDestroy( mandLabel ); // mandLabel + } + } + } + } + + UpdateFieldsL( iContactItem ); + + if( iDocument.MessageType( ) == EPostcardSent ) + { // Set all fields read-only + for(TInt loop = EPostcardAddressName; loop<=EPostcardAddressCountry; loop++ ) + { + CEikEdwin* edwin = static_cast< CEikEdwin* >(ControlOrNull( loop ) ); + if( edwin ) + { + edwin->AddFlagToUserFlags( CEikEdwin::EReadOnly ); + edwin->AddFlagToUserFlags( CEikEdwin::EAvkonDisableCursor ); + } + } + } + + SetInitialCurrentLine( ); + SetEditableL(ETrue); + + SetMiddleSoftkeyL(); + } + +// --------------------------------------------------------- +// SetInitialCurrentLine +// --------------------------------------------------------- +void CPostcardAddressForm::SetInitialCurrentLine() + { + // In case something else than Name field is focused + // -> it means we have already been here so there's no need to call this again + TInt focused = IdOfFocusControl( ); + TInt a = EPostcardAddressName; + if( focused == a ) + { + CAknForm::SetInitialCurrentLine(); + } + } + +// --------------------------------------------------------- +// HandleResourceChange +// --------------------------------------------------------- +void CPostcardAddressForm::HandleResourceChange(TInt aType ) + { + CAknForm::HandleResourceChange( aType ); + } + +// --------------------------------------------------------- +// CPostcardAddressDialog::ProcessCommandL +// --------------------------------------------------------- +void CPostcardAddressForm::ProcessCommandL( TInt aCommandId ) + { + HideMenu( ); + + switch ( aCommandId ) + { + case EPostcardCmdSend: + SendL( ); + break; + + case EPostcardCmdForward: + ForwardMessageL( ); + break; + + case EPostcardCmdMessageInfo: + MessageInfoL( ); + break; + + case EPostcardCmdAddRecipient: + case EPostcardCmdReplaceRecipient: + // These MSK commands are not active in viewer mode + DoAddRecipientL( ); + SetMiddleSoftkeyL(); + break; + + case EMsgDispSizeAutomatic: + case EMsgDispSizeLarge: + case EMsgDispSizeNormal: + case EMsgDispSizeSmall: + iAppUi.HandleLocalZoomChangeL( (TMsgCommonCommands)aCommandId ); + break; + case EAknCmdHelp: + LaunchHelpL( ); + break; + + case EAknCmdExit: + case EEikCmdExit: + if( OkToExitL( aCommandId ) ) + { + iRetValue = EPostcardDialogExit; + TryExitL( EAknSoftkeyDone ); + } + break; + + default : + CAknForm::ProcessCommandL( aCommandId ); + break; + } + } + +// --------------------------------------------------------- +// DynInitMenuPaneL +// --------------------------------------------------------- +void CPostcardAddressForm::DynInitMenuPaneL + (TInt aResourceId, + CEikMenuPane* aMenuPane) + { + switch ( aResourceId ) + { + case R_POSTCARD_ADDRESS_OPTIONS: + DynInitMainMenuL( aMenuPane ); + break; + case R_POSTCARD_ZOOM_SUBMENU: + { + TInt zoomLevel = KErrGeneral; + iAppUi.GetZoomLevelL( zoomLevel ); + switch ( zoomLevel ) + { + case EAknUiZoomAutomatic: + aMenuPane->SetItemButtonState( EMsgDispSizeAutomatic, + EEikMenuItemSymbolOn ); + break; + case EAknUiZoomNormal: + aMenuPane->SetItemButtonState( EMsgDispSizeNormal, + EEikMenuItemSymbolOn ); + break; + case EAknUiZoomSmall: + aMenuPane->SetItemButtonState( EMsgDispSizeSmall, + EEikMenuItemSymbolOn ); + break; + case EAknUiZoomLarge: + aMenuPane->SetItemButtonState( EMsgDispSizeLarge, + EEikMenuItemSymbolOn ); + break; + default: + break; + } + } + break; + default: + break; + } + } + +// --------------------------------------------------------- +// DynInitMainMenuL +// --------------------------------------------------------- +void CPostcardAddressForm::DynInitMainMenuL( CEikMenuPane* aMenuPane ) + { + aMenuPane->SetItemDimmed( EPostcardCmdSend, + IsMainMenuOptionInvisible( EPostcardCmdSend )); + aMenuPane->SetItemDimmed( EPostcardCmdAddRecipient, + IsMainMenuOptionInvisible( EPostcardCmdAddRecipient )); + aMenuPane->SetItemDimmed( EPostcardCmdReplaceRecipient, + IsMainMenuOptionInvisible( EPostcardCmdReplaceRecipient )); + aMenuPane->SetItemDimmed( EPostcardCmdForward, + IsMainMenuOptionInvisible( EPostcardCmdForward )); + aMenuPane->SetItemDimmed( EPostcardCmdMessageInfo, + IsMainMenuOptionInvisible( EPostcardCmdMessageInfo )); + aMenuPane->SetItemDimmed( EAknCmdHelp, iAddrFlags & EPostcardAddressHelpSupported?EFalse:ETrue ); + aMenuPane->SetItemDimmed( EAknCmdExit, EFalse ); + } + +// --------------------------------------------------------- +// IsMainMenuOptionInvisible +// --------------------------------------------------------- +TBool CPostcardAddressForm::IsMainMenuOptionInvisible( TInt aMenuOptionId ) + { + TBool retVal = ETrue; + TPostcardMsgType msgType = iDocument.MessageType( ); + + switch ( aMenuOptionId ) + { + + case EPostcardCmdSend: + if( msgType != EPostcardSent ) + { + if( !IsEmpty( ) ) + { + retVal = EFalse; + } + } + break; + case EPostcardCmdAddRecipient: + if( msgType != EPostcardSent ) + { + if( IsEmpty( ) ) + { + retVal = EFalse; + } + } + break; + case EPostcardCmdReplaceRecipient: + if( msgType != EPostcardSent ) + { + if( !IsEmpty( ) ) + { + retVal = EFalse; + } + } + break; + case EPostcardCmdForward: + if( msgType == EPostcardSent ) + { + retVal = EFalse; + } + break; + case EPostcardCmdMessageInfo: + { + retVal = EFalse; + break; + } + case EAknCmdHelp: + if( iAddrFlags & EPostcardAddressHelpSupported ) + { + retVal = EFalse; + } + break; + + case EAknCmdExit: + retVal = EFalse; + break; + + default: + break; + } + + return retVal; + } + +// --------------------------------------------------------- +// DoSelectionKeyL +// --------------------------------------------------------- +void CPostcardAddressForm::DoSelectionKeyL( ) + { + TPostcardMsgType msgType = iDocument.MessageType( ); + + if( msgType != EPostcardSent ) + { + DoAddRecipientL( ); + } + } + +// --------------------------------------------------------- +// OkToExitL(TInt aButtonId) +// called by framework when the OK button is pressed +// --------------------------------------------------------- +TBool CPostcardAddressForm::OkToExitL( TInt aButtonId ) + { + TBool okToExit = CAknForm::OkToExitL( aButtonId ); + if( aButtonId == EAknSoftkeyDone || aButtonId == EPostcardCmdSend ) + { + UpdateRecipientToEntryL(); + return ETrue; + } + if( aButtonId == EAknCmdExit ) + { + return ETrue; + } + if( aButtonId == EAknSoftkeyEdit || aButtonId == EPostcardCmdAdd ) + { + DoAddRecipientL(); + CheckTextExceedingL( ); + SetMiddleSoftkeyL(); + return EFalse; + } + if( !okToExit ) + { + return okToExit; + } + if( aButtonId == EAknSoftkeyBack || + aButtonId == EAknSoftkeyExit || + aButtonId == EAknSoftkeyDone || + aButtonId == EAknCmdExit || + aButtonId == EEikCmdExit ) + { + return okToExit; + } + return EFalse; + } + +// --------------------------------------------------------- +// ActivateL() +// --------------------------------------------------------- +void CPostcardAddressForm::ActivateL( ) + { + SetFocus( ETrue ); + TInt focused = IdOfFocusControl( ); + CEikEdwin* edwin = static_cast< CEikEdwin* >(Control( focused ) ); + edwin->AddEdwinObserverL( this ); + CCoeControl::ActivateL( ); + + // After activating -> lets set the max. lengths and hide if needed + + TryChangeFocusToL( iFirstActive==KErrNotFound?EPostcardAddressName:iFirstActive ); + + if( iFirstActive != KErrNotFound ) + { // Lets show a note according to iFirstActive + TInt resourceId; + switch( iFirstActive ) + { + case EPostcardAddressName: + resourceId = R_POSTCARD_ADDRESS_NAME; + break; + case EPostcardAddressInfo: + resourceId = R_POSTCARD_ADDRESS_INFO; + break; + case EPostcardAddressStreet: + resourceId = R_POSTCARD_ADDRESS_STREET; + break; + case EPostcardAddressZip: + resourceId = R_POSTCARD_ADDRESS_ZIP; + break; + case EPostcardAddressCity: + resourceId = R_POSTCARD_ADDRESS_CITY; + break; + case EPostcardAddressState: + resourceId = R_POSTCARD_ADDRESS_STATE; + break; + default: + resourceId = R_POSTCARD_ADDRESS_COUNTRY; + break; + } + + CEikEdwin* edwin2 = static_cast< CEikEdwin* >(ControlOrNull( iFirstActive ) ); + if( edwin2 && edwin2->TextLength( ) ) + { // It's too long + if( edwin2->TextLength( ) > edwin2->MaxLength( ) + 1 ) + { // Exceeded by many + TInt howMany = edwin2->TextLength( ) - edwin2->MaxLength( ); + HBufC* warningString = + StringLoader::LoadLC( R_POSTCARD_ADDRESS_EXCEEDED_MANY, howMany, iCoeEnv ); + iAppUi.ShowConfirmationQueryL( *warningString, ETrue ); + CleanupStack::PopAndDestroy( warningString ); + } + else + { // Exceeded by one + iAppUi.ShowConfirmationQueryL( R_POSTCARD_ADDRESS_EXCEEDED, ETrue ); + } + iAddrFlags |= EPostcardAddressTextExceeded; + } + else + { // It's empty + HBufC* item = StringLoader::LoadLC( resourceId, iCoeEnv ); + CDesCArray* stringArray = new ( ELeave ) CDesCArrayFlat( 2 ); + CleanupStack::PushL( stringArray ); + + stringArray->AppendL( *item ); + stringArray->AppendL( *item ); + + HBufC* note = StringLoader::LoadLC( R_POSTCARD_SEND_FIELD_EMPTY, *stringArray, iCoeEnv ); + + iAppUi.ShowInformationNoteL( note->Des( ), EFalse ); + CleanupStack::PopAndDestroy( 3, item ); // item, stringarray, note + } + } + + if( iKeyEvent.iCode != 0 ) + { + TEventCode type = EEventKey; + iCoeEnv->SyncNotifyFocusObserversOfChangeInFocus(); + iCoeEnv->SimulateKeyEventL( iKeyEvent, type ); + } + } + +// --------------------------------------------------------- +// HandleControlStateChangeL +// --------------------------------------------------------- +void CPostcardAddressForm::HandleControlStateChangeL( TInt /*aControlId*/ ) + { + + } + +// --------------------------------------------------------- +// HandleEdwinEventL +// --------------------------------------------------------- +void CPostcardAddressForm::HandleEdwinEventL(CEikEdwin* /*aEdwin*/, TEdwinEvent /*aEventType*/ ) + { + // The functionality has been removed to HandleControlEventL + } + +// --------------------------------------------------------- +// LineChangedL +// --------------------------------------------------------- +void CPostcardAddressForm::LineChangedL(TInt /*aControlId*/) + { + iAddrFlags &= ~EPostcardAddressTextExceeded; + } + +// --------------------------------------------------------- +// SendL +// --------------------------------------------------------- +void CPostcardAddressForm::SendL( ) + { + iRetValue = EPostcardDialogSend; + TryExitL( EPostcardCmdSend ); + } + +// --------------------------------------------------------- +// ForwardMessageL +// --------------------------------------------------------- +void CPostcardAddressForm::ForwardMessageL( ) + { + iRetValue = EPostcardDialogForward; + TryExitL( EAknSoftkeyDone ); + } + +// --------------------------------------------------------- +// MessageInfoL +// --------------------------------------------------------- +void CPostcardAddressForm::MessageInfoL( ) + { + TPostcardMsgType msgType = iDocument.MessageType( ); + if( msgType != EPostcardSent ) + { // We are dealing with unsent message -> save recipient details for now + CEikEdwin* edwin = static_cast< CEikEdwin* >(ControlOrNull( EPostcardAddressName ) ); + if( edwin ) + { + TMmsMsvEntry tEntry = static_cast( iDocument.Entry() ); + tEntry.iDate.UniversalTime(); + tEntry.iDetails.Set(edwin->Text( )->Read( 0, edwin->TextLength( ) ) ); + tEntry.iBioType = KUidMsgSubTypeMmsPostcard.iUid; + iDocument.CurrentEntry().ChangeL( tEntry ); + } + } + iAppUi.DoShowMessageInfoL( ); + } + +// --------------------------------------------------------- +// LaunchHelpL +// --------------------------------------------------------- +void CPostcardAddressForm::LaunchHelpL( ) + { + if( iDocument.MessageType( ) == EPostcardSent ) + { + iAppUi.LaunchHelpL( KPOSTCARD_HLP_ADDRESS_VIEW() ); + } + else + { + iAppUi.LaunchHelpL( KMMS_POSTCARD_HLP_ADDRESS_EDIT() ); + } + } + +// --------------------------------------------------------- +// CheckTextExceedingL +// --------------------------------------------------------- +void CPostcardAddressForm::CheckTextExceedingL( ) + { + if( iDocument.MessageType( ) == EPostcardSent ) + { // we are just viewing the fields so no reason to show warnings + return; + } + TInt focused = IdOfFocusControl( ); + CEikEdwin* edwin = static_cast< CEikEdwin* >(Control( focused ) ); + if ( !edwin ) + { // just in case + return; + } + TInt maxLength = edwin->MaxLength( ); + + if( edwin->TextLength( ) >= maxLength ) + { + TInt howMany = edwin->TextLength( ) - maxLength; + switch( howMany ) + { + case 0: + { + // No note shown anymore. + break; + } + case 1: + { + if( !( iAddrFlags & EPostcardAddressTextExceeded ) ) + { + iAppUi.ShowConfirmationQueryL( R_POSTCARD_ADDRESS_EXCEEDED, ETrue ); + } + break; + } + default: + { + if( !( iAddrFlags & EPostcardAddressTextExceeded ) ) + { + HBufC* warningString = + StringLoader::LoadLC( R_POSTCARD_ADDRESS_EXCEEDED_MANY, howMany, iCoeEnv ); + iAppUi.ShowConfirmationQueryL( *warningString, ETrue ); + CleanupStack::PopAndDestroy( warningString ); + } + break; + } + } + iAddrFlags |= EPostcardAddressTextExceeded; + } + else + { + iAddrFlags &= ~EPostcardAddressTextExceeded; + } + } + +// --------------------------------------------------------- +// DoAddRecipientL +// --------------------------------------------------------- +void CPostcardAddressForm::DoAddRecipientL( ) + { + if ( !iContact ) + { + iContact = CPostcardContact::NewL( iCoeEnv->FsSession() ); + } + iContact->FetchContactL(); + + if ( iContact->IsValid() ) + { + // Reset the flag, so that user is notified if selected recipient + // has too long address fields. + iAddrFlags &= ~EPostcardAddressTextExceeded; + + CPostcardRecipientWrapper* recWrapper = + CPostcardRecipientWrapper::NewL( iDocument, iAppUi, *iContact ); + CleanupStack::PushL( recWrapper ); + + // Location asking is done in recipientWrapper + CPostcardContact::TLocation location; + TBool hasLocation = recWrapper->AskLocationL( location ); + CleanupStack::PopAndDestroy( recWrapper ); + + if ( hasLocation ) + { + UpdateFieldsL( location ); + RefreshDisplay(); // Refresh the dislay + } + } + } + +// --------------------------------------------------------- +// UpdateFieldsL +// --------------------------------------------------------- +void CPostcardAddressForm::UpdateFieldsL( CContactItem& aContact ) + { + CContactItemFieldSet& fieldSet = aContact.CardFields(); + + for( TInt i = 0; i < fieldSet.Count( ); i++ ) + { + CContactItemField& field = fieldSet[ i ]; + if( field.StorageType( ) == KStorageTypeText ) + { + TInt destinationId = TPostcardUtils::IdFromContactItemName( field.Label( ) ); + CEikEdwin* edwin = static_cast< CEikEdwin* >(ControlOrNull( destinationId ) ); + if( edwin ) + { + HBufC* text = field.TextStorage()->Text().AllocLC( ); + edwin->SetTextL( text ); + edwin->SetCursorPosL( text->Length( ) - 1, EFalse ); + CleanupStack::PopAndDestroy( text ); + } + } + } + } + +// --------------------------------------------------------- +// UpdateFieldsL +// --------------------------------------------------------- +void CPostcardAddressForm::UpdateFieldsL( + CPostcardContact::TLocation aLocation ) + { + // Update address fields + for( TInt i = EPostcardAddressInfo; i <= EPostcardAddressCountry; i++ ) + { + CEikEdwin* edwin = static_cast( ControlOrNull( i ) ); + if ( edwin ) + { + HBufC* text = iContact->GetAddressFieldLC( aLocation, + CPostcardContact::ControlIdToAddrField( i ) ); + edwin->SetTextL(text->Length() ? text:NULL); + CleanupStack::PopAndDestroy( text ); // text + } + } + + // Update the name + CEikEdwin* edwin = + static_cast( ControlOrNull( EPostcardAddressName ) ); + if ( edwin ) + { + HBufC* contactName = iContact->GetNameLC(); + edwin->SetTextL( contactName->Length() ? contactName:NULL ); + CleanupStack::PopAndDestroy( contactName ); // contactName + } + } + +// --------------------------------------------------------- +// IsEmpty +// --------------------------------------------------------- +TBool CPostcardAddressForm::IsEmpty( ) + { + for(TInt loop = EPostcardAddressName; loop<=EPostcardAddressCountry; loop++ ) + { + CEikEdwin* edwin = static_cast< CEikEdwin* >(ControlOrNull( loop ) ); + if( edwin && edwin->TextLength( ) > 0 ) + { + return EFalse; + } + } + return ETrue; + } + +// --------------------------------------------------------- +// HandleControlEventL +// --------------------------------------------------------- +void CPostcardAddressForm::HandleControlEventL(CCoeControl* /*aControl*/,TCoeEvent aEventType) + { + if( aEventType == EEventStateChanged ) + { + + // Update middle softkey + SetMiddleSoftkeyL(); + } + } + +// --------------------------------------------------------- +// CleanNavipane +// --------------------------------------------------------- +void CPostcardAddressForm::CleanNavipane() + { + // Clean navigation pane, otherwise it can contain e.g. + // character counter from greeting text editor, when user + // tries to send a postcard without recipient's address. + MAknEditingStateIndicator* editIndi = + static_cast< CAknEnv* >( iEikonEnv->Extension( ) )->EditingStateIndicator(); + if( editIndi ) + { + CAknIndicatorContainer* indiContainer = editIndi->IndicatorContainer( ); + if ( indiContainer ) + { + indiContainer->SetIndicatorState( + TUid::Uid( EAknNaviPaneEditorIndicatorMessageLength ), + EAknIndicatorStateOff ); + } + } + } + + +// --------------------------------------------------------- +// RefreshDisplay +// --------------------------------------------------------- +void CPostcardAddressForm::RefreshDisplay( ) + { + for(TInt loop = EPostcardAddressName; loop<=EPostcardAddressCountry; loop++ ) + { + CEikEdwin* edwin = static_cast< CEikEdwin* >(ControlOrNull( loop ) ); + if( edwin ) + { + if( edwin->IsVisible( ) ) + { + edwin->DrawNow(); + } + } + } + } + +// --------------------------------------------------------- +// SetMiddleSoftkeyL +// --------------------------------------------------------- +void CPostcardAddressForm::SetMiddleSoftkeyL() + { + TInt resourceId = R_POSTCARD_MSK_BUTTON_EMPTY; + + // Applying changes of the cr 403-1527 always from 5.0 onwards + if ( iDocument.MessageType( ) != EPostcardSent ) + { + if( IsEmpty() ) + { + resourceId = R_POSTCARD_MSK_BUTTON_ADD; + } + else if( !IsEmpty() && IdOfFocusControl() == EPostcardAddressName ) + { + resourceId = R_POSTCARD_MSK_BUTTON_REPLACE; + } + } + + if ( resourceId != iMskResource) + { + const TInt KMskPosition = 3; + CEikButtonGroupContainer& cba = ButtonGroupContainer(); + cba.SetCommandL( KMskPosition, resourceId ); + cba.DrawDeferred(); + iMskResource = resourceId; + } + } + +// End of File