diff -r 0aa5fbdfbc30 -r 3d340a0166ff uifw/EikStd/coctlsrc/EIKLBX.CPP --- a/uifw/EikStd/coctlsrc/EIKLBX.CPP Tue Apr 27 16:55:05 2010 +0300 +++ b/uifw/EikStd/coctlsrc/EIKLBX.CPP Tue May 11 16:27:42 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 1997-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -74,6 +74,7 @@ #include #include #include +#include #include "akntrace.h" // timeout for long keypress used in markable lists @@ -85,7 +86,8 @@ const TInt KDefaultStepSpeed = 5; const TInt KEikListBoxInvalidIndex=-1; //interval time for disable second point event -const TInt KTwoPointerUpEventInterval = 120; // 120 millisecond ( = 0.12 second ) +const TInt KTwoPointerUpEventInterval = 120; // 120 millisecond ( = 0.12 second ) +const TInt KPointerDownAndUpThreshold = 5; // ----------------------------------------------------------------------------- // If a parent to the supplied control has its Gc set, this function will find // it and return it. @@ -377,6 +379,7 @@ public MCenRepNotifyHandlerCallback, public MAknPhysicsObserver, public MAknCollection, + public MAknMarkingCollection, public MAknLongTapDetectorCallBack { public: @@ -448,6 +451,51 @@ */ TInt CollectionExtension( TUint aExtensionId, TAny*& a0, TAny* a1 ); +// From MAknMarkingCollection + /** + * Sets multiple marking state. + * + * @param aActive ETrue if multiple marking should be active. + */ + void SetMultipleMarkingState( TBool aActive ); + + /** + * Returns whether the observer accepts ending of marking mode + * + * @return ETrue if observer accepts exiting marking mode + */ + TBool ExitMarkingMode(); + + /** + * Returns the collection marking state. The state is combination of + * flags defined in @c TStateFlag. + * + * @return Collection state. + */ + TUint MarkingState() const; + + /** + * Marks the currently selected item. + */ + void MarkCurrentItemL(); + + /** + * Marks all items in the collection. + */ + void MarkAllL(); + + /** + * Unmarks all items in the collection. + */ + void UnmarkAll(); + + /* + * Can current item be marked + * + * @return ETrue if item can be marked + */ + TBool CurrentItemMarkable(); + // From MAknLongTapDetectorCallBack /** * Long tap detector callback @@ -512,6 +560,13 @@ * @return ETrue if list has marked items. */ TBool MarkedItems() const; + + /** + * Ignores pointer events until next up event. + * + * @return ETrue if the pointer event ignore was enabled. + */ + TBool IgnorePointerEventsUntilUp(); public: void InitPhysicsL(); @@ -618,7 +673,6 @@ CAknPhysics *iPhysics; TPoint iDragStartPosition; TPoint iLastPointerPos; - TBool iBackgroundDrawingSuppressed; TBool iClickEventsAllowed; TBool iScrolling; TSize iViewSize; @@ -682,12 +736,28 @@ * Item that opened the item action menu */ TInt iLongTappedItem; + + /** + * Marking mode on / off. + */ + TBool iMarkingModeInUse; + + /** + * Marking mode observer. + */ + MAknMarkingModeObserver* iMarkingModeObserver; + /** * Pointer event to be forwarded to the long tap detector upon * highlight timer completion. */ TPointerEvent iDelayedPointerDownEvent; + /** + * Ordinal position of listbox window, before stylus menu is opened. + */ + TInt iOldWinPos; + private: CMatchBuffer* iBuffer; CEikListBox& iListBox; @@ -751,7 +821,8 @@ iLongTapDetector( NULL ), iSingleClickEnabled( iAvkonAppUi->IsSingleClickCompatible() ), iLongTappedItem( KErrNotFound ), - iListBox(aListBox) + iOldWinPos( KErrNotFound ), + iListBox(aListBox) { } @@ -945,6 +1016,7 @@ EnableHighlight( EFalse ); iListBox.iView->DrawItem( iLongTappedItem ); iLongTappedItem = KErrNotFound; + iOldWinPos = KErrNotFound; } } @@ -954,12 +1026,144 @@ // ----------------------------------------------------------------------------- // TInt CListBoxExt::CollectionExtension( - TUint /*aExtensionId*/, TAny*& /*a0*/, TAny* /*a1*/ ) - { + TUint aExtensionId, TAny*& a0, TAny* /*a1*/ ) + { + if ( aExtensionId == MAknMarkingCollection::TYPE ) + { + a0 = static_cast( this ); + } + return KErrNone; } +// ----------------------------------------------------------------------------- +// CListBoxExt::SetMultipleMarkingState +// ----------------------------------------------------------------------------- +// +void CListBoxExt::SetMultipleMarkingState( TBool aActive ) + { + _AKNTRACE_FUNC_ENTER; + iListBox.SetMarkingMode( aActive ); + _AKNTRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CListBoxExt::ExitMarkingMode +// ----------------------------------------------------------------------------- +// +TBool CListBoxExt::ExitMarkingMode() + { + if ( iListBox.MarkingModeObserver() ) + { + return iListBox.MarkingModeObserver()->ExitMarkingMode(); + } + return ETrue; + } + +// ----------------------------------------------------------------------------- +// CListBoxExt::MarkingState +// ----------------------------------------------------------------------------- +// +TUint CListBoxExt::MarkingState() const + { + _AKNTRACE_FUNC_ENTER; + TUint state( 0 ); + if ( iListBox.MarkingMode() ) + { + state |= MAknMarkingCollection::EStateMarkingMode; + if ( MarkedItems() ) + { + state |= MAknMarkingCollection::EStateMarkedItems; + } + if ( iListBox.Model()->NumberOfItems() == 0 ) + { + state |= MAknMarkingCollection::EStateCollectionEmpty; + } + } + _AKNTRACE_FUNC_EXIT; + return state; + } + + +// ----------------------------------------------------------------------------- +// CListBoxExt::MarkCurrentItemL +// ----------------------------------------------------------------------------- +// +void CListBoxExt::MarkCurrentItemL() + { + _AKNTRACE_FUNC_ENTER; + + if ( iListBox.MarkingMode() ) + { + TInt index = iListBox.CurrentItemIndex(); + if ( index >= 0 && + !iListBox.iItemDrawer->Properties( index ).IsSelectionHidden() ) + { + iListBox.View()->SelectItemL( iListBox.CurrentItemIndex() ); + } + } + _AKNTRACE_FUNC_EXIT; + } + + +// ----------------------------------------------------------------------------- +// CListBoxExt::MarkAllL +// ----------------------------------------------------------------------------- +// +void CListBoxExt::MarkAllL() + { + _AKNTRACE_FUNC_ENTER; + + if ( iListBox.MarkingMode() ) + { + for ( TInt i = 0; i < iListBox.Model()->NumberOfItems(); ++i ) + { + if ( !iListBox.iItemDrawer->Properties( i ).IsSelectionHidden() ) + { + iListBox.View()->SelectItemL( i ); + } + } + } + _AKNTRACE_FUNC_EXIT; + } + + +// ----------------------------------------------------------------------------- +// CListBoxExt::UnmarkAll +// ----------------------------------------------------------------------------- +// +void CListBoxExt::UnmarkAll() + { + _AKNTRACE_FUNC_ENTER; + + if ( iListBox.MarkingMode() ) + { + iListBox.View()->ClearSelection(); + } + + _AKNTRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CListBoxExt::CurrentItemMarkable +// ----------------------------------------------------------------------------- +// +TBool CListBoxExt::CurrentItemMarkable() + { + _AKNTRACE_FUNC_ENTER; + TBool itemCanBeMarked = ETrue; + TInt index = iListBox.CurrentItemIndex(); + if ( index >= 0 && + iListBox.iItemDrawer->Properties( index ).IsSelectionHidden() ) + { + itemCanBeMarked = EFalse; + } + _AKNTRACE_FUNC_EXIT; + return itemCanBeMarked; + } + + // --------------------------------------------------------------------------- // CListBoxExt::HandleLongTapEventL // --------------------------------------------------------------------------- @@ -971,6 +1175,8 @@ iLongTappedItem = iLastDownTappedItem; iLastDownTappedItem = KErrNotFound; iItemActionMenu->ShowMenuL( aPenEventScreenLocation, 0 ); + IgnorePointerEventsUntilUp(); + iOldWinPos = iListBox.DrawableWindow()->OrdinalPosition(); _AKNTRACE_FUNC_EXIT; } @@ -1035,12 +1241,18 @@ if ( iListBox.iView->ViewRect() != TRect() ) { - TInt topItemIndex = iListBox.iView->TopItemIndex(); - if ( iListBox.iView->ItemIsPartiallyVisible( topItemIndex) ) - { - topItemIndex++; - } - TRAP_IGNORE( iListBox.UpdateHighlightL( topItemIndex ) ); + // Set current item index highlighted if it is visible, otherwise + // the first visible index + TInt index = iListBox.iView->CurrentItemIndex(); + if ( !iListBox.iView->ItemIsVisible( index ) ) + { + index = iListBox.iView->TopItemIndex(); + if ( iListBox.iView->ItemIsPartiallyVisible( index ) ) + { + index++; + } + } + TRAP_IGNORE( iListBox.UpdateHighlightL( index ) ); } DisableItemSpecificMenu(); @@ -1071,6 +1283,7 @@ _AKNTRACE_FUNC_EXIT; } + // ----------------------------------------------------------------------------- // CListBoxExt::LongTapPointerEventL // ----------------------------------------------------------------------------- @@ -1079,12 +1292,13 @@ { if ( iSingleClickEnabled && iLongTapDetector && iItemActionMenu ) { - // Send event on down only if item specific items were found and current - // item is marked if there are marked items - if ( !( MarkedItems() && - !iListBox.View()->ItemIsSelected( iListBox.CurrentItemIndex() ) ) - && ( aPointerEvent.iType != TPointerEvent::EButton1Down - || iItemActionMenu->InitMenuL() ) ) + // Send event on down only if item specific items were found. + // Long tap is also disabled if current item is not marked while + // there are some marked items or marking mode is active. + if ( !( ( iListBox.MarkingMode() || MarkedItems() ) + && !iListBox.View()->ItemIsSelected( iListBox.CurrentItemIndex() ) ) + && ( aPointerEvent.iType != TPointerEvent::EButton1Down + || iItemActionMenu->InitMenuL() ) ) { iLongTapDetector->PointerEventL ( aPointerEvent ); } @@ -1190,6 +1404,34 @@ // ----------------------------------------------------------------------------- +// CListBoxExt::IgnorePointerEventsUntilUp +// ----------------------------------------------------------------------------- +// +TBool CListBoxExt::IgnorePointerEventsUntilUp() + { + _AKNTRACE_FUNC_ENTER; + + // Pointer event ignore must be done for the window-owning + // control or it doesn't have any effect! + CCoeControl* windowOwningControl = &iListBox; + + while ( windowOwningControl && !windowOwningControl->OwnsWindow() ) + { + windowOwningControl = windowOwningControl->Parent(); + } + + if ( windowOwningControl ) + { + windowOwningControl->IgnoreEventsUntilNextPointerUp(); + _AKNTRACE_FUNC_EXIT; + return ETrue; + } + _AKNTRACE_FUNC_EXIT; + return EFalse; + } + + +// ----------------------------------------------------------------------------- // CListBoxExt::StartLongPressTimerL // ----------------------------------------------------------------------------- // @@ -1717,7 +1959,8 @@ } // --------------------------------------------------------------------------- -// CListBoxExt::FeedbackEnabledOnUpEvent +// Checks whether or not tactile feedback should be given on a pointer +// up event. // --------------------------------------------------------------------------- // TBool CListBoxExt::FeedbackEnabledOnUpEvent() @@ -1725,11 +1968,20 @@ _AKNTRACE_FUNC_ENTER; TBool enabled( EFalse ); + // As there's no pressed down highlight in single click enabled lists, + // the iLastDownTappedItem is used to track whether or not the pointer + // up event happened inside the same list item as the pointer down event. + // Feedback should not be given if the pointer up is received outside of + // the item that received the pointer down event, or in cases when the + // list has been dragged or flicked between the pointer down and pointer + // up events. if ( ( iListBox.iItemDrawer->Flags() & CListItemDrawer::EPressedDownState - || iSingleClickEnabled ) && !iFlickStopped ) + || ( iSingleClickEnabled && iLastDownTappedItem != KErrNotFound ) ) && + !iFlickStopped ) { enabled = ETrue; } + _AKNTRACE_FUNC_EXIT; return enabled; } @@ -2104,12 +2356,24 @@ { if ( iListBoxExt && iListBoxExt->iSingleClickEnabled ) { - // If single click is enabled, highlight must also be visible - if ( iListBoxExt->CollectionState() + TInt offset = (iListBoxExt->iWorldSize.iHeight / 2) + - iListBoxExt->iViewPosition.iY; + TInt totalItems = iModel->NumberOfItems(); + TInt itemsInRect = + iView->NumberOfItemsThatFitInRect( iView->ViewRect() ); + + if ( ( iListBoxExt->CollectionState() & MAknCollection::EStateHighlightVisible ) + || ( ItemsInSingleLine() + && ( totalItems <= itemsInRect ) + && ( offset != 0 ) ) ) { newTopItemIndex = iView->CalcNewTopItemIndexSoItemIsVisible( currentItemIndex ); } + else + { + newTopItemIndex = iView->CalcNewTopItemIndexSoItemIsVisible( topItemIndex ); + } } else { @@ -2129,10 +2393,10 @@ if ( newTopItemIndex != KEikListBoxInvalidIndex ) { iView->SetTopItemIndex( newTopItemIndex ); - if ( iListBoxExt && iListBoxExt->iPhysics ) - { - iListBoxExt->InitPhysicsL(); - } + } + if ( iListBoxExt && iListBoxExt->iPhysics ) + { + iListBoxExt->InitPhysicsL(); } } UpdateScrollBarsL(); @@ -2404,7 +2668,8 @@ UpdateCurrentItem(aItemIndex); iView->SetDisableRedraw(redrawDisabled); - if ( iListBoxExt && iListBoxExt->iPhysics && aItemIndex == 0 ) + if ( iListBoxExt && iListBoxExt->iPhysics && aItemIndex == 0 + && !iListBoxExt->iScrolling ) { iView->SetItemOffsetInPixels( 0 ); } @@ -3715,7 +3980,7 @@ if (!shiftKeyPressed && iListBoxFlags & EShiftEnterMarks) { // enter key pressed on markable list without shift - if (SelectionIndexes()->Count() > 0) + if ( SelectionIndexes()->Count() > 0 && !MarkingMode() ) { // when there's marked items, should open options menu. __KeyDebug(ETrue, "ok without shift => ok options menu"); @@ -3961,6 +4226,29 @@ { allowed = iListBoxExt->iClickEventsAllowed; } + + if ( MarkingMode() && allowed ) + { + switch ( aEvent ) + { + case MEikListBoxObserver::EEventItemSingleClicked: + case MEikListBoxObserver::EEventEnterKeyPressed: + { + TInt index = CurrentItemIndex(); + if ( index >= 0 && + !iItemDrawer->Properties(index).IsSelectionHidden() ) + { + iView->ToggleItemL( iView->CurrentItemIndex() ); + } + + allowed = EFalse; + } + break; + + default: + break; + } + } if ( allowed ) { @@ -4692,11 +4980,6 @@ return; } - - // When in marking mode, pointer events should not be forwarded to - // long tap detector, this boolean indicates if marking mode is active - TBool markingMode( iListBoxExt->MarkedItems() ); - if ( aPointerEvent.iType == TPointerEvent::EButton1Down ) { if ( iListBoxExt->iSingleClickEnabled && @@ -4708,9 +4991,8 @@ iListBoxExt->iFeedbackType = ETouchFeedbackList; - if ( iListBoxFlags & ES60StyleMultiselection || - ( !iListBoxExt->iSingleClickEnabled && - itemIndex != iView->CurrentItemIndex() ) ) + if ( !iListBoxExt->iSingleClickEnabled && + itemIndex != iView->CurrentItemIndex() ) { iListBoxExt->iFeedbackType = ETouchFeedbackSensitiveList; } @@ -4855,11 +5137,15 @@ CCoeEnv::Static()->WsSession().Finish(); } - iListBoxExt->ImmediateFeedback( - iListBoxExt->iFeedbackType, - TTouchFeedbackType( ETouchFeedbackVibra | - ETouchFeedbackAudio ), - aPointerEvent ); + if ( !( ( iListBoxFlags & EViewerFlag ) && + ( iListBoxFlags & EDisableItemSpecificMenu ) ) ) + { + iListBoxExt->ImmediateFeedback( + iListBoxExt->iFeedbackType, + TTouchFeedbackType( ETouchFeedbackVibra | + ETouchFeedbackAudio ), + aPointerEvent ); + } if ( !wasFlicking ) { @@ -4891,7 +5177,8 @@ } } #endif - if (!(iListBoxFlags & EMultipleSelection)) // i.e. this is a single selection listbox + if ( !( iListBoxFlags & EMultipleSelection ) + || MarkingMode() ) { if (itemIndex == oldCurrentItemIndex) { @@ -5037,10 +5324,13 @@ case TPointerEvent::EButton1Up: _AKNTRACE("TPointerEvent::EButton1Up"); - if ( iListBoxExt->FeedbackEnabledOnUpEvent() && iListBoxExt->iClickEventsAllowed ) + if ( iListBoxExt->FeedbackEnabledOnUpEvent() && iListBoxExt->iClickEventsAllowed + && ( !( ( iListBoxFlags & EViewerFlag ) && + ( iListBoxFlags & EDisableItemSpecificMenu ) ) ) ) { TTouchLogicalFeedback fbType = ETouchFeedbackList; - if ( iListBoxFlags & ES60StyleMultiselection ) + if ( iListBoxFlags & ES60StyleMultiselection + || iListBoxFlags & EMultipleSelection ) { fbType = ETouchFeedbackCheckbox; } @@ -5111,9 +5401,16 @@ return; } } - else if ( s60StyleMultiselection && - iListBoxExt->iLastDownTappedItem == itemIndex && - !Buffer()->iDragToAnotherItem ) + // Due to the feature of capactior panel, the pointer position + // may change between pointer down and up during user click + // action. When the click position is between two items, the + // item index may change unwanted, so we make a threshold + // for this situation. + else if ( s60StyleMultiselection + && ( iListBoxExt->iLastDownTappedItem == itemIndex + || Abs( iListBoxExt->iLastPointerPos.iY + - aPointerEvent.iPosition.iY ) < KPointerDownAndUpThreshold ) + && !Buffer()->iDragToAnotherItem ) { iListBoxFlags |= EStateChanged; Buffer()->iPressedIndex = itemIndex; @@ -5471,9 +5768,12 @@ EXPORT_C TBool CEikListBox::BackgroundDrawingSuppressed() const { - if ( iListBoxExt ) - { - return iListBoxExt->iBackgroundDrawingSuppressed; + if ( iItemDrawer ) + { + TInt flags = iItemDrawer->Flags(); + + return ( flags & CListItemDrawer::EDrawWholeBackground ) + && ( flags & CListItemDrawer::EBackgroundDrawn ); } return EFalse; @@ -5793,8 +6093,22 @@ EColorControlDimmedBackground : EColorControlBackground,*this); UpdateViewColors(); UpdateItemDrawerColors(); - + + // store the value of virtical offset as it will be 0 in SizeChange, + // that will affect view position in skin changed, which is a bug. + TInt oldOffset = 0; + if ( iView ) + { + oldOffset = iView->ItemOffsetInPixels(); + } + // TODO: check if this call is real need here. SizeChanged(); + if ( oldOffset !=0 && iView ) + { + iView->SetItemOffsetInPixels( oldOffset ); + UpdateScrollBarThumbs(); + } + // this methord is empty. UpdateScrollBarsColors(); #ifdef RD_UI_TRANSITION_EFFECTS_LIST @@ -5839,7 +6153,13 @@ case KAknMessageFocusLost: { - if ( iListBoxExt && iListBoxExt->iSingleClickEnabled ) + TInt oldWinPos = iListBoxExt->iOldWinPos; + TInt winPos = DrawableWindow()->OrdinalPosition(); + + // Do not remove higlight if window ordinal position has changed + // during the time when stylus menu is open + if ( iListBoxExt && iListBoxExt->iSingleClickEnabled + && ( oldWinPos == KErrNotFound || oldWinPos == winPos ) ) { TBool enabled( iItemDrawer && !( iItemDrawer->Flags() & CListItemDrawer::ESingleClickDisabledHighlight ) ); @@ -6289,6 +6609,60 @@ return enabled; } + +// --------------------------------------------------------------------------- +// CEikListBox::SetMarkingMode +// --------------------------------------------------------------------------- +// +EXPORT_C void CEikListBox::SetMarkingMode( TBool aEnable ) + { + if ( iListBoxExt && iListBoxExt->iSingleClickEnabled && + ( iListBoxFlags & CEikListBox::ES60StyleMarkable ) ) + { + if ( iListBoxExt->iMarkingModeInUse != aEnable ) + { + if ( aEnable ) + { + iView->ItemDrawer()->SetFlags( + CListItemDrawer::EMarkingModeEnabled ); + } + else + { + iView->ItemDrawer()->ClearFlags( + CListItemDrawer::EMarkingModeEnabled ); + + if ( iView->SelectionIndexes()->Count() > 0 ) + { + iView->ClearSelection( EFalse ); + } + } + + iListBoxExt->iMarkingModeInUse = aEnable; + DrawDeferred(); + } + + if ( MarkingModeObserver() ) + { + MarkingModeObserver()->MarkingModeStatusChanged( aEnable ); + } + } + } + + +// --------------------------------------------------------------------------- +// CEikListBox::SetMarkingModeObserver +// --------------------------------------------------------------------------- +// +EXPORT_C void CEikListBox::SetMarkingModeObserver( + MAknMarkingModeObserver* aObserver ) + { + if ( iListBoxExt ) + { + iListBoxExt->iMarkingModeObserver = aObserver; + } + } + + void CEikListBox::ScrollView( const TInt aOffset, TBool aDrawNow ) { _AKNTRACE_FUNC_ENTER; @@ -6336,7 +6710,7 @@ } else if ( CAknPhysics::EAknPhysicsActionDragging == iListBoxExt->iPhysics->OngoingPhysicsAction() ) { - iListBoxExt->ImmediateFeedback( iListBoxExt->iFeedbackType, + iListBoxExt->ImmediateFeedback( ETouchFeedbackSensitiveList, TTouchFeedbackType( ETouchFeedbackVibra | ETouchFeedbackAudio ), TPointerEvent() ); } @@ -6365,17 +6739,20 @@ #endif // _DEBUG iView->SetTopItemIndex( newTopItemIndex ); } + if ( aDrawNow ) { TRect rect(Rect()); // list position changed - if ( iListBoxExt ) - { - iListBoxExt->iBackgroundDrawingSuppressed = ETrue; - } + if ( iListBoxExt && iListBoxExt->FlickOrPanningOngoing() ) + { + iItemDrawer->SetFlags( CListItemDrawer::EDrawWholeBackground ); + } + UpdateScrollBarThumbs(); DrawNow(); + if (iSBFrame && iSBFrame->VerticalScrollBar() && !iSBFrame->VerticalScrollBar()->OwnsWindow()) { TRect srect( iSBFrame->VerticalScrollBar()->Rect() ); @@ -6384,9 +6761,11 @@ iSBFrame->DrawScrollBarsNow(); } } + if ( iListBoxExt ) { - iListBoxExt->iBackgroundDrawingSuppressed = EFalse; + iItemDrawer->ClearFlags( CListItemDrawer::EDrawWholeBackground + | CListItemDrawer::EBackgroundDrawn ); } } _AKNTRACE_FUNC_EXIT; @@ -6402,20 +6781,10 @@ _AKNTRACE_FUNC_ENTER; _AKNTRACE( "aPointerEvent.iType = %d", aPointerEvent.iType ); if ( iListBoxExt->iPhysics->OngoingPhysicsAction() == CAknPhysics::EAknPhysicsActionBouncing ) - { - // Block scrolling events outside listbox area. Note that pointer - // event ignore must be done for the window-owning control or it - // doesn't have any effect! - CCoeControl* windowOwningControl = this; - - while ( windowOwningControl && !windowOwningControl->OwnsWindow() ) - { - windowOwningControl = windowOwningControl->Parent(); - } - - if ( windowOwningControl ) - { - windowOwningControl->IgnoreEventsUntilNextPointerUp(); + { + // Block scrolling events outside listbox area. + if ( iListBoxExt->IgnorePointerEventsUntilUp() ) + { _AKNTRACE_FUNC_EXIT; return ETrue; } @@ -6456,6 +6825,11 @@ iListBoxExt->iMarkingDisabled = ETrue; iListBoxFlags|=ELeftDownInViewRect; blockEvent = ETrue; + iListBoxExt->ImmediateFeedback( + ETouchFeedbackList, + TTouchFeedbackType( ETouchFeedbackVibra | + ETouchFeedbackAudio ), + aPointerEvent ); } } } @@ -6732,6 +7106,40 @@ // --------------------------------------------------------------------------- +// CEikListBox::MarkingMode +// --------------------------------------------------------------------------- +// +TBool CEikListBox::MarkingMode() const + { + TBool markingModeInUse = EFalse; + + if ( iListBoxExt ) + { + markingModeInUse = iListBoxExt->iMarkingModeInUse; + } + + return markingModeInUse; + } + + +// --------------------------------------------------------------------------- +// CEikListBox::MarkingModeObserver +// --------------------------------------------------------------------------- +// +MAknMarkingModeObserver* CEikListBox::MarkingModeObserver() + { + MAknMarkingModeObserver* observer = NULL; + + if ( iListBoxExt ) + { + observer = iListBoxExt->iMarkingModeObserver; + } + + return observer; + } + + +// --------------------------------------------------------------------------- // Sets this control as visible or invisible. // --------------------------------------------------------------------------- //