diff -r 3d340a0166ff -r 941195f2d488 uifw/ganes/src/HgScroller.cpp --- a/uifw/ganes/src/HgScroller.cpp Tue May 11 16:27:42 2010 +0300 +++ b/uifw/ganes/src/HgScroller.cpp Tue May 25 12:58:19 2010 +0300 @@ -50,8 +50,6 @@ #include -const TInt KIntensity = 100; // 100% - // ============================ MEMBER FUNCTIONS =============================== // ----------------------------------------------------------------------------- @@ -374,7 +372,8 @@ iCurrentRow(-1), iSelectedIndex(KErrNotFound), iScrollBarType( EHgScrollerScrollBar ), - iFirstTime(ETrue) + iFirstTime(ETrue), + iOldWinPos(KErrNotFound) { // No implementation required } @@ -436,7 +435,7 @@ } // ----------------------------------------------------------------------------- -// CHgGrid::Draw() +// CHgScroller::Draw() // Draws the display. // ----------------------------------------------------------------------------- // @@ -589,7 +588,9 @@ && iSelectedIndex != KErrNotFound && !HasHighlight() && iActionMenu->InitMenuL() ) + { iDetector->PointerEventL( aEvent ); + } } // Drag else if( aEvent.iType == TPointerEvent::EDrag && iPointerDown ) @@ -647,24 +648,6 @@ feedback->InstantFeedback( this, ETouchFeedbackSlider, aEvent ); } } - // Drag - else if( aEvent.iType == TPointerEvent::EDrag - && iScrollbar->IsDragging() ) - { - // Smooth continuous tactile feedback is produced - // during thumb dragging. The tactile feedback API - // filters out possible re-startings of the effect. - if ( feedback ) - { - TTimeIntervalMicroSeconds32 timeout( 300000 ); - feedback->StartFeedback( this, - ETouchContinuousSlider, - &aEvent, - KIntensity, // intensity - timeout ); - } - } - // End drag else if( aEvent.iType == TPointerEvent::EButton1Up ) { // Stop the continuous tactile feedback that may be playing @@ -723,6 +706,8 @@ } else if( !iPanning ) { + // to get Handle Selected to be called for sure in single touch + iSelectedIndex = KErrNotFound; SetHighlightL(); } MTouchFeedback* feedback = MTouchFeedback::Instance(); @@ -755,8 +740,18 @@ iPanning = delta >= iPhysics->DragThreshold(); } + //if user has dragged onto another item + if( !iPanning && GetSelected(iStart) != GetSelected(aEvent.iPosition) ) + { + // after setting iPanning true, longtap is cancelled + iPanning = ETrue; + } + if( prevPanning != iPanning ) + { + iPrev = aEvent.iPosition; DrawDeferred(); // to clear highlight + } if(iPanning) { @@ -1271,7 +1266,7 @@ { iItems.ResetAndDestroy(); iItemCount = 0; - iSelectedIndex = -1; + iSelectedIndex = KErrNotFound; if( iManager ) { @@ -1494,8 +1489,6 @@ void CHgScroller::HandleGainingForeground() { iSelectionMode = ENoSelection; - TRect rect( PositionRelativeToScreen(), Size() ); - TRAP_IGNORE( InitScreenL( rect ); ) iScrollbar->Reset(); } @@ -1505,7 +1498,12 @@ // void CHgScroller::HandleLosingForeground() { - iPointerDown = EFalse; + if( iOldWinPos == KErrNotFound + || iOldWinPos == DrawableWindow()->OrdinalPosition() ) + { + iPointerDown = EFalse; + } + iPopupText1.Zero(); iPopupText2.Zero(); } @@ -1570,7 +1568,7 @@ if((index != KErrNotFound || !HasHighlight()) && iPointerDown ) { - iSelectionToFocusedItem = index == iSelectedIndex; + iSelectionToFocusedItem = (index == iSelectedIndex); iSelectedIndex = index; iFocusedIndex = index; // Selection has changed to valid item @@ -1723,6 +1721,9 @@ { delete iIndicatorManager; iIndicatorManager = NULL; iIndicatorManager = CHgIndicatorManager::NewL(); + delete iScrollbar; iScrollbar = NULL; + iScrollbar = CHgScrollbar::NewL(*this); + InitScrollbarL(); InitGraphicsL(); } ) @@ -1737,8 +1738,9 @@ { if( iActionMenu ) { + iOldWinPos = DrawableWindow()->OrdinalPosition(); + iActionMenu->ShowMenuL(aPenEventScreenLocation); iPointerDown = EFalse; - iActionMenu->ShowMenuL(aPenEventScreenLocation); } } @@ -1750,12 +1752,26 @@ { TUint ret = 0; - if(IsFocused()) ret |= MAknCollection::EStateCollectionVisible; - - if(HasHighlight()) ret |= MAknCollection::EStateHighlightVisible; - - if( iFlags & EHgScrollerSelectionMode ) ret |= MAknCollection::EStateMultipleSelection; - + if( IsFocused() ) + { + ret |= MAknCollection::EStateCollectionVisible; + } + if( HasHighlight() ) + { + ret |= MAknCollection::EStateHighlightVisible; + } + if( iFlags & EHgScrollerSelectionMode ) + { + ret |= MAknCollection::EStateMultipleSelection; + for( TInt i = 0; i < iItems.Count(); ++i ) + { + if( iItems[i]->Flags() & CHgItem::EHgItemFlagMarked ) + { + ret |= MAknCollection::EStateMarkedItems; + break; + } + } + } return ret; } @@ -1765,6 +1781,7 @@ // void CHgScroller::ItemActionMenuClosed() { + iOldWinPos = KErrNotFound; DrawDeferred(); }