uifw/AvKon/aknhlist/src/akntreelistphysicshandler.cpp
branchRCL_3
changeset 56 d48ab3b357f1
parent 55 aecbbf00d063
child 72 a5e7a4f63858
--- a/uifw/AvKon/aknhlist/src/akntreelistphysicshandler.cpp	Tue Aug 31 15:28:30 2010 +0300
+++ b/uifw/AvKon/aknhlist/src/akntreelistphysicshandler.cpp	Wed Sep 01 12:16:19 2010 +0100
@@ -113,6 +113,38 @@
         _AKNTRACE_FUNC_EXIT;
 	    return;
         }
+     
+    TBool listEmpty = iTree->VisibleItemCount() > 0 ? EFalse : ETrue;
+    TBool eventSent = EFalse;
+    
+    // empty area events
+    if ( aPointerEvent.iType == TPointerEvent::EButton1Up
+             && PointerOnEmptyArea( aPointerEvent.iPosition ) )
+        {
+        if ( listEmpty )
+            {
+            // no items, empty list was clicked
+            iTreeListView->ReportTreeListEvent( 
+                        MAknTreeListObserver::EEmptyListClicked,
+                        KAknTreeIIDNone );
+            eventSent = ETrue;
+            }
+        else if ( iDownOnEmptyArea )
+            {
+            // items exist, empty list area was clicked
+            iTreeListView->ReportTreeListEvent( 
+                        MAknTreeListObserver::EEmptyAreaClicked,
+                        KAknTreeIIDNone );
+            eventSent = ETrue;
+            }
+        }
+    
+    if ( listEmpty || eventSent )
+        {
+        // return always if list is empty or if empty area event was sent
+        _AKNTRACE_FUNC_EXIT;
+        return;
+        }   
     
     // Panning/flicking logic    
 
@@ -131,7 +163,7 @@
             // flicking was ongoing when content stopped
             if ( iFeedback )
                 {
-                iFeedback->InstantFeedback( ETouchFeedbackBasic );
+                iFeedback->InstantFeedback( ETouchFeedbackList );
                 }
             wasFlicking = ETrue;
             }
@@ -160,8 +192,8 @@
             {
             iTree->EnableMarquee( EFalse );
             }
-           
-        iEmptyAreaClicked = EmptyAreaClicked( aPointerEvent.iPosition ); 
+            
+        iDownOnEmptyArea = PointerOnEmptyArea( aPointerEvent.iPosition );
         }
     
     // EDrag    
@@ -181,8 +213,9 @@
                 }
 #endif // RD_UI_TRANSITION_EFFECTS_LIST
 
-            iPanningActivated = ETrue;
-            iEmptyAreaClicked = EFalse;        
+            iPanningActivated = ETrue;   
+            iDownOnEmptyArea = EFalse;
+  
             
             iHighlightTimer->Cancel();
             iItemToBeFocused = NULL;
@@ -228,7 +261,7 @@
     if ( aPointerEvent.iType == TPointerEvent::EButton1Up )
         {
         iTreeListView->SetPressedDownState( EFalse );
-        if ( iTreeListView->SingleClickEnabled() && !aMarking )
+        if ( iTreeListView->SingleClickEnabled() )
             {
             iHighlightTimer->Cancel();
             iTreeListView->EnableHighlight( EFalse );
@@ -293,23 +326,10 @@
             // also on up event -> play basic list feedback
             if ( iFeedback )
                  {
-                 TTouchLogicalFeedback fbType = ETouchFeedbackBasicItem;
                  if ( iItemToBeSelected != NULL )
                      {
-                     if ( iItemToBeSelected->IsLeaf() && iItemToBeSelected->IsMarkable() )
-                         {
-                         fbType = ETouchFeedbackCheckbox;
-                         }
-                     else if ( iItemToBeSelected->Node() != NULL )
-                         {
-                         if ( iItemToBeSelected->Node()->ChildCount() == 0 && 
-                                 iItemToBeSelected->Node()->IsMarkable() )
-                             {
-                             fbType = ETouchFeedbackCheckbox;
-                             }
-                         }
                      iFeedback->InstantFeedback( iTreeListView, 
-                                                 fbType,
+                                                 ETouchFeedbackList,
                                                  ETouchFeedbackVibra,
                                                  aPointerEvent );
                      }
@@ -317,27 +337,11 @@
                  }
             }
 
-        if ( iItemToBeSelected != NULL && !aMarking)
+        if ( iItemToBeSelected != NULL && !aMarking )
             {
             iTreeListView->SelectItem( iItemToBeSelected );
             iItemToBeSelected = NULL;
-            }
-
-        if ( iItemToBeSelected == NULL && iEmptyAreaClicked )
-            {
-            if ( iTree->VisibleItemCount() > 0 )
-                {
-                iTreeListView->ReportTreeListEvent( 
-                            MAknTreeListObserver::EEmptyAreaClicked,
-                            KAknTreeIIDNone );
-                }
-            else
-                {
-                iTreeListView->ReportTreeListEvent( 
-                            MAknTreeListObserver::EEmptyListClicked,
-                            KAknTreeIIDNone );                
-                }
-            }       
+            }      
         }
     
     // Item handling logic    
@@ -351,7 +355,7 @@
     
         if ( item && (*iItems)[ii].Rect().Contains( adjustedPosition ) )
             {        
-            if ( aPointerEvent.iType == TPointerEvent::EButton1Down )
+            if ( aPointerEvent.iType == TPointerEvent::EButton1Up )
                 {            
                 // Marking mode 
                 if ( aMarking )
@@ -359,24 +363,31 @@
                     TBool drawNow = ( item == iTreeListView->FocusedItem() );    
                     if ( aShiftPressed )
                         {
-                        iTreeListView->MarkItems( iTreeListView->FocusedItem(), item,
-                            !item->IsMarked(), drawNow );
+                        if ( iTreeListView->HighlightEnabled() )
+                            {
+                            iTreeListView->MarkItems( iTreeListView->FocusedItem(), item,
+                                    !item->IsMarked(), drawNow );
+                            }
+                        else
+                            {
+                            iTreeListView->MarkItem( item, !item->IsMarked(), drawNow );
+                            }
                         }
                     else if ( aCtrlPressed )
                         {
                         iTreeListView->MarkItem( item, !item->IsMarked(), drawNow );
                         }
-                    }  
-                else if ( iTreeListView->SingleClickEnabled() 
-                          && !wasFlicking  )                    
+                    } 
+                }
+            else if ( aPointerEvent.iType == TPointerEvent::EButton1Down )
+                {     
+                if ( iTreeListView->SingleClickEnabled() 
+                        && !wasFlicking  && !aMarking )                    
                     {
                     iItemToBeSelected = item;             
                     iTreeListView->SetFocusedItem( item, ii, EFalse );
-                    // Start long tap detector 
-                    if ( !iTreeListView->HasMarkedItemsL() )
-                        {
-                        iTreeListView->LongTapPointerEventL( aPointerEvent );
-                        }
+                    // Start long tap detector
+                    iTreeListView->LongTapPointerEventL( aPointerEvent );
                     }
                 if ( ii != iTreeListView->FocusedItemIndex() )
                     {
@@ -397,7 +408,7 @@
                             // item is a non-focused node, play basic list
                             // feedback
                             iFeedback->InstantFeedback( iTreeListView, 
-                                                        ETouchFeedbackBasicItem );
+                                                        ETouchFeedbackList );
                             
                             // next up event causes for the node to collapse,
                             // play feedback on up event
@@ -408,7 +419,7 @@
                             // item is a non-focused leaf, play sensitive 
                             // feedback
                             iFeedback->InstantFeedback( iTreeListView, 
-                                                        ETouchFeedbackSensitiveItem );
+                                                        ETouchFeedbackSensitiveList );
                             }
                         }
                     }
@@ -422,30 +433,34 @@
                     if ( iFeedback )
                         {
                         iFeedback->InstantFeedback( iTreeListView,
-                                                    ETouchFeedbackBasicItem );
+                                                    ETouchFeedbackList );
                         
                         // next up event cause an action on the screen,
                         // play feedback on up event
                         iPlayFeedbackOnUp = ETrue;
                         }
                     }
-                if ( !aMarking )
+                // timer will be launched everytime, but not
+                // if flicking was ongoing AND it was stopped by tapping 
+                // to highlighted item or to folder (=node)   
+                if ( !( wasFlicking && iItemToBeSelected != NULL ) )
                     {
-                    // timer will be launched everytime, but not
-                    // if flicking was ongoing AND it was stopped by tapping 
-                    // to highlighted item or to folder (=node)   
-                    if ( !( wasFlicking && iItemToBeSelected != NULL ) )
+                    LaunchHighlightTimer( wasScrolling );
+                    }
+                }                      
+            else if ( aPointerEvent.iType == TPointerEvent::EDrag )
+                {
+                if ( iTreeListView->SingleClickEnabled() && !wasFlicking )
+                    {
+                    if ( ii != iTreeListView->FocusedItemIndex() )
                         {
-                        LaunchHighlightTimer( wasScrolling );
+                        iItemToBeSelected = NULL;
+                        iTreeListView->EnableHighlight( EFalse );
+                        iTreeListView->CancelLongTapDetectorL();
+                        iTreeListView->DrawNow();
                         }
-                    }
-                else
-                    {
-                    // Pressed down highlight or highlight timer 
-                    // are not used in marking mode.
-                    SetHighlight();   
-                    }
-                }
+                    }     
+                } 
             (*iItems)[ii].HandlePointerEventL( aPointerEvent, aViewLevel,
                 iTreeListView->Indention(), iTreeListView->IndentionWidth() );
             }
@@ -552,6 +567,10 @@
 //
 void CAknTreeListPhysicsHandler::SetItemHeight( const TInt& aHeight )
     {
+    if( iScrollIndex > 0 && iItemHeight > 0 && aHeight != iItemHeight )
+        {
+        iScrollIndex = ( iScrollIndex / iItemHeight ) * aHeight;
+        }
     iItemHeight = aHeight;
     }
 
@@ -806,12 +825,6 @@
     TUint /*aFlags*/ )
     {
     iScrollIndex = aNewPosition.iY - iViewRect.Height() / 2;
-    TTouchFeedbackType feedbackType = ETouchFeedbackVibra;
-    if ( iPhysics->OngoingPhysicsAction() 
-        == CAknPhysics::EAknPhysicsActionDragging )
-        {
-        feedbackType = static_cast<TTouchFeedbackType>(ETouchFeedbackAudio | ETouchFeedbackVibra);
-        }
     if ( iPhysics->OngoingPhysicsAction() 
             == CAknPhysics::EAknPhysicsActionBouncing )
         {
@@ -886,18 +899,18 @@
                 {
                 if ( bottomItem != iTree->VisibleItemCount() - 1 )
                     iFeedback->InstantFeedback( iTreeListView,
-                                                ETouchFeedbackSensitiveItem,
-                                                feedbackType,
+                                                ETouchFeedbackSensitiveList,
+                                                ETouchFeedbackVibra,
                                                 TPointerEvent() );
                 }
             }
         else if ( bottomItem == iTree->VisibleItemCount() )
             {
-            if ( upperItem != iOldTopItem )
+            if ( upperItem != iOldTopItem && ( upperItem != 0 || iOldTopItem != -1 ) )
                 {
                 iFeedback->InstantFeedback( iTreeListView,
-                                            ETouchFeedbackSensitiveItem,
-                                            feedbackType,
+                                            ETouchFeedbackSensitiveList,
+                                            ETouchFeedbackVibra,
                                             TPointerEvent() );
                 }
             }
@@ -906,8 +919,8 @@
             if ( upperItem < iOldTopItem || bottomItem > iOldBottomItem )
                 {
                 iFeedback->InstantFeedback( iTreeListView,
-                                            ETouchFeedbackSensitiveItem,
-                                            feedbackType,
+                                            ETouchFeedbackSensitiveList,
+                                            ETouchFeedbackVibra,
                                             TPointerEvent() );
                 }
             }
@@ -1041,7 +1054,7 @@
         if ( handler->iTreeListView->SingleClickEnabled() 
              && !handler->iEnableEvents )
             {
-            handler->iTreeListView->EnableHighlight(ETrue);
+            handler->iTreeListView->EnableHighlight( ETrue, ETrue );
             }
         // Pressed down highlight if item still pressed down
         if ( !handler->iFlags.IsSet( EFlagButtonUpReceived )
@@ -1132,12 +1145,12 @@
 
 
 // ---------------------------------------------------------------------------
-// CAknTreeListPhysicsHandler::EmptyAreaClicked
+// CAknTreeListPhysicsHandler::PointerOnEmptyArea
 // ---------------------------------------------------------------------------
 //
-TBool CAknTreeListPhysicsHandler::EmptyAreaClicked( TPoint aPosition )
-    { 
-    if ( aPosition.iY <= WorldHeight() )
+TBool CAknTreeListPhysicsHandler::PointerOnEmptyArea( TPoint aPosition )
+    {        
+    if ( aPosition.iY - iViewRect.iTl.iY <= WorldHeight() )
         {
         return EFalse;
         }