uifw/ganes/src/HgScroller.cpp
branchRCL_3
changeset 25 941195f2d488
parent 23 3d340a0166ff
child 29 a8834a2e9a96
--- 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 <featdiscovery.h>
 
-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();
     }