--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/locationlandmarksrefappfors60/Src/LandmarksEditDialog.cpp Wed Sep 01 12:31:27 2010 +0100
@@ -0,0 +1,1081 @@
+/*
+* Copyright (c) 2004-2007 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: Implements the CLandmarksEditDialog class
+*
+*/
+
+
+#include <eikmenub.h>
+#include <akntitle.h>
+#include <aknnotewrappers.h>
+#include <aknappui.h>
+#include <e32math.h>
+#include <eikcapc.h>
+#include <aknselectionlist.h>
+#include <aknlocationed.h>
+#include <AknWaitDialog.h>
+#include <avkon.rsg>
+
+#include <lbsposition.h>
+#include <lbspositioninfo.h>
+
+#include <EPos_CPosLandmark.h>
+#include <EPos_CPosLandmarkCategory.h>
+
+#include "LmRefApp.hrh"
+#include <lmrefapp.rsg>
+
+#include "LandmarksUtils.h"
+#include "LandmarksCommonData.h"
+#include "LandmarksEditDialog.h"
+#include "LandmarksCategoriesDialog.h"
+#include "LandmarksPositionRequest.h"
+#include "LandmarksApplicationEngine.h"
+#include "LandmarksAppUi.h"
+#include "LandmarksLmCategoriesModel.h"
+
+// ============================ LOCAL FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// Gets value from EDWIN and puts to cleanup stack
+// @param aEdwin must be EDWIN control
+// -----------------------------------------------------------------------------
+//
+HBufC* FetchTextLC( CCoeControl* aEdwin )
+ {
+ CEikEdwin* editor = static_cast <CEikEdwin*> ( aEdwin );
+ HBufC* text = editor->GetTextInHBufL();
+ if ( text )
+ {
+ CleanupStack::PushL( text );
+ }
+ else
+ {
+ // create empty text
+ text = HBufC::NewLC( 0 );
+ }
+ return text;
+ }
+
+// -----------------------------------------------------------------------------
+// Retrieves a long float from am EDWIN editor.
+// @param aDouble double float that is retrieved from editor.
+// @param aEdwin must be EDWIN control
+// @return ETrue if successful, EFalse otherwise
+// -----------------------------------------------------------------------------
+//
+TBool FetchDoubleL( TReal& aDouble, CCoeControl* aEdwin )
+ {
+ TBool success = EFalse;
+ TLocale locale;
+
+ HBufC* text = FetchTextLC( aEdwin );
+
+ if ( text->Length() )
+ {
+ // Try to extract value
+ TLex fieldLex( *text );
+ success = ( KErrNone == fieldLex.Val( aDouble, locale.DecimalSeparator() ) );
+ }
+ else
+ {
+ // User has indicated that he/she wants this value to be undefined.
+ TRealX nan;
+ nan.SetNaN();
+ aDouble = nan;
+ success = ETrue;
+ }
+
+ CleanupStack::PopAndDestroy( text );
+ return success;
+ }
+
+// -----------------------------------------------------------------------------
+// Retrieves a float from am EDWIN editor.
+// @param aFloat float that is retrieved from editor.
+// @param aEdwin must be EDWIN control
+// @return ETrue if successful, EFalse otherwise
+// -----------------------------------------------------------------------------
+//
+TBool FetchFloatL( TReal32& aFloat, CCoeControl* aEdwin )
+ {
+ TBool success = EFalse;
+ TLocale locale;
+
+ HBufC* text = FetchTextLC( aEdwin );
+
+ if ( text->Length() )
+ {
+ // Try to extract value
+ TLex fieldLex( *text );
+ success = ( KErrNone == fieldLex.Val( aFloat, locale.DecimalSeparator() ) );
+ }
+ else
+ {
+ // User has indicated that he/she wants this value to be undefined.
+ TRealX nan;
+ nan.SetNaN();
+ aFloat = nan;
+ success = ETrue;
+ }
+
+ CleanupStack::PopAndDestroy( text );
+ return success;
+ }
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+CLandmarksEditDialog::CLandmarksEditDialog(
+ CPosLandmark& aLandmark,
+ TBool aUseCurrentLocation,
+ TBool& aEdited,
+ CLandmarksApplicationEngine& aEngine,
+ TInt aInitialFocusFieldId )
+: iOriginalLandmark( aLandmark ),
+ iUseCurrentLocation( aUseCurrentLocation ),
+ iEdited( aEdited ),
+ iEngine( aEngine ),
+ iInitialFocusFieldId( aInitialFocusFieldId )
+ {
+ iEdited = EFalse;
+
+ // Configure real format
+ const TChar KDecimalChar = '.';
+ iRealFormat.iPlaces = KNrOfDecimals;
+ iRealFormat.iPoint = KDecimalChar;
+ iRealFormat.iTriLen = 0;
+ iRealFormat.iWidth = KPosLmMaxTextFieldLength;
+ iRealFormat.iType = KRealFormatFixed;
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CLandmarksEditDialog::ConstructL()
+ {
+ CAknForm::ConstructL( R_LMREFAPP_EDIT_MENU_BAR );
+
+ // Save original title
+ CEikStatusPane* statusPane = iAvkonAppUi->StatusPane();
+ iTitlePane = ( CAknTitlePane* ) statusPane->ControlL(
+ TUid::Uid( EEikStatusPaneUidTitle ) );
+ iOriginalTitle = iTitlePane->Text()->AllocL();
+
+ // Copy data of original landmark
+ iLandmark = CPosLandmark::NewL( iOriginalLandmark );
+
+ // Create iPositionRequest
+ HBufC* appName = iCoeEnv->AllocReadResourceAsDes16LC( R_LMREFAPP_APP_TITLE );
+ iPositionRequest = CLandmarksPositionRequest::NewL( *appName, this );
+ CleanupStack::PopAndDestroy( appName );
+
+ // Initialize iCategoryIds
+ iLandmark->GetCategoriesL( iCategoryIds );
+
+ iLmCategoriesModel =
+ CLandmarksLmCategoriesModel::NewL( iEngine, iCategoryIds );
+
+ // Initialise states of real value editors
+ for ( TInt i = ELatitudeEditor; i <= ERadiusEditor; i++ )
+ {
+ User::LeaveIfError( iIsRealValueEdited.Append( EFalse ) );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+CLandmarksEditDialog* CLandmarksEditDialog::NewLC(
+ CPosLandmark& aLandmark,
+ TBool aUseCurrentLocation,
+ TBool& aEdited,
+ CLandmarksApplicationEngine& aEngine,
+ TInt aInitialFocusFieldId )
+ {
+ CLandmarksEditDialog* self = new ( ELeave ) CLandmarksEditDialog(
+ aLandmark, aUseCurrentLocation, aEdited, aEngine, aInitialFocusFieldId );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+CLandmarksEditDialog::~CLandmarksEditDialog()
+ {
+ CloseWaitDialog();
+
+ delete iLandmark;
+ delete iAppName;
+ delete iPositionRequest;
+ iCategoryIds.Close();
+ iIsRealValueEdited.Close();
+ delete iLmCategoriesModel;
+
+ // Restore title pane. Ownership of iTitlePane transferred.
+ if ( iTitlePane && iOriginalTitle )
+ {
+ iTitlePane->SetText( iOriginalTitle );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CLandmarksEditDialog::DynInitMenuPaneL(
+ TInt aResourceId,
+ CEikMenuPane* aMenuPane )
+ {
+ CAknForm::DynInitMenuPaneL( aResourceId, aMenuPane );
+
+ if ( aResourceId == R_AVKON_FORM_MENUPANE )
+ {
+ // We do not want to allow the user to modify our Form therefore
+ // Disable the Label, Add, Delete, and Save Field
+ aMenuPane->SetItemDimmed( EAknFormCmdLabel, ETrue );
+ aMenuPane->SetItemDimmed( EAknFormCmdAdd, ETrue );
+ aMenuPane->SetItemDimmed( EAknFormCmdDelete, ETrue );
+ aMenuPane->SetItemDimmed( EAknFormCmdSave, ETrue );
+
+ aMenuPane->SetItemDimmed( ELandmarksUpdateToCurrentLocation,
+ Control( ELandmarkCategoryField )->IsFocused() );
+ aMenuPane->SetItemDimmed( ELandmarksEditCategories,
+ !Control( ELandmarkCategoryField )->IsFocused() );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CLandmarksEditDialog::ProcessCommandL( TInt aCommandId )
+ {
+ CAknForm::ProcessCommandL( aCommandId );
+
+ switch ( aCommandId )
+ {
+ case ELandmarksUpdateToCurrentLocation:
+ UpdateToCurrentLocationL();
+ break;
+
+ case ELandmarksResetCoordinates:
+ ResetCoordinatesL();
+ break;
+
+ case ELandmarksEditCategories:
+ EditCategoriesL();
+ break;
+
+ default:
+ break;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CLandmarksEditDialog::NotifyOperationProgressL(
+ TOperation aOperation,
+ TInt /*aProgress*/,
+ TInt aErrorCode )
+ {
+ if ( aErrorCode == KErrNone &&
+ aOperation == EAcquiringLocation )
+ {
+ // Update location fields with new location
+ TPosition position;
+ iPositionInfo.GetPosition( position );
+ ConfigureLocationFieldsL( position );
+ SetChangesPending( ETrue );
+
+ // Indicate that editors have been updated
+ for ( TInt i = ELatitudeEditor; i <= EVerticalAccEditor; i++ )
+ {
+ iIsRealValueEdited[i] = ETrue;
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+TBool CLandmarksEditDialog::OkToExitL( TInt aButtonId )
+ {
+ if ( aButtonId == EAknSoftkeyDone )
+ {
+ // exit from CAknForm's "edit" mode
+ return CAknForm::OkToExitL( EAknSoftkeyBack );
+ }
+ else
+ {
+ return CAknForm::OkToExitL( aButtonId );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CLandmarksEditDialog::PreLayoutDynInitL()
+ {
+ SetEditableL( ETrue );
+ ConfigureFieldsL();
+ ConfigureCategoryFieldL();
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CLandmarksEditDialog::PostLayoutDynInitL()
+ {
+ SetChangesPending( ETrue );
+
+ UpdateTitleBarL();
+ CAknForm::PostLayoutDynInitL();
+
+ if ( iUseCurrentLocation )
+ {
+ UpdateToCurrentLocationL();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CLandmarksEditDialog::SetInitialCurrentLine()
+ {
+ CAknForm::SetInitialCurrentLine();
+
+ if ( iInitialFocusFieldId >= ELandmarkNameField &&
+ iInitialFocusFieldId <= ELandmarkCountryField )
+ {
+ TInt err = KErrNone;
+ TRAP( err, TryChangeFocusToL( iInitialFocusFieldId ) );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CLandmarksEditDialog::HandleControlEventL(
+ CCoeControl* aControl,
+ TCoeEvent aEventType )
+ {
+ CAknForm::HandleControlEventL( aControl, aEventType );
+
+ if ( aEventType == EEventStateChanged )
+ {
+ if ( aControl == ControlOrNull( ELandmarkLatitudeField ) )
+ {
+ iIsRealValueEdited[ELatitudeEditor] = ETrue;
+ }
+ else if ( aControl == ControlOrNull( ELandmarkLongitudeField ) )
+ {
+ iIsRealValueEdited[ELongitudeEditor] = ETrue;
+ }
+ else if ( aControl == ControlOrNull( ELandmarkAltitudeField ) )
+ {
+ iIsRealValueEdited[EAltitudeEditor] = ETrue;
+ }
+ else if ( aControl == ControlOrNull( ELandmarkHorAccField ) )
+ {
+ iIsRealValueEdited[EHorizontalAccEditor] = ETrue;
+ }
+ else if ( aControl == ControlOrNull( ELandmarkVerAccField ) )
+ {
+ iIsRealValueEdited[EVerticalAccEditor] = ETrue;
+ }
+ else if ( aControl == ControlOrNull( ELandmarkRadiusField ) )
+ {
+ iIsRealValueEdited[ERadiusEditor] = ETrue;
+ }
+ else if ( aControl == ControlOrNull( ELandmarkNameField ) )
+ {
+ UpdateTitleBarL( ETrue ); // get it from name field
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CLandmarksEditDialog::HandleResourceChange( TInt aType )
+ {
+ if ( aType == KEikDynamicLayoutVariantSwitch )
+ {
+ CAknForm::HandleResourceChange( aType );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+TBool CLandmarksEditDialog::SaveFormDataL()
+ {
+ TErrorInForm error = FetchAndSaveFormDataL();
+ if ( error )
+ {
+ ProcessErrorsInFormL( error );
+ // Leave to interrupt saving of data. Other error codes than KErrNone
+ // result in an additional error dialog.
+ User::Leave( KErrNone );
+ }
+ else
+ {
+ // input is valid, save everything to original landmark
+ TPtrC text;
+
+ iLandmark->GetLandmarkName( text );
+ iOriginalLandmark.SetLandmarkNameL( text );
+
+ iLandmark->GetLandmarkDescription( text );
+ iOriginalLandmark.SetLandmarkDescriptionL( text );
+
+ iOriginalLandmark.RemoveLandmarkAttributes( CPosLandmark::ECategoryInfo );
+ for ( TInt i = 0; i < iCategoryIds.Count(); i++ )
+ {
+ iOriginalLandmark.AddCategoryL( iCategoryIds[i] );
+ }
+
+ CopyCoordinateDataL( *iLandmark, iOriginalLandmark );
+ CopyAddressDataL( *iLandmark, iOriginalLandmark );
+ }
+
+ iEdited = ETrue;
+ return ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+CLandmarksEditDialog::TErrorInForm CLandmarksEditDialog::FetchAndSaveFormDataL()
+ {
+ HBufC* text = NULL;
+
+ // name
+ text = FetchTextLC( Control( ELandmarkNameField ) );
+ if ( text->Length() )
+ {
+ iLandmark->SetLandmarkNameL( *text );
+ }
+ else
+ {
+ return EEmptyLandmarkName;
+ }
+ CleanupStack::PopAndDestroy( text );
+
+ // description
+ text = FetchTextLC( Control( ELandmarkDescField ) );
+ iLandmark->SetLandmarkDescriptionL( *text );
+ CleanupStack::PopAndDestroy( text );
+
+ // categories
+ iLandmark->RemoveLandmarkAttributes( CPosLandmark::ECategoryInfo );
+ for ( TInt i = 0; i < iCategoryIds.Count(); i++ )
+ {
+ iLandmark->AddCategoryL( iCategoryIds[i] );
+ }
+
+ // Address fields
+ SaveAddressDataL();
+
+ // coordinate fields
+ TErrorInForm error = SaveCoordinateDataL();
+ if ( error )
+ {
+ return error;
+ }
+
+ return ENoErrors;
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CLandmarksEditDialog::SaveAddressDataL()
+ {
+ HBufC* text = NULL;
+
+ iLandmark->RemovePositionField( EPositionFieldStreet );
+ iLandmark->RemovePositionField( EPositionFieldPostalCode );
+ iLandmark->RemovePositionField( EPositionFieldCity );
+ iLandmark->RemovePositionField( EPositionFieldCountry );
+
+ // street
+ text = FetchTextLC( Control( ELandmarkStreetField ) );
+ if ( text->Length() )
+ {
+ iLandmark->SetPositionFieldL( EPositionFieldStreet, *text );
+ }
+ CleanupStack::PopAndDestroy( text );
+
+ // postal code
+ text = FetchTextLC( Control( ELandmarkPostalField ) );
+ if ( text->Length() )
+ {
+ iLandmark->SetPositionFieldL( EPositionFieldPostalCode, *text );
+ }
+ CleanupStack::PopAndDestroy( text );
+
+ // city
+ text = FetchTextLC( Control( ELandmarkCityField ) );
+ if ( text->Length() )
+ {
+ iLandmark->SetPositionFieldL( EPositionFieldCity, *text );
+ }
+ CleanupStack::PopAndDestroy( text );
+
+ // country
+ text = FetchTextLC( Control( ELandmarkCountryField ) );
+ if ( text->Length() )
+ {
+ iLandmark->SetPositionFieldL( EPositionFieldCountry, *text );
+ }
+ CleanupStack::PopAndDestroy( text );
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+CLandmarksEditDialog::TErrorInForm CLandmarksEditDialog::SaveCoordinateDataL()
+ {
+ TLocality existingLocation;
+ TBool locationExists = ( iLandmark->GetPosition( existingLocation ) == KErrNone );
+
+ TReal latitude = existingLocation.Latitude();
+ TReal longitude = existingLocation.Longitude();
+ TReal32 altitude = existingLocation.Altitude();
+ TReal32 horAcc = existingLocation.HorizontalAccuracy();
+ TReal32 verAcc = existingLocation.VerticalAccuracy();
+
+ TPosition tempPos;
+
+ // latitude
+ if ( iIsRealValueEdited[ELatitudeEditor] || !locationExists )
+ {
+ CAknLocationEditor* editor = static_cast<CAknLocationEditor*>( Control ( ELandmarkLatitudeField ) );
+ editor->Get( tempPos );
+ latitude = tempPos.Latitude();
+ }
+
+ // longitude
+ if ( iIsRealValueEdited[ELongitudeEditor] || !locationExists )
+ {
+ CAknLocationEditor* editor = static_cast<CAknLocationEditor*>( Control ( ELandmarkLongitudeField ) );
+ editor->Get( tempPos );
+ longitude = tempPos.Longitude();
+ }
+
+ // altitude
+ if ( iIsRealValueEdited[EAltitudeEditor] || !locationExists )
+ {
+ if ( !FetchFloatL( altitude, Control( ELandmarkAltitudeField ) ) )
+ {
+ return EWrongAltitude;
+ }
+ }
+
+ // horizontal accuracy
+ if ( iIsRealValueEdited[EHorizontalAccEditor] || !locationExists )
+ {
+ if ( !FetchFloatL( horAcc, Control( ELandmarkHorAccField ) ) )
+ {
+ return EWrongHorAcc;
+ }
+ }
+
+ // vertical accuracy
+ if ( iIsRealValueEdited[EVerticalAccEditor] || !locationExists )
+ {
+ if ( !FetchFloatL( verAcc, Control( ELandmarkVerAccField ) ) )
+ {
+ return EWrongVerAcc;
+ }
+ }
+
+ // Update location. There are some rules specified by TLocality and
+ // TCoordinate how to update a location. These rules are taken into
+ // account below when validating the location data.
+ if ( Math::IsNaN( latitude ) && Math::IsNaN( longitude ) )
+ {
+ // If lat long are undefined, then alt and hAcc
+ // must be undefined
+ if ( !Math::IsNaN( horAcc ) )
+ {
+ return ENoLatLonButHorAcc;
+ }
+ else if ( !Math::IsNaN( altitude ) )
+ {
+ return ENoLatLonButAltitude;
+ }
+ else if ( !Math::IsNaN( verAcc ) )
+ {
+ return ENoAltButVerAcc;
+ }
+ else
+ {
+ // None position fields are set, Remove position info.
+ iLandmark->RemoveLandmarkAttributes( CPosLandmark::EPosition );
+ }
+ }
+ else if ( !Math::IsNaN( latitude ) && !Math::IsNaN( longitude ) )
+ {
+ if ( !Math::IsNaN( horAcc ) && horAcc < 0 )
+ {
+ // If lat long are defined, hAcc must be positive if defined
+ return EWrongHorAcc;
+ }
+ else if ( Math::IsNaN( altitude ) && !Math::IsNaN( verAcc ) )
+ {
+ // if altitude is undefined, then vertical accuracy
+ // must be undefined
+ return ENoAltButVerAcc;
+ }
+ else if ( !Math::IsNaN( verAcc ) && verAcc < 0 )
+ {
+ // vertical accuracy must be positive if defined
+ return EWrongVerAcc;
+ }
+ else
+ {
+ // It is allowed to set the new locality
+ TCoordinate coordinate( latitude, longitude, altitude );
+ TLocality newLocation( coordinate, horAcc, verAcc );
+ iLandmark->SetPositionL( newLocation );
+ }
+ }
+ else
+ {
+ // Inform user that no valid lat/long has been entered
+ return EOnlyLatOrLon;
+ }
+
+ // coverage radius
+ TReal32 radius;
+ TInt radiusExists = ( iLandmark->GetCoverageRadius( radius ) == KErrNone );
+ if ( iIsRealValueEdited[ERadiusEditor] || !radiusExists )
+ {
+ if ( !FetchFloatL( radius, Control( ELandmarkRadiusField ) ) )
+ {
+ return EWrongRadius;
+ }
+ }
+ if ( !Math::IsNaN( radius ) && radius < 0 )
+ {
+ return EWrongRadius;
+ }
+ iLandmark->SetCoverageRadius( radius );
+
+ return ENoErrors;
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CLandmarksEditDialog::ConfigureFieldsL()
+ {
+ TPtrC textFieldValue;
+
+ // Configure landmark name
+ textFieldValue.Set( KNullDesC );
+ iLandmark->GetLandmarkName( textFieldValue );
+
+ SetTextFieldL( ELandmarkNameField, textFieldValue );
+
+ // Configure description
+ textFieldValue.Set( KNullDesC );
+ iLandmark->GetLandmarkDescription( textFieldValue );
+
+ SetTextFieldL( ELandmarkDescField, textFieldValue );
+
+ // all address fields
+ ConfigureAddressFieldsL();
+
+ // Configure location fields
+ TLocality location;
+ iLandmark->GetPosition( location );
+ ConfigureLocationFieldsL( location );
+
+ // Configure coverage Radius
+ TReal32 coverageRadius;
+ TBuf<KPosLmMaxTextFieldLength> radiusBuf;
+ TInt res = iLandmark->GetCoverageRadius( coverageRadius );
+ if ( res != KErrNotFound )
+ {
+ radiusBuf.AppendNum( coverageRadius, iRealFormat );
+ }
+
+ SetTextFieldL( ELandmarkRadiusField, radiusBuf );
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CLandmarksEditDialog::ConfigureAddressFieldsL()
+ {
+ TPtrC textFieldValue;
+
+ // street
+ textFieldValue.Set( KNullDesC );
+ iLandmark->GetPositionField( EPositionFieldStreet, textFieldValue );
+
+ SetTextFieldL( ELandmarkStreetField, textFieldValue );
+
+ // postalCode
+ textFieldValue.Set( KNullDesC );
+ iLandmark->GetPositionField( EPositionFieldPostalCode, textFieldValue );
+
+ SetTextFieldL( ELandmarkPostalField, textFieldValue );
+
+ // city
+ textFieldValue.Set( KNullDesC );
+ iLandmark->GetPositionField( EPositionFieldCity, textFieldValue );
+
+ SetTextFieldL( ELandmarkCityField, textFieldValue );
+
+ // country
+ textFieldValue.Set( KNullDesC );
+ iLandmark->GetPositionField( EPositionFieldCountry, textFieldValue );
+
+ SetTextFieldL( ELandmarkCountryField, textFieldValue );
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CLandmarksEditDialog::ConfigureLocationFieldsL( TLocality& aLocation )
+ {
+ TBuf<KPosLmMaxTextFieldLength> textFieldValue;
+
+ TPosition pos( aLocation, TTime(0) );
+ // Configure latitude in float format
+ SetLocationFieldL( ELandmarkLatitudeField, pos );
+
+ // Configure longitude in float format
+ SetLocationFieldL( ELandmarkLongitudeField, pos );
+
+ // Configure altitude
+ LandmarksUtils::FloatToDes( aLocation.Altitude(), textFieldValue, iRealFormat );
+ SetTextFieldL( ELandmarkAltitudeField, textFieldValue );
+
+ // Configure horizontal accuracy
+ LandmarksUtils::FloatToDes( aLocation.HorizontalAccuracy(), textFieldValue, iRealFormat );
+ SetTextFieldL( ELandmarkHorAccField, textFieldValue );
+
+ // Configure vertical accuracy
+ LandmarksUtils::FloatToDes( aLocation.VerticalAccuracy(), textFieldValue, iRealFormat );
+ SetTextFieldL( ELandmarkVerAccField, textFieldValue );
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CLandmarksEditDialog::ConfigureCategoryFieldL()
+ {
+ TInt nrOfCategories = iCategoryIds.Count();
+ const TInt KExtraChars = 2; // CRLF
+
+ HBufC* lmCategoriesBuf = HBufC::NewLC(
+ ( KPosLmMaxTextFieldLength + KExtraChars ) * nrOfCategories );
+
+ TPtr lmCategories = lmCategoriesBuf->Des();
+ for ( TInt i = 0; i < nrOfCategories; i++ )
+ {
+ if ( i > 0 )
+ {
+ lmCategories.Append( CEditableText::ELineBreak );
+ }
+
+ CPosLandmarkCategory* category = iEngine.CategoryLC( iCategoryIds[i] );
+ TPtrC categoryName;
+ category->GetCategoryName( categoryName );
+ lmCategories.Append( categoryName );
+ CleanupStack::PopAndDestroy( category );
+ }
+
+ SetTextFieldL( ELandmarkCategoryField, *lmCategoriesBuf );
+
+ CleanupStack::PopAndDestroy( lmCategoriesBuf );
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CLandmarksEditDialog::SetTextFieldL( TInt aId, const TDesC& aText )
+ {
+ CEikEdwin* editor = static_cast<CEikEdwin*>( Control( aId ) );
+ editor->SetTextL( &aText );
+ editor->DrawDeferred();
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CLandmarksEditDialog::SetLocationFieldL( TInt aId, const TPosition& aPosition )
+ {
+ CAknLocationEditor* editor = static_cast<CAknLocationEditor*>( Control( aId ) );
+ editor->Set( aPosition );
+ editor->DrawDeferred();
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CLandmarksEditDialog::UpdateTitleBarL( TBool aFromField )
+ {
+ if ( aFromField )
+ {
+ TBuf<KPosLmMaxTextFieldLength> name;
+
+ CEikEdwin* nameEditor =
+ static_cast<CEikEdwin*>( Control( ELandmarkNameField ) );
+ nameEditor->GetText( name );
+ iTitlePane->SetTextL( name );
+ }
+ else
+ {
+ TPtrC ptr;
+ iLandmark->GetLandmarkName( ptr );
+ iTitlePane->SetTextL( ptr );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CLandmarksEditDialog::ProcessErrorsInFormL(
+ CLandmarksEditDialog::TErrorInForm aErrorId )
+ {
+ switch ( aErrorId )
+ {
+ case ENoErrors:
+ break;
+ case EWrongLatitude:
+ NotifyErrorToUserL( R_LMREFAPP_LATITUDE_ERROR );
+ break;
+ case EWrongLongitude:
+ NotifyErrorToUserL( R_LMREFAPP_LONGITUDE_ERROR );
+ break;
+ case EWrongAltitude:
+ NotifyErrorToUserL( R_LMREFAPP_ALTITUDE_ERROR );
+ break;
+ case EWrongHorAcc:
+ NotifyErrorToUserL( R_LMREFAPP_HOR_ACC_ERROR );
+ break;
+ case EWrongVerAcc:
+ NotifyErrorToUserL( R_LMREFAPP_VER_ACC_ERROR );
+ break;
+ case EWrongRadius:
+ NotifyErrorToUserL( R_LMREFAPP_RADIUS_ERROR );
+ break;
+ case EOnlyLatOrLon:
+ NotifyErrorToUserL( R_LMREFAPP_LAT_LONG_ERROR );
+ break;
+ case ENoLatLonButHorAcc:
+ NotifyErrorToUserL( R_LMREFAPP_HACC_LAT_LONG_ERROR );
+ break;
+ case ENoLatLonButAltitude:
+ NotifyErrorToUserL( R_LMREFAPP_ALT_LAT_LONG_ERROR );
+ break;
+ case ENoAltButVerAcc:
+ NotifyErrorToUserL( R_LMREFAPP_VACC_ALT_ERROR );
+ break;
+ case EEmptyLandmarkName:
+ NotifyErrorToUserL( R_LMREFAPP_EMPTY_LANDMARK_NAME_ERROR );
+ break;
+ default:
+ LandmarksUtils::Panic( KErrGeneral );
+ break;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CLandmarksEditDialog::NotifyErrorToUserL( TInt aResourceId )
+ {
+ HBufC* msg = iCoeEnv->AllocReadResourceLC( aResourceId );
+ LandmarksUtils::ErrorNoteL( *msg );
+ CleanupStack::PopAndDestroy( msg );
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CLandmarksEditDialog::EditCategoriesL()
+ {
+ TInt res = CLandmarksCategoriesDialog::RunDialogL( *iLmCategoriesModel );
+ if ( res )
+ {
+ ConfigureCategoryFieldL();
+ DrawDeferred();
+ SetChangesPending( ETrue );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CLandmarksEditDialog::UpdateToCurrentLocationL()
+ {
+ // Update location fields to current location
+ HBufC* title =
+ iCoeEnv->AllocReadResourceAsDes16LC( R_LMREFAPP_ACQUIRING_LOC );
+ iPositionRequest->FetchPositionInfoL( *title, iPositionInfo );
+ CleanupStack::PopAndDestroy( title );
+ }
+
+// ---------------------------------------------------------------------------
+// Copies address information ( address and building position fields ) from
+// source landmark to target.
+// ---------------------------------------------------------------------------
+//
+void CLandmarksEditDialog::CopyAddressDataL( CPosLandmark& aSrc, CPosLandmark& aTrg )
+ {
+ // clean address fields
+ for ( TPositionFieldId fieldId = EPositionFieldAddressCapabilitiesBegin + 1;
+ fieldId < EPositionFieldNMEACapabilitiesBegin;
+ fieldId++ )
+ {
+ aTrg.RemovePositionField( fieldId );
+ }
+
+ // copy fields
+ TPositionFieldId fieldId = aSrc.FirstPositionFieldId();
+ while ( fieldId != EPositionFieldNone )
+ {
+ if ( fieldId > EPositionFieldAddressCapabilitiesBegin &&
+ fieldId < EPositionFieldNMEACapabilitiesBegin )
+ {
+ TPtrC field;
+ if ( KErrNone == aSrc.GetPositionField( fieldId, field ) )
+ {
+ aTrg.SetPositionFieldL( fieldId, field );
+ }
+ }
+ fieldId = aSrc.NextPositionFieldId( fieldId );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Copies coordinate information ( locality and coverage ) from
+// source landmark to target. If some fields are empty in source,
+// they will also be emptied in result.
+// ---------------------------------------------------------------------------
+//
+void CLandmarksEditDialog::CopyCoordinateDataL( CPosLandmark& aSrc, CPosLandmark& aTrg )
+ {
+ TLocality loc;
+ if ( KErrNone == aSrc.GetPosition( loc ) )
+ {
+ aTrg.SetPositionL( loc );
+ }
+ else
+ {
+ aTrg.RemoveLandmarkAttributes( CPosLandmark::EPosition );
+ }
+
+ TRealX nan;
+ nan.SetNaN();
+ TReal32 coverage( nan );
+
+ aSrc.GetCoverageRadius( coverage );
+ aTrg.SetCoverageRadius( coverage );
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+TBool CLandmarksEditDialog::HasAddressData()
+ {
+ // check only those fields, which are shown to user
+ const TPositionFieldId fieldIds[] =
+ {
+ EPositionFieldCountry,
+ EPositionFieldCity,
+ EPositionFieldStreet,
+ EPositionFieldPostalCode,
+ };
+ const TInt fields = 4;
+
+ for ( TInt i = 0; i < fields; i++ )
+ {
+ TPtrC field;
+ TInt err = iLandmark->GetPositionField( fieldIds[i], field );
+ if ( !err && field.Length() )
+ {
+ return ETrue;
+ }
+ }
+
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+TBool CLandmarksEditDialog::HasCoordinateData()
+ {
+ TLocality loc;
+ return ( KErrNone == iLandmark->GetPosition( loc ) );
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CLandmarksEditDialog::StartWaitDialogL( TInt aResId )
+ {
+ if ( iWaitDialog )
+ {
+ User::Leave( KErrInUse );
+ }
+
+ iWaitDialog = new (ELeave) CAknWaitDialog(
+ ( reinterpret_cast<CEikDialog**>( &iWaitDialog ) ) );
+
+ iWaitDialog->SetTone( CAknNoteDialog::EConfirmationTone );
+ iWaitDialog->ExecuteLD( aResId );
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CLandmarksEditDialog::CloseWaitDialog()
+ {
+ if ( iWaitDialog )
+ {
+ TRAP_IGNORE( iWaitDialog->ProcessFinishedL() );
+ iWaitDialog = NULL;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CLandmarksEditDialog::ResetCoordinatesL()
+ {
+ TPosition position;
+ ConfigureLocationFieldsL( position );
+
+ SetChangesPending( ETrue );
+
+ // Indicate that editors have been updated
+ for ( TInt i = ELatitudeEditor; i <= EVerticalAccEditor; i++ )
+ {
+ iIsRealValueEdited[i] = ETrue;
+ }
+ }
+