diff -r fb3763350a08 -r 4d54b72983ae menufw/menufwui/mmwidgets/src/mmgrid.cpp --- a/menufw/menufwui/mmwidgets/src/mmgrid.cpp Fri Jan 22 09:35:14 2010 +0200 +++ b/menufw/menufwui/mmwidgets/src/mmgrid.cpp Tue Jan 26 11:48:23 2010 +0200 @@ -12,7 +12,7 @@ * Contributors: * * Description: -* Version : %version: MM_95 % << Don't touch! Updated by Synergy at check-out. +* Version : %version: MM_97 % << Don't touch! Updated by Synergy at check-out. * */ @@ -51,6 +51,7 @@ // CMmGrid::~CMmGrid() { + delete iRedrawTimer; } // ----------------------------------------------------------------------------- @@ -215,42 +216,65 @@ void CMmGrid::HandleScrollEventL( CEikScrollBar* aScrollBar, TEikScrollEvent aEventType ) { - CAknGrid::HandleScrollEventL(aScrollBar, aEventType); - iCurrentTopItemIndex = TopItemIndex(); - - // setting default highligh in order not to overwrite the top item index - // set before in the SetLayout method - CMmWidgetContainer* parent = static_cast< CMmWidgetContainer* > ( Parent() ); - if (!parent->IsHighlightVisible()) - { - parent->SetDefaultHighlightL( EFalse ); + if ( aEventType == EEikScrollThumbDragVert && !iScrollbarThumbIsBeingDragged ) + { + iScrollbarThumbIsBeingDragged = ETrue; + static_cast( + View()->ItemDrawer() )->EnableCachedDataUse( ETrue ); + iRedrawTimer->Start( KScrollingRedrawInterval, KScrollingRedrawInterval, + TCallBack( &CMmGrid::RedrawTimerCallback, static_cast( this ) ) ); + } + else if ( aEventType == EEikScrollThumbReleaseVert ) + { + iScrollbarThumbIsBeingDragged = EFalse; + static_cast( + View()->ItemDrawer() )->EnableCachedDataUse( EFalse ); + // The view will be redrawn with cache disabled when ProcessScrollEventL + // calls the base class's HandleScrollEventL method -- no need to + // explicitly redraw the view. + iRedrawTimer->Cancel(); + } -#ifdef RD_UI_TRANSITION_EFFECTS_LIST - MAknListBoxTfxInternal* transApi = CAknListLoader::TfxApiInternal( - static_cast(iView)->Gc() ); - TBool effects = transApi && !transApi->EffectsDisabled(); - if ( effects && aEventType == EEikScrollPageUp || - aEventType == EEikScrollPageDown ) - { - DrawNow(); - } -#endif - - } + if ( !iScrollbarThumbIsBeingDragged ) + { + ProcessScrollEventL( aScrollBar, aEventType ); + } + else + { + __ASSERT_DEBUG( aEventType == EEikScrollThumbDragVert, User::Invariant() ); + ++iSkippedScrollbarEventsCount; + } } // ----------------------------------------------------------------------------- -// +// Clearing ELeftDownInViewRect flag before invoking the base class +// HandlePointerEventL method effectively prevents that method from doing most +// of the things it would normally do in response to EButton1Down event. +// This flag is explicitly cleared to achieve two things: +// 1. Prevent kinetic scrolling (flick) in edit mode. +// 2. Prevent highlight removal when popup menu is displayed. // ----------------------------------------------------------------------------- // void CMmGrid::HandlePointerEventInEditModeL( const TPointerEvent& aPointerEvent ) { + if ( aPointerEvent.iType == TPointerEvent::EButton1Down ) + { + iButton1DownPos = aPointerEvent.iPosition; + } + else if ( aPointerEvent.iType == TPointerEvent::EButton1Up ) + { + CMmWidgetContainer* parent = static_cast( Parent() ); + TPoint dragDelta = iButton1DownPos - aPointerEvent.iPosition; + if ( Abs( dragDelta.iY ) > KDragTreshold || parent->LongTapInProgress() ) + { + iListBoxFlags &= ~ELeftDownInViewRect; + } + } + TInt itemUnderPointerIndex = KErrNotFound; - if ( aPointerEvent.iType == TPointerEvent::EButton1Up || aPointerEvent.iType == TPointerEvent::EButton1Down ) { - iListBoxFlags &= ~ELeftDownInViewRect; // prevent kinetic scrolling CAknGrid::HandlePointerEventL( aPointerEvent ); } else if ( View()->XYPosToItemIndex( @@ -638,6 +662,7 @@ } DoSetupLayoutL(); + iRedrawTimer = CPeriodic::NewL( EPriorityRealTime ); } // ----------------------------------------------------------------------------- @@ -955,6 +980,62 @@ // // ----------------------------------------------------------------------------- // +void CMmGrid::ProcessScrollEventL( CEikScrollBar* aScrollBar, + TEikScrollEvent aEventType ) + { + CAknGrid::HandleScrollEventL( aScrollBar, aEventType ); + iCurrentTopItemIndex = TopItemIndex(); + + // setting default highligh in order not to overwrite the top item index + // set before in the SetLayout method + CMmWidgetContainer* parent = static_cast< CMmWidgetContainer* > ( Parent() ); + if (!parent->IsHighlightVisible()) + { + parent->SetDefaultHighlightL( EFalse ); + +#ifdef RD_UI_TRANSITION_EFFECTS_LIST + MAknListBoxTfxInternal* transApi = CAknListLoader::TfxApiInternal( + static_cast(iView)->Gc() ); + TBool effects = transApi && !transApi->EffectsDisabled(); + if ( effects && aEventType == EEikScrollPageUp || + aEventType == EEikScrollPageDown ) + { + DrawNow(); + } +#endif + + } + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMmGrid::HandleRedrawTimerEvent() + { + if ( iSkippedScrollbarEventsCount ) + { + ProcessScrollEventL( ScrollBarFrame()->VerticalScrollBar(), + EEikScrollThumbDragVert ); + } + iSkippedScrollbarEventsCount = 0; + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +TInt CMmGrid::RedrawTimerCallback( TAny* aPtr ) + { + CMmGrid* self = static_cast( aPtr ); + self->HandleRedrawTimerEvent(); + return 0; + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// void CMmGrid::SetVerticalItemOffset(TInt aOffset) { static_cast (View())->SetItemOffsetInPixels(aOffset);