williamr@2: /* williamr@2: * Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). williamr@2: * All rights reserved. williamr@2: * This component and the accompanying materials are made available williamr@4: * under the terms of "Eclipse Public License v1.0" williamr@2: * which accompanies this distribution, and is available williamr@4: * at the URL "http://www.eclipse.org/legal/epl-v10.html". williamr@2: * williamr@2: * Initial Contributors: williamr@2: * Nokia Corporation - initial contribution. williamr@2: * williamr@2: * Contributors: williamr@2: * williamr@2: * Description: williamr@2: * Phonebook Data Save service helper. Implements "Save to phonebook" williamr@2: * menu functionality for external applications. williamr@2: * williamr@2: */ williamr@2: williamr@2: williamr@2: #ifndef __CPbkDataSaveAppUi_H__ williamr@2: #define __CPbkDataSaveAppUi_H__ williamr@2: williamr@2: // INCLUDES williamr@2: #include williamr@2: williamr@2: // FORWARD DECLARATIONS williamr@2: class CEikMenuPane; williamr@2: class CPbkContactEngine; williamr@2: class CPbkContactItem; williamr@2: class CPbkFieldInfo; williamr@2: class MPbkDataSaveCallback; williamr@2: class CPbkFFSCheck; williamr@2: class CPbkExtGlobals; williamr@2: williamr@2: williamr@2: // CLASS DECLARATION williamr@2: williamr@2: /** williamr@2: * Phonebook Data Save service helper. Implements "Save to phonebook" williamr@2: * menu functionality for external applications. williamr@2: * williamr@2: * Note that in most cases current status pane layout is replaced with the williamr@2: * Phonebook one. Restoring the original pane is left to be williamr@2: * the responsibility of the client. williamr@2: */ williamr@2: class CPbkDataSaveAppUi : public CBase williamr@2: { williamr@2: public: // Interface williamr@2: /** williamr@2: * Creates an instance of this class. williamr@2: * williamr@2: * @param aEngine Phonebook engine instance. williamr@2: */ williamr@2: IMPORT_C static CPbkDataSaveAppUi* NewL(CPbkContactEngine& aEngine); williamr@2: williamr@2: /** williamr@2: * Destructor. Destroys this object and cancels any open dialogs. williamr@2: */ williamr@2: ~CPbkDataSaveAppUi(); williamr@2: williamr@2: /** williamr@2: * Adds Phonebook data save menu items to a menu pane. Called from williamr@2: * applications DynInitMenuPaneL. This call is not mandatory: williamr@2: * if the application provides its own menus it may call williamr@2: * HandleCommandL directly from menu's command handler. williamr@2: * williamr@2: * @param aMenuPane Menu pane where to add the menu items. williamr@2: * @param aCommandId Id of command which to replace with Phonebook williamr@2: * data save menu items. This command id is stored williamr@2: * into this object as the base id after which are williamr@2: * app-specific command Ids reserved for Phonebook williamr@2: * data save API usage. williamr@2: * @see DynInitMenuPaneL williamr@2: * @see HandleCommandL williamr@2: */ williamr@2: IMPORT_C void AddMenuItemsL(CEikMenuPane* aMenuPane, TInt aCommandId); williamr@2: williamr@2: /** williamr@2: * Updates Phonebook data save menu items. Called from applications williamr@2: * DynInitMenuPaneL. This call is not mandatory: if the application williamr@2: * provides its own menus it may call HandleCommandL directly williamr@2: * from menu's command handler. williamr@2: * williamr@2: * @param aResourceId Resource id of the menu pane as passed to williamr@2: * MEikMenuObserver::DynInitMenuPaneL. If this williamr@2: * resource id does not match with Phonebook data williamr@2: * save submenu this function does nothing. williamr@2: * @param aMenuPane Menu pane as passed to williamr@2: * MEikMenuObserver::DynInitMenuPaneL. williamr@2: * @see AddMenuItemsL williamr@2: */ williamr@2: IMPORT_C void DynInitMenuPaneL(TInt aResourceId, CEikMenuPane* aMenuPane); williamr@2: williamr@2: /** williamr@2: * Handles a menu command inserted by AddMenuItemsL. williamr@2: * williamr@2: * @param aCommandId Command to execute. iBaseCommandId+1 is williamr@2: * Create New Entry and iBaseCommandId+2 is williamr@2: * Add to Existing Entry. Use directly williamr@2: * EPbkCmdDataSaveCreateNew or EPbkCmdDataSaveAddToExisting williamr@2: * if AddMenuItemsL is not called. williamr@2: * @param aFieldTypes Field types where the user can select from. williamr@2: * If there is only one field type selection williamr@2: * list is not displayed. williamr@2: * @param aText Text to put to the selected field. williamr@2: * @param aCallback Calls back to this object if there are williamr@2: * problems in adding the field. See williamr@2: * MPbkDataSaveCallback class for details. williamr@2: * @return ETrue if the command was executed and the data added, williamr@2: * EFalse if the operation was canceled in any stage. williamr@2: * @see AddMenuItemsL williamr@2: * @see MPbkDataSaveCallback williamr@2: * @see TPbkDataSaveCommandId in PbkDataSaveAppUi.hrh williamr@2: */ williamr@2: IMPORT_C TBool HandleCommandL williamr@2: (TInt aCommandId, williamr@2: CArrayPtr& aFieldTypes, williamr@2: const TDesC& aText, williamr@2: MPbkDataSaveCallback* aCallback=NULL); williamr@2: williamr@2: /** williamr@2: * Handles a menu command inserted by AddMenuItemsL. williamr@2: * williamr@2: * @param aCommandId Command to execute. iBaseCommandId+1 is williamr@2: * Create New Entry and iBaseCommandId+2 is williamr@2: * Add to Existing Entry. Use directly williamr@2: * EPbkCmdDataSaveCreateNew or EPbkCmdDataSaveAddToExisting williamr@2: * if AddMenuItemsL is not called. williamr@2: * @param aFieldTypes Field types where the user can select from. williamr@2: * If there is only one field type selection williamr@2: * list is not displayed. williamr@2: * @param aDate Date to put to the selected field. williamr@2: * @param aCallback Calls back to this object if there are williamr@2: * problems in adding the field. See williamr@2: * MPbkDataSaveCallback class for details. williamr@2: * @return ETrue if the command was executed and the data added, williamr@2: * EFalse if the operation was canceled in any stage. williamr@2: * @see AddMenuItemsL williamr@2: * @see MPbkDataSaveCallback williamr@2: * @see TPbkDataSaveCommandId in PbkDataSaveAppUi.hrh williamr@2: */ williamr@2: IMPORT_C TBool HandleCommandL williamr@2: (TInt aCommandId, williamr@2: CArrayPtr& aFieldTypes, williamr@2: const TTime& aDate, williamr@2: MPbkDataSaveCallback* aCallback=NULL); williamr@2: williamr@2: /** williamr@2: * Hides the "Exit" command from contact editor's options menu. williamr@2: * Call this function after creating this object. williamr@2: */ williamr@2: IMPORT_C void HideEditorExitCommand(); williamr@2: williamr@2: private: // Implementation williamr@2: class MFieldData; williamr@2: class CTextFieldData; williamr@2: class CDateFieldData; williamr@2: class CCommandBase; williamr@2: class CCreateNewCommand; williamr@2: class CAddToExistingCommand; williamr@2: CPbkDataSaveAppUi(CPbkContactEngine& aEngine); williamr@2: void ConstructL(); williamr@2: TBool DoHandleCommandL williamr@2: (TInt aCommandId, williamr@2: CArrayPtr& aFieldTypes, williamr@2: MFieldData& aFieldData, williamr@2: MPbkDataSaveCallback* aCallback); williamr@2: williamr@2: private: // Data williamr@2: /// Ref: Phonebook engine instance williamr@2: CPbkContactEngine* iEngine; williamr@2: /// Own: FFS space checker williamr@2: CPbkFFSCheck* iFFSCheck; williamr@2: /// Own: base command id williamr@2: TInt iBaseCommandId; williamr@2: /// Own: the currently executing command williamr@2: CCommandBase* iExecutingCommand; williamr@2: /// Own: flags williamr@2: TUint iFlags; williamr@2: /// Own: handle to UI extension factory williamr@2: CPbkExtGlobals* iExtGlobals; williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: * Callback interface for CPbkDataSaveAppUi::HandleCommandL. williamr@2: */ williamr@2: class MPbkDataSaveCallback williamr@2: { williamr@2: public: // Interface williamr@2: /** williamr@2: * Called by CPbkDataSaveAppUi::HandleCommandL if there is no field williamr@2: * available where to save the data and no new field could be added. williamr@2: * Default implementation does nothing. williamr@2: * williamr@2: * @param aContact Contact where the field cannot be added. williamr@2: */ williamr@2: IMPORT_C virtual void PbkDataSaveNoFieldL(CPbkContactItem& aContact); williamr@2: williamr@2: /** williamr@2: * Called from CPbkDataSaveAppUi::HandleCommandL if the aText is too williamr@2: * long to fit into field. williamr@2: * Default implementation clips aText from the end. If an empty williamr@2: * string is returned the field addition is canceled. williamr@2: * williamr@2: * @param aText The original text. williamr@2: * @param aFieldInfo The type of field where the text should be williamr@2: * inserted. williamr@2: * @return A substring of aText so that the substring's length is williamr@2: * <=aFieldInfo.MaxLength(). williamr@2: */ williamr@2: IMPORT_C virtual TPtrC PbkDataSaveClipTextL williamr@2: (const TDesC& aText, CPbkFieldInfo& aFieldInfo); williamr@2: }; williamr@2: williamr@2: #endif // __CPbkDataSaveAppUi_H__ williamr@2: williamr@2: // End of File