diff -r 5b6f26637ad3 -r f4a778e096c2 phonebookui/Phonebook2/UIControls/inc/CPbk2ContactEditorDlgImpl.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook2/UIControls/inc/CPbk2ContactEditorDlgImpl.h Wed Sep 01 12:29:52 2010 +0100 @@ -0,0 +1,483 @@ +/* +* Copyright (c) 2005-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: Phonebook 2 contact editor dialog implementation. +* +*/ + + +#ifndef CPBK2CONTACTEDITORDLGIMPL_H +#define CPBK2CONTACTEDITORDLGIMPL_H + +// INCLUDES +#include +#include +#include +#include +#include "MPbk2ContactEditorUiBuilder.h" +#include "MPbk2ContactEditorUiBuilderExtension.h" +#include "MPbk2ContactEditorControlExtension.h" +#include "MPbk2ContactEditorEventObserver.h" +#include "MPbk2DialogEliminator.h" +#include "TPbk2ContactEditorParams.h" +#include +#include "MPbk2BaseCommand.h" +#include "MPbk2ImageFieldObserver.h" + +// FORWARD DECLARATIONS +class CAknTitlePane; +class MPbk2ContactEditorStrategy; +class CPbk2FieldPropertyArray; +class CPbk2PresentationContact; +class CPbk2ContactEditorFieldArray; +class MPbk2ContactNameFormatter; +class CPbk2UIExtensionManager; +class MPbk2ContactEditorExtension; +class MPbk2EditedContactObserver; +class MPbk2ContactEditorContactRelocator; +class CAknNavigationControlContainer; +class MPbk2ContactEditorUIField; +class CPbk2ContactEditorFieldFactory; +class CAknNavigationDecorator; +class CPbk2ContactEditorArrayItem; +class CAknInputBlock; +class MPbk2ApplicationServices; +class CCnvCharacterSetConverter; + +// CLASS DECLARATION + +/** + * Phonebook 2 contact editor dialog implementation. + */ +class CPbk2ContactEditorDlgImpl : public CAknForm, + public MPbk2ContactEditorUiBuilder, + public MPbk2ContactEditorUiBuilderExtension, + public MPbk2ContactEditorEventObserver, + public MPbk2DialogEliminator, + public MPbk2ContactEditorControl, + public MPbk2ContactEditorControlExtension, + public MVPbkContactStoreObserver, + public MPbk2ImageFieldObserver, + public MCoeForegroundObserver + { + public: // Constructors and destructor + + /** + * Creates a new instance of this class. + * + * @param aParams Contact editor parameters. + * @param aContact The contact to edit. + * @param aFieldProperties Field properties. + * @param aContactObserver Observer for the contact being edited. + * @param aEditorStrategy Contact editing strategy. + * @param aRelocator Contact relocator. + * @return A new instance of this class. + */ + static CPbk2ContactEditorDlgImpl* NewL( + TPbk2ContactEditorParams& aParams, + CPbk2PresentationContact& aContact, + CPbk2FieldPropertyArray& aFieldProperties, + MPbk2EditedContactObserver& aContactObserver, + MPbk2ContactEditorStrategy& aEditorStrategy, + MPbk2ContactEditorContactRelocator& aRelocator ); + + /** + * Creates a new instance of this class. + * + * @param aParams Contact editor parameters. + * @param aContact The contact to edit. + * @param aFieldProperties Field properties. + * @param aContactObserver Observer for the contact being edited. + * @param aEditorStrategy Contact editing strategy. + * @param aRelocator Contact relocator. + * @param aAppServices Pointer to Pbk2 application services + * @param aTitleText ownership is transferred + * @return A new instance of this class. + */ + static CPbk2ContactEditorDlgImpl* NewL( + TPbk2ContactEditorParams& aParams, + CPbk2PresentationContact& aContact, + CPbk2FieldPropertyArray& aFieldProperties, + MPbk2EditedContactObserver& aContactObserver, + MPbk2ContactEditorStrategy& aEditorStrategy, + MPbk2ContactEditorContactRelocator& aRelocator, + MPbk2ApplicationServices* aAppServices, + HBufC* aTitleText = NULL ); + + /** + * Destructor. + */ + virtual ~CPbk2ContactEditorDlgImpl(); + + public: // Interface + + /** + * Executes the dialog. + */ + void ExecuteLD(); + + /** + * Adds item to the contact. If the given parameter is KErrNotFound + * the add item dialog is run and the user selects the field type. + * + * @param aFieldTypeResourceId Specifies the field type to add. + * @param aFieldTypeXspName Field type xSP name. + */ + void AddItemToContactL( + TInt aFieldTypeResourceId, + const TDesC& aFieldTypeXspName, + TBool aSetFocus = ETrue ); + + /** + * Closes an executing dialog nicely with TryExitL and + * without saving any contact data. + * + * @param aInformObserver Indicates whether the observer + * should be informed about dialog + * closure. + */ + void CloseWithoutSaving( TBool aInformObserver ); + + /** + * Tries to set the focus to the first field which is of the + * type of the given type. + * + * @aFieldTypeResId Field type resource id. + * @param aFieldTypeXspName Field type xSP name. + */ + void TryChangeFocusWithTypeIdL( + TInt aFieldTypeResId, const TDesC& aFieldTypeXSpName ); + + public: // From CCoeControl + TKeyResponse OfferKeyEventL( + const TKeyEvent& aKeyEvent, + TEventCode aType ); + void GetHelpContext( + TCoeHelpContext& aContext ) const; + + public: // From CAknForm + void PreLayoutDynInitL(); + void PostLayoutDynInitL(); + void SetInitialCurrentLine(); + void ProcessCommandL( + TInt aCommandId ); + void DynInitMenuPaneL( + TInt aResourceId, + CEikMenuPane* aMenuPane ); + TBool OkToExitL( + TInt aKeycode ); + void HandleControlStateChangeL( + TInt aControlId ); + //Let Avkon know from which base class control has been + //derived from in order to use the correct layout method. + MEikDialogPageObserver::TFormControlTypes + ConvertCustomControlTypeToBaseControlType(TInt aControlType) const; + //Provide custom control + SEikControlInfo CreateCustomControlL(TInt aControlType); + void HandlePointerEventL( const TPointerEvent& aPointerEvent ); + // Handles a change to the control's resources. + void HandleResourceChange( TInt aType ); + + public: // From MPbk2ContactEditorUiBuilder + CCoeControl* CreateLineL( + const TDesC& aCaption, + TInt aControlId, + TInt aControlType ); + CEikCaptionedControl* LineControl( + TInt aControlId ) const; + void DeleteControl( + TInt aControlId ); + void TryChangeFocusL( + TInt aControlId ); + void SetCurrentLineCaptionL( + const TDesC& aText ); + CCoeControl* Control( + TInt aControlId ) const; + void SetEditableL( + TBool aState ); + void LoadBitmapToFieldL( + const MPbk2FieldProperty& aFieldProperty, + const CPbk2IconInfoContainer& aIconInfoContainer, + TInt aControlId ); + TAny* ContactEditorUiBuilderExtension( TUid aExtensionUid ); + + public: // From MPbk2ContactEditorUiBuilderExtension + CCoeControl* AddCustomFieldToFormL(TInt aIndex, TInt aResourceId); + TBool HandleCustomFieldCommandL(TInt aCommand ); + + public: // From MPbk2ContactEditorEventObserver + void ContactEditorOperationCompleted( + MVPbkContactObserver::TContactOpResult aResult, + MPbk2ContactEditorEventObserver::TParams aParams ); + void ContactEditorOperationFailed( + MVPbkContactObserver::TContactOp aOpCode, + TInt aErrorCode, + MPbk2ContactEditorEventObserver::TParams aParams, + MPbk2ContactEditorEventObserver::TFailParams& aFailParams ); + + public: // From MPbk2DialogEliminator + void RequestExitL( + TInt aCommandId ); + void ForceExit(); + void ResetWhenDestroyed( + MPbk2DialogEliminator** aSelfPtr ); + + public: // From MPbk2ContactEditorControl + void SetFocus( + TInt aIndex ); + TInt NumberOfControls() const; + TInt IndexOfCtrlType( + TPbk2FieldCtrlType aType, + TInt& aIndex ) const; + TBool AreAllControlsEmpty() const; + TBool IsControlEmptyL( + TInt aIndex ) const; + TBool IsCustomControlEmptyL(TInt aIndex, TBool& aRet) const; + MPbk2ContactEditorField& EditorField( + TInt aIndex ) const; + virtual TAny* ContactEditorControlExtension( + TUid /*aExtensionUid*/ ); + + public: // From MPbk2ContactEditorControlExtension + void UpdateControlsL(); + TInt FocusedControlType(); + + public: // From MVPbkContactStoreObserver + void StoreReady( + MVPbkContactStore& aContactStore ); + void StoreUnavailable( + MVPbkContactStore& aContactStore, + TInt aReason ); + void HandleStoreEventL( + MVPbkContactStore& aContactStore, + TVPbkContactStoreEvent aStoreEvent ); + + public: // From MPbk2ImageFieldObserver + /** + * Called when image has bee loaded. + * + */ + TInt ImageLoadingComplete(); + + + /** + * Called when image loading failed. + * + */ + TInt ImageLoadingFailed(); + + + /** + * Called when image loading was cancelled. + * + */ + TInt ImageLoadingCancelled(); + + private: // From MCoeForegroundObserver + void HandleGainingForeground(); + void HandleLosingForeground(); + + private: // From CEikDialog + void LineChangedL( + TInt aControlId ); + + private: // Implementation + + void DoImageLoadingCompleteL(); + + CPbk2ContactEditorDlgImpl( + TPbk2ContactEditorParams& aParams, + CPbk2PresentationContact& aContact, + CPbk2FieldPropertyArray& aFieldProperties, + MPbk2EditedContactObserver& aContactObserver, + MPbk2ContactEditorStrategy& aEditorStrategy, + MPbk2ContactEditorContactRelocator& aRelocator, + MPbk2ApplicationServices* aAppServices = NULL, + HBufC* aTitleText = NULL ); + void ConstructL(); + void StoreTitlePaneTextL(); + void ConstructContextMenuL(); + void ConstructNaviPaneL(); + void UpdateTitleL(); + void UpdateTitlePictureL(); + void CloseDialog( + MVPbkContactObserver::TContactOp aOpCode, + TBool aInformObserver ); + void ExitApplication( + MVPbkContactObserver::TContactOp aOpCode, + TInt aCommandId ); + void CmdAddItemL(); + void CmdDeleteItemL(); + void CmdEditItemLabelL(); + void CmdDoneL( + MPbk2ContactEditorEventObserver::TParams& aParams ); + TInt FocusedFieldIndexL(); + void SetCbaButtonsL(); + TBool EmptyContextMenuL(); + TBool OkToExitApplicationL( + TInt aCommandId ); + void ForwardOkToExitL( TInt aKeycode ); + void SetCbaCommandSetL( TInt aResourceId ); + void UpdateCbasL(CPbk2ContactEditorArrayItem* aItemToUpdate = NULL); + void DimItem( CEikMenuPane* aMenuPane, TInt aCmd ); + void UnDimItem( CEikMenuPane* aMenuPane, TInt aCmd ); + TBool CheckBaseCommandL(TInt aCommandId); + TBool ExecuteBaseCommandL(TInt aCommandId); + TBool CheckFieldSpecificCommandL(TInt aCommandId); + void RemoveAndReAddCurrentFieldL(); + void DynInitRingtoneL( + TInt aResourceId, + CEikMenuPane* aMenuPane, + MPbk2ContactEditorField& aCurrentField ); + void DynInitImageL( + TInt aResourceId, + CEikMenuPane* aMenuPane, + MPbk2ContactEditorField& aCurrentField ); + void DynInitSyncL( + TInt aResourceId, + CEikMenuPane* aMenuPane, + MPbk2ContactEditorField& aCurrentField ); + void DynInitAddressL( + TInt aResourceId, + CEikMenuPane* aMenuPane ); + void ExecuteAddressDlgL(TPbk2ContactEditorParams::TActiveView aActiveView); + void ClearControls(); + TBool ContactHasAddress(TPbk2FieldGroupId aAddressGroup); + void AddGroupFieldsL(TPbk2FieldGroupId aGroupId); + TBool AreAllFieldsEmpty(); + TBool IsUIDataChanged(); + TBool IsAddressValidated(TPbk2FieldGroupId aGroupId); + void DeleteActiveAddressGeoCoords(); + void SetAddressValidationIconsL(); + + void WaitFinishL(); + void CloseDialog(); + + TBool IsUnicodeL( const TDesC& aText ); + TBool IsCheckPointEvent( + const TKeyEvent& aKeyEvent, + TEventCode aType ); + void CheckCurrentFieldTextL( + CPbk2ContactEditorArrayItem* aCurrentField, + const TKeyEvent& aKeyEvent, + TEventCode aType ); + void RestorePrevNaviDecoratorL(); + void RestoreStatusPaneL(); + static TInt DelayDlgDeleteCallBack( TAny* aCallBack ); + void DelayDlgDelete(); + + private: // Data structures + + /** + * Exit states. + */ + enum TExitState + { + EExitOrdered, + EExitApproved, + EOkToExitWithoutHandlingIt + }; + /** + * Using states. + */ + enum TUseState + { + EUseReady, + EUseOperatingContact, + EUseFinished + }; + + private: // Data + /// Ref: Editor parameters + TPbk2ContactEditorParams& iParams; + /// Own: Context menu bar + CEikMenuBar* iContextMenuBar; + /// Ref: Application's title pane + CAknTitlePane* iTitlePane; + /// Own: Title pane text to restore on exit + HBufC* iStoredTitlePaneText; + /// Ref: A strategy for the editor + MPbk2ContactEditorStrategy& iEditorStrategy; + /// Ref: Phonebook 2 field properties + CPbk2FieldPropertyArray& iFieldProperties; + /// Ref: Presentation level contact + CPbk2PresentationContact& iContact; + /// Ref: For setting the title of the contact + MPbk2ContactNameFormatter* iNameFormatter; + /// Own: Manages dialog fields + CPbk2ContactEditorFieldArray* iUiFieldArray; + /// Own: Exit information for TExitState + TBitFlags8 iExitRecord; + /// Own: Contact editor extension + MPbk2ContactEditorExtension* iEditorExtension; + /// Ref: Observer for the contact being edited + MPbk2EditedContactObserver& iContactObserver; + /// Own: Add item selection index + TInt iAddItemSelectionIndex; + /// Ref: Contact relocator + MPbk2ContactEditorContactRelocator& iRelocator; + /// Ref: Extension manager + CPbk2UIExtensionManager* iExtensionManager; + /// Ref: Status pane handle + CAknNavigationControlContainer* iNaviContainer; + /// Ref: Pointer to dialog eliminator + MPbk2DialogEliminator** iSelfPtr; + /// Own: Current CBA command set + TInt iCbaCommandSet; + ///Own: Handle to basecommand object + MPbk2BaseCommand* iPbk2BaseCommand; + //Ref: Temp holder for last created custom control + CCoeControl* iLastCreatedCustomControl; + // Own: In order to prevent execution of multiple commands in case + // user taps fast enough touch ui. + TBool iCommandPending; + /// Own: 'end-key' was pressed + TBool iEndKeyWasPressed; + /// Field factory + CPbk2ContactEditorFieldFactory* iFieldFactory; + /// Ref: Instance of Address View + CPbk2ContactEditorDlgImpl* iAddressView; + /// Own: If we are in stand alone Address View + TBool iAddressViewStandalone; + /// Dialog using state + TUseState iUseState; + /// Own: Wait until finish contact store operation + CActiveSchedulerWait* iWaitFinish; + /// Own: User input blocker + CAknInputBlock* iInputBlock; + // Own: Whether the service has been canceled + TBool iServiceCanceled; + // Own: A store contact + MVPbkStoreContact* iStoreContact; + // Ref: Pbk2 application services + MPbk2ApplicationServices* iAppServices; + // Own: Custom title text + HBufC* iTitleText; + /// Own: Converts text between Unicode and SMS 7-bit + CCnvCharacterSetConverter* iConverter; + /// Ref: A pointer to stack variable in CloseDialog() for knowing + /// if the destructor has already been called + TBool* iDestroyedPtr; + /// Ref: Holds the TopMost NaviDecorator before pushing + /// the empty one on to the top. + /// Doesnt Own. + CAknNavigationDecorator* iPrevNaviDecorator; + + TInt iCurrentstatuspane; + /// Own: For asynchronously delete editordlg. + CIdle* iDelayDelete; + }; + +#endif // CPBK2CONTACTEDITORDLGIMPL_H + +// End of File