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