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 |
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 } |