fep/aknfep/UiPlugins/AknFepUiInterface/AvkonImpl/src/AknFepUiAvkonImpl.cpp
branchRCL_3
changeset 3 f5a1e66df979
parent 0 eb1f2e154e89
child 6 6ceef9a83b1a
--- a/fep/aknfep/UiPlugins/AknFepUiInterface/AvkonImpl/src/AknFepUiAvkonImpl.cpp	Tue Feb 02 01:02:04 2010 +0200
+++ b/fep/aknfep/UiPlugins/AknFepUiInterface/AvkonImpl/src/AknFepUiAvkonImpl.cpp	Fri Feb 19 23:09:27 2010 +0200
@@ -392,15 +392,23 @@
     {
     if (iCba)
         {
-        delete iCba;
-        iCba = NULL;
+        DeleteCBAL();
         }
-    iCba = CEikButtonGroupContainer::NewL(CEikButtonGroupContainer::ECba,
-                                          CEikButtonGroupContainer::EHorizontal,
-                                          aObserver,
-                                          aResourceId);
-    iCba->SetBoundingRect(CEikonEnv::Static()->EikAppUi()->ApplicationRect());
-    iCba->DrawNow();
+    // Create Inside CBA if needed
+    CreateInsideCBAL( CEikButtonGroupContainer::ECba,
+    		          CEikButtonGroupContainer::EHorizontal,
+    		          aObserver,
+    		          aResourceId );
+    
+    if ( iCba == NULL )
+        {
+        iCba = CEikButtonGroupContainer::NewL( CEikButtonGroupContainer::ECba,
+                                               CEikButtonGroupContainer::EHorizontal,
+                                               aObserver,
+                                               aResourceId );
+        iCba->SetBoundingRect(CEikonEnv::Static()->EikAppUi()->ApplicationRect());
+        iCba->DrawNow();
+        }
     }
 
 /**
@@ -413,8 +421,14 @@
         {
         if (!iCba)
             {
-            iCba = CEikButtonGroupContainer::NewL(CEikButtonGroupContainer::ECba, CEikButtonGroupContainer::EHorizontal, aObserver, R_AVKON_SOFTKEYS_EMPTY);
-            iCba->SetBoundingRect(CEikonEnv::Static()->EikAppUi()->ApplicationRect());
+            CreateInsideCBAL( CEikButtonGroupContainer::ECba, CEikButtonGroupContainer::EHorizontal, aObserver, R_AVKON_SOFTKEYS_EMPTY );
+            if ( iCba == NULL )
+            	{
+                iCba = CEikButtonGroupContainer::NewL( CEikButtonGroupContainer::ECba, 
+                		                               CEikButtonGroupContainer::EHorizontal, 
+                		                               aObserver, R_AVKON_SOFTKEYS_EMPTY );
+                iCba->SetBoundingRect(CEikonEnv::Static()->EikAppUi()->ApplicationRect());
+            	}
             }
         // set each CBA
         TBool update = UpdateSoftkeyLabelL(ELeftSoftkeyIndex, ENullCommandId, R_TEXT_SOFTKEY_EMPTY);
@@ -437,8 +451,7 @@
         }
     else
         {
-        delete iCba;
-        iCba = NULL;
+        DeleteCBAL();
         }
     }
 
@@ -454,8 +467,7 @@
 
 void CAknFepUIAvkonImpl::DeleteSoftkeys()
 	{
-	delete iCba;
-	iCba = NULL;
+	TRAP_IGNORE( DeleteCBAL() );
 	}
 
 void CAknFepUIAvkonImpl::DrawSoftkeysNow()
@@ -466,8 +478,12 @@
 void CAknFepUIAvkonImpl::CreateSoftkeys(TInt aResourceId, MEikCommandObserver* aObserver)
 	{
 	DeleteSoftkeys();
-    TRAP_IGNORE(iCba = CEikButtonGroupContainer::NewL(CEikButtonGroupContainer::ECba, CEikButtonGroupContainer::EHorizontal, aObserver, aResourceId));
-    iCba->SetBoundingRect(CEikonEnv::Static()->EikAppUi()->ApplicationRect());
+	TRAP_IGNORE(CreateInsideCBAL(CEikButtonGroupContainer::ECba, CEikButtonGroupContainer::EHorizontal, aObserver, aResourceId));
+	if ( iCba == NULL)
+		{
+        TRAP_IGNORE(iCba = CEikButtonGroupContainer::NewL(CEikButtonGroupContainer::ECba, CEikButtonGroupContainer::EHorizontal, aObserver, aResourceId));
+        iCba->SetBoundingRect(CEikonEnv::Static()->EikAppUi()->ApplicationRect());
+		}
     iCba->MakeVisible(ETrue);
     iCba->ButtonGroup()->AsControl()->DrawableWindow()->SetOrdinalPosition(0,ECoeWinPriorityAlwaysAtFront + 10);
 	}
@@ -894,3 +910,89 @@
 #endif //__ITI_VIRTUAL_TOUCH_FIRST_GENERATION_SUPPORT__
 #endif //RD_INTELLIGENT_TEXT_INPUT
 
+void CAknFepUIAvkonImpl::DeleteCBAL()
+	{
+	if ( iCba )
+	    {
+	    delete iCba;
+	    iCba = NULL;
+	    }
+	
+	if ( isCbaEmded )
+		{
+		CEikAppUi* eikAppUi = (CEikAppUi *)CCoeEnv::Static()->AppUi();
+		if( eikAppUi!= NULL && eikAppUi->IsDisplayingDialog() && eikAppUi->TopFocusedControl() )
+		    {
+		    CEikDialog* dlg = eikAppUi->TopFocusedControl()->MopGetObject( dlg );
+		    if ( dlg )
+		        {
+		        CEikButtonGroupContainer* currentCba = dlg->MopGetObject( currentCba );
+	        	CEikCba* dlgcba = static_cast<CEikCba*>( currentCba->ButtonGroup());
+	        	if ( currentCba && iDialogCba == currentCba )
+		            {
+		            currentCba->RemoveCommandFromStack( ELeftSoftkeyIndex, -1 );
+		            currentCba->RemoveCommandFromStack( ERightSoftkeyIndex, -1 );
+
+		            currentCba->DrawNow();
+		            currentCba->ActivateL();
+		            iDialogCba = NULL;
+                    isCbaEmded = EFalse;
+		            }
+		        }
+		    }
+	    }
+	}
+
+void CAknFepUIAvkonImpl::CreateInsideCBAL( CEikButtonGroupContainer::TUse aUse,
+		                                   CEikButtonGroupContainer::TOrientation aOrientation,
+                                           MEikCommandObserver* aCommandObserver,
+                                           TInt aResourceId )
+	{
+	CEikAppUi* eikAppUi = (CEikAppUi *)CCoeEnv::Static()->AppUi();
+	// If current is dialog create inside CBA
+	if ( eikAppUi!= NULL && eikAppUi->IsDisplayingDialog() && eikAppUi->TopFocusedControl())
+		{
+		CEikDialog* dlg = eikAppUi->TopFocusedControl()->MopGetObject( dlg );
+		if ( dlg )
+		    {
+			CEikButtonGroupContainer* currentCba = dlg->MopGetObject( currentCba );
+			CEikCba* dlgcba = static_cast<CEikCba*>( currentCba->ButtonGroup());
+			if ( currentCba )
+				{
+				TUint flags( 0 );
+				flags |= CEikButtonGroupContainer::EIsEmbedded | CEikButtonGroupContainer::EAddToStack;
+				if ( iCba != NULL )
+					{
+					delete iCba;
+					iCba = NULL;
+					}
+				iCba = CEikButtonGroupContainer::NewL( aUse, aOrientation, 
+						                               aCommandObserver, 
+						                               aResourceId, flags );
+				
+				CEikCba* cba = static_cast<CEikCba*>( iCba->ButtonGroup());
+				
+				CEikCba* dlgcba = static_cast<CEikCba*>( currentCba->ButtonGroup());
+				if( !isCbaEmded )
+					{
+					currentCba->AddCommandToStackL( ELeftSoftkeyIndex, -1, _L(""), NULL, NULL );
+					currentCba->AddCommandToStackL( ERightSoftkeyIndex, -1, _L(""), NULL, NULL );
+					currentCba->ActivateL();
+					currentCba->DrawNow();
+					iDialogCba = currentCba;
+					isCbaEmded = ETrue;
+					}
+			
+				cba->SetButtonGroupFlags( ~( EEikCbaFlagTransparent | EEikCbaFlagOutlineFont ));
+				TRect dlgRect( dlg->Rect());
+				TRect cbaRect( currentCba->Rect());
+				iCba->SetRect( currentCba->Rect());
+				iCba->SetPosition( 
+						TPoint( dlg->DrawableWindow()->Position().iX,dlg->DrawableWindow()->Position().iY + dlgRect.Height() - cbaRect.Height()));
+				iCba->SetBoundingRect( dlg->Rect());
+			    }
+		    }
+		}
+	}
+
+//End of File