landmarksui/uicontrols/src/CLmkCoordinateEditor.cpp
branchRCL_3
changeset 18 870918037e16
parent 0 522cd55cc3d7
--- /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 <e32math.h>
+#include <stringloader.h>
+#include <eikenv.h>
+#include <AknUtils.h>
+
+#include <LmkUi.rsg>
+#include "LmkConsts.h"
+#include "landmarks.hrh"
+#include "CLmkMfneSeparator.h"
+#include "CLmkCoordinateEditor.h"
+#include <AknBidiTextUtils.h>
+
+// 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