diff -r eb1f2e154e89 -r f5a1e66df979 fep/aknfep/UiPlugins/AknFepUiInterface/AvkonImpl/src/AknFepUiAvkonImpl.cpp --- 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( 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( 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( iCba->ButtonGroup()); + + CEikCba* dlgcba = static_cast( 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