javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtlistview.cpp
branchRCL_3
changeset 19 71c436fe3ce0
parent 17 0fd27995241b
child 24 6c158198356e
--- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtlistview.cpp	Tue May 25 12:34:19 2010 +0300
+++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtlistview.cpp	Wed Jun 09 09:34:07 2010 +0300
@@ -143,7 +143,9 @@
         iWidthOfSpaceBetweenItems(0),
         iHeightOfSpaceBetweenItems(0),
         iDensity(EMediumListViewDensity),   // must match Java-side default
-        iIsGridCellLayoutNeeded(EFalse)
+        iIsGridCellLayoutNeeded(EFalse),
+        iFlickScrollingOngoing(EFalse)
+
 {
     // Default to horizontal layout orientation (vertical scrollbar)
     //if( iStyle & KSwtStyleVertical )
@@ -1620,8 +1622,11 @@
 //
 void CSwtListView::FocusChanged(TDrawNow aDrawNow)
 {
-    TBool focused = IsFocused();
-    iGrid->SetFocus(focused);
+    TBool isFocused = IsFocused();
+#ifdef RD_JAVA_S60_RELEASE_9_2
+    EnableFocusHighlight(isFocused);
+#endif //RD_JAVA_S60_RELEASE_9_2
+    iGrid->SetFocus(isFocused);
     HandleFocusChanged(aDrawNow);
 }
 
@@ -2653,6 +2658,14 @@
 //
 void CSwtListView::ProcessKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType)
 {
+#ifdef RD_JAVA_S60_RELEASE_9_2
+    if (aType == EEventKeyDown)
+    {
+        // After panning focus highlight was disabled, so enabling again
+        EnableFocusHighlight(ETrue);
+    }
+#endif //RD_JAVA_S60_RELEASE_9_2
+
     if (GetItemCount() == 0)
     {
         iGrid->OfferKeyEventL(aKeyEvent, aType);
@@ -3040,6 +3053,8 @@
         return;
     }
 
+    UpdateFlickScrollingState(aEventType);
+
     switch (aEventType)
     {
         // On 5.0, drawing trough Java gives simply a better fps.
@@ -3492,7 +3507,32 @@
     // Deliver event to scrollbar
     if (iVScrollBarGrabsPointerEvents && vsb)
     {
-        vsb->HandlePointerEventL(aPointerEvent);
+        if (!iFlickScrollingOngoing
+                && aPointerEvent.iType == TPointerEvent::EButton1Down)
+        {
+            // Scrollbar was tapped after scrolling stopped
+            // by itself, so no need to redirect events
+            iScrollbarPointerEventToListbox = EFalse;
+        }
+
+        if (iScrollbarPointerEventToListbox)
+        {
+            // Stops kinetic scrolling when scrollbar is tapped
+            iGrid->ForwardPointerEventL(aPointerEvent);
+            // Continue delivering events until button up appears to prevent
+            // some unexpected behavior in both scrollbar and listbox
+            switch (aPointerEvent.iType)
+            {
+            case TPointerEvent::EButton1Up:
+                iScrollbarPointerEventToListbox = EFalse;
+                break;
+            }
+        }
+        else
+        {
+            // Handles scrollbar behavior
+            vsb->HandlePointerEventL(aPointerEvent);
+        }
     }
 
     // Deliver event to list
@@ -3574,6 +3614,8 @@
     {
         iVScrollBarGrabsPointerEvents = EFalse;
     }
+
+    PostMouseEventL(aPointerEvent);
 }
 
 // ---------------------------------------------------------------------------
@@ -3587,6 +3629,36 @@
 }
 #endif // RD_SCALABLE_UI_V2
 
+
+#ifdef RD_JAVA_S60_RELEASE_9_2
+// ---------------------------------------------------------------------------
+// CSwtListView::EnableFocusHighlight
+// From MSwtControl
+// ---------------------------------------------------------------------------
+//
+void CSwtListView::EnableFocusHighlight(TBool aEnable)
+{
+    ASSERT(iGrid);
+    ASSERT(iGrid->View());
+
+    CListItemDrawer* itemDrawer = iGrid->View()->ItemDrawer();
+    if (itemDrawer)
+    {
+        TInt disabledHighlight =
+            itemDrawer->Flags() & CListItemDrawer::EDisableHighlight;
+
+        if (aEnable && disabledHighlight)
+        {
+            itemDrawer->ClearFlags(CListItemDrawer::EDisableHighlight);
+        }
+        else if (!aEnable && !disabledHighlight)
+        {
+            itemDrawer->SetFlags(CListItemDrawer::EDisableHighlight);
+        }
+    }
+}
+#endif //RD_JAVA_S60_RELEASE_9_2
+
 #ifdef RD_JAVA_ADVANCED_TACTILE_FEEDBACK
 void CSwtListView::DoControlSpecificFeedback(
     const TBool& aFirstTap,
@@ -3609,3 +3681,21 @@
 }
 #endif //RD_JAVA_ADVANCED_TACTILE_FEEDBACK
 
+// ---------------------------------------------------------------------------
+// CSwtTableListBox::UpdateFlickScrollingState
+// Updates flick scrolling status based on received listbox event.
+// ---------------------------------------------------------------------------
+//
+void CSwtListView::UpdateFlickScrollingState(TListBoxEvent aEventType)
+{
+    switch (aEventType)
+    {
+    case EEventFlickStarted:
+        iFlickScrollingOngoing = ETrue;
+        iScrollbarPointerEventToListbox = ETrue;
+        break;
+    case EEventFlickStopped:
+        iFlickScrollingOngoing = EFalse;
+        break;
+    }
+}