diff -r 000000000000 -r 2f259fa3e83a uifw/AvKon/src/AknForm.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/AvKon/src/AknForm.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,454 @@ +/* +* 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: +* +*/ + +// AknForm.cpp +// +// Copyright (c) 2001 Symbian Ltd. All rights reserved. +// + + +#include +#include +#include +#include +#include +#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#endif +#include +#include +#include +#include + +#include +#include +#include +#include +#include "aknenv.h" +#include + +#ifdef RD_UI_TRANSITION_EFFECTS_POPUPS +#include +#endif + +/** + * Local Panic Function and Panic Codes (Shared by AknDialog & AknForm) + */ +enum TPanicCodes + { + EGeneralFormPanic, + ENoMenuBar, + EMenuCommandUnknown + }; + +void Panic(TPanicCodes aPanic) + { + _LIT(kForm, "AVKON-FORM"); + User::Panic(kForm, aPanic); + } + +/** + * Constructor + */ +EXPORT_C CAknForm::CAknForm() + { +#ifdef RD_UI_TRANSITION_EFFECTS_POPUPS + GfxTransEffect::Deregister( this ); +#endif + iWsBufferRequestID = iAvkonEnv->RequestWsBuffer( 16000 ); + } + +/** + * Creates a default Form menu using default form menu resource. + * (note that the parameter, a new menu bar resource, is saved for later. + */ +EXPORT_C void CAknForm::ConstructL(TInt aMenuBarId) + { + iMenuBarId = aMenuBarId; + CAknDialog::ConstructL(R_AVKON_FORM_MENUBAR); + } + +/** + * + */ +EXPORT_C CAknForm::~CAknForm() + { + // cancels large WS client buffer required by form + iAvkonEnv->CancelWsBufferRequest( iWsBufferRequestID ); + } + +/** + * This function intialises the items on the menu. It's used to disable and enable menu items and may be + * over riden to add new ones. + * In addition it adds menu items which have been provided in the ContsructL in the form of a Menu Bar resource. + * Instead of using the Menu Bar directly it extracts the menu panes and adds them to it's own menu pane. + * It must be called in the DynInitMenuPaneL() function of any derived class before anything else!! + * + */ +EXPORT_C void CAknForm::DynInitMenuPaneL(TInt aResourceId, CEikMenuPane* aMenuPane) + { + if (aResourceId == R_AVKON_FORM_MENUPANE) + { + if (iMenuBarId) + { + + TResourceReader reader; + iCoeEnv->CreateResourceReaderLC(reader, iMenuBarId); + + TInt count = reader.ReadInt16(); // Number of menu panes + while (count--) + { + TInt menuPaneResourceId = reader.ReadInt32(); + reader.ReadTPtrC(); // read and ignore the rest... + reader.ReadInt32(); + reader.ReadTPtrC(); + reader.ReadInt16(); + reader.ReadInt16(); + reader.ReadInt32(); + aMenuPane->AddMenuItemsL(menuPaneResourceId, 0, ETrue); // at the top, with a separator + } + CleanupStack::PopAndDestroy(); // Resource Reader + } + + TBool editOptionDimmed = IsEditable(); + aMenuPane->SetItemDimmed(EAknFormCmdEdit, editOptionDimmed); + aMenuPane->SetItemDimmed(EAknFormCmdSave, !editOptionDimmed); + aMenuPane->SetItemDimmed(EAknFormCmdLabel, !editOptionDimmed); + aMenuPane->SetItemDimmed(EAknFormCmdAdd, !editOptionDimmed); + aMenuPane->SetItemDimmed(EAknFormCmdDelete, !editOptionDimmed); + } + } + +/** + *From MEikCommandObserver (act on the menu selection if menu is showing - pass on to client if not processed here) + */ +EXPORT_C void CAknForm::ProcessCommandL(TInt aCommandId) + { + CAknDialog::ProcessCommandL(aCommandId); + + switch (aCommandId) + { + case EAknFormCmdEdit : // Change into edit state + if (!IsEditable()) + SetEditableL(ETrue); + break; + case EAknFormCmdAdd : // Add Field to Form (display dialog) + AddItemL(); + break; + case EAknFormCmdSave : // Save form data (must be implemented by Child) and revert to View Mode + if (SaveFormDataL()) + { + SetChangesPending( EFalse ); + TBool hasEditModeOnly = FormFlagsFromActivePage()&EEikFormEditModeOnly; + if (!hasEditModeOnly) + SetEditableL(EFalse); + } + break; + case EAknFormCmdLabel : // Edit selected label (display dialog) + EditCurrentLabelL(); + break; + case EAknFormCmdDelete : // Delete selected item (control) + DeleteCurrentItemL(); + break; + default : + // Default action is to do nothing. + // Mustn't panic as this function might be called by a child which has already + // acted upon an action which it has added to the menu. + break; + } + } + + +/** + * From CEikDialog (thence MEikDialogPageObserver) + * If deleting then this routine must not do anything (the default tries to access the control + * which has just been deleted!) + */ +EXPORT_C void CAknForm::PrepareForFocusTransitionL() + { + if (!Deleting()) + CAknDialog::PrepareForFocusTransitionL(); + } + + + +/** + * + * From CEikDialog - Use this to pop up the options menu or close the dialog. + * Will call SaveFormDataL() before closing if data has been edited. + * Will NOT permit exit if attempt to save data fails. + */ +EXPORT_C TBool CAknForm::OkToExitL(TInt aButtonId) + { + TBool hasEditModeOnly = FormFlagsFromActivePage()&EEikFormEditModeOnly; + + if (iMenuBar) + HideMenu(); + + if (aButtonId == EAknSoftkeyOptions) + { + DisplayMenuL(); + return EFalse; + } + else if ( aButtonId == EAknSoftkeyBack) + { + if (IsEditable()) + { + TBool mayExitEditMode = ETrue; + if (UnsavedEdit()) + { + if ( QuerySaveChangesL() ) + { + // User has chosen to save. Attempt to save. Implementation of this + // may in some situations return EFalse. This will prevent leaving edit + // mode + mayExitEditMode = SaveFormDataL(); + if ( mayExitEditMode ) + SetChangesPending( EFalse ); + } + else // introduced to allow users to re-set data when a save is undesired. + DoNotSaveFormDataL(); + } + if (hasEditModeOnly) + { + if ( !mayExitEditMode ) + return EFalse; // stay in Form because save failed + } + else + { + if ( mayExitEditMode ) + SetEditableL(EFalse); // go out of edit mode of Form + return EFalse; // remain in form ( but in view mode if save was OK). + } + + } // end of if (IsEditable()) + + return ETrue; + } + else if (aButtonId == EAknSoftkeyChange) + { + if (ControlOrNull(IdOfFocusControl())) + { + // we need to inform popup field about MSK event + TKeyEvent event = { EKeyOK, EKeyOK, EModifierPureKeycode, 0 }; + Line(IdOfFocusControl())->OfferKeyEventL(event, EEventKey ); + } + } + return EFalse; + } + +EXPORT_C void CAknForm::HandleResourceChange(TInt aType) + { + CEikDialog::HandleResourceChange(aType); + } + + + +/** + * This routine should be re-implemented by the client to save the contents of the form. + * The re-implementation can call this function to display the 'Saved' dialog. + * (CAknForm::SaveFormDataL()) + * + * This should return ETrue unless there was a problem saving that the user can circumvent + * If it is a serious system problem, then a Leave should be generated + * + * Note that the changes pending flag is not cleared here ( but you could if you want to ); + * it is the responsibility of the caller to clear iff return is ETrue. + */ +EXPORT_C TBool CAknForm::SaveFormDataL() + { + return (ETrue); + } + +/** + * This routine may be overridden. Default displays 'Save Changes Dialog Yes/No' + * Returns ETrue if Changes are requested to be saved and then are successfully saved + * + * Re-implementation may put data validation here (as an alternative to over-riding + * OkToExit - which is a more complicated method ) + * + * Note that this routine does not perform the changes itself. + */ +EXPORT_C TBool CAknForm::QuerySaveChangesL() + { + CAknQueryDialog* saveChangesDialog = CAknQueryDialog::NewL(); + TInt option = saveChangesDialog->ExecuteLD(R_AVKON_FORM_DEFAULT_SAVE_CHANGES_DIALOG); + return ( option ); + } + +EXPORT_C void CAknForm::SetChangesPending(TBool aChangesPending) + { + SetFormFlag( EUnsavedEdit, aChangesPending ); + } + + +/** + * This routine may be overridden. Default displays old label as caption and editor for new one + * Uses customised dialog + */ +EXPORT_C void CAknForm::EditCurrentLabelL() + { + const TInt KFurtherTextIrrelevant=30; + if (!ControlOrNull(IdOfFocusControl())) + return; + TPtrC originalLabel = Line(IdOfFocusControl())->GetFullCaptionText(); + TBuf buf= originalLabel.Left(KFurtherTextIrrelevant); + TResourceReader reader ; + iCoeEnv->CreateResourceReaderLC( reader, R_AVKON_TEXT_EDIT_LABEL_QUERY_TEXT ) ; + HBufC* editLabelQueryPrompt = reader.ReadHBufCL(); + CleanupStack::PushL(editLabelQueryPrompt); + CAknTextQueryDialog* dlg = CAknTextQueryDialog::NewL(buf); + dlg->PrepareLC(R_AVKON_DEFAULT_EDIT_LABEL_QUERY); + dlg->SetPromptL(*editLabelQueryPrompt); + TInt queryOk = dlg->RunLD(); + CleanupStack::PopAndDestroy(); // editLabelQueryPrompt + CleanupStack::PopAndDestroy(); // reader + if(queryOk == EAknSoftkeyOk) + { + SetFormFlag( EUnsavedEdit, ETrue ); + TRAP_IGNORE(Line(IdOfFocusControl())->SetCaptionL(buf)); + } + DrawNow(); + } + +/** + * This routine may be overridden. Default displays delete item? Yes/No + * Deletes Item on return from Dialog before returning + */ +EXPORT_C void CAknForm::DeleteCurrentItemL() + { + CAknQueryDialog* deleteItemDialog = CAknQueryDialog::NewL(); + TInt option = deleteItemDialog->ExecuteLD(R_AVKON_FORM_DEFAULT_DELETE_ITEM_DIALOG); + if (option == EAknSoftkeyYes) + { + SetFormFlag( EDeleting, ETrue ); + + TInt LineForDeletion = IdOfFocusControl(); + + if (LineForDeletion) + { + DeleteLine(LineForDeletion); + SetFormFlag( EUnsavedEdit, ETrue ); + } + DrawNow(); + SetFormFlag( EDeleting, EFalse ); + } + } + +/** + * This routine may be overridden. Default displays Add Item + * Uses customised dialog + */ +EXPORT_C void CAknForm::AddItemL() + { + } + + +/** + * + */ +EXPORT_C TBool CAknForm::UnsavedEdit() const + { + return (iFlags & EUnsavedEdit); + } + +EXPORT_C TBool CAknForm::Deleting() const + { + return (iFlags & EDeleting); + } + + +EXPORT_C void CAknForm::PostLayoutDynInitL() + { + if (FormFlagsFromActivePage()&EEikFormEditModeOnly) + SetEditableL(ETrue); + else + SetEditableL(EFalse); + } + +/* +Overridden, so that the form can tell if a line's state has changed. +This is used to decide when to save changes. +*/ + +EXPORT_C void CAknForm::HandleControlStateChangeL(TInt aControlId) + { + SetChangesPending(ETrue); + CAknDialog::HandleControlStateChangeL(aControlId); + } + +/* +This is added, so that anyone adding lines either in PreLayoutDynInit or SetInitialCurrentLine +should have the lines in a consistent state. +*/ +EXPORT_C void CAknForm::SetInitialCurrentLine() + { + // call SetEditableL again to put controls in consistent state. + + TRAP_IGNORE(SetEditableL(IsEditable())); // re-run the seteditable to ensure any added lines are in consistent state. + // ignore e. + CAknDialog::SetInitialCurrentLine(); + } + +EXPORT_C void CAknForm::SetFormFlag(enum CAknForm::TFlags aFlagPattern, TBool aSetTheFlag ) + { + if ( aSetTheFlag ) + iFlags |= aFlagPattern; + else + iFlags &= (~aFlagPattern); + } + +EXPORT_C void CAknForm::HandlePointerEventL(const TPointerEvent& aPointerEvent) + { + CAknDialog::HandlePointerEventL(aPointerEvent); + } + +EXPORT_C void* CAknForm::ExtensionInterface( TUid /*aInterface*/ ) + { + return NULL; + } + + +EXPORT_C void CAknForm::DoNotSaveFormDataL() + { + + }; + +EXPORT_C void CAknForm::CEikDialog_Reserved_1() + { + + } + +EXPORT_C void CAknForm::CEikDialog_Reserved_2() + { + + } + +EXPORT_C void CAknForm::CAknDialog_Reserved() + { + + } + +EXPORT_C void CAknForm::CAknForm_Reserved() + { + + } + +void CAknForm::DoLayout() + { + Layout(); + }