williamr@2: /*
williamr@2: * Copyright (c) 2006-2007 Nokia Corporation and/or its subsidiary(-ies).
williamr@2: * All rights reserved.
williamr@2: * This component and the accompanying materials are made available
williamr@2: * under the terms of the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members
williamr@2: * which accompanies this distribution, and is available
williamr@2: * at the URL "http://www.symbianfoundation.org/legal/licencesv10.html".
williamr@2: *
williamr@2: * Initial Contributors:
williamr@2: * Nokia Corporation - initial contribution.
williamr@2: *
williamr@2: * Contributors:
williamr@2: *
williamr@2: * Description:  Location editors 
williamr@2: *
williamr@2: */
williamr@2: 
williamr@2: #ifndef AKNLOCATIONED_H
williamr@2: #define AKNLOCATIONED_H
williamr@2: 
williamr@2: #include <eikmfne.h>
williamr@2: 
williamr@2: class TPosition;
williamr@2: class CLocationStrings;
williamr@2: /**
williamr@2:  * Editor for TPosition type; latitude and longitude editor
williamr@2:  *
williamr@2:  * There exists two ways to construct CAknLocationEditor:
williamr@2:  *
williamr@2:  * @code
williamr@2:  * CAknLocationEditor *editor = CAknLocationEditor::NewL(pos, context);
williamr@2:  * @endcode
williamr@2:  * 
williamr@2:  * Using resources:
williamr@2:  *
williamr@2:  * @code
williamr@2:  * CAknLocationEditor *editor = new (ELeave) CAknLocationEditor
williamr@2:  * TResourceReader reader;
williamr@2:  * iCoeEnv->CreateResourceReaderLC(reader,R_RES_ID_FOR_EDITOR);
williamr@2:  * editor->ConstructFromResourceL(reader);
williamr@2:  * editor->Set(pos);
williamr@2:  * CleanupStack::PopAndDestroy();
williamr@2:  * @endcode
williamr@2:  * 
williamr@2:  * Resource file format is as follows:
williamr@2:  * @code
williamr@2:  *     LATITUDE_EDITOR
williamr@2:  *        {
williamr@2:  *	      flags = ELocationEdFlagLatitude;
williamr@2:  *		  latlongresourceid = R_EIK_LATITUDE_AND_LONGITUDE;
williamr@2:  *        };
williamr@2:  * @endcode
williamr@2:  *  or:
williamr@2:  * @code
williamr@2:  *      LONGITUDE_EDITOR
williamr@2:  *        {
williamr@2:  *		  flags = ELocationEdFlagLongitude;
williamr@2:  *		  latlongresourceid = R_EIK_LATITUDE_AND_LONGITUDE;
williamr@2:  *        };
williamr@2:  * @endcode
williamr@2:  *
williamr@2:  *  @lib eikctl.lib
williamr@2:  *  @lib lbs.lib (for TPosition class)
williamr@2:  *  @since 3.2
williamr@2:  *  @see TPosition
williamr@2:  */
williamr@2: class CAknLocationEditor : public CEikMfne
williamr@2: 	{
williamr@2: public:
williamr@2: 	/**
williamr@2: 	 * TLocationContext determines what part of TPosition class is used for this editor.
williamr@2:      *  ELongitudeOnly means only longitude part of TPosition is used.
williamr@2:      *  ELatitudeOnly means only latitude part of TPosition is used.
williamr@2: 	 */
williamr@2: 	enum TLocationContext
williamr@2: 		{
williamr@2: 		ELongitudeOnly = 0x1,
williamr@2: 		ELatitudeOnly  = 0x2
williamr@2: 		};
williamr@2:     /**
williamr@2:      * Constructor
williamr@2:      */
williamr@2: 	IMPORT_C CAknLocationEditor();
williamr@2:     /**
williamr@2:      * Destructor
williamr@2:      */
williamr@2: 	IMPORT_C ~CAknLocationEditor();
williamr@2:     /**
williamr@2:      * NewL()
williamr@2:      *    Creates location editor and initializes it's value to value determined by the aValue parameter.
williamr@2: 	 *
williamr@2:      * @param aValue Initial value for location editor.
williamr@2:      * @param aContext Which part of the TPosition is used for this location editor
williamr@2:      */
williamr@2: 	IMPORT_C static CAknLocationEditor* NewL( TPosition &aValue, TLocationContext aContext );
williamr@2: 
williamr@2: 	/**
williamr@2: 	 * ConstructFromResourceL
williamr@2:      *     Constructs location editor using information from resource files
williamr@2:      *
williamr@2:      * @param aResourceReader resource reader
williamr@2: 	 */
williamr@2: 	IMPORT_C void ConstructFromResourceL( TResourceReader& aResourceReader );
williamr@2: 
williamr@2: 	/**
williamr@2: 	 * DisplayableLocationL()
williamr@2: 	 *    Converts TPosition into displayable descriptor usable for listboxes
williamr@2:      *
williamr@2: 	 * @param aValue value of the location
williamr@2: 	 * @param aContext which part of the TPosition is used
williamr@2: 	 */
williamr@2: 	IMPORT_C static HBufC* DisplayableLocationL( const TPosition &aValue, TLocationContext aContext );
williamr@2: 
williamr@2: 
williamr@2:     /**
williamr@2:      * PrepareForFocusLossL()
williamr@2:      *     detects focus changes to validate editor contents
williamr@2:      */
williamr@2: 	IMPORT_C virtual void PrepareForFocusLossL();
williamr@2: 
williamr@2: 	/**
williamr@2:      * Set()
williamr@2:      *     Sets either longitude or latitude values of aValue
williamr@2:      *
williamr@2: 	 *  @param aValue new value for the editor
williamr@2:      */
williamr@2: 	IMPORT_C void Set(const TPosition &aValue);
williamr@2: 	/**
williamr@2: 	 * Get()
williamr@2:      *      Gets either longitude or latitude values of aValue
williamr@2:      *
williamr@2:      * @param aValue TPosition object that will be modified
williamr@2:      */
williamr@2: 	IMPORT_C void Get( TPosition &aValue ) const;
williamr@2: 	/**
williamr@2: 	 * OfferKeyEventL()
williamr@2: 	 *         key event handling of location editor
williamr@2: 	 */
williamr@2: 	IMPORT_C TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType);
williamr@2: private:
williamr@2: 	enum TLocationType
williamr@2: 		{
williamr@2: 		EDD,
williamr@2: 		EDMM,
williamr@2: 		EDMSD
williamr@2: 		};
williamr@2: 	TLocationType Type() const;
williamr@2: 	static void Split( const TPosition &aValue, 
williamr@2: 					   TLocationContext aContext, 
williamr@2: 					   TInt &aDegrees, 
williamr@2: 					   TInt &aDeciDegrees, 
williamr@2: 					   TInt &aMinutes, 
williamr@2: 					   TInt &aDeciMinutes, 
williamr@2: 					   TInt &aSeconds, 
williamr@2: 					   TInt &aDeciSeconds, 
williamr@2: 					   TBool &aNeg, 
williamr@2: 					   TBool &aNan );
williamr@2: 	static void SplitDD( const TPosition &aValue, 
williamr@2: 						 TLocationContext aContext, 
williamr@2: 						 TInt &aDegrees,
williamr@2: 						 TInt &aDeciDegrees, 
williamr@2: 						 TBool &aNeg, 
williamr@2: 						 TBool &aNan );
williamr@2: 	static void SplitDMM( const TPosition &aValue, 
williamr@2: 	                      TLocationContext aContext, 
williamr@2: 	                      TInt &aDegrees, 
williamr@2: 	                      TInt &aMinutes, 
williamr@2: 	                      TInt &aDeciMinutes, 
williamr@2: 	                      TBool &aNeg, 
williamr@2: 	                      TBool &aNan );
williamr@2: 	static void SplitDMSD( const TPosition &aValue, 
williamr@2: 						   TLocationContext aContext, 
williamr@2: 						   TInt &aDegrees, 
williamr@2: 						   TInt &aMinutes, 
williamr@2: 						   TInt &aSeconds, 
williamr@2: 						   TInt &aDeciSeconds, 
williamr@2: 						   TBool &aNeg, 
williamr@2: 						   TBool &aNan );
williamr@2: 	static void CombineDD( TPosition &aValue, 
williamr@2: 						   TLocationContext aContext, 
williamr@2: 						   TInt aDegrees, 
williamr@2: 						   TInt aDeciDegrees, 
williamr@2: 						   TBool aNeg, 
williamr@2: 						   TBool aNan );
williamr@2: 	static void CombineDMM( TPosition &aValue, 
williamr@2: 							TLocationContext aContext, 
williamr@2: 							TInt aDegrees, 
williamr@2: 							TInt aMinutes, 
williamr@2: 							TInt aDeciMinutes, 
williamr@2: 							TBool aNeg, 
williamr@2: 							TBool aNan );
williamr@2: 	static void CombineDMSD( TPosition &aValue, 
williamr@2: 							 TLocationContext aContext, 
williamr@2: 							 TInt aDegrees, 
williamr@2: 							 TInt aMinutes, 
williamr@2: 							 TInt aSeconds, 
williamr@2: 							 TInt aDeciSeconds, 
williamr@2: 							 TBool aNeg, 
williamr@2: 							 TBool aNan );
williamr@2: private:
williamr@2: 	void SetUninitialised(TBool aInitialised);
williamr@2: 	void RefreshFromLocale();
williamr@2: 	void ConstructL( TPosition &aValue, TLocationContext aContext );
williamr@2: public:
williamr@2: 	void HandleCenRepChangedL(TUint32 aKey, TInt aValue);
williamr@2: 	void CreateMfneFieldsL(const TPosition &aValue);
williamr@2: private:
williamr@2: 	void LoadStringsL( TInt aResourceId );
williamr@2: 	
williamr@2: 	/**
williamr@2: 	* Maps logical MFNE field order to correct visual order.
williamr@2: 	* @param aFieldNumber Field position in logical format.
williamr@2: 	* @param aType Used location editor format.
williamr@2: 	* @return Field position in visual format.
williamr@2: 	*/
williamr@2: 	TInt FieldMapping(const TInt aFieldNumber, const TLocationType aType) const;
williamr@2: 
williamr@2: protected:
williamr@2: 	IMPORT_C virtual void* CAknLocationEditor_ExtensionInterface( TUid aInterface ); 
williamr@2: private:
williamr@2: 	CLocationStrings* iStrings;
williamr@2: 	TLocationContext iContext;
williamr@2: 	};
williamr@2: 
williamr@2: 
williamr@2: #endif