extras/converter/Ui/Src/CCnvMainForm.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 19 Feb 2010 22:52:07 +0200
branchRCL_3
changeset 6 57ec1f1a7fd2
parent 0 3ee3dfdd8d69
permissions -rw-r--r--
Revision: 201003 Kit: 201007

/*
* 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:  
*     An AVKON form class containing popup fields and floating point editors.
*     Implements the 'Main State' of the application.
*
*/



#ifndef __CCNVMAINFORM_H__
#define __CCNVMAINFORM_H__

// INCLUDES
#include <AknForm.h>
#include <TCnvCategory.h>

//Select Edwin
#include <eikedwob.h>


// FORWARD DECLARATIONS
class CCnvConverter;
class CAknPopupField;
class CErrorUI;

// CLASS DEFINITION
/**
* An AVKON form class containing popup fields and floating point editors.
* Implements the 'Main State' of the application.
*/
class CCnvMainForm : public CAknForm , public MEikEdwinObserver
	{

	public: // constructors and destructor

		/**
		* Default constructor.
		*/
		CCnvMainForm( TBool &aAlreadyDead );

		/**
		* Destructor.
		*/
		~CCnvMainForm();

		/**
		* 2nd phase constructor.
		*/
		void ConstructL();

	private: // constructors

		/**
		* Default constructor. Not implemented.
		*/
		CCnvMainForm();

	public: // from CCoeControl

		/**
		* Specifies the help context for this form.
		* @param aContext the context IDs are placed here
		*/
		void GetHelpContext( TCoeHelpContext& aContext ) const;

	public: // from MEikCommandObserver

		/**
		* Handles menu commands.
		* @param aCommandId Command identifier.
		*/
		void ProcessCommandL( TInt aCommandId );

	public:	// from MEikDialogPageObserver

		/**
		* Takes any action required when the current line is
		* changed to aControlId.
		* @param aControlId Control identifier.
		*/
		void LineChangedL( TInt aControlId );

	public:	// from MEikMenuObserver

		/**
		* Dynamically initialises a menu pane. The Uikon framework calls this
		* function, immediately before the menu pane is activated.
		* @param aResourceId Resource ID identifying a menu pane to initialise
		* @param aMenuPane The in-memory representation of the menu pane.
		*/
		void DynInitMenuPaneL( TInt aResourceId, CEikMenuPane* aMenuPane );

	protected: // from MCoeControlObserver

		/**
		* Handles an event originating from one of the form's controls.
		* @param aControl The control that reported the event.
		* @param aEventType The type of the reported event.
		*/
		void HandleControlEventL( CCoeControl* aControl,
			TCoeEvent aEventType );

	protected: // from CAknForm

		/**
		* Saves form popup field states to a file (not implemented, yet).
		* @return ETrue if the editable state can be left
		*         (always in this case).
		*/
		TBool SaveFormData();

        /**
        * Deal with that the field is empty,when move focus to other field.
        * The Uikon framework calls this function,immediately before focus move. 
        */
        void PrepareForFocusTransitionL();
	protected: // from CEikDialog

		/**
		* Tests if it is OK to exit the dialog.
		* @param aButtonId The ID of the button that was activated.
		* @return ETrue to validate and exit the dialog,
		*         EFalse to keep the dialog active.
		*/
		TBool OkToExitL( TInt aButtonId );

		/**
		* Pre-layout dialog initialisation.
		*/
		void PreLayoutDynInitL();

	private: // new methods
		/**
		* returns ETrue if the the character is an integer
		*/
		TBool IsDigit(TUint aChar);

		/**
		* Checks if a form control has REALLY changed (uses history knowledge)
		* Form controls report bogus state changed events, this is used to
		* filter them out.
		* @param controlId Form ID of the control to be checked
		* @return ETrue if the specified control's state has changed
		*/
		TBool HasReallyChanged( TInt controlId );

		/**
		* Initialised change history (for HasReallyChanged)
		*/
		void InitialiseChangeHistory();

		/**
		* Called when the user has changed
		* the unit type popup field selection.
		*/
		void HandleCategoryChangedL();

		/**
		* Called when the user has changed
		* either of the unit popup field selections.
		*/
		void HandleUnitChangedL();

		/**
		* Checks if the unit rates (factors) are defined in the model
		* for the currently selected unit type.
		* @param aShowNote If ETrue "rates missing note" is shown, if
		*                  rates are not valid.
		* @return ETrue if rates are valid, EFalse otherwise.
		*/
		TBool AreRatesValidL(TBool aShowNote);

		/**
		* Checks if a floating point editor's value is within allowable range.
		* @param aEditorId Resource ID of the editor control to be checked.
		* @return ETrue If value is in range, EFalse otherwise.
		*/
		TBool IsEditorValueValidL( TUint aEditorId );

		/**
		* Checks if a floating point editor's value is such that no conversion
		* should be made and no "invalid value" error should be reported.
		* @param aEditorId Resource ID of the editor control to be checked.
		* @return ETrue Indicates that conversion should not proceed.
		*/
		TBool EditorValueCausesHold( TUint aEditorId );

		/**
		* Handles the ECmdRates command. Launches the Rates Form.
		*/
		void CmdRatesL();

		/**
		* Handles the ECmdSetType command.
		*/
		void CmdSetTypeL();

		/**
		* Handles the ECmdSetUnit command.
		*/
		void CmdSetUnitL();

		/**
		* Tells the model to load its state from a file.
		*/
		void LoadStateL();

		/**
		* Tells the model to save its state to a file.
		* Displays an error note if there is not enough space in permanent
		* storage.
		*/
		void SaveState();

		/**
		* Calculates and displays the unit conversion immediately.
		*/
		void SynchronousConversionL( TBool aShowRateInvalidNote = ETrue );

		/**
		* Calculates and displays the unit conversion after 0.75 seconds.
		*/
		void AsynchronousConversion();

		/**
		* Cancels a queued asynchronous conversion request, if any.
		*/
		void CancelConversion();

		/**
		* Called by the conversion timer after the 0.75 second timeout
		* has exipred. Calls SynchronousConversion() to do
		* the actual conversion.
		* @param aMainForm Pointer to the CCnvMainForm instance.
		*/
		static TInt TimerCallback( TAny* aMainForm );

		/**
		* Shows an error note for invalid value situation
		* @param aEditorId Id of the editor that holds the invalid value
		*/
		void ShowInvalidValueNoteL(TInt aEditorId);

		/**
		* From CCoeControl processing of a key event
		* @param aKeyEvent : Key event information
		*        aType : EEventKeyDown | EEventKey | EEventKeyUp
		* @return : EKeyWasConsumed if keyevent is consumed.   
		*           EKeyWasNotConsumed if keyevent is not consumed.
		* Handling of the keys is taken care for the editor fields
		*/
		TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent,
			TEventCode aType);

		/**
		*Checks if the number entered in the editor field is a valid number
		*@param aEditroId : Id of the editor that needs to be evaluated
		*@return : EFalse if the editor value is not a vaild number	
		*		 : ETrue if the number is a valid number
		*/
		TBool IsVaildNumberEntered(TInt aEditorId);

		/**
		*From MEikEdwinObserver. handles the Navigation on the editor control. 
		*/
		void HandleEdwinEventL(CEikEdwin* aEdwin,TEdwinEvent aEventType);
		
		/**
		*Do the calculation and change the value for the related edit field
		*/
		void ValueCalculationL( TUint aUnit1Popup, TUint aUnit2Popup, TReal aMount );

	private: // data

		/**
		* Pointer to our model. Owned.
		*/
		CCnvConverter* iModel;

		/**
		* Model accessor for unit types.
		*/
		TCnvCategory iTypeCategory;

		/**
		* Model accessor for source units.
		*/
		TCnvCategory iUnit1Category;

		/**
		* Model accessor for destination units.
		*/
		TCnvCategory iUnit2Category;

		/**
		* Pointer to the Unit Type popup field. Not owned.
		*/
		CAknPopupField* iTypePopupCtrl;

		/**
		* Pointer to the source Unit popup field. Not owned.
		*/
		CAknPopupField* iUnit1PopupCtrl;

		/**
		* Pointer to the destination Unit popup field. Not owned.
		*/
		CAknPopupField* iUnit2PopupCtrl;

		/**
		* Id of the currency category in the model.
		*/
		TUint iCurrencyCategoryId;

		/**
		* ETrue if this instance is fully constructed, EFalse otherwise.
		*/
		TBool iIsFullyConstructed;

		/**
		* ETrue if the user has already been notified that the disk is full.
		*/
		TBool iHasNotifiedDiscFull;

		/**
		* ETrue if the iLastUsedEditorId has changed after the focus
		* has entered the editor.
		*/
		TBool iActiveEditorChanged;

		/**
		* Pointer to the timer used for asynchronous conversions
		* (which need a0.75 second delay..)
		*/
		CPeriodic* iConversionTimer;

		/**
		* The id of the unit amount field that the user has modified last.
		*/
		TInt iLastUsedEditorId;

		/**
		* The id of the line that was last active in the form.
		*/
		TInt iLastActiveEditorLine;

		/**
		* The previous type selection.
		*/
		TInt iHistoryTypeCategory;

		/**
		* The previous source unit selection.
		*/
		TInt iHistoryUnit1Category;

		/**
		* The previous destination unit selection.
		*/
		TInt iHistoryUnit2Category;

		/**
		* Pointer to the Error UI object. Owned
		* Used for displaying the Disk Full error message.
		*/
		CErrorUI* iErrorUI;

		/**
		* Reference to a flag in this form's owner.
		* Used to indicate that we have been deleted by someone
		* (could be the app framework.. <sigh>)
		*/
		TBool& iAlreadyDead;	

		TKeyEvent iKeyEvent;

		TBool isEdwinNavigated;
		TBool isEdwinUpdateText;

	};

#endif // __CCNVMAINFORM_H__