diff -r 1fc85118c3ae -r 870918037e16 locationlandmarksrefappfors60/Src/LandmarksEditDialog.cpp --- /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 +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +#include "LmRefApp.hrh" +#include + +#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 ( 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( Control ( ELandmarkLatitudeField ) ); + editor->Get( tempPos ); + latitude = tempPos.Latitude(); + } + + // longitude + if ( iIsRealValueEdited[ELongitudeEditor] || !locationExists ) + { + CAknLocationEditor* editor = static_cast( 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 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 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( Control( aId ) ); + editor->SetTextL( &aText ); + editor->DrawDeferred(); + } + +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// +void CLandmarksEditDialog::SetLocationFieldL( TInt aId, const TPosition& aPosition ) + { + CAknLocationEditor* editor = static_cast( Control( aId ) ); + editor->Set( aPosition ); + editor->DrawDeferred(); + } + +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// +void CLandmarksEditDialog::UpdateTitleBarL( TBool aFromField ) + { + if ( aFromField ) + { + TBuf name; + + CEikEdwin* nameEditor = + static_cast( 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( &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; + } + } +