landmarksui/uicontrols/src/CLmkEditorNumberField.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:31:27 +0100
branchRCL_3
changeset 18 870918037e16
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* 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:    Methods for Landmark editor number field.
*
*/







// INCLUDE FILES
#include "CLmkEditorNumberField.h"
#include "MLmkEditorUiBuilder.h"
#include "LmkConsts.h"
#include "landmarks.hrh"
#include <eikcapc.h>
#include <e32math.h>
#include <aknuniteditor.h>
#include <barsread.h>
#include <lmkui.rsg>
#include "clmkcentralrepository.h"
#include <locnotprefplugindomaincrkeys.h>
#include <centralrepository.h>
#include <CLmkEditorDlg.h>

//================== CONSTANTS===============================
const TReal KFootToMeterFraction = 0.3048;
// ================= MEMBER FUNCTIONS =======================

// ----------------------------------------------------
// CLmkEditorNumberField::CLmkEditorNumberField
// ----------------------------------------------------
//
CLmkEditorNumberField::CLmkEditorNumberField
        ( MLmkFieldData& aField,
		  MLmkEditorUiBuilder& aUiBuilder ) :
    CLmkEditorFieldBase( aField, aUiBuilder )
    {
    }

// ----------------------------------------------------
// CLmkEditorNumberField::ConstructL
// ----------------------------------------------------
//
void CLmkEditorNumberField::ConstructL()
    {
    iRepository = CLmkCentralRepository::NewL();
    CreateAvkonUnitEditorL();
    iCaptionedCtrl = iUiBuilder.LineControl( ControlId() );
    iCaptionedCtrl->SetTakesEnterKey( ETrue );
    }

// ----------------------------------------------------
// CLmkEditorNumberField::NewL
// ----------------------------------------------------
//
CLmkEditorNumberField* CLmkEditorNumberField::NewL
        ( MLmkFieldData& aField,
		 MLmkEditorUiBuilder& aUiBuilder )
    {
    CLmkEditorNumberField* self =
        new(ELeave) CLmkEditorNumberField( aField, aUiBuilder );
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );
    return self;
    }

// ----------------------------------------------------
// CLmkEditorNumberField::~CLmkEditorNumberField
// ----------------------------------------------------
//
CLmkEditorNumberField::~CLmkEditorNumberField()
    {
    delete iRepository;
    }

// ----------------------------------------------------
// CLmkEditorNumberField::SaveFieldL
// ----------------------------------------------------
//
TBool CLmkEditorNumberField::SaveFieldL()
    {
    TBool result = EFalse;
	TReal32 oldData = LandmarkItemField().FloatData();
	TReal32 currData = iControl->Value();
	if( oldData != currData)
        {
        if (!IsSystemUnitMetric())
            {
            if (LandmarkItemField().FieldType() == EPositionAccuracy
                    || LandmarkItemField().FieldType() == EAltitudeAccuracy)
                {
                if (currData < (KMinAccuracy / KFootToMeterFraction))
                    {
                    currData = (KMinAccuracy / KFootToMeterFraction);
                    }
                else if (currData > (KMaxAccuracy / KFootToMeterFraction))
                    {
                    currData = (KMaxAccuracy / KFootToMeterFraction);
                    }
                }
            else if (LandmarkItemField().FieldType() == EAltitude)
                {
                if (currData < (KMinAltitude / KFootToMeterFraction))
                    {
                    currData = (KMinAltitude / KFootToMeterFraction);
                    }
                else if (currData > (KMaxAltitude / KFootToMeterFraction))
                    {
                    currData = (KMaxAltitude / KFootToMeterFraction);
                    }
                }

            ConvertFromFootToMeters(currData);
            }
        else
            {
            if (LandmarkItemField().FieldType() == EPositionAccuracy
                    || LandmarkItemField().FieldType() == EAltitudeAccuracy)
                {
                if (currData < KMinAccuracy)
                    {
                    currData = KMinAccuracy;
                    }
                else if (currData > KMaxAccuracy)
                    {
                    currData = KMaxAccuracy;
                    }
                }

            else if (LandmarkItemField().FieldType() == EAltitude)
                {
                if (currData < KMinAltitude)
                    {
                    currData = KMinAltitude;
                    }
                else if (currData > KMaxAltitude)
                    {
                    currData = KMaxAltitude;
                    }
                }
            }

        LandmarkItemField().SetTReal(currData);
        result = ETrue;
        }
   	return result;
    }

// ----------------------------------------------------
// CLmkEditorNumberField::ActivateL
// ----------------------------------------------------
//
void CLmkEditorNumberField::ActivateL()
    {
    iCaptionedCtrl->ActivateL();
    }

// ----------------------------------------------------
// CLmkEditorNumberField::UpdateL
// ----------------------------------------------------
//
void CLmkEditorNumberField::UpdateL()
    {
    TReal32 fieldData = LandmarkItemField().FloatData();
    TReal32 dispData = fieldData;
    if( fieldData == iDbData)
	    {
	    dispData = 	iConvertedData;
	    }
	else
		{
		if( !IsSystemUnitMetric())
			{
			//Imperial
			iDbData = fieldData;
			ConvertFromMetersToFoot( fieldData);
			iConvertedData = fieldData;
			dispData = 	iConvertedData;
			}
		}

	ResolveUnitL();
    iControl->SetValue( dispData );
    }

// ----------------------------------------------------
// CLmkEditorNumberField::CreateAvkonUnitEditorL
// ----------------------------------------------------
//
void CLmkEditorNumberField::CreateAvkonUnitEditorL()
	{
	// Create Distance editor using AVKON's unit editor
	// and insert a line in the dialog
	iControl = static_cast<CAknUnitEditor*>( iUiBuilder.CreateLineL(
            FieldLabel(), LandmarkItemField().UniqueFieldIdentity(),
            EAknCtUnitEditor ) );


	
	// Obtain the current system of measurement
	TInt sysOfMeasurement = EAknUnitEditorMeter;
	if( !IsSystemUnitMetric())
		{
		sysOfMeasurement = EAknUnitEditorFoot;
		}
	
	//read control from resource file.
	TResourceReader reader;
	if( sysOfMeasurement == EAknUnitEditorMeter)
		{
		iEnv->CreateResourceReaderLC(reader, R_LMK_UNIT_EDITOR_METRIC);
		}
	else
		{
		iEnv->CreateResourceReaderLC(reader, R_LMK_UNIT_EDITOR_IMPERIAL);
		}
	
	iControl->ConstructFromResourceL(reader);
	CleanupStack::PopAndDestroy(); //reader
	ResolveUnitL();

    /*
     if ( LandmarkItemField().FieldType() == EPositionAccuracy ||
     LandmarkItemField().FieldType() == EAltitudeAccuracy )
     {
     if( EAknUnitEditorMeter == sysOfMeasurement )
     {
     iControl->SetMinimumAndMaximum(KMinAccuracy, KMaxAccuracy);
     }
     else
     {
     iControl->SetMinimumAndMaximum( KMinAccuracy / KFootToMeterFraction,
     KMaxAccuracy / KFootToMeterFraction );
     }

     }
     else if ( LandmarkItemField().FieldType() == EAltitude )
     {
     if( EAknUnitEditorMeter == sysOfMeasurement )
     {
     iControl->SetMinimumAndMaximum( KMinAltitude, KMaxAltitude );
     }
     else
     {
     iControl->SetMinimumAndMaximum( KMinAltitude / KFootToMeterFraction,
     KMaxAltitude / KFootToMeterFraction );
     }
     }
     */

    TReal32 fieldData = LandmarkItemField().FloatData();
    iDbData = fieldData;
    iConvertedData = fieldData;

	if( EAknUnitEditorFoot == sysOfMeasurement )
		{
		//Imperial
		ConvertFromMetersToFoot( fieldData);
		iConvertedData = fieldData;
		}
	iControl->SetValue(iConvertedData);
	}

// -----------------------------------------------------------------------------
//CLmkEditorNumberField::FieldValue()
// -----------------------------------------------------------------------------
//
TReal CLmkEditorNumberField::FieldValue() const
	{
	return iControl->Value();
	}

// -----------------------------------------------------------------------------
//CLmkEditorNumberField::ResolveUnitL()
// -----------------------------------------------------------------------------
//
void CLmkEditorNumberField::ResolveUnitL()
	{
    TReal fieldData = LandmarkItemField().FloatData();

    if( IsSystemUnitMetric())
		{
		TInt fieldUnit = EAknUnitEditorMeter;
		iControl->SetUnitL( fieldUnit );
		}
	else
		{
		TInt fieldUnit = EAknUnitEditorFoot;
		iControl->SetUnitL( fieldUnit );
		}
	}

// -----------------------------------------------------------------------------
//CLmkEditorNumberField::ConvertFromFootToMeters()
// -----------------------------------------------------------------------------
//
void CLmkEditorNumberField::ConvertFromFootToMeters(TReal32& aValue)
	{

	aValue *= KFootToMeterFraction;

	}

// -----------------------------------------------------------------------------
//CLmkEditorNumberField::ConvertFromMetersToFoot()
// -----------------------------------------------------------------------------
//
void CLmkEditorNumberField::ConvertFromMetersToFoot(TReal32& aValue)
	{

	aValue /= KFootToMeterFraction;

	}

// -----------------------------------------------------------------------------
//CLmkEditorNumberField::IsSystemUnitMetric()
// -----------------------------------------------------------------------------
//
TBool CLmkEditorNumberField::IsSystemUnitMetric()
	{
	TBool result = EFalse;
	TInt keyValue;
	TInt err = iRepository->GetKeyValue( KLocSystemofMeasurements, keyValue );
	if( keyValue == EUnitsMetric )
		{
		result = ETrue;
		}
	return result;
	}


// -----------------------------------------------------------------------------
//CLmkEditorNumberField::HandleUnitChangeL()
// -----------------------------------------------------------------------------
//
void CLmkEditorNumberField::HandleUnitChangeL()
	{
	// Obtain the current system of measurement
	TInt sysOfMeasurement = EAknUnitEditorMeter;
	if( !IsSystemUnitMetric())
		{
		sysOfMeasurement = EAknUnitEditorFoot;
		}

	TReal32 controlData = iControl->Value();
	if( controlData != iConvertedData)
		{
		iConvertedData = controlData;
		}

    if( EAknUnitEditorMeter == sysOfMeasurement )
	    {

	    //Imperial to metric
	    ConvertFromFootToMeters( iConvertedData );
	    }
	else
		{
		//metric to imperial
		ConvertFromMetersToFoot( iConvertedData );
		}

    if ( LandmarkItemField().FieldType() == EPositionAccuracy ||
    	 LandmarkItemField().FieldType() == EAltitudeAccuracy )
        {
        if( EAknUnitEditorMeter == sysOfMeasurement )
        	{
        	iControl->SetMinimumAndMaximum(KMinAccuracy, KMaxAccuracy);
        	}
		else
			{
			iControl->SetMinimumAndMaximum( KMinAccuracy / KFootToMeterFraction,
							 			    KMaxAccuracy / KFootToMeterFraction );
			}
        }
    else if ( LandmarkItemField().FieldType() == EAltitude )
        {
        if( EAknUnitEditorMeter == sysOfMeasurement )
        	{
        	iControl->SetMinimumAndMaximum( KMinAltitude, KMaxAltitude );
        	}
		else
			{
        	iControl->SetMinimumAndMaximum( KMinAltitude / KFootToMeterFraction,
        									KMaxAltitude / KFootToMeterFraction );
			}
        }
	ResolveUnitL();
    iControl->SetValue( iConvertedData );
	}

// -----------------------------------------------------------------------------
//CLmkEditorFieldBase::ResetL()
// -----------------------------------------------------------------------------
//
void CLmkEditorNumberField::ResetL()
	{
	TRealX temp;
    temp.SetNaN();
    iControl->SetValue(temp);
	}
// End of File