diff -r aecbbf00d063 -r d48ab3b357f1 uifw/EikStd/dlgsrc/EIKDIALG.CPP --- 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 #include #include +#include // #include "eikdialogext.h" #include @@ -69,8 +70,11 @@ #endif #include #include +#include +#include #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 @@ // 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( 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( iEikonEnv->EikAppUi() ); - if ( GfxTransEffect::IsRegistered( this ) && IsVisible() && effectButton + + TBool effectTriggered = EFalse; + CAknAppUi* aknAppUi = static_cast(iEikonEnv->EikAppUi()); + + MTouchFeedback* feedback = NULL; + if(AknLayoutUtils::PenEnabled()) + { + feedback = static_cast(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( 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; }