diff -r 2f259fa3e83a -r 8ca85d2f0db7 uifw/EikStd/coctlsrc/EIKMENUP.CPP --- a/uifw/EikStd/coctlsrc/EIKMENUP.CPP Tue Feb 02 01:00:49 2010 +0200 +++ b/uifw/EikStd/coctlsrc/EIKMENUP.CPP Fri Feb 19 23:04:46 2010 +0200 @@ -46,7 +46,6 @@ #include #include #include -#include #include #include #include @@ -55,8 +54,6 @@ #include #include -#include -#include #include #include #include @@ -64,16 +61,9 @@ #include //For transition effects #include // SetAllParents method #include -#include #include #include -#ifdef RD_UI_TRANSITION_EFFECTS_LIST -#include // LISTBOX EFFECTS IMPLEMENTATION -#include -#include -#endif // RD_UI_TRANSITION_EFFECTS_LIST - #include #include #include @@ -115,40 +105,15 @@ * Extension now contains menu/submenu highlight animation functionality. */ NONSHARABLE_CLASS( CEikMenuPaneExtension ): - public CActive, - public MCoeForegroundObserver, - public MAknsEffectAnimObserver, + public CBase, public MCoeControlObserver, public MAknPhysicsObserver { public: - enum TFlag - { - /** - * If set, animation creation is attempted. If not set, animation will - * never be created. - */ - EFlagUseAnimation = 0 - }; - - enum TScreen - { - EQhdHeight = 360, - EQhdWidth = 640 - }; - CEikMenuPaneExtension(); ~CEikMenuPaneExtension(); void ConstructL( CEikMenuPane* aControl ); - void CreateAnimation(); - void NoAnimIfError( TInt aError ); - void UseNoAnimation(); - void FocusGained(); - void FocusLost(); - - void HandleLayoutSwitch(); - void ChangeHighlightBackground(); void MenuClosed(); void ConstructMenuSctRowL( TDes& aSpecialChars, TInt aResourceId ); @@ -167,29 +132,7 @@ void ChangePosition( TPointerEvent& aPointerEvent ); void CalculateParentEvent( const TPointerEvent& aPointerEvent, TPointerEvent& aParentEvent ); - TRect GetBackgroundRect( const TRect& aWindowRect ) const; - static void AdjustPopupLayoutData( TAknWindowLineLayout& aListScrollPaneLayout ); - - const TAknLayoutText GetMenuItemTextLayout(const TRect& aItemRect, TBool cascade); - -public: // Implementation of MCoeForegroundObserver - void HandleGainingForeground(); - void HandleLosingForeground(); - -public: // Implementation of MAknsEffectAnimObserver - void AnimFrameReady( TInt aError, TInt ); void HandleControlEventL(CCoeControl* aControl,TCoeEvent aEventType); - -protected: // CActive overloads - void DoCancel(); - void RunL(); - -private: // New internal methods - void Play(); - TBool DrawHighlightBackground( CFbsBitGc& aGc ); - void PostDeleteAnimation(); - void CreateAnimationL( const TSize& aHighlightSize ); - void DoResizeL( const TSize& aHighlightSize, TBool aAboutToStart ); public: void ImmediateFeedback( TTouchLogicalFeedback aType, TTouchFeedbackType aFbType ); @@ -197,10 +140,6 @@ public: void StartCascadeMenuAppearTransition(); -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - void CalcItemSize( MAknListBoxTfxInternal* transApi ) const; -#endif - /** * Prepares cascade menu for item specific commands. */ @@ -236,7 +175,7 @@ * * @return ETrue if highlight is enabled */ - TBool HighlightEnabled(); + TBool HighlightEnabled(); /** * Sets the default highlight to options menu @@ -245,8 +184,6 @@ void SetDefaultHighlight(); public: // Data - TBool iHasIcon; - TBool iIsPenEnable; CFbsBitmap* iCascadeBitmap; CFbsBitmap* iCascadeBitmapMask; CAknsFrameBackgroundControlContext* iBgContext; @@ -257,14 +194,7 @@ CFbsBitmap* iRadioButtonBitmapMask; // mask for the above bitmap TBool iHasRadioGroup; // is ETrue if submenu contains radio button group. TInt iSelectedRadioButtonItem; // index of the radio button item which is currently selected (one must be selected) - CCoeControl* iGrabbingCBAComponent; // component control of CBA which is currently grabbing the pointer CEikMenuPane* iControl; - CAknsEffectAnim* iAnimation; - /** - * Stored flags are explained in enumeration TFlags. - */ - TBitFlags32 iAnimFlags; - CAknCharMap* iSct; // Menu SCT row, created only when needed. TBool iSctHighlighted; // No "normal" menu item can be highlighted if ETrue @@ -277,26 +207,17 @@ // needs to be mutable since we need to get information from Draw methods // (that are declared const) mutable TRect iCascadeDRect; - TBool iTransitionsOn; // Transitions FtMgr flag on TBool iShowCascadeTransition; // For later deletion of cascade menu, this allows the transition system // to correctly handle the aborted transitions CEikMenuPane* iCascadeMenuObject; TBool iDraggedOutside; TPointerEvent iLastPointerEvent; - -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - CWindowGc* iGc; -#endif TInt iItemsThatFitInView; TRect iScrollBarRect; TRect iSctRect; - TInt iTotalNumberOfItemsInView; // this value includes partial items - - CIdle* iTaskSwapIdle; CRedirectionListener* iRedirectionListener; - TRect iSBRect; RWindow* iMenuPaneWindow; // Not own, used by SCT TBool iLaunchCascadeMenu; TBool isUpdateScrollDirectly; @@ -315,6 +236,7 @@ ESingleClickEnabled, EHideItemSpecificCommands, EContextSensitive, + ESkipScrollbarUpdate, EHighlightEnabled }; @@ -322,6 +244,28 @@ * Menu pane extension flags. */ TBitFlags iFlags; + + /** + * Cached rectangle occupied by menu items (excluding scrollbar's area). + */ + TRect iItemAreaRect; + + /** + * Cached rectangle occupied by menu items and scrollbar. + */ + TRect iMenuAreaRect; + + /** + * Index of the item were highlight was previously drawn to. + * Can be KErrNotFound. + */ + TInt iHighlightedItem; + + /** + * Scrollbar's desired visibility. This is calculated in conjunction with + * menu pane's size and used later on when calculating scrollbar's layout. + */ + CEikScrollBarFrame::TScrollBarVisibility iScrollbarVisibility; private: // Data CPeriodic* iTimer; // timer to launch submenu, own @@ -453,12 +397,6 @@ inline void CEikMenuPane::CMenuScroller::SetTopItemIndex(TInt aIndex) { iTopItemIndex=aIndex; -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - if ( iMenuPane.iExtension ) - { - iTopItemIndex = aIndex; - } -#endif } inline CIdle* CEikMenuPane::CMenuScroller::Idle() const @@ -474,16 +412,8 @@ iLastFeedbackTopItemIndex = 0; iPressedDown = EFalse; iFlickActive = EFalse; - - TRect rect; - if ( !iControl->iOwner ) - { - rect = iMenuPaneRect; - } - else - { - rect = iControl->Rect(); - } + + TRect rect( iMenuPaneRect ); TInt itemHeight = iControl->iItemHeight; TInt itemsInRect = rect.Height() / itemHeight; @@ -537,19 +467,18 @@ void CEikMenuPaneExtension::ViewPositionChanged( const TPoint& aNewPosition, TBool aDrawNow, TUint /*aFlags*/ ) - { + { _AKNTRACE_FUNC_ENTER; - if ( !iControl->iItemArray ) + TInt delta = iViewPosition.iY - aNewPosition.iY; + + if ( !iControl->iItemArray || delta == 0 ) { return; } - + iListTopIndex = aNewPosition.iY - iViewHeight / 2; - iListBottomIndex = aNewPosition.iY + iViewHeight - iViewHeight / 2; - TInt delta = iViewPosition.iY - aNewPosition.iY; - DoOffset( delta ); iViewPosition = aNewPosition; @@ -560,16 +489,21 @@ if ( aDrawNow ) { - TRAP_IGNORE( iControl->DoUpdateScrollBarL() ); - - if ( iControl->iOwner ) // Submenu + if ( iFlags.IsClear( ESkipScrollbarUpdate ) ) { - iControl->DrawNow(); + TRAP_IGNORE( iControl->DoUpdateScrollBarL() ); } - else + + // Redraw only item area if scrollbar is invisible, otherwise include + // also scrollbar's area in order to avoid drawdeferred. + TRect drawRect( iItemAreaRect ); + + if ( iScrollbarVisibility == CEikScrollBarFrame::EOn ) { - iControl->DrawNow( TRect( iMenuPaneRect.Size() ) ); - } + drawRect = iMenuAreaRect; + } + + iControl->DrawNow( drawRect ); } _AKNTRACE_FUNC_EXIT; } @@ -736,14 +670,6 @@ { _AKNTRACE_FUNC_ENTER; iFlickActive = EFalse; -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - MAknListBoxTfx* tfxApi = CAknListLoader::TfxApi( iGc ); - - if ( tfxApi ) - { - tfxApi->EnableEffects( ETrue ); - } -#endif // RD_UI_TRANSITION_EFFECTS_LIST _AKNTRACE_FUNC_EXIT; } @@ -936,7 +862,6 @@ // ----------------------------------------------------------------------------- // CEikMenuPaneExtension::CEikMenuPaneExtension() : - CActive( EPriorityHigh ), // Initialise data members to zero iCascadeBitmap( NULL ), iCascadeBitmapMask( NULL ), @@ -948,16 +873,10 @@ iRadioButtonBitmapMask( NULL ), iHasRadioGroup( EFalse ), iSelectedRadioButtonItem( KNoSelectedRadioButtonItem ), - iGrabbingCBAComponent( NULL ), iControl( NULL ), - iAnimation( NULL ), - iAnimFlags ( 0 ), iSct( NULL ), iSctHighlighted( EFalse ), iSpecialCharPointed( EFalse ) -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - ,iGc ( NULL ) -#endif // RD_UI_TRANSITION_EFFECTS_LIST ,iVerticalOffset( 0 ) ,iPhysics( NULL ) ,iListTopIndex( 0 ) @@ -967,9 +886,9 @@ ,iFeedback( MTouchFeedback::Instance() ) ,iLastFeedbackTopItemIndex( 0 ) { - iIsPenEnable = AknLayoutUtils::PenEnabled(); - iItemsReadyForPenSelection = !iIsPenEnable; + iItemsReadyForPenSelection = !AknLayoutUtils::PenEnabled(); iNextHighlightItem = KErrNotFound; + iHighlightedItem = KErrNotFound; } // ----------------------------------------------------------------------------- @@ -980,17 +899,6 @@ CEikMenuPaneExtension::~CEikMenuPaneExtension() { _AKNTRACE_FUNC_ENTER; -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - if ( CAknListLoader::TfxApiInternal( iGc ) ) - { - delete iGc; - } -#endif - Cancel(); // Cancel possibly pending request - - // Stop receiving foreground events - CCoeEnv* env = CCoeEnv::Static(); - env->RemoveForegroundObserver( *this ); delete iCascadeBitmap; iCascadeBitmap = NULL; @@ -1015,9 +923,6 @@ iControl = NULL; - delete iAnimation; - iAnimation = NULL; - delete iSct; iSct = NULL; @@ -1053,8 +958,6 @@ { ASSERT( aControl ); iControl = aControl; - iAnimFlags.Set( EFlagUseAnimation ); // Animations are created by default - CActiveScheduler::Add( this ); iDraggedOutside = EFalse; iLaunchCascadeMenu = EFalse; iButtonDownItem = KErrNotFound; @@ -1064,11 +967,6 @@ // Delays submenu opening during appear transitions iRedirectionListener = new ( ELeave ) CRedirectionListener( *this ); } -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - iGc = CAknListLoader::CreateTfxGc( *aControl, - iControl->iScroller->iTopItemIndex, - iTotalNumberOfItemsInView ); -#endif // RD_UI_TRANSITION_EFFECTS_LIST if ( static_cast( iControl->ControlEnv()->AppUi() )->IsSingleClickCompatible() ) { @@ -1084,55 +982,6 @@ KAknsIIDQsnFrPopup, TRect( 0, 0, 1, 1 ), TRect( 0, 0, 1, 1 ), EFalse ); } -// ----------------------------------------------------------------------------- -// CEikMenuPaneExtension::CreateAnimation -// ----------------------------------------------------------------------------- -// -void CEikMenuPaneExtension::CreateAnimation() - { -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - return; -#else - if( !iAnimation && iAnimFlags.IsSet( EFlagUseAnimation ) ) - { - TRect rect = iControl->HighlightRect(); - TRAPD( err, CreateAnimationL( rect.Size() ) ); - if( KErrNone != err ) - { - // Animation has not been drawn -> no need for repaint - UseNoAnimation(); - } - } -#endif //RD_UI_TRANSITION_EFFECTS_LIST - } - -// ----------------------------------------------------------------------------- -// CEikMenuPaneExtension::NoAnimIfError -// ----------------------------------------------------------------------------- -// -void CEikMenuPaneExtension::NoAnimIfError( TInt aError ) - { - if( KErrNone != aError ) - UseNoAnimation(); - } - -// ----------------------------------------------------------------------------- -// CEikMenuPaneExtension::UseNoAnimation -// Falls back to normal highlight rendering. -// ----------------------------------------------------------------------------- -// -void CEikMenuPaneExtension::UseNoAnimation() - { - delete iAnimation; - iAnimation = NULL; - - // Do not attempt to create animations in the future - iAnimFlags.Clear( EFlagUseAnimation ); - - // Stop receiving foreground events - CCoeEnv* env = CCoeEnv::Static(); - env->RemoveForegroundObserver( *this ); - } // ----------------------------------------------------------------------------- // CEikMenuPaneExtension::StartCascadeMenuTimerL @@ -1157,6 +1006,7 @@ _AKNTRACE_FUNC_EXIT; } + // ----------------------------------------------------------------------------- // CEikMenuPaneExtension::StopCascadeMenuTimer // Stops the timer for the sub menu launch @@ -1260,6 +1110,7 @@ _AKNTRACE_FUNC_EXIT; } + // ----------------------------------------------------------------------------- // CEikMenuPaneExtension::HighlightTimerCallBack // Callback function of the timer for pressed down highlight @@ -1311,11 +1162,12 @@ { if ( !iControl->iSBFrame ) { - iControl->CreateScrollBarFrame(); - } - TRect scrollBarRect = iControl->iSBFrame->VerticalScrollBar()->Rect(); - TPoint scrollerTl = scrollBarRect.iTl; - TPoint scrollerBr = scrollBarRect.iBr; + return; + } + + TRect scrollBarRect( iControl->iSBFrame->VerticalScrollBar()->Rect() ); + TPoint scrollerTl( scrollBarRect.iTl ); + TPoint scrollerBr( scrollBarRect.iBr ); TRect gapRect; // For layout that left to right if ( !AknLayoutUtils::LayoutMirrored() ) @@ -1363,158 +1215,14 @@ TPointerEvent& aParentEvent ) { aParentEvent.iModifiers = aPointerEvent.iModifiers; - TPoint subPos = iControl->PositionRelativeToScreen(); - TPoint ownerPos = iControl->iOwner->PositionRelativeToScreen(); + TPoint subPos = iControl->Position(); + TPoint ownerPos = iControl->iOwner->Position(); aParentEvent.iPosition.SetXY ( aPointerEvent.iPosition.iX + subPos.iX - ownerPos.iX, aPointerEvent.iPosition.iY + subPos.iY - ownerPos.iY); aParentEvent.iType = aPointerEvent.iType; } -// ----------------------------------------------------------------------------- -// CEikMenuPaneExtension::GetBackgroundRect -// Get background rect for landscape mode of menu pane. -// ----------------------------------------------------------------------------- -// -TRect CEikMenuPaneExtension::GetBackgroundRect( const TRect& aWindowRect ) const - { - return aWindowRect; - } - -// ----------------------------------------------------------------------------- -// CEikMenuPaneExtension::AdjustPopupLayoutData -// Adjust popup layout data for main menu pane in landscape mode -// ----------------------------------------------------------------------------- -// -void CEikMenuPaneExtension::AdjustPopupLayoutData( TAknWindowLineLayout& aListScrollPaneLayout ) - { - TRect screenRect; - AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EScreen, screenRect ); - AknLayoutUtils::TAknCbaLocation cbaPosition = AknLayoutUtils::CbaLocation(); - - if ( screenRect.Width() == EQhdWidth && screenRect.Height() == EQhdHeight - && cbaPosition == AknLayoutUtils::EAknCbaLocationBottom ) - { - if ( !AknLayoutUtils::LayoutMirrored() ) - { - aListScrollPaneLayout.ir -= 32; - } - else - { - aListScrollPaneLayout.il -= 32; - } - } - } - - -// ----------------------------------------------------------------------------- -// CEikMenuPaneExtension::GetMenuItemTextLayout -// Get Layout of menu item text. -// ----------------------------------------------------------------------------- -// -const TAknLayoutText CEikMenuPaneExtension::GetMenuItemTextLayout(const TRect& aItemRect, TBool cascade) - { - TAknTextLineLayout menuTextLayout; - - if ( !iControl->iOwner ) - { - menuTextLayout = AknLayoutScalable_Avkon::list_single_pane_t1_cp2( cascade ? 3 : 0 ).LayoutLine(); - } - else - { - if ( iHasIcon ) - { - menuTextLayout = TAknTextLineLayout( AknLayoutScalable_Avkon::list_single_popup_submenu_pane_t1( 1 ).LayoutLine() ); - } - else - { - menuTextLayout = TAknTextLineLayout( AknLayoutScalable_Avkon::list_single_popup_submenu_pane_t1( 0 ).LayoutLine() ); - } - } - - TAknLayoutText textRect; - textRect.LayoutText( aItemRect, menuTextLayout ); - return textRect; - } - - -// ----------------------------------------------------------------------------- -// CEikMenuPaneExtension::FocusGained -// The owning control has gained focus -> animation should be continued. -// ----------------------------------------------------------------------------- -// -void CEikMenuPaneExtension::FocusGained() - { - Play(); - } - -// ----------------------------------------------------------------------------- -// CEikMenuPaneExtension::FocusLost -// The owning control has lost focus -> no running animation (even if the -// control is partially visible). -// ----------------------------------------------------------------------------- -// -void CEikMenuPaneExtension::FocusLost() - { - if( iAnimation ) - { - NoAnimIfError( iAnimation->Pause() ); - } - } - -// ----------------------------------------------------------------------------- -// CEikMenuPaneExtension::HandleLayoutSwitch -// ----------------------------------------------------------------------------- -// -void CEikMenuPaneExtension::HandleLayoutSwitch() - { - if( iAnimation ) // Animation exists -> try to resize - { - TRect rect( iControl->HighlightRect() ); - - // Resize animation - TBool aboutToStart = ETrue; - if( iAnimation->State() == EAknsAnimStateStopped ) - aboutToStart = EFalse; - - TRAPD( err, DoResizeL( rect.Size(), aboutToStart ) ); - NoAnimIfError( err ); - } - } - -// ----------------------------------------------------------------------------- -// CEikMenuPaneExtension::ChangeHighlightBackground -// ----------------------------------------------------------------------------- -// -void CEikMenuPaneExtension::ChangeHighlightBackground() - { - // Every time the current list item is changed we need to change the - // animation input layer (animated element is the highlight bacground that - // can differ between highlight positions). - if( iAnimation ) - { - if( iAnimation->State() == EAknsAnimStateStopped ) - { - // Input layers don't exist when stopped or finished. We need to - // resize to create the input layers and to update the output - // layer. - - TRAPD( err, DoResizeL( iAnimation->Size(), EFalse ) ); - NoAnimIfError( err ); - } - else // Either paused, running or finished - { - // Update the highlight background - if( iAnimation->InputRgbGc() ) - DrawHighlightBackground( *iAnimation->InputRgbGc() ); - - // We need to update the output frame (otherwise the highlight - // would drawn with the old output before the next new animation - // frame). - NoAnimIfError( iAnimation->UpdateOutput() ); - } - } - } // ----------------------------------------------------------------------------- // CEikMenuPaneExtension::MenuClosed @@ -1523,20 +1231,9 @@ void CEikMenuPaneExtension::MenuClosed() { _AKNTRACE_FUNC_ENTER; - delete iAnimation; - iAnimation = NULL; - - CCoeEnv* env = CCoeEnv::Static(); - env->RemoveForegroundObserver( *this ); - - iAnimFlags.Set( EFlagUseAnimation ); - delete iSct; iSct = NULL; iSctHighlighted = EFalse; -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - iSctRect = TRect::EUninitialized; -#endif if ( iCba ) { @@ -1554,192 +1251,6 @@ _AKNTRACE_FUNC_EXIT; } -// ----------------------------------------------------------------------------- -// CEikMenuPaneExtension::HandleGainingForeground -// The application has gained foreground -> animation should be continued. -// ----------------------------------------------------------------------------- -// -void CEikMenuPaneExtension::HandleGainingForeground() - { - // It is safe to start animation in this method because animation is - // deleted when the menu is closed -> it is not possible that menu receives - // foreground event while it is not visible and the animation exists. - - // We need to check if the menu has focus (to prevent running nonfocused - // animation because also the nonfocused menu (menu/submenu) receives - // foreground events) - Play(); - } - -// ----------------------------------------------------------------------------- -// CEikMenuPaneExtension::HandleLosingForeground -// The application lost foreground -> no running animation (even if the -// application is partially visible). -// ----------------------------------------------------------------------------- -// -void CEikMenuPaneExtension::HandleLosingForeground() - { - if( iAnimation ) - { - NoAnimIfError( iAnimation->Stop() ); - } - } - -// ----------------------------------------------------------------------------- -// CEikMenuPaneExtension::AnimFrameReady -// ----------------------------------------------------------------------------- -// -void CEikMenuPaneExtension::AnimFrameReady( TInt aError, TInt ) - { - if( KErrNone != aError ) - { - // Animation has failed to run -> schedule the animation for - // deletion to fall back to normal rendering. - PostDeleteAnimation(); - } - else if( iControl ) // Frame ok - { - if ( iControl->IsVisible() ) - { - iControl->RepaintHighlight(); - } - } - } - -// ----------------------------------------------------------------------------- -// CEikMenuPaneExtension::DoCancel -// ----------------------------------------------------------------------------- -// -void CEikMenuPaneExtension::DoCancel() - { - // Required method, but not needed - } - - -// ----------------------------------------------------------------------------- -// CEikMenuPaneExtension::RunL -// Postponed animation deletion is done here -// ----------------------------------------------------------------------------- -// -void CEikMenuPaneExtension::RunL() - { - UseNoAnimation(); - } - -// ----------------------------------------------------------------------------- -// CEikMenuPaneExtension::Play -// ----------------------------------------------------------------------------- -// -void CEikMenuPaneExtension::Play() - { - if( !iAnimation || !iControl->IsFocused() ) - { - return; - } - - // No need to start running/finished animation - if( EAknsAnimStateRunning == iAnimation->State() || - EAknsAnimStateFinished == iAnimation->State() ) - { - return; - } - - CAknAppUi* aui = static_cast(CEikonEnv::Static()->AppUi()); - if( !aui->IsForeground() ) - { - return; - } - - if( EAknsAnimStatePaused == iAnimation->State() ) - { - NoAnimIfError( iAnimation->Continue() ); - } - else if( EAknsAnimStateStopped == iAnimation->State() ) - { - if( iAnimation->NeedsInputLayer() ) - { - TRAPD( err, DoResizeL( iAnimation->Size(), ETrue ) ); - NoAnimIfError( err ); - - if( KErrNone != err ) - return; - } - - NoAnimIfError( iAnimation->Start() ); - } - } - -// ----------------------------------------------------------------------------- -// CEikMenuPaneExtension::DrawHighlightBackground -// Draws skinned highlight background to the provided graphics context. -// ----------------------------------------------------------------------------- -// -TBool CEikMenuPaneExtension::DrawHighlightBackground( CFbsBitGc& aGc ) - { - // Draw the background under the current highlight. This simplified - // drawing, we only grab a piece from the list background bitmap. - MAknsSkinInstance* skin = AknsUtils::SkinInstance(); - - return AknsDrawUtils::DrawBackground( skin, iBgContext, iControl, aGc, TPoint(0,0), - iControl->HighlightRect(), - KAknsDrawParamRGBOnly ); - } - -// ----------------------------------------------------------------------------- -// CEikMenuPaneExtension::PostDeleteAnimation -// Schedules the animation for deletion by activating the extension itself. -// Deletion is postponed because in many error/failure occasions the caller has -// been animation and direct deletion is possibly not safe (because function -// stack would return through the deleted object). -// ----------------------------------------------------------------------------- -// -void CEikMenuPaneExtension::PostDeleteAnimation() - { - TRequestStatus* status = &iStatus; - User::RequestComplete( status, KErrNone ); - SetActive(); - } - -// ----------------------------------------------------------------------------- -// CEikMenuPaneExtension::CreateAnimationL -// ----------------------------------------------------------------------------- -// -void CEikMenuPaneExtension::CreateAnimationL( const TSize& aHighlightSize ) - { - // Create animation - CCoeEnv* env = CCoeEnv::Static(); - env->AddForegroundObserverL( *this ); - - delete iAnimation; - iAnimation = NULL; - - iAnimation = CAknsEffectAnim::NewL( this ); - TBool ok = iAnimation->ConstructFromSkinL( KAknsIIDQsnAnimList ); - - if( !ok ) // Animation for the ID was not found from the skin - { - User::Leave( KErrNotFound ); - } - - DoResizeL( aHighlightSize, ETrue ); - - Play(); - } - -// ----------------------------------------------------------------------------- -// CEikMenuPaneExtension::DoResizeL -// ----------------------------------------------------------------------------- -// -void CEikMenuPaneExtension::DoResizeL( - const TSize& aHighlightSize, TBool aAboutToStart ) - { - iAnimation->BeginConfigInputLayersL( aHighlightSize, aAboutToStart ); - - if( iAnimation->InputRgbGc() ) - DrawHighlightBackground( *iAnimation->InputRgbGc() ); - - iAnimation->EndConfigInputLayersL(); - } // ----------------------------------------------------------------------------- // CEikMenuPaneExtension::ConstructMenuSctRowL @@ -1762,11 +1273,8 @@ if ( renew && iMenuPaneWindow && iControl ) { iSct->SetContainerWindowL( *iControl ); - if ( AknLayoutUtils::PenEnabled() ) - { - iSct->SetGloballyCapturing( ETrue ); - iSct->SetPointerCapture( ETrue ); - } + iSct->SetGloballyCapturing( ETrue ); + iSct->SetPointerCapture( ETrue ); } _AKNTRACE_FUNC_EXIT; } @@ -1791,11 +1299,8 @@ if ( renew && iMenuPaneWindow && iControl) { iSct->SetContainerWindowL( *iControl ); - if ( AknLayoutUtils::PenEnabled() ) - { - iSct->SetGloballyCapturing( ETrue ); - iSct->SetPointerCapture( ETrue ); - } + iSct->SetGloballyCapturing( ETrue ); + iSct->SetPointerCapture( ETrue ); } } @@ -1806,13 +1311,10 @@ void CEikMenuPaneExtension::HandleControlEventL(CCoeControl* /*aControl*/,TCoeEvent aEventType) { _AKNTRACE_FUNC_ENTER; - if ( AknLayoutUtils::PenEnabled() ) - { - if(aEventType == EEventStateChanged) - { - // Something has been selected from CharMap - iSpecialCharPointed = ETrue; - } + if ( aEventType == EEventStateChanged ) + { + // Something has been selected from CharMap + iSpecialCharPointed = ETrue; } _AKNTRACE( "aEventType = %d", aEventType ); _AKNTRACE_FUNC_EXIT; @@ -2362,27 +1864,12 @@ CheckCreateScrollerL(); CheckCreateExtensionL(); - iExtension->iTransitionsOn = FeatureManager::FeatureSupported( KFeatureIdUiTransitionEffects ); - CreateWindowL( iCoeEnv->RootWin() ); EnableWindowTransparency(); SetAllowStrayPointers(); EnableDragEvents(); - TAknWindowLineLayout menuLineLayout; - if ( iOwner ) // submenu - { - menuLineLayout = AknLayoutScalable_Avkon::list_single_popup_submenu_pane( 0 ).LayoutLine(); - } - else - { - menuLineLayout = AknLayoutScalable_Avkon::list_single_pane_cp2( 0 ).LayoutLine(); - } - - TRect windowRect = Rect(); - TAknLayoutRect menuLayoutRect; - menuLayoutRect.LayoutRect( windowRect, menuLineLayout ); - iItemHeight = menuLayoutRect.Rect().Height(); + iItemHeight = CalculateItemHeight(); if ( iExtension->iSct ) { @@ -2390,15 +1877,12 @@ iExtension->iMenuPaneWindow = window; iExtension->iSct->SetContainerWindowL( *this ); - if ( AknLayoutUtils::PenEnabled() ) - { - // This is effectively the same as CCoeControl::EnableDragEvents() - // which is protected. - window->PointerFilter( EPointerFilterDrag, 0 ); - iExtension->iSct->SetGloballyCapturing( ETrue ); - iExtension->iSct->SetPointerCapture( ETrue ); - iExtension->iSct->SetObserver(iExtension); - } + // This is effectively the same as CCoeControl::EnableDragEvents() + // which is protected. + window->PointerFilter( EPointerFilterDrag, 0 ); + iExtension->iSct->SetGloballyCapturing( ETrue ); + iExtension->iSct->SetPointerCapture( ETrue ); + iExtension->iSct->SetObserver(iExtension); } if ( iOwner ) // submenu @@ -2416,7 +1900,6 @@ User::Leave( KErrNoMemory ); Window().SetOrdinalPosition( 0 ); - Window().SetPointerGrab( ETrue ); SetGloballyCapturing( ETrue ); @@ -2440,19 +1923,7 @@ } CreateItemArrayL(); - TAknWindowLineLayout menuLineLayout; - if ( iOwner ) // submenu - { - menuLineLayout = AKN_LAYOUT_WINDOW_list_single_popup_submenu_pane( 0, 0 ); - } - else - { - menuLineLayout = AKN_LAYOUT_WINDOW_list_single_popup_menu_pane( 0 ); - } - TRect windowRect = Rect(); - TAknLayoutRect menuLayoutRect; - menuLayoutRect.LayoutRect( windowRect, menuLineLayout ); - iItemHeight = menuLayoutRect.Rect().Height(); + iItemHeight = CalculateItemHeight(); CheckCreateScrollerL(); CheckCreateExtensionL(); @@ -2789,16 +2260,13 @@ iExtension->StartCascadeMenuAppearTransition(); } - if( AknLayoutUtils::PenEnabled() ) - { - TTouchLogicalFeedback fbLogicalType = ETouchFeedbackPopUp; - if ( CAknTransitionUtils::TransitionsEnabled( AknTransEffect::EComponentTransitionsOff ) ) - { - fbLogicalType = ETouchFeedbackIncreasingPopUp; - } - iExtension->ImmediateFeedback( fbLogicalType, + TTouchLogicalFeedback fbLogicalType = ETouchFeedbackPopUp; + if ( CAknTransitionUtils::TransitionsEnabled( AknTransEffect::EComponentTransitionsOff ) ) + { + fbLogicalType = ETouchFeedbackIncreasingPopUp; + } + iExtension->ImmediateFeedback( fbLogicalType, ETouchFeedbackVibra ); - } _AKNTRACE_FUNC_EXIT; } @@ -2824,11 +2292,6 @@ numItemsInPane++; } - TInt maxNumItemsInMenu = AknLayoutScalable_Avkon:: - list_single_pane_cp2_ParamLimits().LastRow() + 1; - TInt maxNumItemsInSubMenu = AknLayoutScalable_Avkon:: - list_single_popup_submenu_pane_ParamLimits().LastRow() + 1; - TInt maxItemsInView = NumberOfItemsThatFitInView(); if (iExtension && iExtension->iSct) @@ -2866,12 +2329,6 @@ iExtension->iPressedDown = EFalse; iExtension->SetOffset( 0 ); - iExtension->iHasIcon = MenuHasIcon(); - - if ( iExtension->iTransitionsOn ) - { - CAknTransitionUtils::SetAllParents( this ); - } const TSize screenSize( iEikonEnv->EikAppUi()->ApplicationRect().Size() ); @@ -2892,11 +2349,7 @@ SetDefaultHighlight(); } - TRect rect( CalculateSizeAndPosition() ); - TPoint newPos( rect.iTl ); - TSize menuSize( rect.Size() ); - - SetExtent( newPos, menuSize ); + SetRect( CalculateSizeAndPosition() ); // We need to set the background context when calling create for the // first time. Otherwise iExtension->iBgContext would have tiny @@ -2904,15 +2357,6 @@ // white. UpdateBackgroundContext( Rect() ); - // The extent has been set. This is the first safe point in code to - // construct animations (because before this highlight related layout code - // will produce invalid results - if( iExtension ) - { - // Creates animation only if it does not exist - iExtension->CreateAnimation(); - } - // Initialize physics engine TRAP_IGNORE ( iExtension->InitPhysicsL() ); @@ -2967,8 +2411,6 @@ TAknsItemID frameIID; TAknsItemID frameCenterIID; - TRect backgroundRect( iExtension->GetBackgroundRect( aWindowRect ) ); - if( iOwner ) //for sub menu { topLeft.LayoutRect( aWindowRect, SkinLayout::Submenu_skin_placing_Line_2() ); @@ -2978,8 +2420,8 @@ } else { - topLeft.LayoutRect( backgroundRect, SkinLayout::Popup_windows_skin_placing__frame_general__Line_2() ); - bottomRight.LayoutRect( backgroundRect, SkinLayout::Popup_windows_skin_placing__frame_general__Line_5() ); + topLeft.LayoutRect( aWindowRect, SkinLayout::Popup_windows_skin_placing__frame_general__Line_2() ); + bottomRight.LayoutRect( aWindowRect, SkinLayout::Popup_windows_skin_placing__frame_general__Line_5() ); frameIID = KAknsIIDQsnFrPopup; frameCenterIID = KAknsIIDQsnFrPopupCenterMenu; } @@ -3040,16 +2482,7 @@ _AKNTRACE( "previousSelectedItem = %d", previousSelectedItem ); ActivateGc(); -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - MAknListBoxTfxInternal *transApi = CAknListLoader::TfxApiInternal( iExtension->iGc ); - if ( transApi ) - { - iExtension->iGc->Activate( *DrawableWindow() ); - } - CWindowGc& gc = transApi ? *iExtension->iGc : SystemGc(); -#else CWindowGc& gc = SystemGc(); -#endif // RD_UI_TRANSITION_EFFECTS_LIST PrepareGcForDrawingItems( gc ); // Scrollers top item index must be updated first because setting selected @@ -3086,7 +2519,10 @@ if ( previousTopItem == topItem && aNewSelectedItem >= 0 ) { // then only previuosly and currently selected items should be redrawn - DrawItem( gc, previousSelectedItem, ERemoveHighlight ); + if ( iExtension->iHighlightedItem != KErrNotFound ) + { + DrawItem( gc, previousSelectedItem, ERemoveHighlight ); + } if ( !iExtension->iSctHighlighted ) { @@ -3095,12 +2531,14 @@ } else { - TBool skipHighlight = EFalse; + /*TBool skipHighlight = EFalse; + if (iExtension && iExtension->iSct && aNewSelectedItem == 0 && previousSelectedItem > 1) { skipHighlight = ETrue; } + for( TInt i = topItem; iiGc->Deactivate(); - } -#endif // RD_UI_TRANSITION_EFFECTS_LIST + }*/ + + // update the whole menu area + iExtension->ViewPositionChanged( iExtension->iViewPosition ); +// UpdateScrollBarThumbs(); + } + DeactivateGc(); - - UpdateScrollBarThumbs(); - // Updating view position here prevents some flickering - iExtension->ViewPositionChanged( iExtension->iViewPosition ); - _AKNTRACE_FUNC_EXIT; } @@ -3136,177 +2567,15 @@ // void CEikMenuPane::PrepareGcForDrawingItems(CGraphicsContext& aGc) const { - // BIDI /* * get the fonts from the LAF! * Do we need to get them here? - nope - moved to DrawItem() */ -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - MAknListBoxTfxInternal* transApi = CAknListLoader::TfxApiInternal( iExtension->iGc ); - if ( transApi ) - { - transApi->StartDrawing( MAknListBoxTfxInternal::EListNotSpecified ); - } -#endif - - aGc.SetPenColor(iEikonEnv->ControlColor( EColorMenuPaneText, *this) ); -#if defined(MENU_TEXTURED_BACKGROUND) - iEikonEnv->SetTexturedBrush( aGc ); -#else + aGc.SetPenColor( iEikonEnv->ControlColor( EColorMenuPaneText, *this) ); aGc.SetBrushStyle( CGraphicsContext::ESolidBrush ); aGc.SetBrushColor( iEikonEnv->ControlColor( EColorMenuPaneBackground,*this ) ); -#endif - -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - if ( transApi ) - { - transApi->StopDrawing(); - } -#endif - } - -#ifdef RD_UI_TRANSITION_EFFECTS_LIST -/** - * Iterate through the visible items in a menu and calculate minimum - * item margins that dont need drawing. - */ -void CEikMenuPaneExtension::CalcItemSize( MAknListBoxTfxInternal* transApi ) const - { - if ( transApi && iControl->iItemArray && iControl->iItemArray->Count() ) - { - TRect marginRect(TRect::EUninitialized); - const TInt index = 0; - - // Specifies whether the text should be moved to give some space for icon. - TInt hasIcon = iControl->MenuHasIcon() ? 1 : 0; - - TAknWindowLineLayout menuPane( AKN_LAYOUT_WINDOW_list_menu_pane( 0 , 0 ) ); - TAknWindowLineLayout singleMenuPane( - AKN_LAYOUT_WINDOW_list_single_popup_menu_pane( index ) ); - TAknTextLineLayout menuTextLayout( - AKN_LAYOUT_TEXT_List_pane_texts__menu_single__Line_1(0) ); - - TAknLayoutRect menuPaneRect; - TAknLayoutRect singleMenuPaneRect; - TAknLayoutText textRect; - - TBool hasCascade = EFalse; - TBool hasNonCascade = EFalse; - - // number of items in the whole menu - for(TInt i = 0; i < iControl->iItemArray->Count(); i++) - { - CEikMenuPaneItem* item = (*iControl->iItemArray)[i]; - - // true if a cascade symbol must be drawn (main menu only) - TBool cascade = item->iData.iCascadeId != 0; - - if ( cascade ) - { - if ( hasCascade ) - { - if ( hasNonCascade ) - { - break; - } - continue; - } - hasCascade = ETrue; - } - else - { - if ( hasNonCascade ) - { - if ( hasCascade ) - { - break; - } - continue; - } - hasNonCascade = ETrue; - } - - if ( !iControl->iOwner ) - { - TAknWindowLineLayout listScrollPaneLayout( - AknLayoutScalable_Avkon::listscroll_menu_pane(0).LayoutLine() ); - AdjustPopupLayoutData( listScrollPaneLayout ); - TAknLayoutRect listScrollPaneRect; - listScrollPaneRect.LayoutRect( iControl->Rect(), listScrollPaneLayout ); - - menuPane = AknLayoutScalable_Avkon::list_menu_pane( 0 ).LayoutLine(); - menuPaneRect.LayoutRect( listScrollPaneRect.Rect(), menuPane ); - - singleMenuPane = AknLayoutScalable_Avkon::list_single_pane_cp2( index ).LayoutLine(); - singleMenuPaneRect.LayoutRect( menuPaneRect.Rect(), singleMenuPane ); - - menuTextLayout = AknLayoutScalable_Avkon::list_single_pane_t1_cp2( cascade ? 3 : 0 ).LayoutLine(); - } - else // Submenu - { - TBool hasDoubleSpanScrollBar = EFalse; - if ( iControl->iOwner && iControl->iSBFrame && - iControl->iSBFrame->VScrollBarVisibility() ) - { - hasDoubleSpanScrollBar = ETrue; - } - TAknWindowLineLayout listScrollPaneLayout( AknLayoutScalable_Avkon::listscroll_popup_sub_pane().LayoutLine() ); - TAknLayoutRect listScrollPaneRect; - listScrollPaneRect.LayoutRect( iControl->Rect(), listScrollPaneLayout ); - - menuPane = AknLayoutScalable_Avkon::list_submenu_pane( !hasDoubleSpanScrollBar ).LayoutLine(); - menuPaneRect.LayoutRect( listScrollPaneRect.Rect(), menuPane ); - - singleMenuPane = AknLayoutScalable_Avkon::list_single_popup_submenu_pane( index ).LayoutLine(); - singleMenuPaneRect.LayoutRect( menuPaneRect.Rect(), singleMenuPane ); - - menuTextLayout = TAknTextLineLayout( AknLayoutScalable_Avkon::list_single_popup_submenu_pane_t1( hasIcon ).LayoutLine() ); - } - - textRect.LayoutText( singleMenuPaneRect.Rect(), menuTextLayout ); - if (marginRect == TRect::EUninitialized) - { - marginRect = textRect.TextRect(); - } - else - { - marginRect.BoundingRect(textRect.TextRect()); - } - - if ( cascade ) - { - TAknWindowLineLayout elementCascade( AknLayoutScalable_Avkon::list_single_pane_cp2_g3().LayoutLine()); - TAknLayoutRect cascadeRect; - cascadeRect.LayoutRect( singleMenuPaneRect.Rect(), elementCascade ); - marginRect.BoundingRect(cascadeRect.Rect()); - } - else - { - TAknLayoutRect activeApplicationsIconRect; - activeApplicationsIconRect.LayoutRect( singleMenuPaneRect.Rect(), - AknLayoutScalable_Avkon::list_single_pane_g1_cp2(0).LayoutLine() ); - marginRect.BoundingRect(activeApplicationsIconRect.Rect()); - } - } - - if ( hasIcon ) - { - TAknLayoutRect iconLayoutRect; - iconLayoutRect.LayoutRect( singleMenuPaneRect.Rect(), - AknLayoutScalable_Avkon::list_single_popup_submenu_pane_g1().LayoutLine() ); - marginRect.BoundingRect(iconLayoutRect.Rect()); - } - - //send margins to tfx - TPoint tl ( marginRect.iTl - menuPaneRect.Rect().iTl ); - transApi->SetPosition( MAknListBoxTfxInternal::EListTLMargin, tl ); - - TPoint br( singleMenuPaneRect.Rect().Size().AsPoint() - marginRect.iBr + menuPaneRect.Rect().iTl ); - transApi->SetPosition( MAknListBoxTfxInternal::EListBRMargin, br ); - } - } -#endif + } // --------------------------------------------------------------------------- @@ -3316,28 +2585,9 @@ void CEikMenuPane::DrawItem( TInt aItem, THighlightType aHighlight ) const { ActivateGc(); -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - MAknListBoxTfxInternal* transApi = - CAknListLoader::TfxApiInternal( iExtension->iGc ); - - if ( transApi ) - { - iExtension->iGc->Activate( *DrawableWindow() ); - } - - CWindowGc& gc = transApi ? *iExtension->iGc : SystemGc(); -#else CWindowGc& gc = SystemGc(); -#endif // RD_UI_TRANSITION_EFFECTS_LIST PrepareGcForDrawingItems( gc ); DrawItem( gc, aItem, aHighlight ); - -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - if ( transApi ) - { - iExtension->iGc->Deactivate(); - } -#endif // RD_UI_TRANSITION_EFFECTS_LIST DeactivateGc(); } @@ -3363,14 +2613,6 @@ return; } - // seem to have window owning control in correct place - TRect windowRect = Rect(); - - if ( !iOwner ) - { - windowRect.iBr.iY -= ( iExtension->iCba->Rect().Height() ); - } - CEikMenuPaneItem* item = (*iItemArray)[aItem]; // Max visible number of items in menu / submenu TInt maxNumberOfItems = NumberOfItemsThatFitInView(); @@ -3404,12 +2646,15 @@ index += itemLeftInBottom; } - TBool drawPartialItem(EFalse); + TBool drawSeparator = !( ( index + topIndex ) == numItemsInArray - 1 ); + TBool drawPartialItem = EFalse; + if ( index == maxNumberOfItems ) { // We have partial items to draw because of panning so there // is one more item to draw than normally. drawPartialItem = ETrue; + // There is no layout data for the extra item, so we used the one // above it. --index; @@ -3421,58 +2666,32 @@ return; // only interested in drawing visible items } - // Collect all of the information from the Layout DLL. Initialise these - // variables with DUMMY data. Then replace it with menu/submenu data. - TAknWindowLineLayout menuPane( AKN_LAYOUT_WINDOW_list_menu_pane( 0 , 0 ) ); - TAknWindowLineLayout singleMenuPane( - AKN_LAYOUT_WINDOW_list_single_popup_menu_pane( index ) ); - TAknTextLineLayout menuTextLayout( - AKN_LAYOUT_TEXT_List_pane_texts__menu_single__Line_1(0) ); - TAknLayoutRect menuPaneRect; + TAknTextLineLayout menuTextLayout; TAknLayoutRect singleMenuPaneRect; - if ( !iOwner ) - { - TAknWindowLineLayout listScrollPaneLayout( - AknLayoutScalable_Avkon::listscroll_menu_pane(0).LayoutLine() ); - if ( iExtension ) - { - iExtension->AdjustPopupLayoutData( listScrollPaneLayout ); - } - TAknLayoutRect listScrollPaneRect; - listScrollPaneRect.LayoutRect( windowRect, listScrollPaneLayout ); - - menuPane = AknLayoutScalable_Avkon::list_menu_pane( 0 ).LayoutLine(); - menuPaneRect.LayoutRect( listScrollPaneRect.Rect(), menuPane ); - - singleMenuPane = AknLayoutScalable_Avkon::list_single_pane_cp2( index ).LayoutLine(); - singleMenuPaneRect.LayoutRect( menuPaneRect.Rect(), singleMenuPane ); - - menuTextLayout = AknLayoutScalable_Avkon::list_single_pane_t1_cp2( cascade ? 3 : 0 ).LayoutLine(); - } - else // Submenu - { - TBool hasDoubleSpanScrollBar = EFalse; - if ( iSBFrame && iSBFrame->VScrollBarVisibility() ) - { - hasDoubleSpanScrollBar = ETrue; - } - - TAknWindowLineLayout listScrollPaneLayout( AknLayoutScalable_Avkon::listscroll_popup_sub_pane().LayoutLine() ); - TAknLayoutRect listScrollPaneRect; - listScrollPaneRect.LayoutRect( windowRect, listScrollPaneLayout ); - - menuPane = AknLayoutScalable_Avkon::list_submenu_pane( !hasDoubleSpanScrollBar ).LayoutLine(); - menuPaneRect.LayoutRect( listScrollPaneRect.Rect(), menuPane ); - - singleMenuPane = AknLayoutScalable_Avkon::list_single_popup_submenu_pane( index ).LayoutLine(); - singleMenuPaneRect.LayoutRect( menuPaneRect.Rect(), singleMenuPane ); - - menuTextLayout = TAknTextLineLayout( AknLayoutScalable_Avkon::list_single_popup_submenu_pane_t1( 0 ).LayoutLine() ); - + if ( !iOwner ) // main menu + { + singleMenuPaneRect.LayoutRect( iExtension->iItemAreaRect, + AknLayoutScalable_Avkon::list_single_pane_cp2( index ).LayoutLine() ); + menuTextLayout = + AknLayoutScalable_Avkon::list_single_pane_t1_cp2( cascade ? 1 : 0 ).LayoutLine(); + } + else // submenu + { + singleMenuPaneRect.LayoutRect( iExtension->iItemAreaRect, + AknLayoutScalable_Avkon::list_single_popup_submenu_pane( index ).LayoutLine() ); + if ( hasIcon ) { - menuTextLayout = TAknTextLineLayout( AknLayoutScalable_Avkon::list_single_popup_submenu_pane_t1( 1 ).LayoutLine() ); + menuTextLayout = + TAknTextLineLayout( + AknLayoutScalable_Avkon::list_single_popup_submenu_pane_t1( 1 ).LayoutLine() ); + } + else + { + menuTextLayout = + TAknTextLineLayout( + AknLayoutScalable_Avkon::list_single_popup_submenu_pane_t1( 0 ).LayoutLine() ); } } @@ -3492,18 +2711,12 @@ RWindow& window = Window(); - if ( &window && window.GetDrawRect() == TRect::EUninitialized ) - { -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - MAknListBoxTfxInternal* transApi = - CAknListLoader::TfxApiInternal( &aGc ); - drawingInitiated = transApi && !transApi->EffectsDisabled(); -#else + if ( &window && window.GetDrawRect() == TRect::EUninitialized ) + { drawingInitiated = EFalse; -#endif - } - - if ( !drawingInitiated ) + } + + if ( !drawingInitiated && !iExtension->iFullRedraw ) { window.Invalidate( itemRect ); window.BeginRedraw( itemRect ); @@ -3516,136 +2729,70 @@ cc = iExtension->iBgContext; } TBool background( ETrue ); -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - MAknListBoxTfxInternal *transApi = CAknListLoader::TfxApiInternal( &aGc ); - if ( transApi && !transApi->EffectsDisabled() ) - { - iExtension->iGc->Activate( *DrawableWindow() ); - } -#endif - -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - if ( !transApi || transApi->EffectsDisabled() ) - { -#endif + + aGc.SetBrushStyle( CGraphicsContext::ESolidBrush ); + aGc.SetBrushColor( singleMenuPaneRect.Color() ); + + // there can be partial items, so clip drawing on menu pane's item area + aGc.SetClippingRect( iExtension->iItemAreaRect ); + + if (!iExtension->iFullRedraw) + { + background = AknsDrawUtils::Background( + skin, cc, this, aGc, itemRect, + KAknsDrawParamNoClearUnderImage ); + } + + if ( !background ) + { aGc.SetBrushStyle( CGraphicsContext::ESolidBrush ); - aGc.SetBrushColor( singleMenuPaneRect.Color() ); - - if(!iExtension->iFullRedraw) - { - background = AknsDrawUtils::Background( - skin, cc, this, aGc, itemRect, - KAknsDrawParamNoClearUnderImage ); - } - - if( !background ) - { - aGc.SetBrushStyle( CGraphicsContext::ESolidBrush ); - aGc.SetPenStyle( CGraphicsContext::ENullPen ); - aGc.SetPenColor( singleMenuPaneRect.Color() ); - aGc.SetBrushColor( singleMenuPaneRect.Color() ); - aGc.DrawRect( itemRect ); - } -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - } -#endif + aGc.SetPenStyle( CGraphicsContext::ENullPen ); + aGc.SetPenColor( singleMenuPaneRect.Color() ); + aGc.SetBrushColor( singleMenuPaneRect.Color() ); + aGc.DrawRect( itemRect ); + } if ( !iExtension->HighlightEnabled() ) { aHighlight = ENoHighlight; } - + switch ( aHighlight ) { case EDrawHighlight : { if ( !iExtension->iSctHighlighted ) { -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - if ( transApi ) - { - // This will remove the old bitmap - transApi->Invalidate( MAknListBoxTfxInternal::EListHighlight ); - - transApi->BeginRedraw( MAknListBoxTfxInternal::EListHighlight, - itemRect ); - transApi->StartDrawing( MAknListBoxTfxInternal::EListHighlight ); - } -#endif - - // Partial items, so prevent drawing over the edge of menu pane -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - if ( !transApi || ( transApi && transApi->EffectsDisabled() ) ) - { - aGc.SetClippingRect(menuPaneRect.Rect()); - } -#else - aGc.SetClippingRect(menuPaneRect.Rect()); -#endif // RD_UI_TRANSITION_EFFECTS_LIST - - TBool drawOk = EFalse; - if( iExtension->iAnimation ) // Draw animated highlight - { -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - if ( transApi && transApi->VerifyKml() == KErrNone ) - { - Extension()->UseNoAnimation(); - } - else - { -#endif - TAknLayoutRect highlightTopLeft; - TAknLayoutRect highlightBottomRight; - - highlightTopLeft.LayoutRect( itemRect, - SkinLayout::List_highlight_skin_placing__popup_windows__Line_2() ); - highlightBottomRight.LayoutRect( itemRect, - SkinLayout::List_highlight_skin_placing__popup_windows__Line_5() ); - - TRect outerRect( highlightTopLeft.Rect().iTl, highlightBottomRight.Rect().iBr ); - - drawOk = iExtension->iAnimation->Render( aGc, outerRect ); -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - } -#endif - } - - if( !drawOk ) - { - // Animated highlight was not available, use normal skinned - // rendering. - - // Because of transparency, background must be drawn here as well - // (as frame may be see-through) - aGc.SetBrushStyle( CGraphicsContext::ESolidBrush ); - aGc.SetBrushColor( singleMenuPaneRect.Color() ); - - AknsDrawUtils::Background( - skin, cc, this, aGc, itemRect, - KAknsDrawParamNoClearUnderImage ); - - TAknLayoutRect highlightTopLeft; - TAknLayoutRect highlightBottomRight; - - highlightTopLeft.LayoutRect(itemRect, - SkinLayout::List_highlight_skin_placing__popup_windows__Line_2() ); - highlightBottomRight.LayoutRect(itemRect, - SkinLayout::List_highlight_skin_placing__popup_windows__Line_5() ); - TRect outerRect( highlightTopLeft.Rect().iTl, highlightBottomRight.Rect().iBr ); - TRect innerRect( highlightTopLeft.Rect().iBr, highlightBottomRight.Rect().iTl ); - - drawOk = AknsDrawUtils::DrawFrame( skin, - aGc, - outerRect, - innerRect, - KAknsIIDQsnFrList, - KAknsIIDDefault ); - - } - - // Both animated highlight and normal highlight drawing have - // failed. - if( !drawOk ) + iExtension->iHighlightedItem = aItem; + + // Because of transparency, background must be drawn here as well + // (as frame may be see-through) + aGc.SetBrushStyle( CGraphicsContext::ESolidBrush ); + aGc.SetBrushColor( singleMenuPaneRect.Color() ); + + AknsDrawUtils::Background( + skin, cc, this, aGc, itemRect, + KAknsDrawParamNoClearUnderImage ); + + TAknLayoutRect highlightTopLeft; + TAknLayoutRect highlightBottomRight; + + highlightTopLeft.LayoutRect(itemRect, + SkinLayout::List_highlight_skin_placing__popup_windows__Line_2() ); + highlightBottomRight.LayoutRect(itemRect, + SkinLayout::List_highlight_skin_placing__popup_windows__Line_5() ); + TRect outerRect( highlightTopLeft.Rect().iTl, highlightBottomRight.Rect().iBr ); + TRect innerRect( highlightTopLeft.Rect().iBr, highlightBottomRight.Rect().iTl ); + + TBool drawOk = AknsDrawUtils::DrawFrame( skin, + aGc, + outerRect, + innerRect, + KAknsIIDQsnFrList, + KAknsIIDDefault ); + + // skinned highlight drawing has failed + if ( !drawOk ) { TAknLayoutRect shadowRect; TAknLayoutRect highlightRect; @@ -3657,41 +2804,18 @@ shadowRect.DrawRect( aGc ); highlightRect.DrawRect( aGc ); } - - aGc.CancelClippingRect(); - -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - if ( transApi ) - { - transApi->StopDrawing(); - transApi->EndRedraw( MAknListBoxTfxInternal::EListHighlight ); - } -#endif } break; } case ERemoveHighlight: case ENoHighlight: + if ( iExtension->iHighlightedItem == aItem ) + { + iExtension->iHighlightedItem = KErrNotFound; + } default: break; } -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - if ( transApi ) - { - transApi->BeginRedraw( MAknListBoxTfxInternal::EListItem, itemRect, aItem ); - transApi->StartDrawing( MAknListBoxTfxInternal::EListItem ); - } -#endif // RD_UI_TRANSITION_EFFECTS_LIST - - // Partial items, so prevent drawing over the edge of menu pane -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - if ( !transApi || ( transApi && transApi->EffectsDisabled() ) ) - { - aGc.SetClippingRect(menuPaneRect.Rect()); - } -#else - aGc.SetClippingRect(menuPaneRect.Rect()); -#endif // RD_UI_TRANSITION_EFFECTS_LIST // Cascade if ( cascade ) @@ -3786,8 +2910,10 @@ } // Text - TAknLayoutText textRect( iExtension->GetMenuItemTextLayout( itemRect, cascade ) ); + TAknLayoutText textRect; + textRect.LayoutText( itemRect, menuTextLayout ); TRgb textColor = textRect.Color(); + if ( aHighlight == EDrawHighlight ) // highlighted text { AknsUtils::GetCachedColor( skin, textColor, KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG10 ); @@ -3819,7 +2945,6 @@ } aGc.SetBrushStyle( CGraphicsContext::ENullBrush ); aGc.SetPenColor( textColor ); - aGc.UseFont( textRect.Font() ); const CFont* font = textRect.Font(); @@ -3846,33 +2971,26 @@ iExtension->iCascadeDRect.SetRect( cascRect.iTl, cascRect.iBr ); } - if(iExtension->iIsPenEnable) - { - TAknLayoutRect highlightRect; - highlightRect.LayoutRect( itemRect, - AKN_LAYOUT_WINDOW_Highlight_graphics__various__Line_2( itemRect ) ); - - // store the calculated y-position to the menu item, - // so that it can be used in HandlePointerEventL() - item->iPos = highlightRect.Rect().iTl.iY; - aGc.DiscardFont(); - } - - if ( !drawingInitiated ) + TAknLayoutRect highlightRect; + highlightRect.LayoutRect( itemRect, + AKN_LAYOUT_WINDOW_Highlight_graphics__various__Line_2( itemRect ) ); + + // store the calculated y-position to the menu item, + // so that it can be used in HandlePointerEventL() + item->iPos = highlightRect.Rect().iTl.iY; + + // don't draw separator line for the last item + if ( drawSeparator ) + { + AknListUtils::DrawSeparator( aGc, itemRect, textColor ); + } + + if ( !drawingInitiated && !iExtension->iFullRedraw ) { Window().EndRedraw(); } aGc.CancelClippingRect(); - -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - if ( transApi && !transApi->EffectsDisabled() ) - { - transApi->StopDrawing(); - transApi->EndRedraw( MAknListBoxTfxInternal::EListItem, aItem ); - iExtension->iGc->Deactivate(); - } -#endif // RD_UI_TRANSITION_EFFECTS_LIST } @@ -3880,36 +2998,8 @@ // CEikMenuPane::Draw // ----------------------------------------------------------------------------- // -#ifdef RD_UI_TRANSITION_EFFECTS_LIST EXPORT_C void CEikMenuPane::Draw( const TRect& aRect ) const { - CWindowGc& gc = ( iExtension && iExtension->iGc ) ? - *iExtension->iGc : SystemGc(); - MAknListBoxTfxInternal *transApi = CAknListLoader::TfxApiInternal( &gc ); - - if ( transApi ) - { - iExtension->iGc->Activate( *DrawableWindow() ); - - if ( !transApi->EffectsDisabled() ) - { - if ( iExtension->iScrollBarRect.iTl.iX <= aRect.iTl.iX && - iExtension->iScrollBarRect.iBr.iX >= aRect.iBr.iX ) - { - transApi->BeginRedraw( MAknListBoxTfxInternal::EListUpdateRect, aRect ); - iExtension->iGc->Deactivate(); - return; - } - - iExtension->CalcItemSize( transApi ); - } - } -#else -EXPORT_C void CEikMenuPane::Draw(const TRect& /*aRect*/) const - { -#endif // RD_UI_TRANSITION_EFFECTS_LIST - - TRect windowRect( Rect() ); MAknsSkinInstance* skin = AknsUtils::SkinInstance(); MAknsControlContext* cc = NULL; @@ -3918,37 +3008,11 @@ cc = iExtension->iBgContext; } -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - if ( transApi ) - { - transApi->SetListType( MAknListBoxTfxInternal::EListBoxTypeMenuPane ); - transApi->BeginRedraw( MAknListBoxTfxInternal::EListView, windowRect ); - } -#else CWindowGc& gc = SystemGc(); -#endif // RD_UI_TRANSITION_EFFECTS_LIST PrepareGcForDrawingItems( gc ); -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - if ( transApi ) - { - transApi->StartDrawing( MAknListBoxTfxInternal::EListView ); - } -#endif - - if ( !IsCascadeMenuPane() ) - { - CFbsBitmap* cbaExtension = AknsUtils::GetCachedBitmap( skin, KAknsIIDQsnBgSlicePopup ); - if ( cbaExtension ) - { - TAknLayoutRect sliceRect; - sliceRect.LayoutRect( windowRect, SkinLayout::Popup_windows_skin_placing__background_slice__Line_2() ); - AknIconUtils::SetSize( cbaExtension, sliceRect.Rect().Size() ); - gc.BitBlt( TPoint( windowRect.iTl.iX, windowRect.iBr.iY-cbaExtension->SizeInPixels().iHeight ), cbaExtension ); - windowRect.iBr.iY -=2; // two used as margin when rect layouts were done - } - } TInt count=0; + if( iItemArray ) { count=iItemArray->Count(); @@ -3957,97 +3021,37 @@ // Give the topmost menu item's rect to SCT if needed. if ( iExtension->iSct ) { - TAknLayoutRect listScrollPaneRect; - TAknLayoutRect menuPaneRect; - TAknLayoutRect singleMenuPaneRect; - - TAknWindowLineLayout listScrollPaneLayout( - AknLayoutScalable_Avkon::listscroll_menu_pane(0).LayoutLine() ); - if ( iExtension ) - { - iExtension->AdjustPopupLayoutData( listScrollPaneLayout ); - } - listScrollPaneRect.LayoutRect( windowRect, listScrollPaneLayout ); - menuPaneRect.LayoutRect( listScrollPaneRect.Rect(), - AknLayoutScalable_Avkon::list_menu_pane( 0 ).LayoutLine() ); - singleMenuPaneRect.LayoutRect( menuPaneRect.Rect(), - AknLayoutScalable_Avkon::list_single_pane_cp2( 0 ).LayoutLine() ); - // Give the rect of the first menu item to SCT. - iExtension->iSct->SetMenuSctRect( singleMenuPaneRect.Rect() ); -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - if( transApi ) - { - iExtension->iSctRect = singleMenuPaneRect.Rect(); - TAknLayoutRect cellLayRect; - cellLayRect.LayoutRect( iExtension->iSctRect, - AknLayoutScalable_Avkon::cell_graphic_popup_pane( 0, 0, 0 ) ); - iExtension->iSctRect.iTl.iX -= 1; - iExtension->iSctRect.iTl.iY -= 1; - iExtension->iSctRect.iBr.iX += 3; - transApi->ResetNonDrawingRects(); - transApi->AddNonDrawingRect( iExtension->iScrollBarRect ); - transApi->AddNonDrawingRect( iExtension->iSctRect ); - } -#endif // RD_UI_TRANSITION_EFFECTS_LIST - } - - if ( iExtension->iSct ) - { + iExtension->iSct->SetMenuSctRect( ItemRect( 0 ) ); + TRegionFix<4> region; - region.AddRect( Rect() ); + region.AddRect( aRect ); region.SubRect( iExtension->iSct->Rect() ); gc.SetClippingRegion( region ); } - TRect backgroundRect( iOwner ? windowRect : iExtension->GetBackgroundRect( windowRect ) ); - // The added flag removes the white bg for transparency TBool frameDrawn = AknsDrawUtils::Background( - skin, cc, this, gc, backgroundRect, KAknsDrawParamNoClearUnderImage ); - -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - if ( transApi ) - { - transApi->StopDrawing(); - } -#endif // RD_UI_TRANSITION_EFFECTS_LIST - - iExtension->iFullRedraw = ETrue; - - for ( TInt ii=0;iiiSctHighlighted && ii == iSelectedItem ) - DrawItem( gc, ii, EDrawHighlight); - else - DrawItem( gc, ii, ENoHighlight); - } - - iExtension->iFullRedraw = EFalse; + skin, cc, this, gc, aRect, KAknsDrawParamNoClearUnderImage ); + + if ( aRect.Intersects( iExtension->iItemAreaRect ) ) + { + iExtension->iFullRedraw = ETrue; + + for ( TInt ii=0;iiiSctHighlighted && ii == iSelectedItem ) + DrawItem( gc, ii, EDrawHighlight); + else + DrawItem( gc, ii, ENoHighlight); + } + + iExtension->iFullRedraw = EFalse; + } if ( iExtension->iSct ) { -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - if ( transApi ) - { - transApi->StartDrawing( MAknListBoxTfxInternal::EListNotSpecified ); - } -#endif gc.CancelClippingRegion(); -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - if ( transApi ) - { - transApi->StopDrawing(); - } -#endif - } - -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - if ( transApi ) - { - transApi->EndViewRedraw( aRect ); - iExtension->iGc->Deactivate(); - } -#endif // RD_UI_TRANSITION_EFFECTS_LIST + } } @@ -4121,7 +3125,6 @@ CEikMenuPane* menu = iOwner ? iOwner : this; MCoeControlObserver* observer = menu->Observer(); - if ( commandId != EAknCmdTaskSwapper ) { _AKNTRACE( "commandId = %d", commandId ); @@ -4159,26 +3162,6 @@ { _AKNTRACE_FUNC_ENTER; _AKNTRACE( "aDrawNow = %d", aDrawNow ); - if( iExtension ) - { - if ( IsFocused() ) - { -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - // Focus must be handled here, otherwise it will come to late - MAknListBoxTfxInternal *transApi = CAknListLoader::TfxApiInternal( iExtension->iGc ); - - if ( transApi ) - { - transApi->HandleFocusChange( ETrue ); - } -#endif // RD_UI_TRANSITION_EFFECTS_LIST - iExtension->FocusGained(); - } - else // Not focused - { - iExtension->FocusLost(); - } - } if ( !iItemArray || iItemArray->Count() == 0 ) { @@ -4370,74 +3353,52 @@ TInt itemAfterLastItem = loopScrolling ? 0 : max; TInt itemAfterFirstItem = loopScrolling ? max : 0; -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - CWindowGc& gc = iExtension->iGc ? *iExtension->iGc : SystemGc(); - MAknListBoxTfxInternal* transApi = CAknListLoader::TfxApiInternal( &gc ); -#endif //RD_UI_TRANSITION_EFFECTS_LIST - - if(iExtension->iIsPenEnable) - { - _AKNTRACE( "[%s]", "iExtension->iIsPenEnable = TRUE" ); - // Scroll highlighted item so that it becomes visible, - // if it is not visible before (scrolling with scroll bar - // can cause highlighted item to go out of screen) - TInt topItem = iScroller->TopItemIndex(); - TInt bottomItem = topItem + NumberOfItemsThatFitInView(); - - if ( iExtension->Offset() < 0 ) - { - // Extra bottom item when panning - bottomItem++; - } - - if( bottomItem > NumberOfItemsInPane() ) - { - bottomItem = NumberOfItemsInPane(); - } - _AKNTRACE( "topItem = %d,bottomItem = %d", topItem,bottomItem ); - - if ( aType != EEventKeyDown && iSelectedItem != ENothingSelected && - !(iExtension->iSctHighlighted && topItem == 0) && - (iSelectedItem < topItem || iSelectedItem > bottomItem - 1) ) + // Scroll highlighted item so that it becomes visible, + // if it is not visible before (scrolling with scroll bar + // can cause highlighted item to go out of screen) + TInt topItem = iScroller->TopItemIndex(); + TInt bottomItem = topItem + NumberOfItemsThatFitInView(); + + if ( iExtension->Offset() < 0 ) + { + // Extra bottom item when panning + bottomItem++; + } + + if( bottomItem > NumberOfItemsInPane() ) + { + bottomItem = NumberOfItemsInPane(); + } + _AKNTRACE( "topItem = %d,bottomItem = %d", topItem,bottomItem ); + + if ( aType != EEventKeyDown && iSelectedItem != ENothingSelected && + !(iExtension->iSctHighlighted && topItem == 0) && + (iSelectedItem < topItem || iSelectedItem > bottomItem - 1) ) + { + _AKNTRACE( "[%s]", "ScrollToMakeItemVisible(iSelectedItem);" ); + ScrollToMakeItemVisible(iSelectedItem); + + ActivateGc(); + CWindowGc& gc = SystemGc(); + PrepareGcForDrawingItems( gc ); + + // draw all items that are needed. + for( TInt i = 0; i < count; i++ ) { - _AKNTRACE( "[%s]", "ScrollToMakeItemVisible(iSelectedItem);" ); - ScrollToMakeItemVisible(iSelectedItem); - - ActivateGc(); -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - if ( transApi ) + if( i == iSelectedItem && !iExtension->iSctHighlighted) { - iExtension->iGc->Activate( *DrawableWindow() ); + DrawItem( gc, i, EDrawHighlight ); } -#else - CWindowGc& gc = SystemGc(); -#endif // RD_UI_TRANSITION_EFFECTS_LIST - PrepareGcForDrawingItems( gc ); - - // draw all items that are needed. - for( TInt i = 0; i < count; i++ ) + else { - if( i == iSelectedItem && !iExtension->iSctHighlighted) - { - DrawItem( gc, i, EDrawHighlight ); - } - else - { - DrawItem( gc, i, ERemoveHighlight ); - } + DrawItem( gc, i, ERemoveHighlight ); } - -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - if ( transApi ) - { - iExtension->iGc->Deactivate(); - } -#endif // RD_UI_TRANSITION_EFFECTS_LIST - DeactivateGc(); - _AKNTRACE( "[%s]", "OfferKeyEventL return 9" ); - _AKNTRACE_FUNC_EXIT; - return EKeyWasConsumed; } + + DeactivateGc(); + _AKNTRACE( "[%s]", "OfferKeyEventL return 9" ); + _AKNTRACE_FUNC_EXIT; + return EKeyWasConsumed; } if ( iSelectedItem != ENothingSelected || iExtension->iSctHighlighted ) @@ -4454,13 +3415,6 @@ // loop scrolling always used in options menus case EKeyDownArrow: _AKNTRACE( "[%s]", "OfferKeyEventL(EKeyDownArrow)" ); -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - if ( transApi ) - { - transApi->SetMoveType( - MAknListBoxTfxInternal::EListMoveDown ); - } -#endif //RD_UI_TRANSITION_EFFECTS_LIST if ( iExtension->iSctHighlighted && iExtension->iSct ) { iExtension->iSctHighlighted = EFalse; @@ -4486,13 +3440,6 @@ break; case EKeyUpArrow: _AKNTRACE( "[%s]", "OfferKeyEventL(EKeyUpArrow)" ); -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - if ( transApi ) - { - transApi->SetMoveType( - MAknListBoxTfxInternal::EListMoveUp ); - } -#endif //RD_UI_TRANSITION_EFFECTS_LIST if ( iExtension->iSct && iSelectedItem == 0 && !iExtension->iSctHighlighted ) { @@ -4695,100 +3642,72 @@ TInt count( NumberOfItemsInPane() ); - if ( iExtension->iIsPenEnable ) - { - // Scroll highlighted item so that it becomes visible - // if it is not visible before (scrolling with scroll bar - // can cause highlighted item to go out of screen). - TInt topItem( iScroller->TopItemIndex() ); - TInt bottomItem( topItem + NumberOfItemsThatFitInView() ); - if ( bottomItem > count ) - { - bottomItem = count; - } - - if ( iExtension->Offset() < 0 && - ( iSelectedItem == topItem || iSelectedItem == bottomItem ) ) - { - // Restoring offset with "simulated" ok key event. - iExtension->RestoreOffset( EKeyOK ); - } - else if ( iSelectedItem < topItem || - iSelectedItem > bottomItem - 1 ) + // Scroll highlighted item so that it becomes visible + // if it is not visible before (scrolling with scroll bar + // can cause highlighted item to go out of screen). + TInt topItem( iScroller->TopItemIndex() ); + TInt bottomItem( topItem + NumberOfItemsThatFitInView() ); + if ( bottomItem > count ) + { + bottomItem = count; + } + + if ( iExtension->Offset() < 0 && + ( iSelectedItem == topItem || iSelectedItem == bottomItem ) ) + { + // Restoring offset with "simulated" ok key event. + iExtension->RestoreOffset( EKeyOK ); + } + else if ( iSelectedItem < topItem || + iSelectedItem > bottomItem - 1 ) + { + if ( count > iSelectedItem ) { - if ( count > iSelectedItem ) + if ( iExtension->iSctHighlighted && iExtension->iSct ) { - if ( iExtension->iSctHighlighted && iExtension->iSct ) + TKeyEvent key; + key.iCode = EKeyOK; + key.iModifiers = 0; + + TKeyResponse keyResponse( EKeyWasNotConsumed ); + TEventCode type( EEventNull ); + keyResponse = iExtension->iSct->OfferKeyEventL( key, + type ); + if ( keyResponse == EKeyWasConsumed ) { - TKeyEvent key; - key.iCode = EKeyOK; - key.iModifiers = 0; - - TKeyResponse keyResponse( EKeyWasNotConsumed ); - TEventCode type( EEventNull ); - keyResponse = iExtension->iSct->OfferKeyEventL( key, - type ); - if ( keyResponse == EKeyWasConsumed ) - { - ReportSelectionMadeL(); - } - _AKNTRACE( "[%s]" "ActivateCurrentItemL return 2" ); - _AKNTRACE_FUNC_EXIT; - return; + ReportSelectionMadeL(); } + _AKNTRACE( "[%s]" "ActivateCurrentItemL return 2" ); + _AKNTRACE_FUNC_EXIT; + return; } - - iExtension->isUpdateScrollDirectly = ETrue; - ScrollToMakeItemVisible( iSelectedItem ); - iExtension->isUpdateScrollDirectly = EFalse; - - ActivateGc(); - -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - - MAknListBoxTfxInternal *transApi = - CAknListLoader::TfxApiInternal( iExtension->iGc ); - if ( transApi ) + } + + iExtension->isUpdateScrollDirectly = ETrue; + ScrollToMakeItemVisible( iSelectedItem ); + iExtension->isUpdateScrollDirectly = EFalse; + + ActivateGc(); + CWindowGc& gc = SystemGc(); + PrepareGcForDrawingItems( gc ); + + // Draw all items that are needed. + for ( TInt i = 0; i < count; i++ ) + { + if ( i == iSelectedItem && !iExtension->iSctHighlighted ) { - iExtension->iGc->Activate( *DrawableWindow() ); + DrawItem( gc, i, EDrawHighlight ); } - CWindowGc& gc = transApi ? *iExtension->iGc : SystemGc(); - -#else - - CWindowGc& gc = SystemGc(); - -#endif // RD_UI_TRANSITION_EFFECTS_LIST - - PrepareGcForDrawingItems( gc ); - - // Draw all items that are needed. - for ( TInt i = 0; i < count; i++ ) + else { - if ( i == iSelectedItem && !iExtension->iSctHighlighted ) - { - DrawItem( gc, i, EDrawHighlight ); - } - else - { - DrawItem( gc, i, ERemoveHighlight ); - } + DrawItem( gc, i, ERemoveHighlight ); } - -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - - if ( transApi ) - { - iExtension->iGc->Deactivate(); - } - -#endif // RD_UI_TRANSITION_EFFECTS_LIST - - DeactivateGc(); - _AKNTRACE( "[%s]" "ActivateCurrentItemL return 3" ); - _AKNTRACE_FUNC_EXIT; - return; } + + DeactivateGc(); + _AKNTRACE( "[%s]" "ActivateCurrentItemL return 3" ); + _AKNTRACE_FUNC_EXIT; + return; } if ( iCascadeMenuPane ) @@ -4909,11 +3828,6 @@ // EXPORT_C void CEikMenuPane::HandlePointerEventL( const TPointerEvent& aPointerEvent ) { - if( !AknLayoutUtils::PenEnabled() ) - { - return; - } - _AKNTRACE_FUNC_ENTER; if ( iOwner && !IsVisible() ) @@ -4949,16 +3863,13 @@ { if ( aPointerEvent.iType == TPointerEvent::EButton1Down ) { - if( AknLayoutUtils::PenEnabled() ) + if ( CAknTransitionUtils::TransitionsEnabled( AknTransEffect::EComponentTransitionsOff ) ) { - if ( CAknTransitionUtils::TransitionsEnabled( AknTransEffect::EComponentTransitionsOff ) ) - { - iExtension->ImmediateFeedback( ETouchFeedbackDecreasingPopUp ); - } - else - { - iExtension->ImmediateFeedback( ETouchFeedbackPopUp ); - } + iExtension->ImmediateFeedback( ETouchFeedbackDecreasingPopUp ); + } + else + { + iExtension->ImmediateFeedback( ETouchFeedbackPopUp ); } iExtension->iShowCascadeTransition = ETrue; CloseCascadeMenu(); @@ -5048,21 +3959,7 @@ // Get the option item's rect in Menu SCT if ( iExtension->iSct ) { - TAknLayoutRect menuPaneRect; - TAknWindowLineLayout menuPane; - - TAknWindowLineLayout listScrollPaneLayout( - AknLayoutScalable_Avkon::listscroll_menu_pane(0).LayoutLine() ); - if ( iExtension ) - { - iExtension->AdjustPopupLayoutData( listScrollPaneLayout ); - } - TAknLayoutRect listScrollPaneRect; - listScrollPaneRect.LayoutRect( Rect(), listScrollPaneLayout ); - - menuPane = AknLayoutScalable_Avkon::list_menu_pane( 0 ).LayoutLine(); - menuPaneRect.LayoutRect( listScrollPaneRect.Rect(), menuPane ); - menuSctRect = menuPaneRect.Rect(); + menuSctRect = iExtension->iItemAreaRect; } TRect cascadeMenuRect(0,0,0,0); @@ -5089,8 +3986,8 @@ // if submenu, then move it's rect coordinates to relative to parent. if ( iCascadeMenuPane ) { - TPoint subPos = iCascadeMenuPane->PositionRelativeToScreen(); - cascadeMenuRect = TRect(subPos-PositionRelativeToScreen(), iCascadeMenuPane->Size()); + TPoint subPos = iCascadeMenuPane->Position(); + cascadeMenuRect = TRect(subPos-Position(), iCascadeMenuPane->Size()); } // Pointerevent in case we need to pass event from submenu to parent @@ -5103,12 +4000,6 @@ iExtension->ResetPressedHighlight(); } -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - MAknListBoxTfxInternal *transApi = CAknListLoader::TfxApiInternal( - iExtension->iGc ); - TBool effects = transApi && !transApi->EffectsDisabled(); -#endif - switch (aPointerEvent.iType ) { case TPointerEvent::EButton1Up: @@ -5308,16 +4199,13 @@ // if submenu, and clicked outside of it if ( !cascadeMenuRect.Contains( aPointerEvent.iPosition ) ) { - if( AknLayoutUtils::PenEnabled() ) - { - if ( CAknTransitionUtils::TransitionsEnabled( AknTransEffect::EComponentTransitionsOff ) ) - { - iExtension->ImmediateFeedback( ETouchFeedbackDecreasingPopUp ); - } - else - { - iExtension->ImmediateFeedback( ETouchFeedbackPopUp ); - } + if ( CAknTransitionUtils::TransitionsEnabled( AknTransEffect::EComponentTransitionsOff ) ) + { + iExtension->ImmediateFeedback( ETouchFeedbackDecreasingPopUp ); + } + else + { + iExtension->ImmediateFeedback( ETouchFeedbackPopUp ); } //Just close sub menu iExtension->iShowCascadeTransition = ETrue; @@ -5356,12 +4244,6 @@ iExtension->iSct->HighlightSctRow( iExtension->iSctHighlighted ); } -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - if ( effects ) - { - transApi->SetMoveType( MAknListBoxTfxInternal::EListTap ); - } -#endif iExtension->iPressedDown = ETrue; // Start timer for pressed highlight @@ -5382,12 +4264,7 @@ { iExtension->iButtonDownItem = KErrNotFound; } -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - if ( effects ) - { - transApi->Draw( Rect() ); - } -#endif + // if new item has submenu, show it if ( item->iData.iCascadeId ) { @@ -5415,37 +4292,32 @@ } else { - if ( iExtension->iIsPenEnable ) + // For finger usability, extend to the right. + TRect innerToRightRect; + if ( AknLayoutUtils::LayoutMirrored() ) + { + innerToRightRect = TRect( Rect().iTl, innerRect.iBr ); + } + else { - // For finger usability, extend to the right. - TRect innerToRightRect; - if ( AknLayoutUtils::LayoutMirrored() ) + innerToRightRect = TRect( innerRect.iTl, Rect().iBr ); + } + // Keep opened + if ( innerToRightRect.Contains( aPointerEvent.iPosition ) ) + { + break; + } + + // clicked outside, then close menu case by case + if ( iCascadeMenuPane ) + { + if ( CAknTransitionUtils::TransitionsEnabled( AknTransEffect::EComponentTransitionsOff ) ) { - innerToRightRect = TRect( Rect().iTl, innerRect.iBr ); + iExtension->ImmediateFeedback( ETouchFeedbackDecreasingPopUp ); } else { - innerToRightRect = TRect( innerRect.iTl, Rect().iBr ); - } - // Keep opened - if ( innerToRightRect.Contains( aPointerEvent.iPosition ) ) - { - break; - } - } - // clicked outside, then close menu case by case - if ( iCascadeMenuPane ) - { - if( AknLayoutUtils::PenEnabled() ) - { - if ( CAknTransitionUtils::TransitionsEnabled( AknTransEffect::EComponentTransitionsOff ) ) - { - iExtension->ImmediateFeedback( ETouchFeedbackDecreasingPopUp ); - } - else - { - iExtension->ImmediateFeedback( ETouchFeedbackPopUp ); - } + iExtension->ImmediateFeedback( ETouchFeedbackPopUp ); } iExtension->iShowCascadeTransition = ETrue; CloseCascadeMenu(); //Just close sub menu. @@ -5494,15 +4366,6 @@ iExtension->iNextHighlightItem = KErrNotFound; iExtension->iPanningActive = ETrue; iExtension->EnableHighlight( EFalse ); - -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - MAknListBoxTfx* tfxApi = CAknListLoader::TfxApi( iExtension->iGc ); - - if ( tfxApi ) - { - tfxApi->EnableEffects( EFalse ); - } -#endif // RD_UI_TRANSITION_EFFECTS_LIST } if ( iExtension->iPanningActive ) @@ -5543,19 +4406,16 @@ && !cascadeMenuRect.Contains( aPointerEvent.iPosition ) ) { - if ( AknLayoutUtils::PenEnabled() ) + if ( CAknTransitionUtils::TransitionsEnabled( + AknTransEffect::EComponentTransitionsOff ) ) { - if ( CAknTransitionUtils::TransitionsEnabled( - AknTransEffect::EComponentTransitionsOff ) ) - { - iExtension->ImmediateFeedback( - ETouchFeedbackDecreasingPopUp ); - } - else - { - iExtension->ImmediateFeedback( - ETouchFeedbackPopUp ); - } + iExtension->ImmediateFeedback( + ETouchFeedbackDecreasingPopUp ); + } + else + { + iExtension->ImmediateFeedback( + ETouchFeedbackPopUp ); } iExtension->iShowCascadeTransition = ETrue; CloseCascadeMenu(); @@ -5568,14 +4428,6 @@ if ( oldSelected != ii ) { iExtension->iPressedDown = EFalse; -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - if ( effects - && !iExtension->iShowCascadeTransition ) - { - transApi->SetMoveType( - MAknListBoxTfxInternal::EListDrag ); - } -#endif } TRect screenRect( TPoint( KMinTInt, KMinTInt ), TPoint( KMaxTInt, KMaxTInt ) ); @@ -5818,9 +4670,6 @@ EXPORT_C void CEikMenuPane::SetSelectedItem( TInt aSelectedItem ) { iSelectedItem = (aSelectedItem >= NumberOfItemsInPane() ) ? 0 : aSelectedItem; - - if( iExtension ) - iExtension->ChangeHighlightBackground(); } // ----------------------------------------------------------------------------- @@ -5916,10 +4765,6 @@ void CEikMenuPane::HandleScrollEventL( CEikScrollBar* aScrollBar, TEikScrollEvent aEventType ) { _AKNTRACE_FUNC_ENTER; - if( !AknLayoutUtils::PenEnabled()) - { - return; - } _AKNTRACE( "[%s]", "Stop physics engine"); iExtension->iPhysics->StopPhysics(); @@ -5967,16 +4812,9 @@ // Items that becomes topmost and downmost items TInt newTopItem = 0; - // if update is not wanted, do nothing. if ( update ) { -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - MAknListBoxTfxInternal* transApi = CAknListLoader::TfxApiInternal( - iExtension->iGc ); - TBool effects = transApi && !transApi->EffectsDisabled(); -#endif - switch (aEventType) { case EEikScrollUp: @@ -6038,17 +4876,7 @@ { _AKNTRACE( "[%s]", "EEikScrollPageDown"); _AKNTRACE( "bottomItem = %d", bottomItem); - // if last item is not visible - if ( bottomItem < countOfItems) - { - // move menu to show one site down or then downmost items. - newTopItem = (bottomItem <= (countOfItems - itemsThatFitToView)) ? (topItem + itemsThatFitToView) : (countOfItems - itemsThatFitToView); - } - else - { - update = EFalse; - } - _AKNTRACE( "newTopItem = %d", newTopItem); + update = ETrue; _AKNTRACE( "update = %d", update); } break; @@ -6056,77 +4884,35 @@ case EEikScrollThumbDragVert: { _AKNTRACE( "[%s]", "EEikScrollThumbDragVert"); -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - - if ( effects ) - { - MAknListBoxTfx* tfxApi = CAknListLoader::TfxApi( iExtension->iGc ); - - if ( tfxApi ) - { - tfxApi->EnableEffects( EFalse ); - effects = EFalse; - } - } -#endif // new thumb position TInt thumb = aScrollBar->ThumbPosition(); _AKNTRACE( "thumb = %d", thumb); - - // did dragging cause scrolling - if ( thumb != topItem ) - { - newTopItem = thumb; - } - else - { - update = EFalse; - } - _AKNTRACE( "newTopItem = %d", newTopItem); + update = ETrue; _AKNTRACE( "update = %d", update); } break; - case EEikScrollThumbReleaseVert: - { -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - MAknListBoxTfx* tfxApi = CAknListLoader::TfxApi( iExtension->iGc ); - - if ( tfxApi ) - { - tfxApi->EnableEffects( ETrue ); - } -#endif - } - return; - default: update = EFalse; break; } - -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - if ( effects ) - { - transApi->SetMoveType( newTopItem > topItem ? - MAknListBoxTfxInternal::EListScrollDown : - MAknListBoxTfxInternal::EListScrollUp ); - } -#endif - + // if topItem changed, then draw menu again. + if ( newTopItem != topItem || update ) + { + iExtension->iListTopIndex = aScrollBar->ThumbPosition(); + TPoint newPosition( iExtension->iViewPosition.iX, + iExtension->iListTopIndex + iExtension->iViewHeight / 2 ); - iExtension->iListTopIndex = aScrollBar->ThumbPosition(); - - iExtension->iViewPosition.iY = - iExtension->iListTopIndex + iExtension->iViewHeight / 2; - - iExtension->ViewPositionChanged( iExtension->iViewPosition ); - + iExtension->iFlags.Set( CEikMenuPaneExtension::ESkipScrollbarUpdate ); + iExtension->ViewPositionChanged( newPosition ); + iExtension->iFlags.Clear( CEikMenuPaneExtension::ESkipScrollbarUpdate ); + } } _AKNTRACE_FUNC_EXIT; } + // ----------------------------------------------------------------------------- // CEikMenuPane::CreateScrollBarFrame // ----------------------------------------------------------------------------- @@ -6140,13 +4926,13 @@ { CEikScrollBarFrame::TScrollBarVisibility visibility = CEikScrollBarFrame::EOn; - if ( iOwner && ( iItemArray->Count() <= NumberOfItemsThatFitInView() ) ) + if ( iItemArray->Count() <= NumberOfItemsThatFitInView() ) { - // submenu with less than 6 items + // all items fit, no need to show the scrollbar visibility = CEikScrollBarFrame::EOff; } - TRAP_IGNORE( iSBFrame->SetScrollBarVisibilityL( CEikScrollBarFrame::EOff, visibility /*CEikScrollBarFrame::EAuto*/ ) ); - + + TRAP_IGNORE( iSBFrame->SetScrollBarVisibilityL( CEikScrollBarFrame::EOff, visibility ) ); TRAP_IGNORE( iSBFrame->CreateDoubleSpanScrollBarsL( EFalse, EFalse, ETrue, EFalse ) ); iSBFrame->DrawBackground( EFalse, EFalse ); UpdateScrollBar(); @@ -6160,13 +4946,14 @@ // void CEikMenuPane::UpdateScrollBar() { - if ( !CheckCreateScroller() ) + if ( !CheckCreateScroller() || !IsVisible() ) return; CIdle* idle = iScroller->Idle(); if ( idle && !idle->IsActive() ) idle->Start( TCallBack( CEikMenuPane::UpdateScrollBarCallBackL, this ) ); } + // ----------------------------------------------------------------------------- // CEikMenuPane::UpdateScrollBarCallBackL // ----------------------------------------------------------------------------- @@ -6177,6 +4964,7 @@ return 0; } + // ----------------------------------------------------------------------------- // CEikMenuPane::DoUpdateScrollBarL // ----------------------------------------------------------------------------- @@ -6189,17 +4977,7 @@ TEikScrollBarModel hSbarModel; TEikScrollBarModel vSbarModel; - TRect menuPaneRect; - if ( !iOwner ) - { - menuPaneRect = iExtension->iMenuPaneRect; - } - else - { - menuPaneRect = Rect(); - } - - TRect clientRect( menuPaneRect.Size() ); + TRect clientRect( iExtension->iMenuPaneRect.Size() ); // Panning uses pixel resolution scrollbar vSbarModel.iThumbPosition = iExtension->iListTopIndex; @@ -6218,79 +4996,40 @@ layout.SetInclusiveMargin( 0 ); layout.iTilingMode = TEikScrollBarFrameLayout::EClientRectConstant; - // For main menupane scrollbar is always shown, for submenu only when needed - if ( !iOwner ) - { - iSBFrame->SetScrollBarVisibilityL( CEikScrollBarFrame::EOff, CEikScrollBarFrame::EOn ); - } - else - { - TInt maxItems = NumberOfItemsThatFitInView(); - TInt count = iItemArray->Count(); - iSBFrame->SetScrollBarVisibilityL( CEikScrollBarFrame::EOff, - (count > maxItems) ? CEikScrollBarFrame::EOn : CEikScrollBarFrame::EOff ); - } - + CEikScrollBarFrame::TScrollBarVisibility visibility = + iSBFrame->ScrollBarVisibility( CEikScrollBar::EVertical ); + + // scrollbar is shown only if needed + if ( iExtension->iScrollbarVisibility == CEikScrollBarFrame::EOn + && visibility == CEikScrollBarFrame::EOff ) + { + iSBFrame->SetScrollBarVisibilityL( CEikScrollBarFrame::EOff, + CEikScrollBarFrame::EOn ); + iExtension->iScrollBarRect = iSBFrame->VerticalScrollBar()->Rect(); + } + else if ( iExtension->iScrollbarVisibility == CEikScrollBarFrame::EOff + && visibility == CEikScrollBarFrame::EOn ) + { + iSBFrame->SetScrollBarVisibilityL( CEikScrollBarFrame::EOff, + CEikScrollBarFrame::EOff ); + iExtension->iScrollBarRect = TRect::EUninitialized; + } + TAknLayoutRect scrollLayoutRect; - if ( !iOwner ) - { - TAknWindowLineLayout listScrollPaneLayout( - AknLayoutScalable_Avkon::listscroll_menu_pane(0).LayoutLine() ); - if ( iExtension ) - { - iExtension->AdjustPopupLayoutData( listScrollPaneLayout ); - } - scrollLayoutRect.LayoutRect( clientRect, listScrollPaneLayout ); - scrollBarInclusiveRect = scrollLayoutRect.Rect(); - scrollBarClientRect = scrollBarInclusiveRect; - - AknLayoutUtils::LayoutVerticalScrollBar( iSBFrame, scrollBarClientRect, - AknLayoutScalable_Avkon::scroll_pane_cp25(0).LayoutLine() ); - } - else - { - scrollLayoutRect.LayoutRect( clientRect, - AknLayoutScalable_Avkon::listscroll_popup_sub_pane().LayoutLine() ); - scrollBarInclusiveRect = scrollLayoutRect.Rect(); - scrollBarClientRect = scrollBarInclusiveRect; - - AknLayoutUtils::LayoutVerticalScrollBar( iSBFrame, scrollBarClientRect, - AknLayoutScalable_Avkon::scroll_pane_cp4().LayoutLine()); - } + scrollLayoutRect.LayoutRect( clientRect, + AknLayoutScalable_Avkon::listscroll_popup_sub_pane().LayoutLine() ); + scrollBarInclusiveRect = scrollLayoutRect.Rect(); + scrollBarClientRect = scrollBarInclusiveRect; + + AknLayoutUtils::LayoutVerticalScrollBar( iSBFrame, scrollBarClientRect, + AknLayoutScalable_Avkon::scroll_pane_cp4().LayoutLine()); iSBFrame->TileL( &hDsSbarModel, &vDsSbarModel, scrollBarClientRect, scrollBarInclusiveRect, layout ); iSBFrame->SetVFocusPosToThumbPos( vDsSbarModel.FocusPosition() ); - -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - MAknListBoxTfxInternal* transApi = CAknListLoader::TfxApiInternal( iExtension->iGc ); - if ( iSBFrame->VerticalScrollBar() && - iSBFrame->VScrollBarVisibility() == CEikScrollBarFrame::EOn ) - { - iExtension->iScrollBarRect = iSBFrame->VerticalScrollBar()->Rect(); - } - else - { - iExtension->iScrollBarRect = TRect::EUninitialized; - } - if ( transApi ) - { - transApi->ResetNonDrawingRects(); - transApi->AddNonDrawingRect( iExtension->iScrollBarRect ); - transApi->AddNonDrawingRect( iExtension->iSctRect ); - } -#endif // RD_UI_TRANSITION_EFFECTS_LIST - if ( iSBFrame->VerticalScrollBar() && - iSBFrame->VScrollBarVisibility() == CEikScrollBarFrame::EOn ) - { - iExtension->iSBRect = iSBFrame->VerticalScrollBar()->Rect(); - } - else - { - iExtension->iSBRect = TRect::EUninitialized; - } _AKNTRACE_FUNC_EXIT; } + // ----------------------------------------------------------------------------- // CEikMenuPane::UpdateScrollBarThumbs // ----------------------------------------------------------------------------- @@ -6303,6 +5042,7 @@ } } + // ----------------------------------------------------------------------------- // CEikMenuPane::ScrollToMakeItemVisible // ----------------------------------------------------------------------------- @@ -6357,6 +5097,7 @@ return; } + // ----------------------------------------------------------------------------- // CEikMenuPane::Scroll // ----------------------------------------------------------------------------- @@ -6400,6 +5141,7 @@ return; } + // ----------------------------------------------------------------------------- // CEikMenuPane::ViewRect // ----------------------------------------------------------------------------- @@ -6409,6 +5151,7 @@ return Rect(); } + // ----------------------------------------------------------------------------- // CEikMenuPane::NumberOfItemsThatFitInView // ----------------------------------------------------------------------------- @@ -6420,7 +5163,7 @@ { subst = 1; } -#ifdef RD_UI_TRANSITION_EFFECTS_LIST + iExtension->iItemsThatFitInView = iOwner ? AknLayoutScalable_Avkon:: list_single_popup_submenu_pane_ParamLimits().LastRow() + 1 : AknLayoutScalable_Avkon:: @@ -6431,20 +5174,9 @@ iExtension->iItemsThatFitInView --; } - if ( iExtension->iPhysics && iExtension->Offset() != 0 ) - { - // with kinetic scrolling there can be partial items on the screen - iExtension->iTotalNumberOfItemsInView = iExtension->iItemsThatFitInView + 1; - } - return iExtension->iItemsThatFitInView; -#else - return iOwner ? AknLayoutScalable_Avkon:: - list_single_popup_submenu_pane_ParamLimits().LastRow() + 1 : - AknLayoutScalable_Avkon:: - list_single_pane_cp2_ParamLimits().LastRow() + 1 - subst; -#endif - } + } + // ----------------------------------------------------------------------------- // CEikMenuPane::TotalItemHeight @@ -6483,6 +5215,7 @@ return err == KErrNone; } + // ----------------------------------------------------------------------------- // CEikMenuPane::CheckCreateScrollerL // ----------------------------------------------------------------------------- @@ -6599,21 +5332,6 @@ PrepareHighlightFrame(); SetCascadedIconSize(); - // Background under highlight may have changed -> we need to update - // highlight background to animation - if( iExtension ) - { - iExtension->HandleLayoutSwitch(); - } - -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - MAknListBoxTfxInternal *transApi = CAknListLoader::TfxApiInternal( iExtension->iGc ); - if ( transApi ) - { - transApi->Remove( MAknListBoxTfxInternal:: EListEverything ); - } -#endif - //Initialize physics engine if ( iExtension->iPhysics ) { @@ -6671,7 +5389,11 @@ } else if ( aType == KAknMessageFocusLost ) { - if ( iExtension && iExtension->HighlightEnabled() ) + if ( iCascadeMenuPane ) + { + iCascadeMenuPane->HandleResourceChange( aType ); + } + else if ( iExtension && iExtension->HighlightEnabled() ) { iExtension->EnableHighlight( EFalse, EFalse ); DrawItem( iSelectedItem, ENoHighlight ); @@ -6943,14 +5665,17 @@ // it can be only in submenu in case when scalable layout is available TBool hasIcon = MenuHasIcon(); - TBool hasDoubleSpanScrollBar = EFalse; - - if ( iSBFrame && iSBFrame->VScrollBarVisibility() ) - { - _AKNTRACE( "[%s]", "hasDoubleSpanScrollBar = ETrue;" ); - hasDoubleSpanScrollBar = ETrue; - } - + + // scrollbar is shown only if needed + if ( iItemArray->Count() > NumberOfItemsThatFitInView() ) + { + iExtension->iScrollbarVisibility = CEikScrollBarFrame::EOn; + } + else + { + iExtension->iScrollbarVisibility = CEikScrollBarFrame::EOff; + } + TRect parentMenuRect; AknLayoutUtils::TAknCbaLocation cbaPosition = AknLayoutUtils::CbaLocation(); @@ -7042,8 +5767,6 @@ _AKNTRACE( "parentMenuRect.iTl.iY = %d", parentMenuRect.iTl.iY ); _AKNTRACE( "parentMenuRect.Width() = %d", parentMenuRect.Width() ); _AKNTRACE( "parentMenuRect.Height( = %d", parentMenuRect.Height() ); - // if we have landscape layout then main menu should be positioned vertically centered - TRect appRect( iEikonEnv->EikAppUi()->ApplicationRect() ); if ( !iOwner ) // main menu { @@ -7063,28 +5786,46 @@ // to be in correct place - so we calculate correct position for // background and move control rect to match new background top left // position. - TRect backgroundRect( iExtension->GetBackgroundRect( parentMenuRect ) ); TPoint backgroundRectPos( - AknPopupUtils::Position( backgroundRect.Size(), ETrue ) ); + AknPopupUtils::Position( parentMenuRect.Size(), ETrue ) ); retVal = parentMenuRect; - retVal.Move( backgroundRectPos - backgroundRect.iTl ); + retVal.Move( backgroundRectPos - parentMenuRect.iTl ); // Set embedded cba rect if ( iExtension->iCba ) { // There is hidden extra touch space for scroll bar in landscape - TInt xOffset = backgroundRect.iTl.iX - parentMenuRect.iTl.iX ; + TInt xOffset = parentMenuRect.iTl.iX - parentMenuRect.iTl.iX ; iExtension->iCba->SetRect( TRect( xOffset, menuRect.Height(), - backgroundRect.Width() + xOffset, + parentMenuRect.Width() + xOffset, menuRect.Height() + cbaRect.Rect().Height() ) ); } iExtension->iMenuPaneRect = TRect( retVal.iTl, TSize ( menuRect.Size() ) ); - + + TInt variety = 4; + + // reserve area for scrollbar only if it's shown + if ( iExtension->iScrollbarVisibility == CEikScrollBarFrame::EOn ) + { + variety = 0; + } + + TAknLayoutRect layoutRect; + layoutRect.LayoutRect( TRect( iExtension->iMenuPaneRect.Size() ), + AknLayoutScalable_Avkon::listscroll_popup_sub_pane( 0 ) ); + + iExtension->iMenuAreaRect = layoutRect.Rect(); + + layoutRect.LayoutRect( iExtension->iMenuAreaRect, + AknLayoutScalable_Avkon::list_menu_pane( variety ) ); + + iExtension->iItemAreaRect = layoutRect.Rect(); + _AKNTRACE( "[%s]", "the layout of main menu return" ); _AKNTRACE_FUNC_EXIT; return retVal; @@ -7097,20 +5838,13 @@ iExtension->iSubMenuWidthIndex = KAlternativeSubmenuWidths - 1; TAknLayoutRect parentListScrollLayoutRect; // listscroll_menu_pane - TAknLayoutRect parentPaneLayoutRect; // list_menu_pane TAknTextLineLayout subMenuText; // layout for the text when item is not indicated TAknTextLineLayout subMenuIconText; // layout for the text when item is indicated TAknWindowLineLayout parentListScrollPaneLayout( AknLayoutScalable_Avkon::listscroll_menu_pane(0).LayoutLine() ); - if ( iExtension ) - { - iExtension->AdjustPopupLayoutData( parentListScrollPaneLayout ); - } parentListScrollLayoutRect.LayoutRect( parentMenuRect, parentListScrollPaneLayout ); - parentPaneLayoutRect.LayoutRect( parentListScrollLayoutRect.Rect(), - AknLayoutScalable_Avkon::list_menu_pane(0).LayoutLine() ); subMenuText = AknLayoutScalable_Avkon::list_single_popup_submenu_pane_t1(0).LayoutLine(); subMenuIconText = AknLayoutScalable_Avkon::list_single_popup_submenu_pane_t1(1).LayoutLine(); @@ -7133,6 +5867,13 @@ } // find the suitable item width, so that the text would be visible + TInt submenuVariety = 1; + + if ( iExtension->iScrollbarVisibility == CEikScrollBarFrame::EOn ) + { + submenuVariety = 0; + } + for ( ii = 6; ii < KAlternativeSubmenuWidths + 6; ++ii ) { TAknWindowLineLayout submenuLayout( AknLayoutScalable_Avkon::popup_submenu_window( ii ).LayoutLine() ); @@ -7143,7 +5884,7 @@ TAknLayoutRect listScrollPaneRect; listScrollPaneRect.LayoutRect( submenuRect.Rect(), listScrollPaneLayout ); - TAknWindowLineLayout listSubmenuPaneLayout( AknLayoutScalable_Avkon::list_submenu_pane( !hasDoubleSpanScrollBar ).LayoutLine() ); + TAknWindowLineLayout listSubmenuPaneLayout( AknLayoutScalable_Avkon::list_submenu_pane( submenuVariety ).LayoutLine() ); TAknLayoutRect listSubmenuPaneRect; listSubmenuPaneRect.LayoutRect( listScrollPaneRect.Rect(), listSubmenuPaneLayout ); @@ -7175,20 +5916,8 @@ TInt parentPos = iOwner->iScroller->TopItemIndex() - iOwner->SelectedItem() + Min( parentCount, iOwner->NumberOfItemsThatFitInView() ); - TInt index = iOwner->SelectedItem() - iOwner->iScroller->TopItemIndex(); - TInt rows = AknLayoutScalable_Avkon::list_single_pane_cp2_ParamLimits().LastRow(); - - // This condition may be true if less items fits to menu view than sub-menu view - // and sub-menu under sub-menu is launched. - if (index > rows) - { - // Change the out-of-boundary index to last legal one. - index = rows; - } - - TAknLayoutRect parentSelectedItemRect; - parentSelectedItemRect.LayoutRect( parentPaneLayoutRect.Rect(), - AknLayoutScalable_Avkon::list_single_pane_cp2( index ).LayoutLine() ); + TRect parentSelectedItemRect( iOwner->HighlightRect() ); + parentSelectedItemRect.Move( iOwner->Position() ); TAknLayoutRect submenuWindowRect; // To prevent a panic in layout code, count has to be at least 1 even if @@ -7227,7 +5956,7 @@ if ( ( Layout_Meta_Data::IsLandscapeOrientation() && cbaPosition != AknLayoutUtils::EAknCbaLocationBottom ) ) { - if ( ( parentSelectedItemRect.Rect().iTl.iY + submenuWindowRect.Rect().Height() ) > + if ( ( parentSelectedItemRect.iTl.iY + submenuWindowRect.Rect().Height() ) > aWindowRect.iBr.iY ) { subMenuPos = EBottom; @@ -7279,7 +6008,7 @@ } else // floating { - TInt yPos = parentSelectedItemRect.Rect().iTl.iY - + TInt yPos = parentSelectedItemRect.iTl.iY - ( listScrollPaneRect.Rect().iTl.iY - submenuWindowRect.Rect().iTl.iY ); // When a submenu is floating, make sure that the possible panning offset of the @@ -7308,6 +6037,25 @@ retVal.Move( 0, -offset ); } } + + if ( retVal.iTl.iY < 0 ) + { + retVal.Move( 0, -retVal.iTl.iY ); + } + + iExtension->iMenuPaneRect = retVal; + + TAknLayoutRect layoutRect; + layoutRect.LayoutRect( TRect( iExtension->iMenuPaneRect.Size() ), + AknLayoutScalable_Avkon::listscroll_popup_sub_pane( 0 ) ); + + iExtension->iMenuAreaRect = layoutRect.Rect(); + + layoutRect.LayoutRect( iExtension->iMenuAreaRect, + AknLayoutScalable_Avkon::list_submenu_pane( submenuVariety ) ); + + iExtension->iItemAreaRect = layoutRect.Rect(); + _AKNTRACE( "[%s]", "the layout of sub menu return" ); _AKNTRACE_FUNC_EXIT; return retVal; @@ -7328,69 +6076,15 @@ if( index < 0 ) index = 0; - // It is possible that this method is called when iItemArray is NULL. In - // that case we fake numItems as 1 to make layout code work. - TInt maxItems = NumberOfItemsThatFitInView(); - TInt numItems = Min( Max( 1, iItemArray->Count() ), maxItems ); - if( !iItemArray ) - numItems = 1; - // When physics is enabled highlight can be moved to partially visible // item which is at the bottom of menu. This causes layout panic and to // avoid that we reduce index by one. - if ( index == maxItems ) + if ( index == NumberOfItemsThatFitInView() ) { index--; } - TRect windowRect = Rect(); - - TAknWindowLineLayout menuPane( AKN_LAYOUT_WINDOW_list_menu_pane( 0 , 0 ) ); - TAknWindowLineLayout singleMenuPane( AKN_LAYOUT_WINDOW_list_single_popup_menu_pane( index ) ); - TAknLayoutRect menuPaneRect; - TAknLayoutRect singleMenuPaneRect; - - TBool hasDoubleSpanScrollBar = EFalse; - - if ( iSBFrame && iSBFrame->VScrollBarVisibility() ) - { - hasDoubleSpanScrollBar = ETrue; - } - - if ( !iOwner ) - { - TAknWindowLineLayout listScrollPaneLayout( - AknLayoutScalable_Avkon::listscroll_menu_pane(0).LayoutLine() ); - if ( iExtension ) - { - iExtension->AdjustPopupLayoutData( listScrollPaneLayout ); - } - TAknLayoutRect listScrollPaneRect; - listScrollPaneRect.LayoutRect( windowRect, listScrollPaneLayout ); - - menuPane = AknLayoutScalable_Avkon::list_menu_pane( 0 ).LayoutLine(); - menuPaneRect.LayoutRect( listScrollPaneRect.Rect(), menuPane ); - - singleMenuPane = AknLayoutScalable_Avkon::list_single_pane_cp2( index ).LayoutLine(); - singleMenuPaneRect.LayoutRect( menuPaneRect.Rect(), singleMenuPane ); - } - else // Submenu - { - TAknWindowLineLayout listScrollPaneLayout( AknLayoutScalable_Avkon::listscroll_popup_sub_pane().LayoutLine() ); - TAknLayoutRect listScrollPaneRect; - listScrollPaneRect.LayoutRect( windowRect, listScrollPaneLayout ); - - menuPane = AknLayoutScalable_Avkon::list_submenu_pane( !hasDoubleSpanScrollBar ).LayoutLine(); - menuPaneRect.LayoutRect( listScrollPaneRect.Rect(), menuPane ); - - singleMenuPane = AknLayoutScalable_Avkon::list_single_popup_submenu_pane( index ).LayoutLine(); - singleMenuPaneRect.LayoutRect( menuPaneRect.Rect(), singleMenuPane ); - } - - // Compared to normal DrawItem the highlight rect step is omitted because - // it would shift the highlight towards left. - - return singleMenuPaneRect.Rect(); + return ItemRect( index ); } @@ -7436,7 +6130,6 @@ { AknIconUtils::SetSize( itemData->Bitmap(), cascadeRect.Rect().Size() ); } - else { if (iExtension->iCascadeBitmap) @@ -7479,8 +6172,7 @@ EXPORT_C TInt CEikMenuPane::CountComponentControls() const { TInt count = 0; - if ( iSBFrame && iSBFrame->VerticalScrollBar() && - !( iSBFrame->VerticalScrollBar()->OwnsWindow() ) ) + if ( iSBFrame && iSBFrame->VerticalScrollBar() ) { count = 1; } @@ -7507,8 +6199,7 @@ { case 0: { - if ( iSBFrame && iSBFrame->VerticalScrollBar() && - !( iSBFrame->VerticalScrollBar()->OwnsWindow() ) ) + if ( iSBFrame && iSBFrame->VerticalScrollBar() ) { return iSBFrame->VerticalScrollBar(); } @@ -7551,6 +6242,10 @@ } +// ----------------------------------------------------------------------------- +// CEikMenuPane::CheckCreateExtensionL +// ----------------------------------------------------------------------------- +// void CEikMenuPane::CheckCreateExtensionL() { if ( !iExtension ) @@ -7562,6 +6257,50 @@ // ----------------------------------------------------------------------------- +// CEikMenuPane::ItemRect +// ----------------------------------------------------------------------------- +// +TRect CEikMenuPane::ItemRect( TInt aItemIndex ) const + { + // this method is valid for the main menu only + TInt lastRow = AknLayoutScalable_Avkon::list_single_pane_cp2_ParamLimits().LastRow(); + aItemIndex = Min( aItemIndex, lastRow ); + + TAknLayoutRect layoutRect; + layoutRect.LayoutRect( iExtension->iItemAreaRect, + AknLayoutScalable_Avkon::list_single_pane_cp2( aItemIndex ) ); + + return layoutRect.Rect(); + } + + +// ----------------------------------------------------------------------------- +// CEikMenuPane::CalculateItemHeight +// ----------------------------------------------------------------------------- +// +TInt CEikMenuPane::CalculateItemHeight() const + { + TAknWindowLineLayout menuLineLayout; + + if ( iOwner ) // submenu + { + menuLineLayout = + AknLayoutScalable_Avkon::list_single_popup_submenu_pane( 0 ).LayoutLine(); + } + else + { + menuLineLayout = + AknLayoutScalable_Avkon::list_single_pane_cp2( 0 ).LayoutLine(); + } + + TAknLayoutRect menuLayoutRect; + menuLayoutRect.LayoutRect( Rect(), menuLineLayout ); + + return menuLayoutRect.Rect().Height(); + } + + +// ----------------------------------------------------------------------------- // CEikMenuPane::ConstructMenuSctRowL // Creates an sct row for editing menu. // @param aSpecialChars Buffer that holds selected characters @@ -7709,30 +6448,20 @@ if ( iCascadeMenuPane->IsVisible() ) { okToDraw = AknsUtils::SkinInstance() != NULL; -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - MAknListBoxTfxInternal *transApi = CAknListLoader::TfxApiInternal( iExtension->iGc ); - if ( transApi && okToDraw ) - { - iCascadeMenuPane->SetFocus( EFalse, EDrawNow ); - } -#endif // Stop ongoing comp. transitions, this is mostly for fast clicking // cases to make sure that no "scrap" is left behind. GfxTransEffect::NotifyExternalState( ENotifyGlobalAbort ); + // cascade menu "cancel" animation. This does not apply // when something is chosen from the menu - - if( iExtension->iShowCascadeTransition && okToDraw ) - { - iCascadeMenuPane->SetParent( this ); - - GfxTransEffect::Begin( iCascadeMenuPane, KGfxControlDisappearAction ); - GfxTransEffect::SetDemarcation( iCascadeMenuPane, iExtension->iCascadeDRect ); - - iCascadeMenuPane->MakeVisible( EFalse ); - - GfxTransEffect::End( iCascadeMenuPane ); - + if ( iExtension->iShowCascadeTransition && okToDraw ) + { + iCascadeMenuPane->SetParent( this ); + + GfxTransEffect::Begin( iCascadeMenuPane, KGfxControlDisappearAction ); + GfxTransEffect::SetDemarcation( iCascadeMenuPane, iExtension->iCascadeDRect ); + iCascadeMenuPane->MakeVisible( EFalse ); + GfxTransEffect::End( iCascadeMenuPane ); } }