uifw/AvKon/src/AknForm.cpp
changeset 0 2f259fa3e83a
child 10 9f56a4e1b8ab
--- /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 <AknForm.h>
+#include <AknQueryDialog.h>
+#include <eikdialg.h>
+#include <eikmenub.h>
+#include <eikenv.h>
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <uikon/eikenvinterface.h>
+#endif
+#include <eikappui.h>
+#include <eiklabel.h>
+#include <eikedwin.h>
+#include <barsread.h>
+
+#include <avkon.hrh>
+#include <avkon.rsg>
+#include <aknnotedialog.h>
+#include <eikcapc.h>
+#include "aknenv.h"
+#include <eikedwin.h>
+
+#ifdef RD_UI_TRANSITION_EFFECTS_POPUPS
+#include <gfxtranseffect/gfxtranseffect.h>
+#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<KFurtherTextIrrelevant> 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();
+	}