locationlandmarksrefappfors60/Inc/LandmarksEditDialog.h
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:31:27 +0100
branchRCL_3
changeset 18 870918037e16
parent 0 522cd55cc3d7
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* Copyright (c) 2004-2007 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: 
*     See class description below
*
*/


#ifndef __LANDMARKS_EDIT_DIALOG_H__
#define __LANDMARKS_EDIT_DIALOG_H__


#include <AknForm.h>
#include <AknForm.h>
#include "LandmarksOperationObserver.h"

class CLandmarksApplicationEngine;
class CLandmarksLmCategoriesModel;
class CLandmarksPositionRequest;
class CPosLandmarkCategory;
class CAknTitlePane;
class CAknWaitDialog;
class CPosLandmark;
class TLocality;
class TPositionInfo;



/**
*  A dialog that makes it possible to edit certain fields of a landmark.
*/
class CLandmarksEditDialog : 
    public CAknForm, 
    public MLandmarksOperationObserver
    {
    public: // Constructors and destructor

        /**
        * Two-phased constructor.
        *
        * @param aLandmark the landmark to edit
        * @param aUseCurrentLocation whether to initiate landmark with
        * current location
        * @param aEdited ETrue if the landmark has been modified,
        * EFalse otherwise
        * @param aEngine the application engine used for accessing categories
        * @param aInitialFocusFieldId Item to select on startup
        */
        static CLandmarksEditDialog* NewLC(
            CPosLandmark& aLandmark,
            TBool aUseCurrentLocation,
            TBool& aEdited,
            CLandmarksApplicationEngine& aEngine,
            TInt aInitialFocusFieldId = 0);

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

    public: // From CAknDialog

        /**
        * DynInitMenuPaneL initializes the menu pane before it is displayed.
        *
        * @param aResourceId a resource ID indetifying the menu bar containing
        * the menu pane to be initialized.
        * @param aMenuPane the menu pane to initialize.
        */
        void DynInitMenuPaneL(TInt aResourceId, CEikMenuPane* aMenuPane);

        /**
        * Processes user commands.
        *
        * @param aCommandId id of the command to respond to
        */
        void ProcessCommandL(TInt aCommandId);

    public: // From MLandmarksOperationObserver

        /**
        * NotifyOperationProgressL notifies the progress and status of an
        * asynchronous operation.
        *
        * @param aOperation the type of operation that is reported.
        * @param aProgress the progress of the operation.
        * @param aErrorCode the status of the operation.
        */
        void NotifyOperationProgressL(
            TOperation aOperation,
            TInt aProgress,
            TInt aErrorCode);

    protected: // From CAknForm

        /**
        * Handles a dialog button press for the specified dialog button.
        *
        * @param aButtonId
        * @return ETrue if OK to exit, EFalse to keep the dialog active
        */
        TBool OkToExitL(TInt aButtonId);


        /**
        * SaveFormDataL deals with the occasion of a change from
        * edit->view mode and the user wishes to save the changes.
        *
        * @return ETrue if the editable state can be left, EFalse otherwise
        */
        TBool SaveFormDataL();

    private: // From CEikDialog

        /**
        * PreLayoutDynInitL initialises the dialog's controls before the dialog
        * is sized and layed out.
        */
        void PreLayoutDynInitL();

        /**
        * PostLayoutDynInitL initialises the dialog's controls after the dialog
        * has been sized but before it has been activated.
        */
        void PostLayoutDynInitL();

        /**
        * Selects desired line on startup
        */
        void SetInitialCurrentLine();

        /**
        * Handles control events.
        *
        * @param aControl The control reporting the event
        * @param aEventType The event type
        */
        void HandleControlEventL(
            CCoeControl* aControl,
            TCoeEvent aEventType);

        /** Handles layout switch */
        void HandleResourceChange( TInt aType );

    private:

        enum TErrorInForm
            {
            ENoErrors,
            EWrongLatitude,
            EWrongLongitude,
            EWrongAltitude,
            EWrongHorAcc,
            EWrongVerAcc,
            EWrongRadius,
            EOnlyLatOrLon,
            ENoLatLonButHorAcc,
            ENoLatLonButAltitude,
            ENoAltButVerAcc,
            EEmptyLandmarkName,
            };

        /** Constructor
         *
         *  @param aLandmark the landmark to edit
         *  @param aUseCurrentLocation whether to initiate landmark with current location
         *  @param aEdited ETrue if the landmark has been modified, EFalse otherwise
         *  @param aEngine the application engine used for accessing categories
         *  @param aInitialFocusFieldId Item to select on startup
         */
        CLandmarksEditDialog(
            CPosLandmark& aLandmark,
            TBool aUseCurrentLocation,
            TBool& aEdited,
            CLandmarksApplicationEngine& aEngine,
            TInt aInitialFocusFieldId);

        void ConstructL();

        /** Configures the fields of the landmark to view/edit */
        void ConfigureFieldsL();

        /** Copies address data from landmark to fields */
        void ConfigureAddressFieldsL();

        /** Copies the location data from landmark to fields.
         *  @param aLocation contains the location data to update location fields with.
         */
        void ConfigureLocationFieldsL(TLocality& aLocation);

        /** Configures the category field */
        void ConfigureCategoryFieldL();

        /** Sets text to the specified field
         * @param aControlId ID of control in the dialog
         * @param aText Text to set to the control
         */
        void SetTextFieldL(TInt aControlId, const TDesC& aText);

        /** Sets text to the specified location field
         * @param aControlId ID of control in the dialog
         * @param aPosition Position value to set to the editor
         */
        void SetLocationFieldL( TInt aId, const TPosition& aPosition );

        /** Updates the title bar based on the contents in the name field.
         * @param aFromField Whether to get text from name field or from landmark.
         */
        void UpdateTitleBarL(TBool aFromField = EFalse);

        /** Launches a markable list dialog for editing categories for this landmark */
        void EditCategoriesL();
        
        /** Start location request to update landmark with current location */
        void UpdateToCurrentLocationL();

        /** Gets all data from fields, checks and saves to current landmark */
        TErrorInForm FetchAndSaveFormDataL();

        /** Saves values of address fields to current landmark */
        void SaveAddressDataL();

        /** Saves values of coordinates fields to current landmark 
         *  \return one of TErrorsInFields values
         */
        TErrorInForm SaveCoordinateDataL();

        /** Launches an error dialog displaying an error message to the user.
         *  @param aResourceId a resource id for a descriptor containing an
         *  error message
         */
        void ProcessErrorsInFormL( TErrorInForm aErrorId );

        /** Launches an error dialog displaying an error message to the user.
         *  @param aResourceId a resource id for a descriptor containing an
         *  error message
         */
        void NotifyErrorToUserL( TInt aResourceId );

        /** Copies address information (address and building position fields) from
         *  source landmark to target.
         */
        void CopyAddressDataL( CPosLandmark& aSrc, CPosLandmark& aTrg );

        /** Copies coordinate information (locality and coverage) from
         *  source landmark to target. If some fields are empty in source,
         *  they will also be emptied in result.
         */
        void CopyCoordinateDataL( CPosLandmark& aSrc, CPosLandmark& aTrg );
        
        /** Checks whether current landmark has any address fields */
        TBool HasAddressData();

        /** Checks whether current landmark has coordinate set */
        TBool HasCoordinateData();

        /** Start wait dialog for modal async operations */
        void StartWaitDialogL( TInt aResId );

        /** Closes wait dialog */
        void CloseWaitDialog();
        
        /** Reset coordinates of current landmark */
        void ResetCoordinatesL();

    private: // Data

        //! The landmark to be edited
        CPosLandmark& iOriginalLandmark;
        
        //! Own copy of the original landmark's data
        CPosLandmark* iLandmark;
        
        //! Whether to get location on startup
        TBool iUseCurrentLocation;

        //! Indicates if the landmark has been edited or not
        TBool& iEdited;

        //! Engine is used for reading categories
        CLandmarksApplicationEngine& iEngine;

        //! Item selected on startup
        TInt iInitialFocusFieldId;

        //! The title pane that is dynamically updated
        CAknTitlePane* iTitlePane;

        //! The original title that the title pane displayed before modified
        HBufC* iOriginalTitle;

        //! Contains a location if the user wants to update to current location
        TPositionInfo iPositionInfo;

        //! The name of the application. Used when fetching locations
        HBufC* iAppName;

        //! A position request used for retriveing locations
        CLandmarksPositionRequest* iPositionRequest;

        //! The listbox model for categories editor
        CLandmarksLmCategoriesModel* iLmCategoriesModel;

        //! The category ids that are set for this landmark
        RArray<TPosLmItemId> iCategoryIds;

        //! Defines how real numbers are formatted
        TRealFormat iRealFormat;

        //! Defines which real values that have been edited
        RArray<TBool> iIsRealValueEdited;

        CAknWaitDialog*         iWaitDialog;
    };

#endif // __LANDMARKS_EDIT_DIALOG__