uifw/EikStd/dlgsrc/EIKDIALG.CPP
branchRCL_3
changeset 56 d48ab3b357f1
parent 55 aecbbf00d063
child 59 978afdc0236f
--- a/uifw/EikStd/dlgsrc/EIKDIALG.CPP	Tue Aug 31 15:28:30 2010 +0300
+++ b/uifw/EikStd/dlgsrc/EIKDIALG.CPP	Wed Sep 01 12:16:19 2010 +0100
@@ -41,6 +41,7 @@
 #include <eikdpage.h>
 #include <eikmop.h>
 #include <aknenv.h>
+#include <touchfeedback.h>
 //<SKIN>
 #include "eikdialogext.h"
 #include <AknsListBoxBackgroundControlContext.h>
@@ -69,8 +70,11 @@
 #endif
 #include <AknQueryDialog.h>
 #include <aknQueryControl.h>
+#include <aknitemactionmenuregister.h>
+#include <layoutmetadata.cdl.h>
 
 #include "akncbacontentobserver.h"
+#include "akntrace.h"
 
 TBool IsBlankScreenDisplayed();
 
@@ -82,10 +86,10 @@
 //
 TBool CbaEmbeddedInDialog( const TInt& aFlags )
     {
-    return AknLayoutUtils::PenEnabled() && 
-        !( aFlags & EEikDialogFlagFillAppClientRect ) &&
+    return !( aFlags & EEikDialogFlagFillAppClientRect ) &&
         !( aFlags & EEikDialogFlagFillScreen ) &&
-        !( aFlags & EEikDialogFlagVirtualInput );
+        !( aFlags & EEikDialogFlagVirtualInput ) &&
+        !( aFlags & EEikDialogFlagNoEmbeddedSoftkeys );
     }
 
 
@@ -120,6 +124,7 @@
 //
 TBool IsFocusedWindowGroup( CEikDialog* aThis )
     {
+	_AKNTRACE_FUNC_ENTER;
     RWindowTreeNode* node = aThis->DrawableWindow();
     // this code finds out if this control belongs to window group
     // that is in focus, there are some rare cases when the latest opened
@@ -152,9 +157,13 @@
 
         if ( focusedWindowGroupId == wgId )
             {
+            _AKNTRACE( "return ETrue;");
+            _AKNTRACE_FUNC_EXIT;
             return ETrue;
             }
         }
+    _AKNTRACE( "return EFalse;");
+    _AKNTRACE_FUNC_EXIT;
     return EFalse;
     }
 
@@ -209,6 +218,7 @@
 
 EXPORT_C CEikDialog::CEikDialog()
     {
+	_AKNTRACE_FUNC_ENTER;
 //	__DECLARE_NAME(_S("CEikDialog"));
 //	No border in Avkon
 	iBorder=TGulBorder(TGulBorder::ENone);
@@ -221,12 +231,16 @@
     GfxTransEffect::Register(this,KGfxPopupDefaultControlUid);
 #endif
     AKNTASHOOK_ADD( this, "CEikDialog" );
+	_AKNTRACE_FUNC_EXIT;
     }
 
 EXPORT_C CEikDialog::~CEikDialog()
     {
+	_AKNTRACE_FUNC_ENTER;
     AKNTASHOOK_REMOVE();
 
+    AknItemActionMenuRegister::RemoveConstructingMenuBarOwner( this );
+
     EnableContentObserver( EFalse );
 
     if ( GfxTransEffect::IsRegistered( this ) )
@@ -253,10 +267,12 @@
 	delete iExtension ;
 	iExtension = NULL;
 	StopWaitingAsRequired();
+	_AKNTRACE_FUNC_EXIT;
     }
 
 void CEikDialog::DynamicConstructL()
 	{
+	_AKNTRACE_FUNC_ENTER;
     PreLayoutDynInitL();
 
     if ( iPageSelector && iPageSelector->IsForm() && Extension() )
@@ -266,8 +282,42 @@
 
     EnableContentObserver( ETrue );
 
+    // Extension member variable iDeleteEmbeddedCba is used to track whether
+    // dialog's implementation of CCoeControl::SizeChanged gets called. If it
+    // isn't then embedded softkeys won't work.
+    CEikDialogExtension* extension = Extension();
+    TBool checkCba = extension && iButtonGroupContainer 
+            && CbaEmbeddedInDialog( iDialogFlags );
+        
+    if ( checkCba )
+        {
+        extension->iDeleteEmbeddedCba = ETrue;
+        }
+
     Layout();
+
+    // At this point CBA's rect should be correctly set. If it isn't, then
+    // assume that dialog didn't properly call CEikDialog::SizeChanged thus 
+    // embedded softkeys won't work.
+    // In that case softkeys are deleted and re-created as a window-owning
+    // component in "legacy" way.
+    if (checkCba && extension->iButtonGroupResourceId != 0 &&
+        (extension->iDeleteEmbeddedCba || Size().iWidth <= 0))
+        {
+        delete iButtonGroupContainer;
+        iButtonGroupContainer = NULL;
+        iButtonGroupContainer = CEikButtonGroupContainer::NewL(
+                CEikButtonGroupContainer::ECba,
+                CEikButtonGroupContainer::EHorizontal,
+                iButtonCommandObserver,
+                extension->iButtonGroupResourceId,
+                0 );
+
+        iDialogFlags |= EEikDialogFlagNoEmbeddedSoftkeys; 
+        }
+
     PostLayoutDynInitL();
+    _AKNTRACE_FUNC_EXIT;
 	}
 
 /**
@@ -279,6 +329,7 @@
  */
 EXPORT_C void CEikDialog::PrepareLC(TInt aResourceId)
     {
+	_AKNTRACE_FUNC_ENTER;
     CleanupStack::PushL(this);
 	BaseConstructL();
     StaticConstructL(aResourceId);
@@ -287,6 +338,7 @@
 		{
 		AknGlobalPopupPriorityController::AddPopupToControlStackL(*this,ECoeStackPriorityDialog,ECoeStackFlagRefusesAllKeys);
 		}
+	_AKNTRACE_FUNC_EXIT;
     }
 
 /**
@@ -310,12 +362,15 @@
  */
 EXPORT_C TInt CEikDialog::ExecuteLD(TInt aResourceId)
     {
+	_AKNTRACE_FUNC_ENTER;
 	PrepareLC(aResourceId);
+	_AKNTRACE_FUNC_EXIT;
 	return(RunLD());
     }
 
 void CEikDialog::BaseConstructL()
 	{
+	_AKNTRACE_FUNC_ENTER;
     CreateWindowL();
 	Window().SetBackgroundColor(iEikonEnv->ControlColor(EColorDialogBackground,*this));
 	EnableDragEvents();
@@ -328,10 +383,14 @@
         {
 	    iExtension = CEikDialogExtension::NewL( *this ) ;        
         }
+    _AKNTRACE_FUNC_EXIT;
 	}
 
 void CEikDialog::StaticConstructL(TInt aResourceId)
     {
+	_AKNTRACE_FUNC_ENTER;
+    AknItemActionMenuRegister::SetConstructingMenuBarOwnerL( this );
+
     TResourceReader reader;
     iCoeEnv->CreateResourceReaderLC(reader,aResourceId);
     ConstructFromResourceL(reader);
@@ -351,6 +410,7 @@
                 }
             }
         }
+    _AKNTRACE_FUNC_EXIT;
     }
 
 /**
@@ -379,6 +439,7 @@
 	// code common to both ConstructSleepingDialogL & ConstructSleepingAlertDialogL
 	//
 	{
+	_AKNTRACE_FUNC_ENTER;
 	iDialogFlags|=EEikDialogFlagSleeping;
 	BaseConstructL();
 	StaticConstructL(aResourceId);
@@ -388,10 +449,12 @@
 		// non visible CBA's do not recieve keys
 		iButtonGroupContainer->MakeVisible(EFalse);
 		}
+    _AKNTRACE_FUNC_EXIT;
 	}
 
 TInt CEikDialog::WaitAsRequired()
     {
+	_AKNTRACE_FUNC_ENTER;
     TInt exitConfirmed=0;
 #if defined (__DEBUG__)
 	RDebug::ProfileEnd(PROFILE_POINT_EIKON_DIALOG_LOAD);
@@ -408,7 +471,7 @@
 		iExitConfirmed=(&exitConfirmed);
         iWait.Start();
         }
-
+    _AKNTRACE_FUNC_EXIT;
 	return(exitConfirmed);
     }
 
@@ -423,6 +486,7 @@
  */
 EXPORT_C TInt CEikDialog::RouseSleepingDialog()
 	{ // none of following ...L calls to Leave
+	_AKNTRACE_FUNC_ENTER;
 	if (IsVisible())
 		ExitSleepingDialog(); // eg for rousing an already roused Alert dialog
 
@@ -541,7 +605,7 @@
 			cba->DrawNow();
 			}
 		}
-
+	_AKNTRACE_FUNC_EXIT;
     return(WaitAsRequired());
 	}
 
@@ -550,6 +614,7 @@
  */
 EXPORT_C void CEikDialog::ExitSleepingDialog()
 	{
+	_AKNTRACE_FUNC_ENTER;
 	FadeBehindPopup(EFalse);
 
     EnableContentObserver( EFalse );
@@ -615,6 +680,7 @@
 	    }
 #endif
     CancelMediatorCommand(this);	
+	_AKNTRACE_FUNC_EXIT;
 	}
 
 /**
@@ -638,6 +704,7 @@
  */
 EXPORT_C void CEikDialog::ConstructFromResourceL(TResourceReader& aReader)
     {
+	_AKNTRACE_FUNC_ENTER;
     iDialogFlags |=aReader.ReadInt32();
             
 #ifdef RD_SCALABLE_UI_V2            
@@ -667,6 +734,7 @@
 		ASSERT(aReader.ReadInt16()==0);
 	
 	SetBorderStyle();  // Moved to the end of construction to allow access to individual lines.
+	_AKNTRACE_FUNC_EXIT;
 	}
 
 void CEikDialog::SetBorderStyle()
@@ -686,13 +754,16 @@
 
 void CEikDialog::CreatePageSelectorL()
 	{
+	_AKNTRACE_FUNC_ENTER;
 	iPageSelector=CEikDialogPageSelector::NewL(*this,this);
 	iPageSelector->SetObserver(this);
 	RegisterDialgWithPageSelector(); // Added JIn
+	_AKNTRACE_FUNC_EXIT;
 	}
 
 void CEikDialog::CreatePageSelectorL(TInt aResourceId)
 	{
+	_AKNTRACE_FUNC_ENTER;
 	if (aResourceId)
 		{
 		TResourceReader reader;
@@ -704,6 +775,7 @@
 			iPageSelector->SetAllPagesDensePacked(ETrue);
 		RegisterDialgWithPageSelector(); // Added JIn
 		}
+	_AKNTRACE_FUNC_EXIT;
 	}
 
 void CEikDialog::CreateButtonGroupContainerL(TInt aResourceId)
@@ -714,7 +786,7 @@
 	// don't activate them in case of sleeping dialog 
     // yet so extra drawings are suppressed until dialog is really
 	// roused to screen
-    
+	_AKNTRACE_FUNC_ENTER;
     TUint flags = ( iDialogFlags & EEikDialogFlagSleeping ) ?
                     ( CEikButtonGroupContainer::EAddToStack |
                     CEikButtonGroupContainer::EDelayActivation ) :
@@ -736,9 +808,15 @@
             iButtonCommandObserver, aResourceId, *this, flags );
 
     EnableContentObserver( ETrue );
+    
+    if ( Extension() )
+        {
+        Extension()->iButtonGroupResourceId = aResourceId;
+        }
 	
 	AknGlobalPopupPriorityController::AddSubPopupL(*this, *iButtonGroupContainer->ButtonGroup()->AsControl());
 	AknGlobalPopupPriorityController::AddPopupToControlStackL(*iButtonGroupContainer->ButtonGroup()->AsControl(), ECoeStackPriorityCba, ECoeStackFlagRefusesFocus);
+	_AKNTRACE_FUNC_EXIT;
 	}
 
 void CEikDialog::CreateTitleBarL()
@@ -770,38 +848,41 @@
  */
 EXPORT_C void CEikDialog::SetSizeAndPosition(const TSize& aSize)
     {
+	_AKNTRACE_FUNC_ENTER;
 	if (iDialogFlags&EEikDialogFlagFillAppClientRect)
 	    {
+        TRect destRect = iEikonEnv->EikAppUi()->ClientRect();       
         // if this is a view app then ask client rect from the currently active view
         TVwsViewId uid;    
         if ( iAvkonAppUi->GetActiveViewId( uid ) == KErrNone )
             {
             if ( uid.iAppUid != uid.iViewUid )
                 {
-                CAknView* view = iAvkonViewAppUi->View(uid.iViewUid);
-                if (view)
+                CAknView* view = iAvkonViewAppUi->View( uid.iViewUid );
+                if ( view )
                     {
-                    SetRect(view->ClientRect());
-                    }
-                else
-                    {
-                    SetRect(iEikonEnv->EikAppUi()->ClientRect());
+                    destRect = view->ClientRect();
                     }
                 }
-            else
+            }
+
+        if ( !Layout_Meta_Data::IsLandscapeOrientation() && iButtonGroupContainer != NULL )
+            {
+            TRect controlPane;
+            AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EControlPane, controlPane );
+
+            if ( destRect.iBr.iY > controlPane.iTl.iY )
                 {
-                SetRect(iEikonEnv->EikAppUi()->ClientRect());
+                destRect.iBr.iY = controlPane.iTl.iY;
                 }
-            }
-         else
-            {
-            SetRect( iEikonEnv->EikAppUi()->ClientRect() );
-            }
-	    }
+            }        
+        SetRect( destRect );
+        }
 	else
         {
         SetRect( TRect( AknPopupUtils::Position( aSize, this ), aSize ) );
         }
+	_AKNTRACE_FUNC_EXIT;
     }
 
 /**
@@ -821,6 +902,7 @@
  */
 EXPORT_C TSize CEikDialog::MinimumSize()
     {
+	_AKNTRACE_FUNC_ENTER;
 	if (iDialogFlags&EEikDialogFlagFillScreen)
         {
         TAknWindowLineLayout windowLineLayoutScreen = AknLayoutScalable_Avkon::Screen().LayoutLine();
@@ -861,7 +943,7 @@
         }
 
 	TSize pageSelectorSize(iPageSelector->MinimumSize());
-
+	_AKNTRACE_FUNC_EXIT;
 	return pageSelectorSize;
     }
 
@@ -872,6 +954,7 @@
  */
 EXPORT_C TSize CEikDialog::PreferredSize(const TSize& aMaxSize) const
 	{
+    _AKNTRACE_FUNC_ENTER;
 	if (iDialogFlags&EEikDialogFlagFillScreen)
 		return iEikonEnv->ScreenDevice()->SizeInPixels();
 	else if (iDialogFlags&EEikDialogFlagFillAppClientRect)
@@ -886,20 +969,24 @@
                 CAknView* view = iAvkonViewAppUi->View(uid.iViewUid);
                 if (view)
                     {
+                    _AKNTRACE_FUNC_EXIT;
                     return view->ClientRect().Size();
                     }
                 else
                     {
+                    _AKNTRACE_FUNC_EXIT;
                     return iEikonEnv->EikAppUi()->ClientRect().Size();
                     }
                 }
             else
                 {
+                _AKNTRACE_FUNC_EXIT;
                 return iEikonEnv->EikAppUi()->ClientRect().Size();
                 }
             }
         else
             {
+            _AKNTRACE_FUNC_EXIT;
             return iEikonEnv->EikAppUi()->ClientRect().Size();
             }
 	    }
@@ -950,6 +1037,7 @@
             }
         }
         
+    _AKNTRACE_FUNC_EXIT;
 	return preferredSize;
 	}
 
@@ -961,6 +1049,7 @@
  */
 EXPORT_C void CEikDialog::SizeChanged()
     {
+	_AKNTRACE_FUNC_ENTER;
 	__ASSERT_DEBUG( iButtonGroupContainer->Location() == CEikButtonGroupContainer::EExternal, 
 		Panic( EEikDialogPanicIllegalOption ) );
 
@@ -1017,7 +1106,12 @@
                 cba->SetRect( TRect(0, 0, 0, 0 ) );
                 }
             }
-		}
+
+        if ( Extension() )
+            {
+            Extension()->iDeleteEmbeddedCba = EFalse;
+            }
+        }
 	if (iTitleBar)
 		{
 		TRect nullRect(0,0,0,0);
@@ -1047,6 +1141,7 @@
 	// <SKIN>
 	iExtension->iBgContext->SetParentPos( PositionRelativeToScreen() ) ;
 	iExtension->iBgContext->SetRect( Rect() ) ;
+	_AKNTRACE_FUNC_EXIT;
 	}
 
 /**
@@ -1099,12 +1194,14 @@
  */
 EXPORT_C void CEikDialog::MakeLineVisible(TInt aControlId,TBool aVisible)
     {
+	_AKNTRACE_FUNC_ENTER;
     CEikCaptionedControl* line=Line(aControlId);
 	CCoeControl* control=line->iControl;
 	if (control->IsVisible()==aVisible)
 		return;
     control->MakeVisible(aVisible);
     line->CheckDimmedDisplayState();
+    _AKNTRACE_FUNC_EXIT;
     }
 
 /**
@@ -1113,6 +1210,7 @@
  */
 EXPORT_C void CEikDialog::MakeWholeLineVisible(TInt aControlId,TBool aVisible)
     {
+	_AKNTRACE_FUNC_ENTER;
     CEikCaptionedControl* line=Line(aControlId);
 	if (line->IsVisible()==aVisible)
 		return;
@@ -1123,6 +1221,7 @@
 		line->iTrailer->MakeVisible(aVisible);
     control->MakeVisible(aVisible);
 	line->MakeVisible(aVisible);
+	_AKNTRACE_FUNC_EXIT;
     }
 
 /**
@@ -1137,6 +1236,7 @@
  */
 EXPORT_C void CEikDialog::Layout()
 	{
+    _AKNTRACE_FUNC_ENTER;
     TAknWindowLineLayout windowLineLayoutScreen = AknLayoutScalable_Avkon::Screen().LayoutLine();
     TRect rectZero = TRect(0,0,0,0);
     TAknLayoutRect layoutRect;
@@ -1145,7 +1245,10 @@
 
 	TSize maxSize = rectScreen.Size();
 
+    _AKNTRACE( "size = %d x %d", iSize.iWidth, iSize.iHeight );
 	SetSizeAndPosition(PreferredSize( maxSize ));
+    _AKNTRACE( "size = %d x %d", iSize.iWidth, iSize.iHeight );
+    _AKNTRACE_FUNC_EXIT;
 	}
 
 /**
@@ -1261,7 +1364,7 @@
 	if (line)
 		{
 		line->SetCaptionL(aText);
-		line->DrawNow();
+		line->DrawDeferred();
 		}
 	}
 
@@ -1379,6 +1482,8 @@
  */
 EXPORT_C void CEikDialog::SetEditableL( TBool aEditable ) 
     {
+	_AKNTRACE_FUNC_ENTER;
+	_AKNTRACE( "CEikDialog::SetEditableL()  aEditable: [%d]", aEditable );
     if ( !iExtension->iFlags[CEikDialogExtension::EEditableStateInitialised] ||
          iIsEditable != aEditable )
         {
@@ -1388,6 +1493,7 @@
         iPageSelector->SetEditableL( aEditable );
         DrawNow();
         }
+    _AKNTRACE_FUNC_EXIT;
     }
 
 /**
@@ -1397,6 +1503,7 @@
  */	
 EXPORT_C TBool CEikDialog::IsEditable() const 
 	{
+	_AKNTRACE( "CEikDialog::IsEditable(): [%d]", iIsEditable );;
 	return ( iIsEditable ) ;
 	}
 
@@ -1452,6 +1559,7 @@
  */
 EXPORT_C TInt CEikDialog::RunLD()
 	{
+	_AKNTRACE_FUNC_ENTER;
     // Moved BringForwards in the beginning to enable 1-frame animations.
 	iEikonEnv->BringForwards(ETrue); // before call to EnableBackup()
 	AknGlobalPopupPriorityController::ShowPopup(*this, ETrue);
@@ -1547,6 +1655,24 @@
 		GfxTransEffect::NotifyExternalState(EInternalHandleSequence, (const TDesC8*)this);
 #endif
 		GfxTransEffect::Begin(this, KGfxControlAppearAction);
+        MTouchFeedback* feedback = NULL;
+        if( AknLayoutUtils::PenEnabled() )
+            {
+            feedback = static_cast<MTouchFeedback*>( ExtensionInterface( KExIfTactileFeedbackUid ) );
+            }
+        if( feedback )
+            {
+            if( CAknTransitionUtils::TransitionsEnabled( AknTransEffect::EComponentTransitionsOff ) )
+                {
+                feedback->InstantFeedback( this, ETouchFeedbackIncreasingPopUp,
+                                            ETouchFeedbackVibra, TPointerEvent() );
+                }
+            else
+                {
+                feedback->InstantFeedback( this, ETouchFeedbackPopUp,
+                                            ETouchFeedbackVibra, TPointerEvent() );
+                }
+            }
 		GfxTransEffect::NotifyExternalState(ECaptureComponentsBegin, (const TDesC8*)this);
 		
 		TRect demarcation;
@@ -1573,13 +1699,14 @@
 	// Claim pointer grab and send the pointer up event to the
 	// control that otherwise would be receiving the drag events.
 	Window().ClaimPointerGrab(ETrue);
-	
+	_AKNTRACE_FUNC_EXIT;
     return(WaitAsRequired());
 	}
 
 
 EXPORT_C void CEikDialog::Draw(const TRect& /*aRect*/) const
     {
+	_AKNTRACE_FUNC_ENTER;
     TRect rect=Rect();
     CWindowGc& gc=SystemGc(); //No reason to demote the gc, CWindowGc is more usable.
 
@@ -1667,6 +1794,7 @@
                 KAknsIIDQsnFrPopup,KAknsIIDQsnFrPopupCenter);
             }    
         }
+    _AKNTRACE_FUNC_EXIT;
     }
     
 EXPORT_C void CEikDialog::HandlePointerEventL(const TPointerEvent& aPointerEvent) 
@@ -1681,6 +1809,7 @@
 
 TKeyResponse CEikDialog::TryAnimateButtonAndExitL(TInt aKeycode)
 	{
+	_AKNTRACE_FUNC_ENTER;
 	TInt buttonId=EEikBidCancel;
 	switch (aKeycode)
 		{
@@ -1704,17 +1833,26 @@
 
 	if (button)
 		{
-		if (button->IsDimmed() || !button->IsVisible())
-			return EKeyWasNotConsumed;
-		buttonGroupContainer.AnimateCommand(buttonId);
+        TBool animateCommand = ( !button->IsDimmed() && button->IsVisible() );
+     
+        if ( !animateCommand && buttonId != EEikBidCancel )
+            {
+			_AKNTRACE_FUNC_EXIT;
+            return EKeyWasNotConsumed;
+            }
+        else if ( animateCommand )
+            {
+            buttonGroupContainer.AnimateCommand( buttonId );
+            }
 		}
 
 	if (button || buttonId==EEikBidCancel || buttonId==EEikBidOk)
 		{
 		TryExitL(buttonId);
+		_AKNTRACE_FUNC_EXIT;
 		return EKeyWasConsumed;
 		}
-
+	_AKNTRACE_FUNC_EXIT;
 	return EKeyWasNotConsumed;
 	}
 
@@ -1735,7 +1873,7 @@
  */
 EXPORT_C TKeyResponse CEikDialog::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)
     {
-
+	_AKNTRACE_FUNC_ENTER;
 
 	// Hide the tool tip (if there is one!)
 	if ( ( iPageSelector->NumPages() == 1 ) && ( CurrentLine() ) && ( CurrentLine()->ToolTipText( ) ) )
@@ -1750,7 +1888,10 @@
     if (!(iDialogFlags&EEikDialogFlagDontEatUpDownEvents) && aKeyEvent.iScanCode != EStdKeyYes)
 	{
 	if (aType!=EEventKey)
-	    return(EKeyWasConsumed);
+		{
+		_AKNTRACE_FUNC_EXIT;
+	    return(EKeyWasConsumed);	
+		}
 	}
 
 	TInt code=aKeyEvent.iCode;
@@ -1763,7 +1904,10 @@
 		{
 		response = iButtonGroupContainer->OfferKeyEventL(aKeyEvent,aType);
 		if(response==EKeyWasConsumed)
-			return EKeyWasConsumed;
+			{
+			_AKNTRACE_FUNC_EXIT;
+			return EKeyWasConsumed;		
+			}
 		}
 
 	//
@@ -1786,7 +1930,10 @@
 			iPageSelector->OfferKeyEventL(aKeyEvent, aType);
 // Add to remove repeated keypress return event of OK key
 		if (aKeyEvent.iRepeats&&EKeyOK==code)
-			return EKeyWasConsumed;
+			{
+			_AKNTRACE_FUNC_EXIT;
+			return EKeyWasConsumed;		
+			}
 		if ((!(modifiers&EModifierCtrl) || modifiers&EModifierPureKeycode) &&
 			!(iDialogFlags&EEikDialogFlagModeless))
 			TryAnimateButtonAndExitL(code);
@@ -1808,10 +1955,12 @@
 		break;
 	KeyToFocus:
 		if(iPageSelector->OfferHotKeysKeyEventL(aKeyEvent,aType)==EKeyWasConsumed)
-			return EKeyWasConsumed;
-
+			{
+		    _AKNTRACE_FUNC_EXIT;
+			return EKeyWasConsumed;		
+			}
 		}
-
+    _AKNTRACE_FUNC_EXIT;
 	return (aKeyEvent.iScanCode == EStdKeyYes ? EKeyWasNotConsumed:EKeyWasConsumed);
     }
 
@@ -1820,6 +1969,7 @@
 */
 EXPORT_C void CEikDialog::FocusChanged(TDrawNow aDrawNow)
     {
+	_AKNTRACE_FUNC_ENTER;
     CEikBorderedControl::FocusChanged( aDrawNow );
 
     TInt controlID = IdOfFocusControl();
@@ -1827,6 +1977,7 @@
         {
         Line(controlID)->SetFocus(IsFocused(), aDrawNow);
         }
+    _AKNTRACE_FUNC_EXIT;
     }
 
 /**
@@ -1840,102 +1991,177 @@
  */
 EXPORT_C void CEikDialog::TryExitL(TInt aButtonId)
     {
-    if ( iDialogFlags & EEikDialogFlagNoUserExit )
+    _AKNTRACE("CEikDialog::TryExitL iDialogFlags = %d, buttonId = %d", iDialogFlags, aButtonId);
+    if (iDialogFlags & EEikDialogFlagNoUserExit)
         {
-		return;
+        return;
         }
         
     // use delayed exit if pointer event handling is in progress
-    if ( Extension()->iPublicFlags.IsSet( CEikDialogExtension::EDelayedExit ) )
+    if (Extension()->iPublicFlags.IsSet(CEikDialogExtension::EDelayedExit))
         {
         Extension()->iButtonId = aButtonId;
         Extension()->StartDelayedExit();
+        
+        _AKNTRACE("CEikDialog::TryExitL return with delayedExit");
         return;
         }
-        
-    TBool effectTriggered = EFalse;
+
     TBool effectButton = aButtonId == EEikBidCancel
                       || aButtonId == EAknSoftkeyExit
                       || aButtonId == EAknSoftkeyBack
                       || aButtonId == EAknSoftkeyNo;
 #ifdef RD_UI_TRANSITION_EFFECTS_POPUPS
     effectButton =    effectButton
-					  || aButtonId == EAknSoftkeyClose
-                      || aButtonId == EAknSoftkeyDone;
+                      || aButtonId == EAknSoftkeyClose
+                      || aButtonId == EAknSoftkeyDone
+                      || aButtonId == EAknSoftkeyOk;
 #endif
-    CAknAppUi* aknAppUi = static_cast<CAknAppUi*>( iEikonEnv->EikAppUi() );
-    if ( GfxTransEffect::IsRegistered( this ) && IsVisible() && effectButton
+
+    TBool effectTriggered = EFalse;
+    CAknAppUi* aknAppUi = static_cast<CAknAppUi*>(iEikonEnv->EikAppUi());
+
+    MTouchFeedback* feedback = NULL;
+    if(AknLayoutUtils::PenEnabled())
+        {
+        feedback = static_cast<MTouchFeedback*>(ExtensionInterface(KExIfTactileFeedbackUid));
+        }
+
+    if (!(iDialogFlags & EEikDialogFlagDelayEffects)
+        && IsFocusedWindowGroup( this )
+        && GfxTransEffect::IsRegistered(this) && IsVisible() && effectButton
 #ifdef RD_UI_TRANSITION_EFFECTS_POPUPS        
-        && !(iDialogFlags&EEikDialogFlagSleeping)
+        && !(iDialogFlags & EEikDialogFlagSleeping)
 #endif
-        && ( !aknAppUi->IsFullScreenApp() || aknAppUi->IsForeground() )
+        && (!aknAppUi->IsFullScreenApp() || aknAppUi->IsForeground())
         && !IsBlankScreenDisplayed()
-         )
+        )
         {
         CAknTransitionUtils::SetAllParents(this);
         GfxTransEffect::Begin(this, KGfxControlDisappearAction);
+
+        if(feedback)
+            {
+            if(CAknTransitionUtils::TransitionsEnabled(AknTransEffect::EComponentTransitionsOff))
+                {
+                feedback->InstantFeedback(this, ETouchFeedbackDecreasingPopUp,
+                                        ETouchFeedbackVibra, TPointerEvent());
+                }
+            else
+                {
+                feedback->InstantFeedback(this, ETouchFeedbackPopUp,
+                                        ETouchFeedbackVibra, TPointerEvent());
+                }
+            }
+
         GfxTransEffect::NotifyExternalState(ECaptureComponentsBegin, (const TDesC8*)this);
-
         TRect demarcation;
-        CAknTransitionUtils::GetDemarcation(CAknTransitionUtils::EPopup,
-                                            demarcation);
+        CAknTransitionUtils::GetDemarcation(CAknTransitionUtils::EPopup, demarcation);
         GfxTransEffect::SetDemarcation(this, demarcation);
         effectTriggered = ETrue;
         }
 
-    if (aButtonId!=EEikBidCancel)
+    if (aButtonId != EEikBidCancel)
+        {
         PrepareForFocusTransitionL();
-    else if (!(iDialogFlags&EEikDialogFlagNotifyEsc))
-		goto finished;
-	if (!OkToExitL(aButtonId))
-            {
-        if ( effectTriggered )
+        }
+    else if (!(iDialogFlags & EEikDialogFlagNotifyEsc))
+        {
+        goto finished;
+        }
+    
+    if (!OkToExitL(aButtonId))
+        {
+        if (effectTriggered)
             {
-            GfxTransEffect::NotifyExternalState( ECaptureComponentsAbort,
-                                                 ( const TDesC8* ) this );
-            GfxTransEffect::Abort( this );
-            }
-   			return;
+            GfxTransEffect::NotifyExternalState(ECaptureComponentsAbort, (const TDesC8*)this);
+            GfxTransEffect::Abort(this);
             }
-
-	if (aButtonId!=EEikBidCancel)
-		GetAutoValues();
+            
+        // Draw again in cast any content change in OkToExitL
+        DrawDeferred();
+        
+        _AKNTRACE("CEikDialog::TryExitL return with OkToExitL false");
+        return;
+        }
+        
+    if (aButtonId != EEikBidCancel)
+        {
+        GetAutoValues();
+        }
+
 finished:
+
     if (iExitConfirmed)
-		*iExitConfirmed=((MappedCommandId( aButtonId ) ==EEikBidCancel)? 0: aButtonId);
+        {
+        *iExitConfirmed = MappedCommandId(aButtonId) == EEikBidCancel ? 0 : aButtonId;
+        }
 
     // Remove content observer in order to prevent unnecessary layout 
     // calculations in dialog shutdown.
-    EnableContentObserver( EFalse );
-
-	if (iDialogFlags&EEikDialogFlagSleeping)
-		ExitSleepingDialog();
-	else
-		{
+    EnableContentObserver(EFalse);
+
+    if (iDialogFlags & EEikDialogFlagSleeping)
+        {
+        ExitSleepingDialog();
+        }
+    else
+        {
         // Remove content observer in order to prevent unnecessary layout 
         // calculations in dialog shutdown.
-        EnableContentObserver( EFalse );
-
-        if ( effectTriggered )
-						{
-        		MakeVisible(EFalse);
-                CAknTransitionUtils::MakeVisibleSubComponents( this,
-                                        CAknTransitionUtils::EForceInvisible );
-
-        		GfxTransEffect::NotifyExternalState(ECaptureComponentsEnd, (const TDesC8*)this);
-        		GfxTransEffect::End(this);
-        		}
-        	else
-			    {
-        		MakeVisible(EFalse);
-                CAknTransitionUtils::MakeVisibleSubComponents( this,
-                                        CAknTransitionUtils::EForceInvisible );
-        		GfxTransEffect::NotifyExternalState( ECaptureComponentsAbort,
-                                                 ( const TDesC8* ) this );
-		    	GfxTransEffect::Abort(this);
-			}
-	    delete(this);
-		}
+        EnableContentObserver(EFalse);
+        
+        // The dialog is asked to postpone the effect after OkToExitL.
+        if ((iDialogFlags & EEikDialogFlagDelayEffects) && !effectTriggered)
+            {
+            if (GfxTransEffect::IsRegistered(this) && IsVisible() && effectButton
+                && (!aknAppUi->IsFullScreenApp() || aknAppUi->IsForeground())
+                && !IsBlankScreenDisplayed()
+                )
+                {
+                TRect demarcation;
+                CAknTransitionUtils::SetAllParents(this);
+                GfxTransEffect::Begin(this, KGfxControlDisappearAction);
+
+                if(feedback)
+                    {
+                    if(CAknTransitionUtils::TransitionsEnabled(AknTransEffect::EComponentTransitionsOff))
+                        {
+                        feedback->InstantFeedback(this, ETouchFeedbackDecreasingPopUp,
+                                                ETouchFeedbackVibra, TPointerEvent());
+                        }
+                    else
+                        {
+                        feedback->InstantFeedback(this, ETouchFeedbackPopUp,
+                                                ETouchFeedbackVibra , TPointerEvent());
+                        }
+                    }
+
+                GfxTransEffect::NotifyExternalState(ECaptureComponentsBegin, (const TDesC8*)this);
+                CAknTransitionUtils::GetDemarcation(CAknTransitionUtils::EPopup, demarcation);
+                GfxTransEffect::SetDemarcation(this, demarcation);
+                effectTriggered = ETrue;
+                }
+            }
+
+        if (effectTriggered)
+            {
+            MakeVisible(EFalse);
+            CAknTransitionUtils::MakeVisibleSubComponents(this, CAknTransitionUtils::EForceInvisible);
+            GfxTransEffect::NotifyExternalState(ECaptureComponentsEnd, (const TDesC8*)this);
+            GfxTransEffect::End(this);
+            }
+        else
+            {
+            // Why we need abort the effect here ??
+            MakeVisible(EFalse);
+            CAknTransitionUtils::MakeVisibleSubComponents(this, CAknTransitionUtils::EForceInvisible);
+            GfxTransEffect::NotifyExternalState(ECaptureComponentsAbort, (const TDesC8*)this);
+            GfxTransEffect::Abort(this);
+            }
+        delete(this);
+        }
+    _AKNTRACE_FUNC_EXIT;
     }
 
 /**
@@ -2063,6 +2289,7 @@
  */
 EXPORT_C void CEikDialog::SetInitialCurrentLine()
     {
+	_AKNTRACE_FUNC_ENTER;
 	if ( !iExtension->iInitialMade )
 	    {
 	    TRAP_IGNORE(iPageSelector->ActivateFirstPageL());
@@ -2071,6 +2298,7 @@
 	    {
 	    iPageSelector->SetInitialFocus();
 	    }
+	_AKNTRACE_FUNC_EXIT;
     }
 
 /**
@@ -2199,7 +2427,7 @@
  */
 EXPORT_C void CEikDialog::HandleResourceChange(TInt aType)
     {
-        
+	_AKNTRACE_FUNC_ENTER;    
     if(aType==KEikDynamicLayoutVariantSwitch)
         {
         if (IsVisible())
@@ -2207,7 +2435,14 @@
         else if (iExtension)
         	iExtension->iFlags.Set(CEikDialogExtension::ELayoutChangeWhileInvisible);
 
-        CCoeControl::HandleResourceChange(aType);
+        TBool isForm = ( iPageSelector && iPageSelector->IsForm() );
+
+        if ( !isForm )
+            {
+            CCoeControl::HandleResourceChange( aType );
+            }
+
+        _AKNTRACE_FUNC_EXIT;
         return;
         }
     else
@@ -2215,32 +2450,39 @@
     	CCoeControl::HandleResourceChange(aType);
         }
     
-    if( !CAknEnv::Static()->TransparencyEnabled() && aType==KEikColorResourceChange)
-        {
-        Window().SetBackgroundColor(iEikonEnv->ControlColor(EColorDialogBackground,*this));
-        }
+    _AKNTRACE_FUNC_EXIT;
     }
 
 void CEikDialog::DoResourceChangeLayout()
 	{
     // Layout must be forced through - bypass optimisations
     // Must work through all pages
-    
+	_AKNTRACE_FUNC_ENTER;
     Layout();
-    SizeChanged();
+    
+    TBool isForm = ( iPageSelector && iPageSelector->IsForm() );
     
-    TInt lastPage =  ( iPageSelector->PageContainer()->NumPages() - 1 );
-    TInt pageIndex = 0;
-    CEikDialogPage* page;
-
-    while ( pageIndex++ <= lastPage )
+    if ( !isForm )
         {
-        page = iPageSelector->PageContainer()->Page( pageIndex );
-        page->HandleResourceChange( KEikDynamicLayoutVariantSwitch );
+        SizeChanged();
+		}
+	
+    if( iPageSelector )
+    	{		
+		TInt lastPage =  ( iPageSelector->PageContainer()->NumPages() - 1 );
+		TInt pageIndex = 0;
+		CEikDialogPage* page( NULL );
+	
+		while ( pageIndex++ <= lastPage )
+			{
+			page = iPageSelector->PageContainer()->Page( pageIndex );
+			page->HandleResourceChange( KEikDynamicLayoutVariantSwitch );
+			}   
         }
 
    	if (iExtension)
    		iExtension->iFlags.Clear(CEikDialogExtension::ELayoutChangeWhileInvisible);
+   	_AKNTRACE_FUNC_EXIT;
 	}
 
 /**
@@ -2284,6 +2526,8 @@
 
 EXPORT_C void CEikDialog::MakeVisible(TBool aVisible)
 	{
+	_AKNTRACE_FUNC_ENTER;
+	_AKNTRACE( "CEikDialog::MakeVisible(): [%d]", aVisible );
    	if (iExtension && iExtension->iFlags[CEikDialogExtension::ELayoutChangeWhileInvisible])
    		DoResourceChangeLayout();
 
@@ -2301,7 +2545,7 @@
         }
     
 	CEikBorderedControl::MakeVisible(aVisible);
-
+	_AKNTRACE_FUNC_EXIT;
 	}
 
 void CEikDialog::FadeBehindPopup(TBool aFade)
@@ -2428,9 +2672,14 @@
 		{
 		control = dlgPage->LineOnPageOrNull(i++);
 		if (control)
-			aControls.Append(control);
+			{
+			if ( KErrNone != aControls.Append(control) )
+				{
+				return;
+				}
+			}
 		}
-		while (control != NULL);
+	while (control != NULL);
 	}
 
 EXPORT_C TInt CEikDialog::DialogFlags()
@@ -2504,6 +2753,7 @@
 
 EXPORT_C void CEikDialog::UpdatePageL(TBool aRedraw)
 	{
+	_AKNTRACE_FUNC_ENTER;
 	if (Rect().Height())
 		{
 		if (iPageSelector)
@@ -2517,11 +2767,13 @@
 						DrawDeferred();
 					}
 		}
+	_AKNTRACE_FUNC_EXIT;
 	}
 
 
 EXPORT_C TInt CEikDialog::GetNumberOfLinesOnPage(TInt aPageIndex) const
 	{
+	_AKNTRACE_FUNC_ENTER;
 	if (iPageSelector)
 		{
 		CEikDialogPageContainer* pageContainer = iPageSelector->PageContainer();
@@ -2529,20 +2781,33 @@
 			{
 			CEikDialogPage* page = pageContainer->Page(aPageIndex);
 			if (page)
-				return page->NumberOfLines();
+				{
+				_AKNTRACE( "CEikDialog::GetNumberOfLinesOnPage(): [%d]", page->NumberOfLines() );
+				_AKNTRACE_FUNC_EXIT;
+				return page->NumberOfLines();			
+				}
 			}
 		}
+	_AKNTRACE( "CEikDialog::GetNumberOfLinesOnPage(): 0");
+	_AKNTRACE_FUNC_EXIT;
 	return 0;
 	}
 
 EXPORT_C TInt CEikDialog::GetNumberOfPages() const
 	{
+	_AKNTRACE_FUNC_ENTER;
 	if (iPageSelector)
 		{
 		CEikDialogPageContainer* pageContainer = iPageSelector->PageContainer();
 		if (pageContainer)
-			return pageContainer->NumPages();
+			{
+		    _AKNTRACE( "CEikDialog::GetNumberOfPages(): [%d]", pageContainer->NumPages() );
+		    _AKNTRACE_FUNC_EXIT;
+		    return pageContainer->NumPages();
+			}
 		}
+	_AKNTRACE( "CEikDialog::GetNumberOfPages(): return 0;" );
+	_AKNTRACE_FUNC_EXIT;
 	return 0;
     }
     
@@ -3049,7 +3314,8 @@
     // softkeys
     if ( iExtension && CbaEmbeddedInDialog( iDialogFlags ) )
         {
-        TSize dialogSize( Rect().Size() );
+        TRect oldDialogRect( Rect() );
+        TSize dialogSize( oldDialogRect.Size() );
         CEikCba* cba = static_cast<CEikCba*>(
                 iButtonGroupContainer->ButtonGroup() );
         TBool cbaVisible( cba->IsVisible() && !cba->IsEmpty() );
@@ -3074,8 +3340,14 @@
             dialogSize.iHeight -= cbaRect.Rect().Height();
             }
 
-        SetRect( TRect(
-            AknPopupUtils::Position( dialogSize, this ), dialogSize ) );
+        TRect newDialogRect( AknPopupUtils::Position( dialogSize, cbaVisible ),
+                             dialogSize );
+        SetRect( newDialogRect );
+        
+        if ( oldDialogRect != newDialogRect )
+            {
+            DrawDeferred();
+            }
         }
     }
 
@@ -3123,6 +3395,7 @@
 const TInt KWgPriorityOfBlankScreen = 10000; // copied from akncapserverentry.cpp
 TBool IsBlankScreenDisplayed()
     {
+	_AKNTRACE_FUNC_ENTER;
     TBool isBlankScreenDisplayed(EFalse);
     RWsSession& wsSession = CEikonEnv::Static()->WsSession();
     
@@ -3132,7 +3405,7 @@
         if (KErrNone == wsSession.WindowGroupList(wgIds) && wgIds->Count() > 0)
             {
             TInt priority = wsSession.GetWindowGroupOrdinalPriority(wgIds->At(0));
-            RDebug::Printf("IsBlankScreenDisplayed():priority:%d",priority);
+            _AKNTRACE( "IsBlankScreenDisplayed():priority: [%d]", priority );
             if (priority == KWgPriorityOfBlankScreen)
                 {
                 isBlankScreenDisplayed = ETrue;
@@ -3140,7 +3413,8 @@
             }
         }
     delete wgIds;
-    RDebug::Printf("IsBlankScreenDisplayed():isBlankScreenDisplayed:%d",isBlankScreenDisplayed);
+    _AKNTRACE( "IsBlankScreenDisplayed():isBlankScreenDisplayed: [%d]", isBlankScreenDisplayed );
+    _AKNTRACE_FUNC_EXIT;
     return isBlankScreenDisplayed;
     }