phonebookui/Phonebook2/MapExtension/src/cpmapcmd.cpp
branchRCL_3
changeset 5 81f8547efd4f
parent 0 e686773b3f54
child 9 0d28c1c5b6dd
--- a/phonebookui/Phonebook2/MapExtension/src/cpmapcmd.cpp	Fri Feb 19 22:40:27 2010 +0200
+++ b/phonebookui/Phonebook2/MapExtension/src/cpmapcmd.cpp	Fri Mar 12 15:41:25 2010 +0200
@@ -570,33 +570,220 @@
 // CPmapCmd::EditorShowMapL
 // --------------------------------------------------------------------------
 //
-void CPmapCmd::EditorShowOnMapsL(TVPbkFieldTypeParameter aAddressType)
-	{
+void CPmapCmd::EditorShowOnMapsL( TVPbkFieldTypeParameter aAddressType )
+    {
     CMnMapView* mapview = CMnMapView::NewL( *iMapViewProvider );
-	CleanupStack::PushL( mapview );
-	        	        
-	RPointerArray<CPosLandmark> landmarks;
-	CleanupClosePushL( landmarks );
-	
-	CPosLandmark* landmark = CPosLandmark::NewL();
-	CleanupStack::PushL( landmark );
-	
-	if ( !FillGeoLandmarkL( *landmark, aAddressType ) )
-		{
-		FillLandmarkL( *landmark, aAddressType );
-		}
-	TLocality locality;
-	if( landmark->NumOfAvailablePositionFields() > 0 || landmark->GetPosition( locality ) == KErrNone )
-		{
-		landmarks.AppendL( landmark );
-		mapview->AddLandmarksToShowL( landmarks );
-		}
-	mapview->ShowMapL();
+    CleanupStack::PushL( mapview );
+
+    RPointerArray<CPosLandmark> landmarks;
+    CleanupClosePushL( landmarks );
+
+    CPosLandmark* landmark = CPosLandmark::NewL();
+    CleanupStack::PushL( landmark );
+
+    if ( !FillGeoLandmarkL( *landmark, aAddressType ) )
+        {
+        FillLandmarkL( *landmark, aAddressType );
+        }
+    TLocality locality;
+    if ( landmark->NumOfAvailablePositionFields() > 0
+        || landmark->GetPosition( locality ) == KErrNone )
+        {
+        landmarks.AppendL( landmark );
+        mapview->AddLandmarksToShowL( landmarks );
+        }
+
+    if ( landmark->GetPosition( locality ) == KErrNone )
+        {
+        mapview->ShowMapL();
+        CleanupStack::PopAndDestroy( landmark );
+        CleanupStack::PopAndDestroy( &landmarks );
+        CleanupStack::PopAndDestroy( mapview );
+        }
+    else
+        {
+        TRequestStatus status;
+        mapview->SelectFromMapL( status );
+        User::WaitForRequest( status );
+        TBool update = EFalse;
+        TBool geocoordsExist = EFalse;
+
+        CPosLandmark* result = NULL;
+        if ( status.Int() == KErrNone )
+            {
+            result = mapview->RetrieveSelectionResultL();
+            if ( result->GetPosition( locality ) == KErrNone )
+                {
+                geocoordsExist = ETrue;
+                }
+            if ( result->IsPositionFieldAvailable( EPositionFieldStreet )
+                || result->IsPositionFieldAvailable( EPositionFieldCity )
+                || result->IsPositionFieldAvailable( EPositionFieldCountry ) )
+                {
+                update = ETrue;
+                }
+
+            }
+        CleanupStack::PopAndDestroy( landmark );
+        CleanupStack::PopAndDestroy( &landmarks );
+        CleanupStack::PopAndDestroy( mapview );
+        if ( result )
+            {
+            CleanupStack::PushL( result );
+            }
+
+        if ( update )
+            {
+
+            const TInt KGranularity = 4;
+            CDesCArrayFlat* arrFields = new (ELeave) CDesCArrayFlat(
+                KGranularity );
+            CleanupStack::PushL( arrFields );
+            HBufC* addrLebel = NULL;
+
+            switch ( aAddressType )
+                {
+                case EVPbkVersitParamPREF:
+                    addrLebel = StringLoader::LoadLC(
+                        R_QTN_PHOB_HEADER_ADDRESS );
+                    break;
+                case EVPbkVersitParamHOME:
+                    addrLebel = StringLoader::LoadLC(
+                        R_QTN_PHOB_HEADER_ADDRESS_HOME );
+                    break;
+                case EVPbkVersitParamWORK:
+                    addrLebel = StringLoader::LoadLC(
+                        R_QTN_PHOB_HEADER_ADDRESS_WORK );
+                    break;
+                default:
+                    User::Leave( KErrArgument );
+                }
+            arrFields->AppendL( addrLebel->Des() );
+            _LIT(KComma, ",");
+            _LIT(KSpace, " ");
+            TInt lenght = 0;
+            TPtrC street;
+            if ( result->IsPositionFieldAvailable( EPositionFieldStreet ) )
+                {
+                result->GetPositionField( EPositionFieldStreet, street );
+                lenght += street.Length();
+                }
 
-	CleanupStack::PopAndDestroy( landmark );
-	CleanupStack::PopAndDestroy( &landmarks );
-	CleanupStack::PopAndDestroy( mapview );
-	}
+            TPtrC city;
+            if ( result->IsPositionFieldAvailable( EPositionFieldCity ) )
+                {
+                result->GetPositionField( EPositionFieldCity, city );
+                if ( lenght )
+                    {
+                    lenght += KComma().Length() + KSpace().Length();
+                    }
+                lenght += city.Length();
+                }
+
+            TPtrC country;
+            if ( result->IsPositionFieldAvailable( EPositionFieldCountry ) )
+                {
+                result->GetPositionField( EPositionFieldCountry, country );
+                if ( lenght )
+                    {
+                    lenght += KComma().Length() + KSpace().Length();
+                    }
+                lenght += country.Length();
+                }
+
+            RBuf newAddr;
+            newAddr.CreateL( lenght );
+            CleanupClosePushL( newAddr );
+
+            if ( street.Length() )
+                {
+                newAddr += street;
+                }
+
+            if ( city.Length() )
+                {
+                if ( newAddr.Length() > 0 )
+                    {
+                    newAddr += KComma();
+                    newAddr += KSpace();
+                    }
+                newAddr += city;
+                }
+
+            if ( country.Length() )
+                {
+                if ( newAddr.Length() > 0 )
+                    {
+                    newAddr += KComma();
+                    newAddr += KSpace();
+                    }
+                newAddr += country;
+                }
+
+            arrFields->AppendL( newAddr );
+            HBufC* prompt = StringLoader::LoadLC(
+                R_QTN_PHOB_CONFIRM_CHANGE_ADDRESS, *arrFields );
+            CAknQueryDialog* dlg = CAknQueryDialog::NewL();
+            if ( !dlg->ExecuteLD( R_PBK2_GENERAL_CONFIRMATION_QUERY, *prompt ) )
+                {
+                update = EFalse;
+                }
+            CleanupStack::PopAndDestroy( prompt );
+            CleanupStack::PopAndDestroy( &newAddr );
+            CleanupStack::PopAndDestroy( addrLebel );
+            CleanupStack::PopAndDestroy( arrFields );
+
+            }
+        if ( update )
+            {
+            if ( !iEditorControl )
+                {
+                iContact->LockL( *this );
+                CActiveScheduler::Start();
+                }
+            UpdateFieldL( *result, EPositionFieldCountry,
+                EVPbkVersitSubFieldCountry, aAddressType );
+            UpdateFieldL( *result, EPositionFieldCity,
+                EVPbkVersitSubFieldLocality, aAddressType );
+            UpdateFieldL( *result, EPositionFieldStreet,
+                EVPbkVersitSubFieldStreet, aAddressType );
+            UpdateFieldL( *result, EPositionFieldPostalCode,
+                EVPbkVersitSubFieldPostalCode, aAddressType );
+            UpdateFieldL( *result, EPositionFieldLocality,
+                EVPbkVersitSubFieldRegion, aAddressType );
+            UpdateFieldL( *result, EPositionFieldNone,
+                EVPbkVersitSubFieldPostOfficeAddress, aAddressType );
+            UpdateFieldL( *result, EPositionFieldNone,
+                EVPbkVersitSubFieldExtendedAddress, aAddressType );
+
+            if ( geocoordsExist )
+                {
+                UpdateCoordsL( locality, aAddressType );
+                }
+            if ( !iEditorControl )
+                {
+                iContact->CommitL( *this );
+                CActiveScheduler::Start();
+                }
+            if ( ControlExtension() )
+                {
+                ControlExtension()->UpdateControlsL();
+                }
+
+            HBufC* text = StringLoader::LoadLC(
+                R_QTN_PHOB_NOTE_ADDRESS_UPDATED );
+            CAknInformationNote* note = new (ELeave) CAknInformationNote(
+                ETrue );
+            note->ExecuteLD( *text );
+            CleanupStack::PopAndDestroy( text );
+            }
+
+        if ( result )
+            {
+            CleanupStack::PopAndDestroy( result );
+            }
+        }
+    }
 
 // --------------------------------------------------------------------------
 // CPmapCmd::FillLandmarkL