uifw/EikStd/coctlsrc/EIKLBX.CPP
branchRCL_3
changeset 20 d48ab3b357f1
parent 19 aecbbf00d063
child 21 978afdc0236f
--- a/uifw/EikStd/coctlsrc/EIKLBX.CPP	Tue Aug 31 15:28:30 2010 +0300
+++ b/uifw/EikStd/coctlsrc/EIKLBX.CPP	Wed Sep 01 12:16:19 2010 +0100
@@ -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 <aknitemactionmenu.h>
 #include <aknlongtapdetector.h>
 #include <AknPriv.hrh>
+#include <aknmarkingmodeobserver.h>
 #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 
@@ -478,6 +526,11 @@
     void DisableSingleClick();
 
     /**
+     * Enables single click
+     */
+    void EnableSingleClickL();    
+    
+    /**
      * Disables item specific menu.
      */
     void DisableItemSpecificMenu();
@@ -512,6 +565,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 +678,6 @@
     CAknPhysics *iPhysics;
     TPoint iDragStartPosition;
     TPoint iLastPointerPos;
-    TBool iBackgroundDrawingSuppressed;
     TBool iClickEventsAllowed;
     TBool iScrolling;
     TSize iViewSize;
@@ -682,12 +741,34 @@
     * 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;
+
+    /**
+     * If double click modifier is set on PointerEvent, the event may be ignored
+     * in some situation(To prevent extra dialog launched by AO).
+     */
+    TBool iDoubleClickEventIgnored;
+    
 private:
     CMatchBuffer* iBuffer;
     CEikListBox& iListBox;
@@ -720,7 +801,7 @@
     /**
      * Height of the list in pixels.
      */    
-    TInt iListBottomLimit;
+    TInt iListBottomLimit;    
     };
     
 // CEikListBoxExt    
@@ -751,7 +832,8 @@
       iLongTapDetector( NULL ),
       iSingleClickEnabled( iAvkonAppUi->IsSingleClickCompatible() ),
       iLongTappedItem( KErrNotFound ),
-      iListBox(aListBox)      
+      iOldWinPos( KErrNotFound ),
+      iListBox(aListBox)
     {
     }
 
@@ -852,7 +934,7 @@
     iItemsInSingleLine = 1;
     iFeedback = MTouchFeedback::Instance();
 
-    iItemActionMenu = CAknItemActionMenu::RegisterCollectionL( *this );
+    iItemActionMenu = CAknItemActionMenu::RegisterCollectionL( *this, &iListBox );
 
     if ( !( iListBox.iListBoxFlags & CEikListBox::EDisableItemSpecificMenu )
             && iItemActionMenu )
@@ -929,6 +1011,10 @@
         {
         state |= MAknCollection::EStateMultipleSelection;
         }
+    if ( MarkedItems() )
+        {
+        state |= MAknCollection::EStateMarkedItems; 
+        }
     _AKNTRACE_FUNC_EXIT;
     return state;
     }
@@ -945,6 +1031,7 @@
         EnableHighlight( EFalse );
         iListBox.iView->DrawItem( iLongTappedItem );
         iLongTappedItem = KErrNotFound;
+        iOldWinPos = KErrNotFound;
         }
     }
 
@@ -954,9 +1041,137 @@
 // -----------------------------------------------------------------------------
 //
 TInt CListBoxExt::CollectionExtension(
-        TUint /*aExtensionId*/, TAny*& /*a0*/, TAny* /*a1*/ )
-    {
-    return KErrNone;
+        TUint aExtensionId, TAny*& a0, TAny* /*a1*/ )
+    {
+    if ( aExtensionId == MAknMarkingCollection::TYPE )
+        {
+        a0 = static_cast<MAknMarkingCollection*>( this );
+        return KErrNone;
+        }
+
+    return KErrNotFound;
+    }
+
+
+// -----------------------------------------------------------------------------
+// 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( index );
+            }
+        }
+    _AKNTRACE_FUNC_EXIT;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CListBoxExt::MarkAllL
+// -----------------------------------------------------------------------------
+//
+void CListBoxExt::MarkAllL()
+    {
+    _AKNTRACE_FUNC_ENTER;
+    
+    if ( iListBox.MarkingMode() && 
+            iListBox.Model()->NumberOfItems() > 0 )
+        {               
+        iListBox.View()->SelectAllL( ETrue );   
+        }
+    _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;
     }
 
 
@@ -971,6 +1186,7 @@
     iLongTappedItem = iLastDownTappedItem;
     iLastDownTappedItem = KErrNotFound;
     iItemActionMenu->ShowMenuL( aPenEventScreenLocation, 0 );
+    iOldWinPos = iListBox.DrawableWindow()->OrdinalPosition();
     _AKNTRACE_FUNC_EXIT;
     }
 
@@ -1035,12 +1251,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();
@@ -1054,6 +1276,28 @@
     _AKNTRACE_FUNC_EXIT;
     }
 
+// -----------------------------------------------------------------------------
+// CListBoxExt::EnableSingleClickL
+// -----------------------------------------------------------------------------
+//
+void CListBoxExt::EnableSingleClickL()
+    {
+    _AKNTRACE_FUNC_ENTER;
+    if ( !iLongTapDetector )
+        {
+        iLongTapDetector = CAknLongTapDetector::NewL( this );
+        }
+    if ( !iItemActionMenu )
+        {
+        iItemActionMenu = CAknItemActionMenu::RegisterCollectionL( 
+            *this, &iListBox );
+        iListBox.iListBoxFlags &= ( ~CEikListBox::EDisableItemSpecificMenu );
+        }    
+    iSingleClickEnabled = ETrue;
+    EnableHighlight( EFalse );
+    // iListBox.UpdateHighlightL( iListBox.iView->CurrentItemIndex() );
+    _AKNTRACE_FUNC_EXIT;
+    }
 
 // -----------------------------------------------------------------------------
 // CListBoxExt::DisableItemSpecificMenu
@@ -1071,6 +1315,7 @@
     _AKNTRACE_FUNC_EXIT;
     }
 
+
 // -----------------------------------------------------------------------------
 // CListBoxExt::LongTapPointerEventL
 // -----------------------------------------------------------------------------
@@ -1079,10 +1324,14 @@
     {
     if ( iSingleClickEnabled && iLongTapDetector && iItemActionMenu  )
         {
-        // Send event on down only if no marked items and item specific items
-        // were found
-        if ( aPointerEvent.iType != TPointerEvent::EButton1Down
-                || ( !MarkedItems() && 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() ) )
+            || ( iListBox.iListBoxFlags & CEikListBox::EItemSpecificMenuAlwaysShown ) )
+            && ( aPointerEvent.iType != TPointerEvent::EButton1Down
+            || iItemActionMenu->InitMenuL() ) ) 
             {
             iLongTapDetector->PointerEventL ( aPointerEvent );
             }
@@ -1183,7 +1432,33 @@
     {
     return ( iListBox.iListBoxFlags & CEikListBox::ES60StyleMarkable
             || iListBox.iListBoxFlags & CEikListBox::EMultipleSelection )
-            && iListBox.SelectionIndexes()->Count() > 0;
+            && iListBox.iView && iListBox.SelectionIndexes()->Count() > 0;
+    }
+
+
+// -----------------------------------------------------------------------------
+// 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 ( windowOwningControl != NULL );
     }
 
 
@@ -1559,6 +1834,13 @@
     _AKNTRACE_FUNC_ENTER;    
     if ( iScrolling )
         {
+        // currently, this is the only way to fix ou1cimx1#375869
+        // iViewPosision is changed but we can't provent that
+        if ( iListBox.iView->TopItemIndex() == 0 
+             && iListBox.iView->ItemOffsetInPixels() > 0 )
+            {
+            iListBox.ScrollView( -iListBox.iView->ItemOffsetInPixels(), ETrue );
+            }        
 #ifdef RD_UI_TRANSITION_EFFECTS_LIST
         iListBox.SuspendEffects( EFalse );
 #endif // RD_UI_TRANSITION_EFFECTS_LIST
@@ -1585,7 +1867,8 @@
         TInt topItemIndex = iListBox.iView->TopItemIndex();
         TInt itemHeight = iListBox.iView->ItemHeight();
         TInt numberOfItems = iListBox.iModel->NumberOfItems();
-
+        TInt emptySpaceOffset ( 0 );
+        
         TSize viewSize( iListBox.iView->ViewRect().Size() );
         TSize worldSize( viewSize.iWidth, itemHeight * numberOfItems );
         
@@ -1600,6 +1883,15 @@
                 {
                 worldSize.iHeight += itemHeight;
                 }
+            
+            // Check empty space below the grid
+            if ( topItemIndex != 0 )
+                {
+                TInt lastItemBottomY = 
+                        iListBox.iView->ItemPos( 
+                                numberOfItems - 1 ).iY + itemHeight +1;
+                emptySpaceOffset = Min( 0, lastItemBottomY - viewSize.iHeight );
+                }
             }
             
         // Reset offset if view's size has changed - this is needed if e.g.
@@ -1610,6 +1902,7 @@
             }
 
         TPoint viewCenter( viewSize.iWidth / 2, ( topItemIndex / iItemsInSingleLine ) * itemHeight - iListBox.iView->ItemOffsetInPixels() + ( viewSize.iHeight / 2 ) );
+        viewCenter.iY += emptySpaceOffset;
 
         // Make sure that world's size is always at least view size.
         worldSize.iHeight = Max( worldSize.iHeight, viewSize.iHeight );
@@ -1715,18 +2008,29 @@
     }
 
 // ---------------------------------------------------------------------------
-// CListBoxExt::FeedbackEnabledOnUpEvent
+// Checks whether or not tactile feedback should be given on a pointer
+// up event.
 // ---------------------------------------------------------------------------
 //
 TBool CListBoxExt::FeedbackEnabledOnUpEvent()
     {
     _AKNTRACE_FUNC_ENTER;
     TBool enabled( EFalse );
-    if ( ( iListBox.iItemDrawer->Flags() & CListItemDrawer::EPressedDownState ) &&
-         !iFlickStopped )
+    
+    // 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 && iLastDownTappedItem != KErrNotFound ) ) &&
+        !iFlickStopped )
         {
         enabled = ETrue;
         }
+
     _AKNTRACE_FUNC_EXIT;
     return enabled;
     }
@@ -1810,6 +2114,22 @@
         }
     }
 
+
+// -----------------------------------------------------------------------------
+// CEikListBox::ItemsInSingleLine
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CEikListBox::ItemsInSingleLine() const
+    {
+    if ( iListBoxExt )
+        {
+        return iListBoxExt->iItemsInSingleLine;
+        }
+    
+    return 1;
+    }
+
+    
 EXPORT_C void CEikListBox::UpdateViewColors()
     {
     _AKNTRACE_FUNC_ENTER;
@@ -2071,7 +2391,8 @@
     iView->CalcBottomItemIndex();
     iView->CalcDataWidth();
     TInt currentItemIndex = iView->CurrentItemIndex();
-
+    TInt totalItems = iModel->NumberOfItems();
+    
     if ( ItemExists(currentItemIndex) )
         {
         TInt topItemIndex( iView->TopItemIndex() );
@@ -2083,25 +2404,48 @@
         	|| iListBoxExt && iListBoxExt->iPhysics 
         	&& currentItemIndex == ( topItemIndex + numberOfItems - 1 ) )
             {
-            newTopItemIndex = iView->CalcNewTopItemIndexSoItemIsVisible( currentItemIndex );
+            if ( iListBoxExt && iListBoxExt->iSingleClickEnabled )
+                {
+                TInt offset = (iListBoxExt->iWorldSize.iHeight / 2)
+                        - iListBoxExt->iViewPosition.iY;
+                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
+                {
+                newTopItemIndex = iView->CalcNewTopItemIndexSoItemIsVisible( currentItemIndex );
+                }
             }
         else
             {
-            // recalculates top index of list when mode be changed
-            TInt totalItems = iModel->NumberOfItems();
+            // recalculates top index of list when mode be changed            
             if ( (totalItems - topItemIndex) < numberOfItems )
                 {
                 newTopItemIndex = Max( 0, totalItems - numberOfItems );
                 }
             }
 
-        if ( newTopItemIndex != KEikListBoxInvalidIndex )
+        if ( newTopItemIndex > KEikListBoxInvalidIndex 
+             && newTopItemIndex < totalItems )
         	{
         	iView->SetTopItemIndex( newTopItemIndex );
-        	if ( iListBoxExt && iListBoxExt->iPhysics )
-        		{
-        		iListBoxExt->InitPhysicsL();
-        		}
+            }
+        if ( iListBoxExt && iListBoxExt->iPhysics )
+            {
+            iListBoxExt->InitPhysicsL();
             }
         }
     UpdateScrollBarsL();
@@ -2373,8 +2717,9 @@
     UpdateCurrentItem(aItemIndex);
     iView->SetDisableRedraw(redrawDisabled);
     
-    if ( iListBoxExt && iListBoxExt->iPhysics && aItemIndex == 0 )
-        {
+    if ( iListBoxExt && iListBoxExt->iPhysics && aItemIndex == 0 
+             && !iListBoxExt->iScrolling )
+        {    
         iView->SetItemOffsetInPixels( 0 );        
         }
     _AKNTRACE_FUNC_EXIT;
@@ -2427,6 +2772,8 @@
     if(iItemDrawer && (iItemDrawer->MinimumCellSize().iHeight != 0))
         iItemHeight = iItemDrawer->MinimumCellSize().iHeight;
 
+    CheckCreateExtensionL();
+    
     if ( iListBoxExt->iLongTapDetector
             && iListBoxFlags & EDisableItemSpecificMenu )
         {
@@ -2854,7 +3201,7 @@
         TEikScrollBarFrameLayout layout;
         CreateScrollBarFrameLayout(layout);
         TBool sizeChanged=iSBFrame->TileL(&hSbarModel, &vSbarModel, clientRect, inclusiveRect, layout);
-        if (iListBoxExt->UpdateScrollBarsColors())
+        if ( iListBoxExt && iListBoxExt->UpdateScrollBarsColors() )
             UpdateScrollBarsColors();
         if (!sizeChanged)
             return;
@@ -2981,11 +3328,7 @@
         _AKNTRACE_FUNC_EXIT;
         return;
         }
-    if( !iListBoxExt )
-        {
-        _AKNTRACE_FUNC_EXIT;
-        return;
-        }
+    
     CEikButtonGroupContainer *bgc;
     CCoeControl* MSK( NULL );
     CEikCba* cba( NULL );
@@ -3023,16 +3366,22 @@
         // marking still works even MSK isn't changed
         if ( err )
             {
-            iListBoxExt->iSelectionModeEnabled = EFalse;
+            if ( iListBoxExt )
+                {
+                iListBoxExt->iSelectionModeEnabled = EFalse;
+                }
             _AKNTRACE_FUNC_EXIT;
             return;
             }
         cba->DrawNow();
-        iListBoxExt->iSelectionModeEnabled = ETrue;
+        if ( iListBoxExt )
+            {
+            iListBoxExt->iSelectionModeEnabled = ETrue;
+            }
         }
 
     // remove stacked MSK
-    if( !aEnable && iListBoxExt->iSelectionModeEnabled )
+    if( !aEnable && iListBoxExt && iListBoxExt->iSelectionModeEnabled )
         {
         if( ( MSK && cba->ControlId( MSK ) == EAknSoftkeyMark ) ||
             ( MSK && cba->ControlId( MSK ) == EAknSoftkeyUnmark ) )
@@ -3041,11 +3390,13 @@
             }
         iListBoxExt->iSelectionModeEnabled = EFalse; // just in case
         }
-        
-    TInt count = iListBoxExt->iSelectionObservers.Count();
-    for ( int i=0; i < count; i++ )
-        {
-        iListBoxExt->iSelectionObservers[i]->SelectionModeChanged( this, aEnable );
+    if ( iListBoxExt )
+        {
+        TInt count = iListBoxExt->iSelectionObservers.Count();
+        for ( int i=0; i < count; i++ )
+            {
+            iListBoxExt->iSelectionObservers[i]->SelectionModeChanged( this, aEnable );
+            }
         }
     _AKNTRACE_FUNC_EXIT;
     }
@@ -3064,6 +3415,16 @@
     UpdateScrollBarThumbs();
     iView->ClearFlags(CListBoxView::EItemCountModified);
 
+
+    if ( iListBoxExt->iItemActionMenu &&
+         iListBoxExt->iLongTappedItem != KErrNotFound )
+        {
+        // Item action menu is being shown and it needs to be closed when
+        // items are added or removed to the list array, otherwise the
+        // item specific commands may be targeted to the wrong item. 
+        iListBoxExt->iItemActionMenu->HideMenu();
+        }
+
     FireItemChange();
     
     if ( iListBoxExt && iListBoxExt->iPhysics )
@@ -3145,7 +3506,8 @@
 EXPORT_C void CEikListBox::HandleItemAdditionL()
     {
     _AKNTRACE_FUNC_ENTER;
-     //fix the bug EGGO-7SQA4S and EVSG-7TD9WZ 
+    __ASSERT_DEBUG( iView, Panic( EEikPanicListBoxNoView ) );
+
     TInt curItemIndex = iView->CurrentItemIndex();
     if(curItemIndex >= 0 && curItemIndex < iModel->NumberOfItems() )
       {
@@ -3153,8 +3515,7 @@
       iView->SetTopItemIndex( newTopItemIndex );
       }
     iView->SetFlags(CListBoxView::EItemCountModified);
-    // following breaks lists in square layout, not needed in SERIES60?
-    //iView->CalcDataWidth();
+
     iView->CalcBottomItemIndex();
     UpdateScrollBarsL();
     UpdateScrollBarThumbs();
@@ -3164,7 +3525,7 @@
     FireItemChange();
     
     if ( iListBoxExt )
-        {    
+        {
         iListBoxExt->CheckScrollBarVisibility();
         // Physics engine world size needs to be updated here, otherwise aknphysics 
         // cone observer may block pointer events on new items. this can happen 
@@ -3173,7 +3534,17 @@
             {
             iListBoxExt->InitPhysicsL();
             }
-        }     
+        
+        if ( iListBoxExt->iItemActionMenu &&
+             iListBoxExt->iLongTappedItem != KErrNotFound )
+            {
+            // Item action menu is being shown and it needs to be closed when
+            // items are added or removed to the list array, otherwise the
+            // item specific commands may be targeted to the wrong item. 
+            iListBoxExt->iItemActionMenu->HideMenu();
+            }
+        }
+
     _AKNTRACE_FUNC_EXIT;
     }
 
@@ -3354,7 +3725,8 @@
             {
             selectionMode = CListBoxView::ENoSelection;
             UpdateMarkUnmarkMSKL();
-            if (IsSelectionMarkKeys(code, aKeyEvent.iScanCode, iListBoxExt->iWesternVariant)) 
+            if ( iListBoxExt 
+                 && IsSelectionMarkKeys( code, aKeyEvent.iScanCode, iListBoxExt->iWesternVariant ) ) 
                 {
                 __KeyDebug(ETrue, "SelectionMarkKey")
                 View()->ClearSelectionAnchorAndActiveIndex();
@@ -3365,7 +3737,7 @@
 
     // CAknGrid marking is implemeted in avkon.dll. But we still need to disable short
     // hash mark in here.
-    if ( iListBoxFlags & EMultipleSelection && 
+    if ( iListBoxExt && iListBoxFlags & EMultipleSelection && 
          iListBoxFlags & EShiftEnterMarks && aType == EEventKeyUp )
         {
         if ( aKeyEvent.iScanCode == EStdKeyLeftArrow ||
@@ -3577,7 +3949,8 @@
                     }
                 }
 		
-            if ( ScrollingDisabled() || ( !iListBoxExt->MovePhysicsCursorL( moveto, selectionMode ) ) )
+            if ( ScrollingDisabled() 
+                || ( iListBoxExt && !iListBoxExt->MovePhysicsCursorL( moveto, selectionMode ) ) )
                 {
                 iView->MoveCursorL(moveto, selectionMode);
                 }
@@ -3626,7 +3999,8 @@
                     }
                 }
 
-            if ( ScrollingDisabled() || ( !iListBoxExt->MovePhysicsCursorL( moveto, selectionMode ) ) )
+            if ( ScrollingDisabled() 
+                || ( iListBoxExt && !iListBoxExt->MovePhysicsCursorL( moveto, selectionMode ) ) )
                 {
                 iView->MoveCursorL(moveto, selectionMode);
                 }
@@ -3668,7 +4042,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");
@@ -3711,7 +4085,7 @@
     //
     if(switchMSK)
         {
-        if( selectionMode == CListBoxView::EDisjointMarkSelection )
+        if( iListBoxExt && selectionMode == CListBoxView::EDisjointMarkSelection )
             {
              // if hash and either up or down pressed -> no short marking
             iListBoxExt->iShortHashMark = EFalse;
@@ -3770,7 +4144,7 @@
     // only if a markable list is active, otherwise the simulated event might open 
     // the selected item, which we don't want.    
     if((iListBoxFlags & EMultipleSelection) && (iListBoxFlags & EShiftEnterMarks) &&
-        iListBoxExt->iWesternVariant &&
+        iListBoxExt && iListBoxExt->iWesternVariant &&
         iListBoxExt->iAknFepHashKeySelection && 
         iListBoxExt->iQwertyMode == EFalse && 
         aType == EEventKeyUp && aKeyEvent.iScanCode == EStdKeyHash &&
@@ -3871,27 +4245,46 @@
         case MEikListBoxObserver::EEventFlickStarted:
         case MEikListBoxObserver::EEventPanningStarted:
             {
+            if ( iListBoxExt && ( iListBoxExt->iWorldSize.iHeight 
+                    <= iListBoxExt->iViewSize.iHeight ) )
+                {
+                return; 
+                }
             iItemDrawer->SetFlags( CListItemDrawer::EDisableMarquee );
-            if ( aEvent == MEikListBoxObserver::EEventFlickStarted )
-                iListBoxExt->SetFlickOngoing( ETrue );
-            else            
-                iListBoxExt->SetPanningOngoing( ETrue );
+            if ( iListBoxExt )
+                { 
+                if ( aEvent == MEikListBoxObserver::EEventFlickStarted )
+                    {
+                    iListBoxExt->SetFlickOngoing( ETrue );
+                    }
+                else 
+                    {
+                    iListBoxExt->SetPanningOngoing( ETrue );
+                    }
+                }
             break;
             }
             
         case MEikListBoxObserver::EEventFlickStopped:
         case MEikListBoxObserver::EEventPanningStopped:
             {
-            iItemDrawer->ClearFlags( CListItemDrawer::EDisableMarquee );
-            if ( aEvent == MEikListBoxObserver::EEventFlickStopped )
+            if ( iListBoxExt && ( iListBoxExt->iWorldSize.iHeight 
+                    <= iListBoxExt->iViewSize.iHeight ) )
                 {
-                iListBoxExt->SetFlickOngoing( EFalse );
+                return; 
                 }
-            else 
-                {
-                iListBoxExt->SetPanningOngoing( EFalse );
-                }
-            
+            iItemDrawer->ClearFlags( CListItemDrawer::EDisableMarquee );
+            if ( iListBoxExt )
+                { 
+                if ( aEvent == MEikListBoxObserver::EEventFlickStopped )
+                    {   
+                    iListBoxExt->SetFlickOngoing( EFalse );                    
+                    }
+                else 
+                    {
+                    iListBoxExt->SetPanningOngoing( EFalse );
+                    }
+                }            
             break;
             }
         }
@@ -3901,10 +4294,34 @@
         TBool allowed = ETrue;
 
         if ( iListBoxExt && iListBoxExt->iPhysics
-             && aEvent != MEikListBoxObserver::EEventFlickStopped )
+             && aEvent != MEikListBoxObserver::EEventFlickStopped 
+             && aEvent != MEikListBoxObserver::EEventFlickStarted )
             {
             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 )
             {
@@ -3940,7 +4357,7 @@
 EXPORT_C void CEikListBox::HandlePhysicsScrollEventL( TInt aDeltaPixels )
     {    
     _AKNTRACE_FUNC_ENTER;
-    if ( iListBoxExt->iPhysics )
+    if ( iListBoxExt && iListBoxExt->iPhysics )
         {
         iListBoxExt->InitPhysicsL();
         
@@ -3955,7 +4372,7 @@
 EXPORT_C void CEikListBox::HandleScrollEventL(CEikScrollBar* aScrollBar,TEikScrollEvent aEventType)
     {
     _AKNTRACE_FUNC_ENTER;
-    if ( iListBoxExt->iSingleClickEnabled )
+    if ( iListBoxExt && iListBoxExt->iSingleClickEnabled )
         {
         iListBoxExt->EnableHighlight( EFalse );
         iView->DrawItem( iView->CurrentItemIndex() );
@@ -4098,17 +4515,17 @@
                 }
 #endif
             
-        if ( iListBoxExt->iPhysics )
+        if ( iListBoxExt && iListBoxExt->iPhysics )
             {
             iListBoxExt->InitPhysicsL();
             TInt deltaPixels = newThumbPos;
     
 #ifdef _DEBUG
-            RDebug::Print( _L( "CListBox::HandleScrollEventL, deltaPixels = %d" ), deltaPixels );
+                RDebug::Print( _L( "CListBox::HandleScrollEventL, deltaPixels = %d" ), deltaPixels );
 #endif // _DEBUG
             
             TPoint newPosition( iListBoxExt->iViewPosition.iX, deltaPixels + iView->ViewRect().Height() / 2 );
-            iListBoxExt->ViewPositionChanged( newPosition );
+            iListBoxExt->ViewPositionChanged( newPosition );            
             }
         else
             {
@@ -4130,7 +4547,9 @@
         // If the event has changed thumb position, then update scroll bar
         // unless physics is used. In that case thumb is updated via 
         // CEikListBox::ScrollView.
-        if ( AknLayoutUtils::PenEnabled() && newThumbPos != newThumbPosBeforeCorrecting && !iListBoxExt->iPhysics )
+        if ( AknLayoutUtils::PenEnabled() 
+             && newThumbPos != newThumbPosBeforeCorrecting 
+             && iListBoxExt && !iListBoxExt->iPhysics )
             {
             UpdateScrollBarThumbs();
             }
@@ -4149,7 +4568,6 @@
         return;
         }
     
-    CheckCreateExtensionL();
     if (!(iListBoxFlags & ELeftDownInViewRect))
         {
         _AKNTRACE_FUNC_EXIT;
@@ -4611,7 +5029,7 @@
     
     // Handle empty list area events
     if ( aPointerEvent.iType == TPointerEvent::EButton1Up &&
-            !iListBoxExt->iScrolling )
+            !iListBoxExt->iScrolling && !iListBoxExt->iIsDownOnItem )
         {
         if ( listEmpty )
             {
@@ -4635,11 +5053,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 && 
@@ -4649,25 +5062,19 @@
             iView->DrawItem( iView->CurrentItemIndex() );
             }
 
-        iListBoxExt->iFeedbackType = ETouchFeedbackBasicItem;
-
-        if ( itemIndex != iView->CurrentItemIndex() ||
-             iListBoxFlags & ES60StyleMultiselection )
-            {
-            iListBoxExt->iFeedbackType = ETouchFeedbackSensitiveItem;
+        iListBoxExt->iFeedbackType = ETouchFeedbackList;
+        iListBoxExt->iDoubleClickEventIgnored = EFalse;
+        
+        if ( !iListBoxExt->iSingleClickEnabled &&
+            itemIndex != iView->CurrentItemIndex() )
+            {
+            iListBoxExt->iFeedbackType = ETouchFeedbackSensitiveList;
             }
 
         if ( iListBoxExt->iPhysics &&
              iListBoxExt->iPhysics->OngoingPhysicsAction() == CAknPhysics::EAknPhysicsActionFlicking )
             {
-            iListBoxExt->iFeedbackType = ETouchFeedbackBasicItem;
-            }
-        
-        if ( !iListBoxExt->iPhysics || itemIndex == iView->CurrentItemIndex() )
-            {
-            iListBoxExt->ImmediateFeedback( iListBoxExt->iFeedbackType,
-                                            TTouchFeedbackType(ETouchFeedbackVibra | ETouchFeedbackAudio),
-                                            aPointerEvent );
+            iListBoxExt->iFeedbackType = ETouchFeedbackList;
             }
         }
     iListBoxExt->iEventModifiers = aPointerEvent.iModifiers;
@@ -4726,6 +5133,7 @@
     if(Buffer()->iPressedIndex == itemIndex)
         {
         Buffer()->iPressedIndex = KEikListBoxInvalidIndex;
+        iListBoxExt->iDoubleClickEventIgnored = ETrue;
         _AKNTRACE_FUNC_EXIT;
         return;
         }
@@ -4757,10 +5165,12 @@
             _AKNTRACE("TPointerEvent::EButton1Down");
             // For drag outside listbox
             iListBoxExt->iIsDownOnItem = pointerIsOverAnItem;
-            iListBoxExt->iLastPoint = pointerPos;
+            iListBoxExt->iLastPoint = pointerPos;            
+			iListBoxExt->iLongTappedItem = KErrNotFound;
 
             // update index of the last down tapped item
             iListBoxExt->iLastDownTappedItem = itemIndex;
+            iListBoxExt->iMarkableListShiftKeyPressed = EFalse; 
 
             if ((! (Rect().Contains(aPointerEvent.iPosition))) && (iListBoxFlags & EPopout)) 
                 {
@@ -4803,14 +5213,17 @@
                             UpdateHighlightL( itemIndex );
                             CCoeEnv::Static()->WsSession().Finish();
                             }
-                        if ( itemIndex != oldCurrentItemIndex )
+
+                        if ( !( ( iListBoxFlags & EViewerFlag ) && 
+                                ( iListBoxFlags & EDisableItemSpecificMenu ) ) )
                             {
-                        	iListBoxExt->ImmediateFeedback( 
+                            iListBoxExt->ImmediateFeedback( 
                                 iListBoxExt->iFeedbackType,
                                 TTouchFeedbackType( ETouchFeedbackVibra | 
                                 ETouchFeedbackAudio ),
                                 aPointerEvent );
-                        	}
+                            }
+
                         if ( !wasFlicking )
                             {
                             ReportListBoxEventL( 
@@ -4820,6 +5233,18 @@
                         }
                     else
                         {
+                        if( itemIndex == oldCurrentItemIndex )
+                            {
+                            if( !( ( iListBoxFlags & EViewerFlag ) && 
+                                    ( iListBoxFlags & EDisableItemSpecificMenu ) ) )
+                                {
+                                iListBoxExt->ImmediateFeedback( 
+							                                   iListBoxExt->iFeedbackType,
+														       TTouchFeedbackType( ETouchFeedbackVibra | 
+														       ETouchFeedbackAudio ),
+														       aPointerEvent );
+                               }
+							}
                         ReportListBoxEventL( 
                                 MEikListBoxObserver::EEventPenDownOnItem );    
                         }
@@ -4841,7 +5266,8 @@
                             }
                         }
 #endif
-                if (!(iListBoxFlags & EMultipleSelection))      // i.e. this is a single selection listbox
+                if ( !( iListBoxFlags & EMultipleSelection ) 
+                        || MarkingMode() )
                     {
                     if (itemIndex == oldCurrentItemIndex)
                         {
@@ -4908,7 +5334,7 @@
                             }
                         }
 
-                    if ( itemIndex == oldCurrentItemIndex )
+                    if ( itemIndex == oldCurrentItemIndex && !iListBoxExt->iSingleClickEnabled )
                         {
                         if ( shiftKeyPressed )
                             {
@@ -4987,10 +5413,17 @@
             
         case TPointerEvent::EButton1Up:
             _AKNTRACE("TPointerEvent::EButton1Up");
-            if ( iListBoxExt->FeedbackEnabledOnUpEvent() && iListBoxExt->iClickEventsAllowed )
+            if ( iListBoxExt->FeedbackEnabledOnUpEvent() && 
+			     iListBoxExt->iClickEventsAllowed && 
+				 ( !( ( iListBoxFlags & EViewerFlag ) && 
+				 ( iListBoxFlags & EDisableItemSpecificMenu ) ) )&& 
+				 ( iListBoxExt->iLastDownTappedItem == itemIndex ) && 
+				 ( !iListBoxExt->iDoubleClickEventIgnored ) && 
+				 itemIndex == iView->CurrentItemIndex() )
                 {
-                TTouchLogicalFeedback fbType = ETouchFeedbackBasicItem;
-                if ( iListBoxFlags & ES60StyleMultiselection )
+                TTouchLogicalFeedback fbType = ETouchFeedbackList;
+                if ( iListBoxFlags & ES60StyleMultiselection 
+                      || iListBoxFlags & EMultipleSelection )
                     {
                     fbType = ETouchFeedbackCheckbox;
                     }
@@ -5046,7 +5479,8 @@
                     }
                 if ( !s60StyleMultiselection )
                     {
-                    if ( !iListBoxExt->iSingleClickEnabled )
+                    if ( !iListBoxExt->iSingleClickEnabled &&
+                         itemIndex == iListBoxExt->iLastDownTappedItem )
                         {
                         ReportListBoxEventL(MEikListBoxObserver::EEventItemClicked);
                         }
@@ -5061,9 +5495,15 @@
                         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 
+                // and flick or drag event is not performed, the item index may
+                // change unwanted, so we make a threshold for this situation.
+                else if ( s60StyleMultiselection && !Buffer()->iDragToAnotherItem
+                         && ( iListBoxExt->iLastDownTappedItem == itemIndex
+                         || ( iListBoxExt->iLastDownTappedItem != KErrNotFound 
+                         && Abs( iListBoxExt->iLastPointerPos.iY - aPointerEvent.iPosition.iY ) < KPointerDownAndUpThreshold ) ) )
                     {
                     iListBoxFlags |= EStateChanged;
                     Buffer()->iPressedIndex = itemIndex;
@@ -5331,7 +5771,7 @@
         // switch off selection (marking) mode when we lose focus
         // this also corrects situation, where FEP-menu is launched
         // and thus listbox doesn't receive shift up event
-        if (NULL != iListBoxExt)
+        if ( iListBoxExt )
             {
             if ((iListBoxFlags & EMultipleSelection) && (iListBoxFlags & EShiftEnterMarks))
                 {
@@ -5351,9 +5791,9 @@
         iView->SetEmphasized(EFalse);
         iView->HideMatcherCursor();
         
-        if (iItemEditor && 
-            (iListBoxFlags & EPaintedSelection) && 
-            (NULL != iListBoxExt && iListBoxExt->ReasonForFocusLost() == EFocusLostToExternalControl))
+        if ( iItemEditor && 
+            ( iListBoxFlags & EPaintedSelection ) && 
+            ( iListBoxExt && iListBoxExt->ReasonForFocusLost() == EFocusLostToExternalControl ) )
             {
             iView->DeselectItem(CurrentItemIndex());
             }
@@ -5421,9 +5861,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;
@@ -5705,7 +6148,7 @@
         
         if ( iView )
             {
-            iView->SetItemOffsetInPixels( 0 );
+            iView->SetItemOffsetInPixels( 0 );            
             }
         
         // make sure that highlight is removed and long tap is canceled 
@@ -5743,8 +6186,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
@@ -5774,10 +6231,12 @@
             // Some client does not let list get button1up, so we do it there...
             iItemDrawer->ClearFlags( CListItemDrawer::EPressedDownState );
             TInt index = View()->CurrentItemIndex();
-            if ( index != KErrNotFound )
+            TBool enabled( !( iItemDrawer->Flags()
+                & CListItemDrawer::ESingleClickDisabledHighlight ) );
+            if ( index != KErrNotFound && enabled )
             	{
                 Window().Invalidate( TRect( View()->ItemPos(index), 
-            		                 View()->ItemSize() ) );
+                                    iItemDrawer->ItemCellSize() ) );
             	}
             break;
             }
@@ -5789,7 +6248,12 @@
 
         case KAknMessageFocusLost:
             {
-            if ( iListBoxExt && iListBoxExt->iSingleClickEnabled )
+            // Do not remove highlight if window ordinal position has changed
+            // during the time when stylus menu is open
+            if ( iListBoxExt && iListBoxExt->iSingleClickEnabled &&
+                 ( iListBoxExt->iOldWinPos == KErrNotFound ||
+                   iListBoxExt->iOldWinPos == 
+                   DrawableWindow()->OrdinalPosition() ) )
                 {
                 TBool enabled( iItemDrawer && !( iItemDrawer->Flags()
                     & CListItemDrawer::ESingleClickDisabledHighlight ) );
@@ -5952,9 +6416,15 @@
             {
             rect.iTl.iX += iItemDrawer->MarkColumn() + iItemDrawer->MarkGutter();
             }
-        iListBoxExt->SetReasonForFocusLost(EFocusLostToInternalEditor);
+        if ( iListBoxExt )
+            {
+            iListBoxExt->SetReasonForFocusLost(EFocusLostToInternalEditor);
+            }
         itemEditor->StartEditingL(*this,rect,index,aMaxLength);
-        iListBoxExt->SetReasonForFocusLost(EFocusLostToExternalControl);
+        if ( iListBoxExt )
+            {
+            iListBoxExt->SetReasonForFocusLost(EFocusLostToExternalControl);
+            }
         ReportListBoxEventL( MEikListBoxObserver::EEventEditingStarted );
         }
     _AKNTRACE_FUNC_EXIT;
@@ -6082,18 +6552,21 @@
 EXPORT_C void CEikListBox::DisableScrolling( TBool aDisabled )
     {
     _AKNTRACE_FUNC_ENTER;
-    iListBoxExt->iScrollingDisabled = aDisabled;
-    iView->iExtension->iScrollingDisabled = aDisabled;
-    
-    if ( aDisabled && iListBoxExt->iPhysics )
-        {
-        delete iListBoxExt->iPhysics;
-        iListBoxExt->iPhysics = NULL;
-        iView->SetItemOffsetInPixels( 0 );
-        }
-    else if ( !aDisabled && !iListBoxExt->iPhysics && CAknPhysics::FeatureEnabled() )
-        {
-        iListBoxExt->iPhysics = CAknPhysics::NewL( *iListBoxExt, this);      
+    if ( iListBoxExt )
+        {
+        iListBoxExt->iScrollingDisabled = aDisabled;
+        iView->iExtension->iScrollingDisabled = aDisabled;
+        
+        if ( aDisabled && iListBoxExt->iPhysics )
+            {
+            delete iListBoxExt->iPhysics;
+            iListBoxExt->iPhysics = NULL;
+            iView->SetItemOffsetInPixels( 0 );
+            }
+        else if ( !aDisabled && !iListBoxExt->iPhysics && CAknPhysics::FeatureEnabled() )
+            {
+            iListBoxExt->iPhysics = CAknPhysics::NewL( *iListBoxExt, this);      
+            }
         }
     _AKNTRACE_FUNC_EXIT;
     }
@@ -6105,19 +6578,29 @@
 //
 EXPORT_C TBool CEikListBox::ScrollingDisabled()
     {
-    return !iListBoxExt->iPhysics || iListBoxExt->iScrollingDisabled;
+    if ( iListBoxExt )
+        {
+        return !iListBoxExt->iPhysics || iListBoxExt->iScrollingDisabled;
+        }
+    else
+        {
+        return ETrue;
+        }
     }
 
 
 EXPORT_C void CEikListBox::SetPointerEventFilterDisabledL( const CArrayFix<TInt>& aItemIndexes )
     {
     _AKNTRACE_FUNC_ENTER;
-    iListBoxExt->iMutiTappingItems.Reset();
-
-    for(TInt i=0; i<aItemIndexes.Count(); i++ )
-        {
-        iListBoxExt->iMutiTappingItems.InsertInOrderL( aItemIndexes.At(i) ); 
-        }   
+    if ( iListBoxExt )
+        {
+        iListBoxExt->iMutiTappingItems.Reset();
+    
+        for(TInt i=0; i<aItemIndexes.Count(); i++ )
+            {
+            iListBoxExt->iMutiTappingItems.InsertInOrderL( aItemIndexes.At(i) ); 
+            } 
+        }
     _AKNTRACE_FUNC_EXIT;
     }
 
@@ -6173,10 +6656,22 @@
 //
 EXPORT_C void CEikListBox::DisableSingleClick( TBool aDisabled )
     {
-    _AKNTRACE_FUNC_ENTER;
-    if ( aDisabled && iListBoxExt->iSingleClickEnabled )
+    _AKNTRACE_FUNC_ENTER;    
+    if ( aDisabled && 
+         iListBoxExt && 
+    	 iListBoxExt->iSingleClickEnabled && 
+    	 iItemDrawer )
         {
         iListBoxExt->DisableSingleClick(); 
+        iItemDrawer->ClearFlags( CListItemDrawer::ESingleClickEnabled);
+        }
+    else if ( !aDisabled &&
+              iListBoxExt &&
+              !iListBoxExt->iSingleClickEnabled &&
+              iItemDrawer )
+        {
+        TRAP_IGNORE( iListBoxExt->EnableSingleClickL() );
+        iItemDrawer->SetFlags( CListItemDrawer::ESingleClickEnabled );
         }
     _AKNTRACE_FUNC_EXIT;
     }
@@ -6188,10 +6683,89 @@
 //
 EXPORT_C void CEikListBox::DisableItemSpecificMenu()
     {
+    _AKNTRACE_FUNC_ENTER;
     if ( iListBoxExt )
         {
         iListBoxExt->DisableItemSpecificMenu();
         }
+    _AKNTRACE_FUNC_EXIT;
+    }
+
+// ---------------------------------------------------------------------------
+// CEikListBox::IsHighlightEnabled
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TBool CEikListBox::IsHighlightEnabled()
+    {
+    _AKNTRACE_FUNC_ENTER;	
+    TBool enabled( EFalse ); 
+    if ( !( iItemDrawer->Flags() & CListItemDrawer::EDisableHighlight ) )
+        {
+        if ( iListBoxExt && iListBoxExt->iSingleClickEnabled )
+            {
+            enabled = !( iItemDrawer->Flags()
+                & CListItemDrawer::ESingleClickDisabledHighlight ); 
+            }
+        else 
+            {
+            enabled = ETrue;
+            }
+        }
+    _AKNTRACE_FUNC_EXIT;
+    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;
+        }
     }
 
 
@@ -6200,9 +6774,9 @@
 	_AKNTRACE_FUNC_ENTER;
 #ifdef _DEBUG
 	RDebug::Print( _L( "CEikListBox::ScrollView, aOffset = %d, aDrawNow = %d" ), aOffset, aDrawNow );
-#endif // _DEBUG
-
-	if ( aOffset != 0 )
+#endif // _DEBUG	
+	
+	if ( iListBoxExt && aOffset != 0 )
 	    {
         TInt itemHeight = iView->ItemHeight();
         TInt viewHeight = iView->ViewRect().Size().iHeight;
@@ -6233,18 +6807,18 @@
                     ( newListBottomPos >= iListBoxExt->ListBottomLimit() ) ||
                     ( newListTopPos <= 0 && newListTopPos + viewHeight >= 0 && newListLastItemPos > viewHeight ) )
                     {
-                    if ( CAknPhysics::EAknPhysicsActionFlicking == iListBoxExt->iPhysics->OngoingPhysicsAction() || 
-                         CAknPhysics::EAknPhysicsActionBouncing == iListBoxExt->iPhysics->OngoingPhysicsAction() )
+                    switch(iListBoxExt->iPhysics->OngoingPhysicsAction())
                         {
-                        iListBoxExt->ImmediateFeedback( ETouchFeedbackSensitiveItem,
-                                                        TTouchFeedbackType( ETouchFeedbackVibra ),
-                                                        TPointerEvent() );
-                        }
-                    else if ( CAknPhysics::EAknPhysicsActionDragging == iListBoxExt->iPhysics->OngoingPhysicsAction() )
-                        {
-                        iListBoxExt->ImmediateFeedback( iListBoxExt->iFeedbackType,
-                                                        TTouchFeedbackType( ETouchFeedbackVibra | ETouchFeedbackAudio ),
-                                                        TPointerEvent() );
+                        case CAknPhysics::EAknPhysicsActionBouncing:
+                        case CAknPhysics::EAknPhysicsActionDragging:
+                        case CAknPhysics::EAknPhysicsActionFlicking:
+                            iListBoxExt->ImmediateFeedback( 
+                                    ETouchFeedbackSensitiveList,
+                                    TTouchFeedbackType( ETouchFeedbackVibra ),
+                                    TPointerEvent() );
+                            break;
+                        default:
+                            break;
                         }
                     }
                 }
@@ -6271,14 +6845,20 @@
 #endif // _DEBUG
         iView->SetTopItemIndex( newTopItemIndex );
         }
+
     if ( aDrawNow )
         {
         TRect rect(Rect());
         
         // list position changed
-        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() );
@@ -6287,7 +6867,12 @@
                 iSBFrame->DrawScrollBarsNow();                
                 }
             }
-        iListBoxExt->iBackgroundDrawingSuppressed = EFalse;
+
+        if ( iListBoxExt )
+            {
+            iItemDrawer->ClearFlags( CListItemDrawer::EDrawWholeBackground 
+                    | CListItemDrawer::EBackgroundDrawn );
+            }
         }        
     _AKNTRACE_FUNC_EXIT;
 	}
@@ -6302,20 +6887,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;
             }
@@ -6323,8 +6898,12 @@
 
     TBool blockEvent = EFalse;
     
-    TBool allowDragEvent( ( iListBoxFlags & ELeftDownInViewRect ) && iSBFrame && !iListBoxExt->iScrollingDisabled );
-
+    // If tap down in listbox area, kinetic scrolling is enabled and style popup menu is not shown,
+    // drag event is sent to listbox.
+    TBool allowDragEvent( ( iListBoxFlags & ELeftDownInViewRect ) 
+            && !iListBoxExt->iScrollingDisabled 
+            && ( iListBoxExt->iSingleClickEnabled 
+                    && iListBoxExt->iLongTappedItem == KErrNotFound ) );
     
     switch ( aPointerEvent.iType )
         {
@@ -6354,7 +6933,13 @@
                         {
                         iListBoxExt->iLastDownTappedItem = tappedItemIndex;
                         iListBoxExt->iMarkingDisabled = ETrue;
+                        iListBoxFlags|=ELeftDownInViewRect;                        
                         blockEvent = ETrue;
+                        iListBoxExt->ImmediateFeedback( 
+                            ETouchFeedbackList,
+                            TTouchFeedbackType( ETouchFeedbackVibra | 
+                            ETouchFeedbackAudio ),
+                            aPointerEvent );
                         }
                     }
                 }
@@ -6558,7 +7143,8 @@
     _AKNTRACE_FUNC_ENTER;
     TInt oldCurrentItemIndex = iView->CurrentItemIndex();
 
-    if ( iListBoxExt->iReportDelayedPenDown && !iListBoxExt->iScrolling )
+    if ( iListBoxExt && iListBoxExt->iReportDelayedPenDown 
+        && !iListBoxExt->iScrolling )
         {
 #ifdef RD_UI_TRANSITION_EFFECTS_LIST
         if ( aItemIndex != oldCurrentItemIndex )
@@ -6581,16 +7167,24 @@
             iListBoxExt->iDelayedPointerDownEvent );
         }
 
-    if ( iListBoxExt->iDelayedMultiselection )
+    if ( iListBoxExt && iListBoxExt->iDelayedMultiselection )
         {
         iItemDrawer->SetFlags( CListItemDrawer::EPressedDownState );
         }
     
     iView->SetItemIndex( aItemIndex );
 
-    if ( iListBoxExt->iMarkableListMarking )
-        {
-        if ( iListBoxExt->iMarkableListShiftKeyPressed )
+    if ( iListBoxExt && iListBoxExt->iMarkableListMarking )
+        {
+        if ( iListBoxExt->iSingleClickEnabled )
+            {
+            if ( iListBoxExt->iMarkableListShiftKeyPressed )
+                {
+                iView->ToggleItemL( iView->CurrentItemIndex() );
+                iListBoxExt->iClickEventsAllowed = EFalse;
+                }
+            }
+        else if ( iListBoxExt->iMarkableListShiftKeyPressed )
            {
 #ifdef RD_UI_TRANSITION_EFFECTS_LIST
            iListBoxExt->iAnchor = oldCurrentItemIndex;
@@ -6618,7 +7212,7 @@
     iView->DrawItem( oldCurrentItemIndex );
     iView->DrawItem( aItemIndex );
     
-    if ( iListBoxExt->iDelayedMultiselection )
+    if ( iListBoxExt && iListBoxExt->iDelayedMultiselection )
         {
         iListBoxFlags |= EStateChanged;
         Buffer()->iPressedIndex = aItemIndex;
@@ -6630,6 +7224,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.
 // ---------------------------------------------------------------------------
 //