uifw/AvKon/aknhlist/src/akntreelistphysicshandler.cpp
branchRCL_3
changeset 56 d48ab3b357f1
parent 55 aecbbf00d063
child 72 a5e7a4f63858
equal deleted inserted replaced
55:aecbbf00d063 56:d48ab3b357f1
   111         {
   111         {
   112         _AKNTRACE("CAknTreeListPhysicsHandler::%s Return due to event blocked", __FUNCTION__);
   112         _AKNTRACE("CAknTreeListPhysicsHandler::%s Return due to event blocked", __FUNCTION__);
   113         _AKNTRACE_FUNC_EXIT;
   113         _AKNTRACE_FUNC_EXIT;
   114 	    return;
   114 	    return;
   115         }
   115         }
       
   116      
       
   117     TBool listEmpty = iTree->VisibleItemCount() > 0 ? EFalse : ETrue;
       
   118     TBool eventSent = EFalse;
       
   119     
       
   120     // empty area events
       
   121     if ( aPointerEvent.iType == TPointerEvent::EButton1Up
       
   122              && PointerOnEmptyArea( aPointerEvent.iPosition ) )
       
   123         {
       
   124         if ( listEmpty )
       
   125             {
       
   126             // no items, empty list was clicked
       
   127             iTreeListView->ReportTreeListEvent( 
       
   128                         MAknTreeListObserver::EEmptyListClicked,
       
   129                         KAknTreeIIDNone );
       
   130             eventSent = ETrue;
       
   131             }
       
   132         else if ( iDownOnEmptyArea )
       
   133             {
       
   134             // items exist, empty list area was clicked
       
   135             iTreeListView->ReportTreeListEvent( 
       
   136                         MAknTreeListObserver::EEmptyAreaClicked,
       
   137                         KAknTreeIIDNone );
       
   138             eventSent = ETrue;
       
   139             }
       
   140         }
       
   141     
       
   142     if ( listEmpty || eventSent )
       
   143         {
       
   144         // return always if list is empty or if empty area event was sent
       
   145         _AKNTRACE_FUNC_EXIT;
       
   146         return;
       
   147         }   
   116     
   148     
   117     // Panning/flicking logic    
   149     // Panning/flicking logic    
   118 
   150 
   119     // EButton1Down
   151     // EButton1Down
   120 
   152 
   129         if ( iPhysics->OngoingPhysicsAction() == CAknPhysics::EAknPhysicsActionFlicking )
   161         if ( iPhysics->OngoingPhysicsAction() == CAknPhysics::EAknPhysicsActionFlicking )
   130             {
   162             {
   131             // flicking was ongoing when content stopped
   163             // flicking was ongoing when content stopped
   132             if ( iFeedback )
   164             if ( iFeedback )
   133                 {
   165                 {
   134                 iFeedback->InstantFeedback( ETouchFeedbackBasic );
   166                 iFeedback->InstantFeedback( ETouchFeedbackList );
   135                 }
   167                 }
   136             wasFlicking = ETrue;
   168             wasFlicking = ETrue;
   137             }
   169             }
   138         
   170         
   139         iFlags.Clear( EFlagButtonUpReceived );
   171         iFlags.Clear( EFlagButtonUpReceived );
   158         if ( iTreeListView->SingleClickEnabled()
   190         if ( iTreeListView->SingleClickEnabled()
   159                 && iTree->IsMarqueeOn() )
   191                 && iTree->IsMarqueeOn() )
   160             {
   192             {
   161             iTree->EnableMarquee( EFalse );
   193             iTree->EnableMarquee( EFalse );
   162             }
   194             }
   163            
   195             
   164         iEmptyAreaClicked = EmptyAreaClicked( aPointerEvent.iPosition ); 
   196         iDownOnEmptyArea = PointerOnEmptyArea( aPointerEvent.iPosition );
   165         }
   197         }
   166     
   198     
   167     // EDrag    
   199     // EDrag    
   168    
   200    
   169     if ( aPointerEvent.iType == TPointerEvent::EDrag )
   201     if ( aPointerEvent.iType == TPointerEvent::EDrag )
   179                 {
   211                 {
   180                 tfxApi->EnableEffects( EFalse );
   212                 tfxApi->EnableEffects( EFalse );
   181                 }
   213                 }
   182 #endif // RD_UI_TRANSITION_EFFECTS_LIST
   214 #endif // RD_UI_TRANSITION_EFFECTS_LIST
   183 
   215 
   184             iPanningActivated = ETrue;
   216             iPanningActivated = ETrue;   
   185             iEmptyAreaClicked = EFalse;        
   217             iDownOnEmptyArea = EFalse;
       
   218   
   186             
   219             
   187             iHighlightTimer->Cancel();
   220             iHighlightTimer->Cancel();
   188             iItemToBeFocused = NULL;
   221             iItemToBeFocused = NULL;
   189             iItemToBeSelected = NULL;
   222             iItemToBeSelected = NULL;
   190             iIndexToBeFocused = -1;
   223             iIndexToBeFocused = -1;
   226     // EButton1Up   
   259     // EButton1Up   
   227    
   260    
   228     if ( aPointerEvent.iType == TPointerEvent::EButton1Up )
   261     if ( aPointerEvent.iType == TPointerEvent::EButton1Up )
   229         {
   262         {
   230         iTreeListView->SetPressedDownState( EFalse );
   263         iTreeListView->SetPressedDownState( EFalse );
   231         if ( iTreeListView->SingleClickEnabled() && !aMarking )
   264         if ( iTreeListView->SingleClickEnabled() )
   232             {
   265             {
   233             iHighlightTimer->Cancel();
   266             iHighlightTimer->Cancel();
   234             iTreeListView->EnableHighlight( EFalse );
   267             iTreeListView->EnableHighlight( EFalse );
   235             iTreeListView->LongTapPointerEventL( aPointerEvent );
   268             iTreeListView->LongTapPointerEventL( aPointerEvent );
   236             }
   269             }
   291             {
   324             {
   292             // touch down has occured on an item, which requires feedback
   325             // touch down has occured on an item, which requires feedback
   293             // also on up event -> play basic list feedback
   326             // also on up event -> play basic list feedback
   294             if ( iFeedback )
   327             if ( iFeedback )
   295                  {
   328                  {
   296                  TTouchLogicalFeedback fbType = ETouchFeedbackBasicItem;
       
   297                  if ( iItemToBeSelected != NULL )
   329                  if ( iItemToBeSelected != NULL )
   298                      {
   330                      {
   299                      if ( iItemToBeSelected->IsLeaf() && iItemToBeSelected->IsMarkable() )
       
   300                          {
       
   301                          fbType = ETouchFeedbackCheckbox;
       
   302                          }
       
   303                      else if ( iItemToBeSelected->Node() != NULL )
       
   304                          {
       
   305                          if ( iItemToBeSelected->Node()->ChildCount() == 0 && 
       
   306                                  iItemToBeSelected->Node()->IsMarkable() )
       
   307                              {
       
   308                              fbType = ETouchFeedbackCheckbox;
       
   309                              }
       
   310                          }
       
   311                      iFeedback->InstantFeedback( iTreeListView, 
   331                      iFeedback->InstantFeedback( iTreeListView, 
   312                                                  fbType,
   332                                                  ETouchFeedbackList,
   313                                                  ETouchFeedbackVibra,
   333                                                  ETouchFeedbackVibra,
   314                                                  aPointerEvent );
   334                                                  aPointerEvent );
   315                      }
   335                      }
   316                  
   336                  
   317                  }
   337                  }
   318             }
   338             }
   319 
   339 
   320         if ( iItemToBeSelected != NULL && !aMarking)
   340         if ( iItemToBeSelected != NULL && !aMarking )
   321             {
   341             {
   322             iTreeListView->SelectItem( iItemToBeSelected );
   342             iTreeListView->SelectItem( iItemToBeSelected );
   323             iItemToBeSelected = NULL;
   343             iItemToBeSelected = NULL;
   324             }
   344             }      
   325 
       
   326         if ( iItemToBeSelected == NULL && iEmptyAreaClicked )
       
   327             {
       
   328             if ( iTree->VisibleItemCount() > 0 )
       
   329                 {
       
   330                 iTreeListView->ReportTreeListEvent( 
       
   331                             MAknTreeListObserver::EEmptyAreaClicked,
       
   332                             KAknTreeIIDNone );
       
   333                 }
       
   334             else
       
   335                 {
       
   336                 iTreeListView->ReportTreeListEvent( 
       
   337                             MAknTreeListObserver::EEmptyListClicked,
       
   338                             KAknTreeIIDNone );                
       
   339                 }
       
   340             }       
       
   341         }
   345         }
   342     
   346     
   343     // Item handling logic    
   347     // Item handling logic    
   344 
   348 
   345     TPoint adjustedPosition( aPointerEvent.iPosition );
   349     TPoint adjustedPosition( aPointerEvent.iPosition );
   349         {
   353         {
   350         CAknTreeItem* item = (*iItems)[ii].Item();
   354         CAknTreeItem* item = (*iItems)[ii].Item();
   351     
   355     
   352         if ( item && (*iItems)[ii].Rect().Contains( adjustedPosition ) )
   356         if ( item && (*iItems)[ii].Rect().Contains( adjustedPosition ) )
   353             {        
   357             {        
   354             if ( aPointerEvent.iType == TPointerEvent::EButton1Down )
   358             if ( aPointerEvent.iType == TPointerEvent::EButton1Up )
   355                 {            
   359                 {            
   356                 // Marking mode 
   360                 // Marking mode 
   357                 if ( aMarking )
   361                 if ( aMarking )
   358                     {
   362                     {
   359                     TBool drawNow = ( item == iTreeListView->FocusedItem() );    
   363                     TBool drawNow = ( item == iTreeListView->FocusedItem() );    
   360                     if ( aShiftPressed )
   364                     if ( aShiftPressed )
   361                         {
   365                         {
   362                         iTreeListView->MarkItems( iTreeListView->FocusedItem(), item,
   366                         if ( iTreeListView->HighlightEnabled() )
   363                             !item->IsMarked(), drawNow );
   367                             {
       
   368                             iTreeListView->MarkItems( iTreeListView->FocusedItem(), item,
       
   369                                     !item->IsMarked(), drawNow );
       
   370                             }
       
   371                         else
       
   372                             {
       
   373                             iTreeListView->MarkItem( item, !item->IsMarked(), drawNow );
       
   374                             }
   364                         }
   375                         }
   365                     else if ( aCtrlPressed )
   376                     else if ( aCtrlPressed )
   366                         {
   377                         {
   367                         iTreeListView->MarkItem( item, !item->IsMarked(), drawNow );
   378                         iTreeListView->MarkItem( item, !item->IsMarked(), drawNow );
   368                         }
   379                         }
   369                     }  
   380                     } 
   370                 else if ( iTreeListView->SingleClickEnabled() 
   381                 }
   371                           && !wasFlicking  )                    
   382             else if ( aPointerEvent.iType == TPointerEvent::EButton1Down )
       
   383                 {     
       
   384                 if ( iTreeListView->SingleClickEnabled() 
       
   385                         && !wasFlicking  && !aMarking )                    
   372                     {
   386                     {
   373                     iItemToBeSelected = item;             
   387                     iItemToBeSelected = item;             
   374                     iTreeListView->SetFocusedItem( item, ii, EFalse );
   388                     iTreeListView->SetFocusedItem( item, ii, EFalse );
   375                     // Start long tap detector 
   389                     // Start long tap detector
   376                     if ( !iTreeListView->HasMarkedItemsL() )
   390                     iTreeListView->LongTapPointerEventL( aPointerEvent );
   377                         {
       
   378                         iTreeListView->LongTapPointerEventL( aPointerEvent );
       
   379                         }
       
   380                     }
   391                     }
   381                 if ( ii != iTreeListView->FocusedItemIndex() )
   392                 if ( ii != iTreeListView->FocusedItemIndex() )
   382                     {
   393                     {
   383                     iItemToBeFocused = item;
   394                     iItemToBeFocused = item;
   384                     iIndexToBeFocused = ii;
   395                     iIndexToBeFocused = ii;
   395                         if ( item->Node() )
   406                         if ( item->Node() )
   396                             {
   407                             {
   397                             // item is a non-focused node, play basic list
   408                             // item is a non-focused node, play basic list
   398                             // feedback
   409                             // feedback
   399                             iFeedback->InstantFeedback( iTreeListView, 
   410                             iFeedback->InstantFeedback( iTreeListView, 
   400                                                         ETouchFeedbackBasicItem );
   411                                                         ETouchFeedbackList );
   401                             
   412                             
   402                             // next up event causes for the node to collapse,
   413                             // next up event causes for the node to collapse,
   403                             // play feedback on up event
   414                             // play feedback on up event
   404                             iPlayFeedbackOnUp = ETrue;
   415                             iPlayFeedbackOnUp = ETrue;
   405                             }
   416                             }
   406                         else
   417                         else
   407                             {
   418                             {
   408                             // item is a non-focused leaf, play sensitive 
   419                             // item is a non-focused leaf, play sensitive 
   409                             // feedback
   420                             // feedback
   410                             iFeedback->InstantFeedback( iTreeListView, 
   421                             iFeedback->InstantFeedback( iTreeListView, 
   411                                                         ETouchFeedbackSensitiveItem );
   422                                                         ETouchFeedbackSensitiveList );
   412                             }
   423                             }
   413                         }
   424                         }
   414                     }
   425                     }
   415                  // item will be selected only if flicking was not ongoing   
   426                  // item will be selected only if flicking was not ongoing   
   416                  else if ( !wasFlicking )
   427                  else if ( !wasFlicking )
   420                     iFlags.Set( EFlagPDHighlightToFocusedItem );
   431                     iFlags.Set( EFlagPDHighlightToFocusedItem );
   421                     // touch down on focused item, while not flicking
   432                     // touch down on focused item, while not flicking
   422                     if ( iFeedback )
   433                     if ( iFeedback )
   423                         {
   434                         {
   424                         iFeedback->InstantFeedback( iTreeListView,
   435                         iFeedback->InstantFeedback( iTreeListView,
   425                                                     ETouchFeedbackBasicItem );
   436                                                     ETouchFeedbackList );
   426                         
   437                         
   427                         // next up event cause an action on the screen,
   438                         // next up event cause an action on the screen,
   428                         // play feedback on up event
   439                         // play feedback on up event
   429                         iPlayFeedbackOnUp = ETrue;
   440                         iPlayFeedbackOnUp = ETrue;
   430                         }
   441                         }
   431                     }
   442                     }
   432                 if ( !aMarking )
   443                 // timer will be launched everytime, but not
       
   444                 // if flicking was ongoing AND it was stopped by tapping 
       
   445                 // to highlighted item or to folder (=node)   
       
   446                 if ( !( wasFlicking && iItemToBeSelected != NULL ) )
   433                     {
   447                     {
   434                     // timer will be launched everytime, but not
   448                     LaunchHighlightTimer( wasScrolling );
   435                     // if flicking was ongoing AND it was stopped by tapping 
   449                     }
   436                     // to highlighted item or to folder (=node)   
   450                 }                      
   437                     if ( !( wasFlicking && iItemToBeSelected != NULL ) )
   451             else if ( aPointerEvent.iType == TPointerEvent::EDrag )
       
   452                 {
       
   453                 if ( iTreeListView->SingleClickEnabled() && !wasFlicking )
       
   454                     {
       
   455                     if ( ii != iTreeListView->FocusedItemIndex() )
   438                         {
   456                         {
   439                         LaunchHighlightTimer( wasScrolling );
   457                         iItemToBeSelected = NULL;
       
   458                         iTreeListView->EnableHighlight( EFalse );
       
   459                         iTreeListView->CancelLongTapDetectorL();
       
   460                         iTreeListView->DrawNow();
   440                         }
   461                         }
   441                     }
   462                     }     
   442                 else
   463                 } 
   443                     {
       
   444                     // Pressed down highlight or highlight timer 
       
   445                     // are not used in marking mode.
       
   446                     SetHighlight();   
       
   447                     }
       
   448                 }
       
   449             (*iItems)[ii].HandlePointerEventL( aPointerEvent, aViewLevel,
   464             (*iItems)[ii].HandlePointerEventL( aPointerEvent, aViewLevel,
   450                 iTreeListView->Indention(), iTreeListView->IndentionWidth() );
   465                 iTreeListView->Indention(), iTreeListView->IndentionWidth() );
   451             }
   466             }
   452         }
   467         }
   453     _AKNTRACE_FUNC_EXIT;
   468     _AKNTRACE_FUNC_EXIT;
   550 // CAknTreeListPhysicsHandler::SetItemHeight
   565 // CAknTreeListPhysicsHandler::SetItemHeight
   551 // ---------------------------------------------------------------------------
   566 // ---------------------------------------------------------------------------
   552 //
   567 //
   553 void CAknTreeListPhysicsHandler::SetItemHeight( const TInt& aHeight )
   568 void CAknTreeListPhysicsHandler::SetItemHeight( const TInt& aHeight )
   554     {
   569     {
       
   570     if( iScrollIndex > 0 && iItemHeight > 0 && aHeight != iItemHeight )
       
   571         {
       
   572         iScrollIndex = ( iScrollIndex / iItemHeight ) * aHeight;
       
   573         }
   555     iItemHeight = aHeight;
   574     iItemHeight = aHeight;
   556     }
   575     }
   557 
   576 
   558 
   577 
   559 // ---------------------------------------------------------------------------
   578 // ---------------------------------------------------------------------------
   804     const TPoint& aNewPosition,
   823     const TPoint& aNewPosition,
   805     TBool aDrawNow,
   824     TBool aDrawNow,
   806     TUint /*aFlags*/ )
   825     TUint /*aFlags*/ )
   807     {
   826     {
   808     iScrollIndex = aNewPosition.iY - iViewRect.Height() / 2;
   827     iScrollIndex = aNewPosition.iY - iViewRect.Height() / 2;
   809     TTouchFeedbackType feedbackType = ETouchFeedbackVibra;
       
   810     if ( iPhysics->OngoingPhysicsAction() 
       
   811         == CAknPhysics::EAknPhysicsActionDragging )
       
   812         {
       
   813         feedbackType = static_cast<TTouchFeedbackType>(ETouchFeedbackAudio | ETouchFeedbackVibra);
       
   814         }
       
   815     if ( iPhysics->OngoingPhysicsAction() 
   828     if ( iPhysics->OngoingPhysicsAction() 
   816             == CAknPhysics::EAknPhysicsActionBouncing )
   829             == CAknPhysics::EAknPhysicsActionBouncing )
   817         {
   830         {
   818         iEventsBlocked = ETrue;
   831         iEventsBlocked = ETrue;
   819         iEnableEvents = EFalse;
   832         iEnableEvents = EFalse;
   884             {
   897             {
   885             if ( bottomItem != iOldBottomItem )
   898             if ( bottomItem != iOldBottomItem )
   886                 {
   899                 {
   887                 if ( bottomItem != iTree->VisibleItemCount() - 1 )
   900                 if ( bottomItem != iTree->VisibleItemCount() - 1 )
   888                     iFeedback->InstantFeedback( iTreeListView,
   901                     iFeedback->InstantFeedback( iTreeListView,
   889                                                 ETouchFeedbackSensitiveItem,
   902                                                 ETouchFeedbackSensitiveList,
   890                                                 feedbackType,
   903                                                 ETouchFeedbackVibra,
   891                                                 TPointerEvent() );
   904                                                 TPointerEvent() );
   892                 }
   905                 }
   893             }
   906             }
   894         else if ( bottomItem == iTree->VisibleItemCount() )
   907         else if ( bottomItem == iTree->VisibleItemCount() )
   895             {
   908             {
   896             if ( upperItem != iOldTopItem )
   909             if ( upperItem != iOldTopItem && ( upperItem != 0 || iOldTopItem != -1 ) )
   897                 {
   910                 {
   898                 iFeedback->InstantFeedback( iTreeListView,
   911                 iFeedback->InstantFeedback( iTreeListView,
   899                                             ETouchFeedbackSensitiveItem,
   912                                             ETouchFeedbackSensitiveList,
   900                                             feedbackType,
   913                                             ETouchFeedbackVibra,
   901                                             TPointerEvent() );
   914                                             TPointerEvent() );
   902                 }
   915                 }
   903             }
   916             }
   904         else if ( upperItem >= 0 || bottomItem < iTree->VisibleItemCount() )
   917         else if ( upperItem >= 0 || bottomItem < iTree->VisibleItemCount() )
   905             {
   918             {
   906             if ( upperItem < iOldTopItem || bottomItem > iOldBottomItem )
   919             if ( upperItem < iOldTopItem || bottomItem > iOldBottomItem )
   907                 {
   920                 {
   908                 iFeedback->InstantFeedback( iTreeListView,
   921                 iFeedback->InstantFeedback( iTreeListView,
   909                                             ETouchFeedbackSensitiveItem,
   922                                             ETouchFeedbackSensitiveList,
   910                                             feedbackType,
   923                                             ETouchFeedbackVibra,
   911                                             TPointerEvent() );
   924                                             TPointerEvent() );
   912                 }
   925                 }
   913             }
   926             }
   914             iOldTopItem = upperItem;
   927             iOldTopItem = upperItem;
   915             iOldBottomItem = bottomItem;
   928             iOldBottomItem = bottomItem;
  1039     if ( handler && handler->iTreeListView )
  1052     if ( handler && handler->iTreeListView )
  1040         {
  1053         {
  1041         if ( handler->iTreeListView->SingleClickEnabled() 
  1054         if ( handler->iTreeListView->SingleClickEnabled() 
  1042              && !handler->iEnableEvents )
  1055              && !handler->iEnableEvents )
  1043             {
  1056             {
  1044             handler->iTreeListView->EnableHighlight(ETrue);
  1057             handler->iTreeListView->EnableHighlight( ETrue, ETrue );
  1045             }
  1058             }
  1046         // Pressed down highlight if item still pressed down
  1059         // Pressed down highlight if item still pressed down
  1047         if ( !handler->iFlags.IsSet( EFlagButtonUpReceived )
  1060         if ( !handler->iFlags.IsSet( EFlagButtonUpReceived )
  1048             && handler->iFlags.IsSet( EFlagPDHighlightToFocusedItem ) )
  1061             && handler->iFlags.IsSet( EFlagPDHighlightToFocusedItem ) )
  1049             {
  1062             {
  1130    	return iTree->VisibleItemCount() * iItemHeight + iListTopOffset;
  1143    	return iTree->VisibleItemCount() * iItemHeight + iListTopOffset;
  1131     }
  1144     }
  1132 
  1145 
  1133 
  1146 
  1134 // ---------------------------------------------------------------------------
  1147 // ---------------------------------------------------------------------------
  1135 // CAknTreeListPhysicsHandler::EmptyAreaClicked
  1148 // CAknTreeListPhysicsHandler::PointerOnEmptyArea
  1136 // ---------------------------------------------------------------------------
  1149 // ---------------------------------------------------------------------------
  1137 //
  1150 //
  1138 TBool CAknTreeListPhysicsHandler::EmptyAreaClicked( TPoint aPosition )
  1151 TBool CAknTreeListPhysicsHandler::PointerOnEmptyArea( TPoint aPosition )
  1139     { 
  1152     {        
  1140     if ( aPosition.iY <= WorldHeight() )
  1153     if ( aPosition.iY - iViewRect.iTl.iY <= WorldHeight() )
  1141         {
  1154         {
  1142         return EFalse;
  1155         return EFalse;
  1143         }
  1156         }
  1144     return ETrue;
  1157     return ETrue;
  1145     }
  1158     }