phonebookui/Phonebook2/UIControls/inc/CPbk2ContactEditorDlgImpl.h
branchRCL_3
changeset 20 f4a778e096c2
equal deleted inserted replaced
19:5b6f26637ad3 20:f4a778e096c2
       
     1 /*
       
     2 * Copyright (c) 2005-2007 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Phonebook 2 contact editor dialog implementation.
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 #ifndef CPBK2CONTACTEDITORDLGIMPL_H
       
    20 #define CPBK2CONTACTEDITORDLGIMPL_H
       
    21 
       
    22 //  INCLUDES
       
    23 #include <AknForm.h>
       
    24 #include <babitflags.h>
       
    25 #include <coeutils.h>
       
    26 #include <MPbk2ContactEditorControl.h>
       
    27 #include "MPbk2ContactEditorUiBuilder.h"
       
    28 #include "MPbk2ContactEditorUiBuilderExtension.h"
       
    29 #include "MPbk2ContactEditorControlExtension.h"
       
    30 #include "MPbk2ContactEditorEventObserver.h"
       
    31 #include "MPbk2DialogEliminator.h"
       
    32 #include "TPbk2ContactEditorParams.h"
       
    33 #include <MVPbkContactStoreObserver.h>
       
    34 #include "MPbk2BaseCommand.h"
       
    35 #include "MPbk2ImageFieldObserver.h"
       
    36 
       
    37 // FORWARD DECLARATIONS
       
    38 class CAknTitlePane;
       
    39 class MPbk2ContactEditorStrategy;
       
    40 class CPbk2FieldPropertyArray;
       
    41 class CPbk2PresentationContact;
       
    42 class CPbk2ContactEditorFieldArray;
       
    43 class MPbk2ContactNameFormatter;
       
    44 class CPbk2UIExtensionManager;
       
    45 class MPbk2ContactEditorExtension;
       
    46 class MPbk2EditedContactObserver;
       
    47 class MPbk2ContactEditorContactRelocator;
       
    48 class CAknNavigationControlContainer;
       
    49 class MPbk2ContactEditorUIField;
       
    50 class CPbk2ContactEditorFieldFactory;
       
    51 class CAknNavigationDecorator;
       
    52 class CPbk2ContactEditorArrayItem;
       
    53 class CAknInputBlock;
       
    54 class MPbk2ApplicationServices;
       
    55 class CCnvCharacterSetConverter;
       
    56 
       
    57 // CLASS DECLARATION
       
    58 
       
    59 /**
       
    60  * Phonebook 2 contact editor dialog implementation.
       
    61  */
       
    62 class CPbk2ContactEditorDlgImpl : public CAknForm,
       
    63                                   public MPbk2ContactEditorUiBuilder,
       
    64                                   public MPbk2ContactEditorUiBuilderExtension,
       
    65                                   public MPbk2ContactEditorEventObserver,
       
    66                                   public MPbk2DialogEliminator,
       
    67                                   public MPbk2ContactEditorControl,
       
    68                                   public MPbk2ContactEditorControlExtension,
       
    69                                   public MVPbkContactStoreObserver,
       
    70                                   public MPbk2ImageFieldObserver,
       
    71                                   public MCoeForegroundObserver
       
    72     {
       
    73     public: // Constructors and destructor
       
    74 
       
    75         /**
       
    76          * Creates a new instance of this class.
       
    77          *
       
    78          * @param aParams           Contact editor parameters.
       
    79          * @param aContact          The contact to edit.
       
    80          * @param aFieldProperties  Field properties.
       
    81          * @param aContactObserver  Observer for the contact being edited.
       
    82          * @param aEditorStrategy   Contact editing strategy.
       
    83          * @param aRelocator        Contact relocator.
       
    84          * @return  A new instance of this class.
       
    85          */
       
    86         static CPbk2ContactEditorDlgImpl* NewL(
       
    87                 TPbk2ContactEditorParams& aParams,
       
    88                 CPbk2PresentationContact& aContact,
       
    89                 CPbk2FieldPropertyArray& aFieldProperties,
       
    90                 MPbk2EditedContactObserver& aContactObserver,
       
    91                 MPbk2ContactEditorStrategy& aEditorStrategy,
       
    92                 MPbk2ContactEditorContactRelocator& aRelocator );
       
    93         
       
    94         /**
       
    95 		* Creates a new instance of this class.
       
    96 		*
       
    97 		* @param aParams           Contact editor parameters.
       
    98 		* @param aContact          The contact to edit.
       
    99 		* @param aFieldProperties  Field properties.
       
   100 		* @param aContactObserver  Observer for the contact being edited.
       
   101 		* @param aEditorStrategy   Contact editing strategy.
       
   102 		* @param aRelocator        Contact relocator.
       
   103 		* @param aAppServices	   Pointer to Pbk2 application services
       
   104 		* @param aTitleText		   ownership is transferred
       
   105 		* @return  A new instance of this class.
       
   106 		*/
       
   107         static CPbk2ContactEditorDlgImpl* NewL(
       
   108 				TPbk2ContactEditorParams& aParams,
       
   109 				CPbk2PresentationContact& aContact,
       
   110 				CPbk2FieldPropertyArray& aFieldProperties,
       
   111 				MPbk2EditedContactObserver& aContactObserver,
       
   112 				MPbk2ContactEditorStrategy& aEditorStrategy,
       
   113 				MPbk2ContactEditorContactRelocator& aRelocator,
       
   114 				MPbk2ApplicationServices* aAppServices,
       
   115 				HBufC* aTitleText = NULL );
       
   116 
       
   117         /**
       
   118          * Destructor.
       
   119          */
       
   120         virtual ~CPbk2ContactEditorDlgImpl();
       
   121 
       
   122     public: // Interface
       
   123 
       
   124         /**
       
   125          * Executes the dialog.
       
   126          */
       
   127         void ExecuteLD();
       
   128 
       
   129         /**
       
   130          * Adds item to the contact. If the given parameter is KErrNotFound
       
   131          * the add item dialog is run and the user selects the field type.
       
   132          *
       
   133          * @param aFieldTypeResourceId      Specifies the field type to add.
       
   134          * @param aFieldTypeXspName         Field type xSP name.
       
   135          */
       
   136         void AddItemToContactL(
       
   137                 TInt aFieldTypeResourceId, 
       
   138                 const TDesC& aFieldTypeXspName, 
       
   139                 TBool aSetFocus = ETrue );
       
   140 
       
   141         /**
       
   142          * Closes an executing dialog nicely with TryExitL and
       
   143          * without saving any contact data.
       
   144          *
       
   145          * @param aInformObserver       Indicates whether the observer
       
   146          *                              should be informed about dialog
       
   147          *                              closure.
       
   148          */
       
   149         void CloseWithoutSaving( TBool aInformObserver );
       
   150 
       
   151         /**
       
   152          * Tries to set the focus to the first field which is of the
       
   153          * type of the given type.
       
   154          *
       
   155          * @aFieldTypeResId     Field type resource id.
       
   156          * @param aFieldTypeXspName         Field type xSP name.
       
   157          */
       
   158         void TryChangeFocusWithTypeIdL(
       
   159                 TInt aFieldTypeResId, const TDesC& aFieldTypeXSpName );
       
   160 
       
   161     public: // From CCoeControl
       
   162         TKeyResponse OfferKeyEventL(
       
   163                 const TKeyEvent& aKeyEvent,
       
   164                 TEventCode aType );
       
   165         void GetHelpContext(
       
   166                 TCoeHelpContext& aContext ) const;
       
   167 
       
   168     public: // From CAknForm
       
   169         void PreLayoutDynInitL();
       
   170         void PostLayoutDynInitL();
       
   171         void SetInitialCurrentLine();
       
   172         void ProcessCommandL(
       
   173                 TInt aCommandId );
       
   174         void DynInitMenuPaneL(
       
   175                 TInt aResourceId,
       
   176                 CEikMenuPane* aMenuPane );
       
   177         TBool OkToExitL(
       
   178                 TInt aKeycode );
       
   179         void HandleControlStateChangeL(
       
   180                 TInt aControlId );
       
   181         //Let Avkon know from which base class control has been 
       
   182         //derived from in order to use the correct layout method.
       
   183         MEikDialogPageObserver::TFormControlTypes 
       
   184             ConvertCustomControlTypeToBaseControlType(TInt aControlType) const;        
       
   185         //Provide custom control
       
   186         SEikControlInfo CreateCustomControlL(TInt aControlType);
       
   187         void HandlePointerEventL( const TPointerEvent& aPointerEvent );
       
   188         // Handles a change to the control's resources.
       
   189         void HandleResourceChange( TInt aType );
       
   190         
       
   191     public: // From MPbk2ContactEditorUiBuilder
       
   192         CCoeControl* CreateLineL(
       
   193                 const TDesC& aCaption,
       
   194                 TInt aControlId,
       
   195                 TInt aControlType );
       
   196         CEikCaptionedControl* LineControl(
       
   197                 TInt aControlId ) const;
       
   198         void DeleteControl(
       
   199                 TInt aControlId );
       
   200         void TryChangeFocusL(
       
   201                 TInt aControlId );
       
   202         void SetCurrentLineCaptionL(
       
   203                 const TDesC& aText );
       
   204         CCoeControl* Control(
       
   205                 TInt aControlId ) const;
       
   206         void SetEditableL(
       
   207                 TBool aState );
       
   208         void LoadBitmapToFieldL(
       
   209                 const MPbk2FieldProperty& aFieldProperty,
       
   210                 const CPbk2IconInfoContainer& aIconInfoContainer,
       
   211                 TInt aControlId );
       
   212         TAny* ContactEditorUiBuilderExtension( TUid aExtensionUid );
       
   213         
       
   214     public: // From MPbk2ContactEditorUiBuilderExtension        
       
   215         CCoeControl* AddCustomFieldToFormL(TInt aIndex, TInt aResourceId); 
       
   216         TBool HandleCustomFieldCommandL(TInt aCommand );        
       
   217 
       
   218     public: // From MPbk2ContactEditorEventObserver
       
   219         void ContactEditorOperationCompleted(
       
   220                 MVPbkContactObserver::TContactOpResult aResult,
       
   221                 MPbk2ContactEditorEventObserver::TParams aParams );
       
   222         void ContactEditorOperationFailed(
       
   223                 MVPbkContactObserver::TContactOp aOpCode,
       
   224                 TInt aErrorCode,
       
   225                 MPbk2ContactEditorEventObserver::TParams aParams,
       
   226                 MPbk2ContactEditorEventObserver::TFailParams& aFailParams );
       
   227 
       
   228     public: // From MPbk2DialogEliminator
       
   229         void RequestExitL(
       
   230                 TInt aCommandId );
       
   231         void ForceExit();
       
   232         void ResetWhenDestroyed(
       
   233                 MPbk2DialogEliminator** aSelfPtr );
       
   234 
       
   235     public: // From MPbk2ContactEditorControl
       
   236         void SetFocus(
       
   237                 TInt aIndex );
       
   238         TInt NumberOfControls() const;
       
   239         TInt IndexOfCtrlType(
       
   240                 TPbk2FieldCtrlType aType,
       
   241                 TInt& aIndex ) const;
       
   242         TBool AreAllControlsEmpty() const;
       
   243         TBool IsControlEmptyL(
       
   244                 TInt aIndex ) const;
       
   245         TBool IsCustomControlEmptyL(TInt aIndex, TBool& aRet) const;        
       
   246         MPbk2ContactEditorField& EditorField(
       
   247                 TInt aIndex ) const;
       
   248         virtual TAny* ContactEditorControlExtension(
       
   249                         TUid /*aExtensionUid*/ );
       
   250         
       
   251     public: // From MPbk2ContactEditorControlExtension
       
   252         void UpdateControlsL();
       
   253         TInt FocusedControlType();
       
   254 
       
   255     public: // From MVPbkContactStoreObserver
       
   256         void StoreReady(
       
   257                 MVPbkContactStore& aContactStore );
       
   258         void StoreUnavailable(
       
   259                 MVPbkContactStore& aContactStore,
       
   260                 TInt aReason );
       
   261         void HandleStoreEventL(
       
   262                 MVPbkContactStore& aContactStore,
       
   263                 TVPbkContactStoreEvent aStoreEvent );
       
   264 
       
   265     public: // From MPbk2ImageFieldObserver
       
   266         /**
       
   267          * Called when image has bee loaded.
       
   268          *
       
   269          */
       
   270         TInt ImageLoadingComplete();
       
   271 
       
   272 
       
   273         /**
       
   274          * Called when image loading failed.
       
   275          *
       
   276          */
       
   277         TInt ImageLoadingFailed();
       
   278 
       
   279 
       
   280         /**
       
   281          * Called when image loading was cancelled.
       
   282          *
       
   283          */
       
   284         TInt ImageLoadingCancelled();
       
   285 
       
   286     private: // From MCoeForegroundObserver
       
   287         void HandleGainingForeground();
       
   288         void HandleLosingForeground();        
       
   289         
       
   290     private: // From CEikDialog
       
   291         void LineChangedL(
       
   292             TInt aControlId );
       
   293 
       
   294     private: // Implementation
       
   295         
       
   296         void DoImageLoadingCompleteL();
       
   297         
       
   298         CPbk2ContactEditorDlgImpl(
       
   299                 TPbk2ContactEditorParams& aParams,
       
   300                 CPbk2PresentationContact& aContact,
       
   301                 CPbk2FieldPropertyArray& aFieldProperties,
       
   302                 MPbk2EditedContactObserver& aContactObserver,
       
   303                 MPbk2ContactEditorStrategy& aEditorStrategy,
       
   304                 MPbk2ContactEditorContactRelocator& aRelocator,
       
   305                 MPbk2ApplicationServices* aAppServices = NULL,
       
   306                 HBufC* aTitleText = NULL );
       
   307         void ConstructL();
       
   308         void StoreTitlePaneTextL();
       
   309         void ConstructContextMenuL();
       
   310         void ConstructNaviPaneL();
       
   311         void UpdateTitleL();
       
   312         void UpdateTitlePictureL();
       
   313         void CloseDialog(
       
   314                 MVPbkContactObserver::TContactOp aOpCode,
       
   315                 TBool aInformObserver );
       
   316         void ExitApplication(
       
   317                 MVPbkContactObserver::TContactOp aOpCode,
       
   318                 TInt aCommandId );
       
   319         void CmdAddItemL();
       
   320         void CmdDeleteItemL();
       
   321         void CmdEditItemLabelL();
       
   322         void CmdDoneL(
       
   323                 MPbk2ContactEditorEventObserver::TParams& aParams );
       
   324         TInt FocusedFieldIndexL();
       
   325         void SetCbaButtonsL();
       
   326         TBool EmptyContextMenuL();
       
   327         TBool OkToExitApplicationL(
       
   328                 TInt aCommandId );
       
   329         void ForwardOkToExitL( TInt aKeycode );
       
   330         void SetCbaCommandSetL( TInt aResourceId );
       
   331         void UpdateCbasL(CPbk2ContactEditorArrayItem* aItemToUpdate = NULL);
       
   332         void DimItem( CEikMenuPane* aMenuPane, TInt aCmd );
       
   333         void UnDimItem( CEikMenuPane* aMenuPane, TInt aCmd );
       
   334         TBool CheckBaseCommandL(TInt aCommandId);
       
   335         TBool ExecuteBaseCommandL(TInt aCommandId);   
       
   336         TBool CheckFieldSpecificCommandL(TInt aCommandId);
       
   337         void RemoveAndReAddCurrentFieldL();        
       
   338         void DynInitRingtoneL(
       
   339             TInt aResourceId, 
       
   340             CEikMenuPane* aMenuPane, 
       
   341             MPbk2ContactEditorField& aCurrentField );
       
   342         void DynInitImageL(
       
   343             TInt aResourceId, 
       
   344             CEikMenuPane* aMenuPane, 
       
   345             MPbk2ContactEditorField& aCurrentField );
       
   346         void DynInitSyncL(
       
   347             TInt aResourceId, 
       
   348             CEikMenuPane* aMenuPane, 
       
   349             MPbk2ContactEditorField& aCurrentField );
       
   350         void DynInitAddressL(
       
   351             TInt aResourceId, 
       
   352             CEikMenuPane* aMenuPane );
       
   353         void ExecuteAddressDlgL(TPbk2ContactEditorParams::TActiveView aActiveView);
       
   354         void ClearControls();
       
   355         TBool ContactHasAddress(TPbk2FieldGroupId aAddressGroup);
       
   356         void AddGroupFieldsL(TPbk2FieldGroupId aGroupId);
       
   357         TBool AreAllFieldsEmpty();
       
   358         TBool IsUIDataChanged();
       
   359         TBool IsAddressValidated(TPbk2FieldGroupId aGroupId);
       
   360         void DeleteActiveAddressGeoCoords();
       
   361         void SetAddressValidationIconsL();
       
   362 
       
   363         void WaitFinishL();
       
   364         void CloseDialog();
       
   365         
       
   366         TBool IsUnicodeL( const TDesC& aText );
       
   367         TBool IsCheckPointEvent(
       
   368                 const TKeyEvent& aKeyEvent,
       
   369                 TEventCode aType );
       
   370         void CheckCurrentFieldTextL( 
       
   371                 CPbk2ContactEditorArrayItem* aCurrentField,
       
   372                 const TKeyEvent& aKeyEvent, 
       
   373                 TEventCode aType );
       
   374         void RestorePrevNaviDecoratorL();
       
   375         void RestoreStatusPaneL(); 
       
   376         static TInt DelayDlgDeleteCallBack( TAny* aCallBack );
       
   377         void DelayDlgDelete();
       
   378 
       
   379     private: // Data structures
       
   380 
       
   381         /**
       
   382          * Exit states.
       
   383          */
       
   384         enum TExitState
       
   385             {
       
   386             EExitOrdered,
       
   387             EExitApproved,
       
   388             EOkToExitWithoutHandlingIt
       
   389             };
       
   390         /**
       
   391          * Using states.
       
   392          */
       
   393         enum TUseState
       
   394             {
       
   395             EUseReady,
       
   396             EUseOperatingContact,
       
   397             EUseFinished
       
   398             };
       
   399 
       
   400     private: // Data
       
   401         /// Ref: Editor parameters
       
   402         TPbk2ContactEditorParams& iParams;
       
   403         /// Own: Context menu bar
       
   404         CEikMenuBar* iContextMenuBar;
       
   405         /// Ref: Application's title pane
       
   406         CAknTitlePane* iTitlePane;
       
   407         /// Own: Title pane text to restore on exit
       
   408         HBufC* iStoredTitlePaneText;
       
   409         /// Ref: A strategy for the editor
       
   410         MPbk2ContactEditorStrategy& iEditorStrategy;
       
   411         /// Ref: Phonebook 2 field properties
       
   412         CPbk2FieldPropertyArray& iFieldProperties;
       
   413         /// Ref: Presentation level contact
       
   414         CPbk2PresentationContact& iContact;
       
   415         /// Ref: For setting the title of the contact
       
   416         MPbk2ContactNameFormatter* iNameFormatter;
       
   417         /// Own: Manages dialog fields
       
   418         CPbk2ContactEditorFieldArray* iUiFieldArray;
       
   419         /// Own: Exit information for TExitState
       
   420         TBitFlags8 iExitRecord;
       
   421         /// Own: Contact editor extension
       
   422         MPbk2ContactEditorExtension* iEditorExtension;
       
   423         /// Ref: Observer for the contact being edited
       
   424         MPbk2EditedContactObserver& iContactObserver;
       
   425         /// Own: Add item selection index
       
   426         TInt iAddItemSelectionIndex;
       
   427         /// Ref: Contact relocator
       
   428         MPbk2ContactEditorContactRelocator& iRelocator;
       
   429         /// Ref: Extension manager
       
   430         CPbk2UIExtensionManager* iExtensionManager;
       
   431         /// Ref: Status pane handle
       
   432         CAknNavigationControlContainer* iNaviContainer;
       
   433         /// Ref: Pointer to dialog eliminator
       
   434         MPbk2DialogEliminator** iSelfPtr;
       
   435         /// Own: Current CBA command set
       
   436         TInt iCbaCommandSet;
       
   437         ///Own: Handle to basecommand object
       
   438         MPbk2BaseCommand* iPbk2BaseCommand; 
       
   439         //Ref: Temp holder for last created custom control
       
   440         CCoeControl* iLastCreatedCustomControl;
       
   441         // Own: In order to prevent execution of multiple commands in case
       
   442         //      user taps fast enough touch ui.
       
   443         TBool iCommandPending;
       
   444         /// Own: 'end-key' was pressed
       
   445         TBool iEndKeyWasPressed;
       
   446         /// Field factory
       
   447         CPbk2ContactEditorFieldFactory* iFieldFactory;
       
   448         /// Ref: Instance of Address View
       
   449         CPbk2ContactEditorDlgImpl* iAddressView;
       
   450         /// Own: If we are in stand alone Address View
       
   451         TBool iAddressViewStandalone;
       
   452         /// Dialog using state
       
   453         TUseState iUseState;
       
   454         /// Own: Wait until finish contact store operation
       
   455         CActiveSchedulerWait* iWaitFinish;
       
   456         /// Own: User input blocker
       
   457         CAknInputBlock* iInputBlock;
       
   458         // Own: Whether the service has been canceled
       
   459         TBool iServiceCanceled;
       
   460         // Own: A store contact
       
   461         MVPbkStoreContact* iStoreContact;
       
   462         // Ref: Pbk2 application services
       
   463         MPbk2ApplicationServices* iAppServices;
       
   464         // Own: Custom title text
       
   465         HBufC* iTitleText;
       
   466         /// Own: Converts text between Unicode and SMS 7-bit 
       
   467         CCnvCharacterSetConverter* iConverter;
       
   468         /// Ref: A pointer to stack variable in CloseDialog() for knowing
       
   469         /// if the destructor has already been called
       
   470         TBool* iDestroyedPtr;
       
   471         /// Ref: Holds the TopMost NaviDecorator before pushing 
       
   472         /// the empty one on to the top.
       
   473         /// Doesnt Own.
       
   474         CAknNavigationDecorator* iPrevNaviDecorator;
       
   475         
       
   476         TInt iCurrentstatuspane;
       
   477         /// Own: For asynchronously delete editordlg.
       
   478         CIdle* iDelayDelete;
       
   479     };
       
   480 
       
   481 #endif // CPBK2CONTACTEDITORDLGIMPL_H
       
   482 
       
   483 // End of File