uifw/EikStd/dlgsrc/EIKDIALG.CPP
branchRCL_3
changeset 23 3d340a0166ff
parent 18 0aa5fbdfbc30
child 25 941195f2d488
--- a/uifw/EikStd/dlgsrc/EIKDIALG.CPP	Tue Apr 27 16:55:05 2010 +0300
+++ b/uifw/EikStd/dlgsrc/EIKDIALG.CPP	Tue May 11 16:27:42 2010 +0300
@@ -84,10 +84,10 @@
 //
 TBool CbaEmbeddedInDialog( const TInt& aFlags )
     {
-    return AknLayoutUtils::PenEnabled() && 
-        !( aFlags & EEikDialogFlagFillAppClientRect ) &&
+    return !( aFlags & EEikDialogFlagFillAppClientRect ) &&
         !( aFlags & EEikDialogFlagFillScreen ) &&
-        !( aFlags & EEikDialogFlagVirtualInput );
+        !( aFlags & EEikDialogFlagVirtualInput ) &&
+        !( aFlags & EEikDialogFlagNoEmbeddedSoftkeys );
     }
 
 
@@ -280,7 +280,40 @@
 
     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->iDeleteEmbeddedCba 
+	        && extension->iButtonGroupResourceId != 0 )
+        {
+        delete iButtonGroupContainer;
+        iButtonGroupContainer = NULL;
+        iButtonGroupContainer = CEikButtonGroupContainer::NewL(
+                CEikButtonGroupContainer::ECba,
+                CEikButtonGroupContainer::EHorizontal,
+                iButtonCommandObserver,
+                extension->iButtonGroupResourceId,
+                0 );
+
+        iDialogFlags |= EEikDialogFlagNoEmbeddedSoftkeys; 
+        }
+
     PostLayoutDynInitL();
     _AKNTRACE_FUNC_EXIT;
 	}
@@ -773,6 +806,11 @@
             iButtonCommandObserver, aResourceId, *this, flags );
 
     EnableContentObserver( ETrue );
+    
+    if ( Extension() )
+        {
+        Extension()->iButtonGroupResourceId = aResourceId;
+        }
 	
 	AknGlobalPopupPriorityController::AddSubPopupL(*this, *iButtonGroupContainer->ButtonGroup()->AsControl());
 	AknGlobalPopupPriorityController::AddPopupToControlStackL(*iButtonGroupContainer->ButtonGroup()->AsControl(), ECoeStackPriorityCba, ECoeStackFlagRefusesFocus);
@@ -913,6 +951,7 @@
  */
 EXPORT_C TSize CEikDialog::PreferredSize(const TSize& aMaxSize) const
 	{
+    _AKNTRACE_FUNC_ENTER;
 	if (iDialogFlags&EEikDialogFlagFillScreen)
 		return iEikonEnv->ScreenDevice()->SizeInPixels();
 	else if (iDialogFlags&EEikDialogFlagFillAppClientRect)
@@ -927,20 +966,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();
             }
 	    }
@@ -991,6 +1034,7 @@
             }
         }
         
+    _AKNTRACE_FUNC_EXIT;
 	return preferredSize;
 	}
 
@@ -1059,7 +1103,12 @@
                 cba->SetRect( TRect(0, 0, 0, 0 ) );
                 }
             }
-		}
+
+        if ( Extension() )
+            {
+            Extension()->iDeleteEmbeddedCba = EFalse;
+            }
+        }
 	if (iTitleBar)
 		{
 		TRect nullRect(0,0,0,0);
@@ -1184,6 +1233,7 @@
  */
 EXPORT_C void CEikDialog::Layout()
 	{
+    _AKNTRACE_FUNC_ENTER;
     TAknWindowLineLayout windowLineLayoutScreen = AknLayoutScalable_Avkon::Screen().LayoutLine();
     TRect rectZero = TRect(0,0,0,0);
     TAknLayoutRect layoutRect;
@@ -1192,7 +1242,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;
 	}
 
 /**
@@ -1948,6 +2001,7 @@
     CAknAppUi* aknAppUi = static_cast<CAknAppUi*>(iEikonEnv->EikAppUi());
     
     if (!(iDialogFlags & EEikDialogFlagDelayEffects)
+        && IsFocusedWindowGroup( this )
         && GfxTransEffect::IsRegistered(this) && IsVisible() && effectButton
 #ifdef RD_UI_TRANSITION_EFFECTS_POPUPS        
         && !(iDialogFlags & EEikDialogFlagSleeping)
@@ -1981,6 +2035,9 @@
             GfxTransEffect::NotifyExternalState(ECaptureComponentsAbort, (const TDesC8*)this);
             GfxTransEffect::Abort(this);
             }
+            
+        // Draw again in cast any content change in OkToExitL
+        DrawDeferred();
         
         _AKNTRACE("CEikDialog::TryExitL return with OkToExitL false");
         return;