diff -r 1fc85118c3ae -r 870918037e16 landmarksui/uicontrols/src/CLmkCoordinateEditor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/landmarksui/uicontrols/src/CLmkCoordinateEditor.cpp Wed Sep 01 12:31:27 2010 +0100 @@ -0,0 +1,396 @@ +/* +* Copyright (c) 2002 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: LandmarksUi Content File - +* +*/ + + + + + + + + +// INCLUDE FILES +#include +#include +#include +#include + +#include +#include "LmkConsts.h" +#include "landmarks.hrh" +#include "CLmkMfneSeparator.h" +#include "CLmkCoordinateEditor.h" +#include + +// CONSTANTS +/// Unnamed namespace for local definitions +namespace { + +const TInt KKeyToMatchEmptyCardinal = 0; + +const TInt KKeyToMatchNorth = 78; +const TInt KKeyToMatchSouth = 83; +const TInt KKeyToMatchWest = 87; +const TInt KKeyToMatchEast = 69; + +const TInt KNumFields = 3; // value, degree, cardinal + +const TInt KLatitudeMaxLength = 7; // DD.DDDD +const TInt KLatitudeMaxDecimals = 4; +const TInt KLongitudeMaxLength = 8; // DDD.DDDD +const TInt KLongitudeMaxDecimals = 4; + +const TReal KLatitudeMaxLimit = 90; +const TReal KLongitudeMaxLimit = 180; + +const TInt KNumCardinalSymbols = 3; // NS / WE + empty + +_LIT(KEmptyDegreeMark, ""); + +#if defined(_DEBUG) +/// Panic codes for CLmkCoordinateEditor +enum TPanicCode + { + EPanicUnknownEditorType + }; + +void Panic(TPanicCode aReason) + { + _LIT(KPanicText, "CLmkCoordinateEditor"); + User::Panic(KPanicText, aReason); + } +#endif // _DEBUG + +} // namespace + +// ============================ MEMBER FUNCTIONS ============================== + +// ---------------------------------------------------------------------------- +// CLmkCoordinateEditor::CLmkCoordinateEditor +// C++ default constructor can NOT contain any code, that +// might leave. +// ---------------------------------------------------------------------------- +// +CLmkCoordinateEditor::CLmkCoordinateEditor() + { + } + +// ---------------------------------------------------------------------------- +// CLmkCoordinateEditor::~CLmkCoordinateEditor +// ---------------------------------------------------------------------------- +// +CLmkCoordinateEditor::~CLmkCoordinateEditor() + { + delete iDegreeMark; + } + +// ---------------------------------------------------------------------------- +// CLmkCoordinateEditor::ConstructL +// Symbian 2nd phase constructor can leave. +// ---------------------------------------------------------------------------- +// +void CLmkCoordinateEditor::ConstructL( + TReal aInitialValue, + CLmkCoordinateEditor::TEditorType aType) + { + iEditorType = aType; + + TInt maxLength = 0, maxDecimals = 0; + TReal maxLimit = 0; + switch( iEditorType ) + { + case ELatitudeEditor: + { + maxLength = KLatitudeMaxLength; + maxDecimals = KLatitudeMaxDecimals; + maxLimit = KLatitudeMaxLimit; + break; + } + case ELongitudeEditor: + { + maxLength = KLongitudeMaxLength; + maxDecimals = KLongitudeMaxDecimals; + maxLimit = KLongitudeMaxLimit; + break; + } + default: + { + __ASSERT_DEBUG(EFalse, Panic(EPanicUnknownEditorType)); + break; + } + } + + // create float field + BaseConstructL(KNumFields); + + if (!AknLayoutUtils::LayoutMirrored()) + { + ConstructValueFieldL(maxLength, maxDecimals); + ConstructDegreeMarkFieldL(); + ConstructCardinalPointFieldL(); + } + else + { + ConstructCardinalPointFieldL(); + ConstructValueFieldL(maxLength, maxDecimals); + ConstructDegreeMarkFieldL(); + } + + SetCardinal(DefaultCardinal()); + SetLimits(0, maxLimit); + SetNumber(aInitialValue); + ShowDegreeAndCardinal(!Math::IsNaN(aInitialValue)); + } + +// ---------------------------------------------------------------------------- +// CLmkCoordinateEditor::ConstructDegreeMarkFieldL +// ---------------------------------------------------------------------------- +// +void CLmkCoordinateEditor::ConstructDegreeMarkFieldL() + { + iDegreeMark = StringLoader::LoadL( R_LMK_DEGREE_MARK, iCoeEnv ); + iDegreeField = CLmkMfneSeparator::NewL(iDegreeMark->Des()); + AddField(iDegreeField); + } + +// ---------------------------------------------------------------------------- +// CLmkCoordinateEditor::ConstructCardinalPointFieldL +// ---------------------------------------------------------------------------- +// +void CLmkCoordinateEditor::ConstructCardinalPointFieldL() + { + HBufC* text = NULL; + iCardinalField = CEikMfneSymbol::NewL(KNumCardinalSymbols); + + // add empty cardinal + text = HBufC::NewLC(1); + iCardinalField->AddSymbolicItem( + CEikMfneSymbol::CItem::NewL(ECardinalNone, KKeyToMatchEmptyCardinal, text), + ETrue); + CleanupStack::Pop(text); + + // read and add cardinals + if ( iEditorType == ELatitudeEditor ) + { + text = StringLoader::LoadLC(R_LMK_CARDINAL_POINT_N, iCoeEnv ); + iCardinalField->AddSymbolicItem( + CEikMfneSymbol::CItem::NewL(ECardinalNorth, KKeyToMatchNorth, text), + EFalse); + CleanupStack::Pop(text); + + text = StringLoader::LoadLC(R_LMK_CARDINAL_POINT_S, iCoeEnv ); + iCardinalField->AddSymbolicItem( + CEikMfneSymbol::CItem::NewL(ECardinalSouth, KKeyToMatchSouth, text), + EFalse); + CleanupStack::Pop(text); + } + else + { + text = StringLoader::LoadLC(R_LMK_CARDINAL_POINT_E, iCoeEnv ); + iCardinalField->AddSymbolicItem( + CEikMfneSymbol::CItem::NewL(ECardinalEast, KKeyToMatchEast, text), + EFalse); + CleanupStack::Pop(text); + + text = StringLoader::LoadLC(R_LMK_CARDINAL_POINT_W, iCoeEnv ); + iCardinalField->AddSymbolicItem( + CEikMfneSymbol::CItem::NewL(ECardinalWest, KKeyToMatchWest, text), + EFalse); + CleanupStack::Pop(text); + } + + AddField(iCardinalField); + } + +// ---------------------------------------------------- +// CLmkCoordinateEditor::Number +// ---------------------------------------------------- +// +TReal CLmkCoordinateEditor::Number() const + { + TReal coord = CLmkFloatEditor::Number(); + if (Math::IsNaN(coord)) + { + return coord; + } + + // South and West coordinates are negative + switch(Cardinal()) + { + case ECardinalSouth: + case ECardinalWest: + { + coord = -coord; + break; + } + default: + break; + } + + return coord; + } + +// ---------------------------------------------------- +// CLmkCoordinateEditor::SetNumber +// ---------------------------------------------------- +// +void CLmkCoordinateEditor::SetNumber(TReal aNumber) + { + if (!Math::IsNaN(aNumber)) + { + // set cardinal point according to number sign + // zero belongs to positive cardinals + TCardinalPoint cardinalId = ECardinalNone; + if (iEditorType == ELatitudeEditor) + { + cardinalId = (aNumber >= 0) ? ECardinalNorth : ECardinalSouth; + } + else // ELongitudeEditor + { + cardinalId = (aNumber >= 0) ? ECardinalEast : ECardinalWest; + } + SetCardinal(cardinalId); + ShowDegreeAndCardinal(ETrue); + CLmkFloatEditor::SetNumber(Abs(aNumber)); + } + else + { + ShowDegreeAndCardinal(EFalse); + CLmkFloatEditor::SetNumber(aNumber); // nan + } + } + +// ---------------------------------------------------- +// CLmkCoordinateEditor::SetCardinal +// ---------------------------------------------------- +// +void CLmkCoordinateEditor::SetCardinal(TCardinalPoint aCardinalId) + { + iCardinalField->SetCurrentSymbolicItemToId(aCardinalId); + CheckEastLongitude(); + } + +// ---------------------------------------------------- +// CLmkCoordinateEditor::Cardinal +// ---------------------------------------------------- +// +CLmkCoordinateEditor::TCardinalPoint CLmkCoordinateEditor::Cardinal() const + { + return (TCardinalPoint) iCardinalField->IdOfCurrentSymbolicItem(); + } + +// ---------------------------------------------------- +// CLmkCoordinateEditor::DefaultCardinal +// ---------------------------------------------------- +// +CLmkCoordinateEditor::TCardinalPoint CLmkCoordinateEditor::DefaultCardinal() + { + return (iEditorType == ELatitudeEditor) ? ECardinalNorth : ECardinalEast; + } + +// ---------------------------------------------------- +// CLmkCoordinateEditor::CheckEastLongitude +// Abs(180) is allowed only for West +// ---------------------------------------------------- +// +void CLmkCoordinateEditor::CheckEastLongitude() + { + if (Cardinal() == ECardinalEast && + CLmkFloatEditor::Number() == KLongitudeMaxLimit) + { + SetCardinal(ECardinalWest); + } + } + +// ---------------------------------------------------- +// CLmkCoordinateEditor::ShowDegreeAndCardinal +// ---------------------------------------------------- +// +void CLmkCoordinateEditor::ShowDegreeAndCardinal(TBool aVisible) + { + if (aVisible) + { + if (iDegreeField->Text() == KEmptyDegreeMark) + { + TInt err = KErrNone; + TRAP(err, iDegreeField->SetTextL(*iDegreeMark)); + } + + if (Cardinal() == ECardinalNone) + { + SetCardinal(DefaultCardinal()); + } + } + else + { + TInt err = KErrNone; + TRAP(err, iDegreeField->SetTextL(KEmptyDegreeMark)); + SetCardinal(ECardinalNone); + } + } + +// ---------------------------------------------------- +// CLmkCoordinateEditor::HandleEnter +// ---------------------------------------------------- +// +void CLmkCoordinateEditor::HandleEnter() + { + ShowDegreeAndCardinal(ETrue); + CLmkFloatEditor::HandleEnter(); + } + +// ---------------------------------------------------- +// CLmkCoordinateEditor::HandleExit +// ---------------------------------------------------- +// +void CLmkCoordinateEditor::HandleExit() + { + ShowDegreeAndCardinal(!IsNan()); + CLmkFloatEditor::HandleExit(); + } + +// ---------------------------------------------------- +// CLmkCoordinateEditor::HandleValueChanged +// ---------------------------------------------------- +// +void CLmkCoordinateEditor::HandleValueChanged() + { + CheckEastLongitude(); + CLmkFloatEditor::HandleValueChanged(); + } + +// ---------------------------------------------------- +// CLmkCoordinateEditor::HandleCustomFieldChanged +// ---------------------------------------------------- +// +void CLmkCoordinateEditor::HandleCustomFieldChanged(TInt aFieldIndex) + { + if (Field(aFieldIndex) == iCardinalField) + { + if (Cardinal() == ECardinalNone) + { + // cycle from empty cardinal + SetCardinal(DefaultCardinal()); + } + else + { + CheckEastLongitude(); + } + } + CLmkFloatEditor::HandleCustomFieldChanged(aFieldIndex); + } + +// End of File