uifw/AvKon/src/AknSelectionList.cpp
changeset 0 2f259fa3e83a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/AvKon/src/AknSelectionList.cpp	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,944 @@
+/*
+* Copyright (c) 2002 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"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+// INCLUDE FILES
+#include "aknselectionlist.h"
+#include <aknsfld.h>
+#include <eikfrlbd.h>
+#include <eikclb.h>
+#include <eikclbd.h>
+#include <AknPanic.h>
+#include <eikcapc.h>
+#include <AknUtils.h>
+#include <AknIconArray.h>
+#include <aknappui.h>
+#include <avkon.mbg>
+#include "AknDebug.h"
+#include "akntrace.h"
+
+// LOCAL FUNCTION PROTOTYPES
+
+// ==================== EXTENSION CLASS ====================
+NONSHARABLE_CLASS(CAknSelectionListDialogExtension) : public CBase
+    {
+    public:        
+        CAknSelectionListDialogExtension();
+        ~CAknSelectionListDialogExtension();    
+
+    public:
+        CIdle *iIdle;
+    };
+   
+// -----------------------------------------------------------------------------
+// CAknSelectionListDialogExtension::CAknSelectionListDialogExtension()
+// 
+// Constructor
+// -----------------------------------------------------------------------------
+//  
+CAknSelectionListDialogExtension::CAknSelectionListDialogExtension()
+    {
+    iIdle = NULL;
+    }
+    
+// -----------------------------------------------------------------------------
+// CAknSelectionListDialogExtension::~CAknSelectionListDialogExtension()
+// 
+// Destructor
+// -----------------------------------------------------------------------------
+// 
+CAknSelectionListDialogExtension::~CAknSelectionListDialogExtension()
+    {
+    delete iIdle;
+    }
+    
+// ==================== EXTENSION CLASS ====================
+NONSHARABLE_CLASS(CAknMarkableListDialogExtension) : public CBase
+    {
+    public:        
+        CAknMarkableListDialogExtension();
+        ~CAknMarkableListDialogExtension();    
+
+    public:
+        CIdle *iIdle;
+    };
+
+// -----------------------------------------------------------------------------
+// CAknMarkableListDialogExtension::CAknMarkableListDialogExtension()
+// 
+// Constructor
+// -----------------------------------------------------------------------------
+//  
+CAknMarkableListDialogExtension::CAknMarkableListDialogExtension()
+    {
+    iIdle = NULL;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknMarkableListDialogExtension::~CAknMarkableListDialogExtension()
+// 
+// Destructor
+// -----------------------------------------------------------------------------
+// 
+CAknMarkableListDialogExtension::~CAknMarkableListDialogExtension()
+    {
+    delete iIdle;
+    }
+    
+// ==================== LOCAL FUNCTIONS ====================
+
+class CFindControl : public CCoeControl 
+    {
+public:
+    CAknSearchField *iFind;
+    ~CFindControl() { delete iFind; }
+    void Draw(const TRect &) const
+    {
+    // this removes flicker from CEikDialog's Draw().
+    }
+    void SizeChanged()
+        {
+        _AKNTRACE_FUNC_ENTER;
+        TRect mainPane;
+        AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, mainPane );
+        
+        TAknLayoutRect listRect;
+    
+        listRect.LayoutRect( mainPane, AknLayout::list_gen_pane(0) );
+
+        TRect r( listRect.Rect() );
+        iPosition = TPoint( r.iTl );
+        iSize.SetSize( r.Width(), r.Height() );
+        _AKNTRACE( "[%s][%s] size: w = %d, h = %d.",
+                "CFindControl", __FUNCTION__, iSize.iWidth, iSize.iHeight );
+        _AKNTRACE_FUNC_EXIT;
+        }
+
+    TSize MinimumSize()
+        {
+        if ( iFind )
+            {
+            if ( iFind->Size() != TSize( 0, 0 ) )
+                {
+                return iFind->Size();
+                }
+            }
+            
+        return iSize;
+        }
+    };
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+// C++ default constructor can NOT contain any code, that
+// might leave.
+//
+
+EXPORT_C CAknSelectionListDialog* CAknSelectionListDialog::NewL(TInt &aValue, MDesCArray *aArray, TInt aMenuBarResourceId, MEikCommandObserver *aCommand)
+    {
+    _AKNTRACE( "[%s][%s] aValue = %d, aMenuBarResourceId = %d.",
+            "CAknSelectionListDialog", __FUNCTION__, aValue, aMenuBarResourceId );
+    CAknSelectionListDialog *dialog = NewLC(aValue, aArray, aMenuBarResourceId, aCommand);
+    CleanupStack::Pop();
+    return dialog;
+    }
+
+EXPORT_C CAknMarkableListDialog* CAknMarkableListDialog::NewL(TInt &aValue, CArrayFix<TInt> *aSelectedItems, MDesCArray *aArray, TInt aMenuBarResourceId, TInt aOkMenuBarId, MEikCommandObserver *aCommand)
+    {
+    _AKNTRACE( "[%s][%s] aValue = %d, aMenuBarResourceId = %d, aOkMenuBarId = %d.",
+            "CAknMarkableListDialog", __FUNCTION__, aValue, aMenuBarResourceId, aOkMenuBarId );
+    CAknMarkableListDialog *dialog = NewLC(aValue, aSelectedItems, aArray, aMenuBarResourceId, aOkMenuBarId, aCommand);
+    CleanupStack::Pop();
+    return dialog;
+    }
+
+EXPORT_C CAknSelectionListDialog *CAknSelectionListDialog::NewLC(TInt &aValue, MDesCArray *aArray, TInt aMenuBarResourceId, MEikCommandObserver *aCommand)
+    {
+    _AKNTRACE( "[%s][%s] aValue = %d, aMenuBarResourceId = %d.",
+            "CAknSelectionListDialog", __FUNCTION__, aValue, aMenuBarResourceId );
+    CAknSelectionListDialog *dialog = new(ELeave)CAknSelectionListDialog(aValue,aArray, aCommand);
+    CleanupStack::PushL(dialog);
+    dialog->ConstructL(aMenuBarResourceId); 
+    return dialog;
+    }
+
+EXPORT_C CAknMarkableListDialog *CAknMarkableListDialog::NewLC(TInt &aValue, CArrayFix<TInt> *aSelectedItems, MDesCArray *aArray, TInt aMenuBarResourceId, TInt aOkMenuBarId, MEikCommandObserver *aCommand)
+    {
+    _AKNTRACE( "[%s][%s] aValue = %d, aMenuBarResourceId = %d, aOkMenuBarId = %d.",
+            "CAknMarkableListDialog", __FUNCTION__, aValue, aMenuBarResourceId, aOkMenuBarId );
+    CAknMarkableListDialog *dialog = new(ELeave)CAknMarkableListDialog(aValue,aSelectedItems, aArray, aMenuBarResourceId, aOkMenuBarId, aCommand);
+    CleanupStack::PushL(dialog);
+    dialog->ConstructL(aMenuBarResourceId);
+    return dialog;
+    }
+
+// -----------------------------------------------------------------------------
+//  CAknSelectionListDialog::ConstructL()
+// 
+// Constructs extension class
+// -----------------------------------------------------------------------------
+// 
+EXPORT_C void CAknSelectionListDialog::ConstructL(TInt aMenuTitleResourceId)
+    {
+    _AKNTRACE( "[%s][%s] aMenuTitleResourceId = %d.",
+            "CAknSelectionListDialog", __FUNCTION__, aMenuTitleResourceId );
+    CAknDialog::ConstructL(aMenuTitleResourceId);
+    iExtension = new (ELeave) CAknSelectionListDialogExtension;     
+    }
+
+// -----------------------------------------------------------------------------
+//  CAknMarkableListDialog::ConstructL()
+// 
+// Constructs extension class
+// -----------------------------------------------------------------------------
+// 
+EXPORT_C void CAknMarkableListDialog::ConstructL(TInt aMenuTitleResourceId)
+    {
+    _AKNTRACE( "[%s][%s] aMenuTitleResourceId = %d.",
+            "CAknMarkableListDialog", __FUNCTION__, aMenuTitleResourceId );
+    CAknDialog::ConstructL(aMenuTitleResourceId);
+    iMarkableExtension = new (ELeave) CAknMarkableListDialogExtension;     
+    }
+
+EXPORT_C CAknSelectionListDialog::CAknSelectionListDialog(TInt &aIndex, MDesCArray *aArray, MEikCommandObserver *aCommand)
+    : iEnterKeyPressed(EFalse),
+      iSelectedItem(&aIndex),
+      iArray(aArray),
+      iCmdObserver(aCommand)
+    {       
+    }
+
+EXPORT_C CAknMarkableListDialog::CAknMarkableListDialog(TInt &aIndex, CArrayFix<TInt> * aSelectedItems, MDesCArray *aArray, TInt aMenuBarResourceId, TInt aOkMenuBarResourceId, MEikCommandObserver *aCommand)
+    : CAknSelectionListDialog(aIndex,aArray, aCommand),
+      iSelectionIndexArray(aSelectedItems),
+      iMenuBarResourceId(aMenuBarResourceId),
+      iOkMenuBarResourceId(aOkMenuBarResourceId)
+    {
+    }
+       
+EXPORT_C CAknSelectionListDialog::~CAknSelectionListDialog()
+    {
+    if (iAvkonAppUi)
+    iAvkonAppUi->RemoveFromStack( this );        
+    delete iExtension;
+    }
+
+EXPORT_C CAknMarkableListDialog::~CAknMarkableListDialog()
+    {
+    delete iMarkableExtension;
+    }
+
+EXPORT_C CCoeControl* CAknSelectionListDialog::ComponentControl(TInt aIndex) const
+    {
+    if (aIndex == CAknDialog::CountComponentControls() )
+    {
+    return FindBox();
+    }
+    return CAknDialog::ComponentControl(aIndex);
+    }
+
+EXPORT_C TInt CAknSelectionListDialog::CountComponentControls() const
+    {
+    TInt newitems = 0;
+    if (FindBox()) newitems++;
+    return CAknDialog::CountComponentControls() + newitems;
+    }
+
+EXPORT_C TBool CAknSelectionListDialog::OkToExitL(TInt aButtonId)
+    {
+    TBool b = CAknDialog::OkToExitL(aButtonId);
+    *iSelectedItem = ListBox()->CurrentItemIndex();
+    if (FindBox())
+    {
+    if (*iSelectedItem != -1)
+        *iSelectedItem = STATIC_CAST(CAknFilteredTextListBoxModel*,ListBox()->Model())->Filter()->FilteredItemIndex(*iSelectedItem);
+    }
+    _AKNTRACE( "[%s][%s] return value = %d.",
+            "CAknSelectionListDialog", __FUNCTION__, b );
+    return b;
+    }
+
+EXPORT_C void CAknSelectionListDialog::Draw(const TRect &) const
+    {
+    // this removes flicker from CEikDialog's Draw().
+    }
+
+EXPORT_C void CAknSelectionListDialog::ProcessCommandL(TInt aCommand)
+    {
+    _AKNTRACE( "[%s][%s] aCommand = %d.",
+            "CAknSelectionListDialog", __FUNCTION__, aCommand );
+    CAknDialog::ProcessCommandL(aCommand);
+    if (FindBox() && iFindType == EPopupFind) 
+        {
+        AknFind::HandleFindPopupProcessCommandL(aCommand, ListBox(), FindBox(), this);
+        DrawNow();
+        }
+
+    if (iCmdObserver) iCmdObserver->ProcessCommandL(aCommand);
+    switch(aCommand)
+    {
+    case EAknCmdOpen:
+        iEnterKeyPressed = ETrue;
+        break;
+    default:
+        SelectionListProcessCommandL(aCommand);
+        break;
+    };
+    }
+
+EXPORT_C void CAknSelectionListDialog::SelectionListProcessCommandL(TInt aCommand)
+    {
+    _AKNTRACE( "[%s][%s] aCommand = %d.",
+            "CAknSelectionListDialog", __FUNCTION__, aCommand );
+    AknSelectionService::HandleSelectionListProcessCommandL(aCommand, ListBox());
+    }
+
+EXPORT_C void CAknSelectionListDialog::HandleListBoxEventL( CEikListBox* /*aListBox*/, TListBoxEvent aEventType )
+    {
+    _AKNTRACE( "[%s][%s] aEventType = %d.",
+            "CAknSelectionListDialog", __FUNCTION__, aEventType );
+    switch(aEventType)
+        {
+        case EEventItemDoubleClicked:
+        case EEventItemSingleClicked:
+            {
+            if ( AknLayoutUtils::PenEnabled() )
+                {
+                delete iExtension->iIdle;
+                iExtension->iIdle = NULL;
+                iExtension->iIdle = CIdle::NewL(CActive::EPriorityIdle);
+                if (iExtension->iIdle)
+                    {                                  
+                    iExtension->iIdle->Start(TCallBack(ExitViaIdle,this)); 
+                    }
+                }
+            else
+                {
+                ProcessCommandL(EAknCmdOpen);
+                // Should do nothing after this - the dialog might be deleted..
+                }
+            }
+            break;
+        case EEventEnterKeyPressed:
+            {
+            ProcessCommandL(EAknCmdOpen);
+            // Should do nothing after this - the dialog might be deleted..
+            }
+            break;
+        default:
+            break;
+        };
+    }
+
+// -----------------------------------------------------------------------------
+// CAknSelectionListDialog::ExitViaIdle()
+// 
+// Callback function to exit dialog after selecting something with tapping it. 
+// This prevents dialog to be destroyed before dialog page's handlepointereventl
+// is fully completed.
+// -----------------------------------------------------------------------------
+// 
+TInt CAknSelectionListDialog::ExitViaIdle(TAny* aSelectionList )
+    {  
+    _AKNTRACE( "[%s][%s] aSelectionList = 0x%x.",
+            "CAknSelectionListDialog", __FUNCTION__, aSelectionList );
+    CAknSelectionListDialog *selectionListDlg = (CAknSelectionListDialog*) aSelectionList; 
+    TRAP_IGNORE(selectionListDlg->TryExitL(EAknSoftkeyOk));
+    return EFalse;
+    }  
+ 
+EXPORT_C TKeyResponse CAknSelectionListDialog::OfferKeyEventL(const TKeyEvent& aKeyEvent,
+                                  TEventCode aType)
+    {
+    _AKNTRACE( "[%s][%s] aKeyEvent(iCode = %d, iScanCode = %d, iModifiers = %d, iRepeats = %d) aType = %d.",
+            "CAknSelectionListDialog", __FUNCTION__, aKeyEvent.iCode, aKeyEvent.iScanCode, aKeyEvent.iModifiers, aKeyEvent.iRepeats, aType );
+    // must pass escape event to dialog - findbox and listbox "eat" escape events
+    TKeyResponse res = EKeyWasNotConsumed;
+    if ( aType == EEventKey && aKeyEvent.iCode == EKeyEscape )
+        {
+        res = CAknDialog::OfferKeyEventL(aKeyEvent, aType);
+        }
+        
+    if ( res == EKeyWasConsumed ) 
+        return res;
+
+    TBool needRefresh = EFalse;
+    res = AknFind::HandleFindOfferKeyEventL(aKeyEvent, aType, this, ListBox(), FindBox(), iFindType==EPopupFind, needRefresh);
+    if (needRefresh && FindBox())
+    {
+    if (iFindType == EPopupFind)
+        {
+//      AknFind::HandlePopupFindSizeChanged(Control(EFindControl), ListBox(), FindBox());
+        AknFind::HandlePopupFindSizeChanged(this, ListBox(), FindBox());
+        }
+    else if ( iFindType == EFixedFind || iFindType == EAdaptiveFind )
+        {
+//      AknFind::HandleFixedFindSizeChanged(Control(EFindControl),(CAknColumnListBox*)ListBox(), FindBox());
+        AknFind::HandleFixedFindSizeChanged(this,(CAknColumnListBox*)ListBox(), FindBox());
+        }
+    DrawNow();
+    }
+    if ( res == EKeyWasConsumed ) 
+    return res;
+    // Give the events to listbox first! This is because otherwise all events do not go to the controls!
+    // Dialogs filter out KeyUp/KeyDown events. If we do not do this, marking is broken; Sometimes it does
+    // not mark list items correctly.
+    if (aKeyEvent.iCode == EKeyLeftArrow || aKeyEvent.iCode == EKeyRightArrow)
+    {
+    // Multipage dialogs need the left/right keys
+    res = CAknDialog::OfferKeyEventL(aKeyEvent, aType);
+    }
+    else
+    res = ListBox()->OfferKeyEventL(aKeyEvent, aType);
+    if ( res == EKeyWasNotConsumed )
+    {
+    res = CAknDialog::OfferKeyEventL(aKeyEvent, aType);
+    }
+    else 
+    {
+    }
+    if (iEnterKeyPressed)
+    TryExitL(EAknSoftkeyOk);
+    // should do nothing after this.
+    return res;
+    }
+
+EXPORT_C CEikListBox *CAknSelectionListDialog::ListBox() const
+    {
+    return (CEikListBox*)Control(ESelectionListControl);
+    }
+
+EXPORT_C CAknSearchField *CAknSelectionListDialog::FindBox() const
+    {
+    CFindControl *control = (CFindControl*)ControlOrNull(EFindControl);
+    if (control) { return control->iFind; }
+    return NULL;
+    }
+
+EXPORT_C void CAknSelectionListDialog::SetupFind(TFindType aType)
+    {
+    _AKNTRACE( "[%s][%s] aType = %d.",
+            "CAknSelectionListDialog", __FUNCTION__, aType );
+    iFindType = aType;
+    }
+
+EXPORT_C TBool CAknSelectionListDialog::IsAcceptableListBoxType(TInt /*aControlType*/, TBool &/*aIsFormattedCellListBox*/) const
+    {
+    return EFalse;
+    }
+
+EXPORT_C TBool CAknSelectionListDialog::IsFormattedCellListBox() const
+    {
+    CEikCaptionedControl *line = Line(ESelectionListControl);
+    TInt controlType = line->iControlType;
+    TBool result = EFalse;
+    if (IsAcceptableListBoxType(controlType, result))
+    return result;
+
+    switch(controlType)
+    {
+    case EAknCtSingleListBox:
+    case EAknCtSingleNumberListBox:
+    case EAknCtSingleHeadingListBox:
+    case EAknCtSingleGraphicListBox:
+    case EAknCtSingleGraphicHeadingListBox:
+    case EAknCtSingleNumberHeadingListBox:
+    case EAknCtSingleLargeListBox:
+        return EFalse;
+    case EAknCtDoubleListBox:
+    case EAknCtDoubleNumberListBox:
+    case EAknCtDoubleTimeListBox:
+    case EAknCtDoubleLargeListBox:
+    case EAknCtDoubleGraphicListBox:
+    case EAknCtSettingListBox:
+    case EAknCtSettingNumberListBox:
+        return ETrue;
+    default:
+        // If you hit this assert, you should derive from this dialog and
+        // implement IsAcceptableListBoxType() method.
+        __ASSERT_DEBUG(0, Panic(EAknPanicNotSupported));
+        return ETrue;
+    }
+    }
+
+EXPORT_C CArrayPtr<CGulIcon>* CAknSelectionListDialog::IconArray() const
+    {
+    if (IsFormattedCellListBox())
+    {
+    return ((CEikFormattedCellListBox*)ListBox())->ItemDrawer()->FormattedCellData()->IconArray();  
+    }
+    else
+    {
+    return ((CEikColumnListBox*)ListBox())->ItemDrawer()->ColumnData()->IconArray();
+    }
+    }
+
+EXPORT_C void CAknSelectionListDialog::SetIconArrayL(CArrayPtr<CGulIcon>* aIcons)
+    {
+    CArrayPtr<CGulIcon>* oldicons = IconArray();
+    if (oldicons)
+        {
+        oldicons->ResetAndDestroy();
+        delete oldicons;
+        }
+
+    if (IsFormattedCellListBox())
+    {
+    ((CEikFormattedCellListBox*)ListBox())->ItemDrawer()->FormattedCellData()->SetIconArray(aIcons);    
+    }
+    else
+    {
+    ((CEikColumnListBox*)ListBox())->ItemDrawer()->ColumnData()->SetIconArray(aIcons);      
+    }
+    
+    }
+
+EXPORT_C SEikControlInfo CAknSelectionListDialog::CreateCustomControlL(TInt aControlType)
+    {
+    _AKNTRACE( "[%s][%s] aControlType = %d.",
+            "CAknSelectionListDialog", __FUNCTION__, aControlType );
+    CFindControl *control1= NULL;
+    TBool findControl = EFalse;
+    if (aControlType == EAknCtSelectionListFixedFind)
+        {
+        iFindType = EFixedFind;
+        findControl = ETrue;
+        }
+    if (aControlType == EAknCtSelectionListPopupFind)
+        {
+        iFindType = EPopupFind;
+        findControl = ETrue;
+        }
+    if (aControlType == EAknCtSelectionListAdaptiveFind)
+        {
+        iFindType = EAdaptiveFind;
+        findControl = ETrue;
+        }    
+    if (findControl)
+        {
+        control1 = new (ELeave) CFindControl;
+        }
+    SEikControlInfo info;
+    info.iControl = control1;
+    info.iFlags = 0;
+    info.iTrailerTextId = 0;
+    return info;
+    }
+
+EXPORT_C void CAknSelectionListDialog::PreLayoutDynInitL()
+    {    
+    _AKNTRACE_FUNC_ENTER;
+    CEikCaptionedControl *line = Line(ESelectionListControl);
+    TInt controlType = line->iControlType;
+    switch(controlType)
+    {
+    case EAknCtSingleNumberListBox:
+    case EAknCtSingleGraphicListBox:
+    break;
+    default:
+    // Only 2 different list layouts are available for fixed find.
+    // => if other layouts are used, turn the find to popup find
+    // automatically.
+    if ( iFindType == EFixedFind || iFindType == EAdaptiveFind )
+        {
+        iFindType = EPopupFind;
+        }
+    };
+
+    CFindControl *control1 = (CFindControl*)ControlOrNull(EFindControl);
+    CAknSearchField *control = NULL;
+    CAknSearchField::TSearchFieldStyle flags = CAknSearchField::EFixed;
+    if (control1)
+        {
+        if (iFindType == EPopupFind)
+            flags = CAknSearchField::EPopup;
+        if (iFindType == EFixedFind)
+            flags = CAknSearchField::EFixed;
+        if (iFindType == EAdaptiveFind)
+            flags = CAknSearchField::EAdaptive;
+        control = CAknSearchField::NewL( *control1, flags, 0, 40 );
+        control1->iFind = control;
+        }
+    
+    CAknDialog::PreLayoutDynInitL();
+    iAvkonAppUi->AddToStackL(this);
+    
+    CEikListBox *listbox = ListBox();
+    CEikTextListBox *txtlistbox = (CEikTextListBox*)listbox;
+    
+    // Listbox items
+    if (iArray)
+    {
+    txtlistbox -> Model() -> SetItemTextArray( iArray );
+    txtlistbox -> Model() -> SetOwnershipType( ELbmDoesNotOwnItemArray );
+    }
+    
+    // Scrollbar
+    listbox->CreateScrollBarFrameL(ETrue);
+    listbox->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto);
+    
+    // Listbox observer
+    listbox->SetListBoxObserver(this);
+    
+    
+    if (FindBox())
+        {
+        if (iFindType == EPopupFind)
+            {
+            STATIC_CAST(CAknFilteredTextListBoxModel*,ListBox()->Model())->CreateFilterL(ListBox(),FindBox());
+            }
+        else if ( iFindType == EFixedFind || iFindType == EAdaptiveFind )
+            {
+            // Fixed find is only available with list_single_graphic_pane
+            __ASSERT_DEBUG(!IsFormattedCellListBox(), Panic(EAknPanicOutOfRange));
+            STATIC_CAST(CAknFilteredTextListBoxModel*,ListBox()->Model())->CreateFilterL(ListBox(),FindBox());
+
+            }
+        } 
+    _AKNTRACE_FUNC_EXIT;
+    }
+
+
+EXPORT_C void CAknSelectionListDialog::SetSizeAndPosition(const TSize &/*aSize*/)
+    {
+    TRect mainPane;
+    AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, mainPane );
+    _AKNTRACE( "[%s][%s] mainPane(l = %d, t = %d, r = %d, b = %d).",
+            "CAknSelectionListDialog", __FUNCTION__, mainPane.iTl.iX, mainPane.iTl.iY,\
+            mainPane.iBr.iX, mainPane.iBr.iY );
+    SetRect( mainPane );
+    
+    if (FindBox())
+        {
+        if (iFindType == EPopupFind)
+            {
+            TBool findPaneVisible = FindBox()->IsFocused();         
+            FindBox()->MakeVisible( findPaneVisible );   
+            AknFind::HandlePopupFindSizeChanged( this, ListBox(), FindBox() );
+            }
+        else if ( iFindType == EFixedFind || iFindType == EAdaptiveFind )
+            {
+            AknFind::HandleFixedFindSizeChanged( this,(CAknColumnListBox*)ListBox(), FindBox());    
+            }
+        }
+    }
+
+EXPORT_C void CAknSelectionListDialog::PostLayoutDynInitL()
+    {
+    _AKNTRACE_FUNC_ENTER;
+    CAknDialog::PostLayoutDynInitL();
+    _AKNTRACE_FUNC_EXIT;
+    }
+
+EXPORT_C void CAknSelectionListDialog::HandlePointerEventL(const TPointerEvent& aPointerEvent) 
+    { 
+    _AKNTRACE( "[%s][%s] aPointerEvent(iType = %d, iModifiers = %d, iPosition(iX = %d, iY = %d), iParentPosition(iX = %d, iY = %d)).",
+            "CAknSelectionListDialog", __FUNCTION__, aPointerEvent.iType, aPointerEvent.iModifiers, \
+            aPointerEvent.iPosition.iX, aPointerEvent.iPosition.iY, aPointerEvent.iParentPosition.iX, aPointerEvent.iParentPosition.iY );
+    CAknDialog::HandlePointerEventL(aPointerEvent); 
+    }
+
+EXPORT_C void* CAknSelectionListDialog::ExtensionInterface( TUid /*aInterface*/ ) 
+    { 
+    return NULL;
+    }
+
+EXPORT_C void CAknSelectionListDialog::CEikDialog_Reserved_1()
+    {
+    }
+
+EXPORT_C void CAknMarkableListDialog::CEikDialog_Reserved_1()
+    {
+    }
+
+EXPORT_C void CAknSelectionListDialog::CEikDialog_Reserved_2()
+    {
+    }
+
+EXPORT_C void CAknMarkableListDialog::CEikDialog_Reserved_2()
+    {
+    }
+
+EXPORT_C void CAknSelectionListDialog::CAknDialog_Reserved()
+    {
+    }
+
+EXPORT_C void CAknMarkableListDialog::CAknDialog_Reserved()
+    {
+    }
+
+EXPORT_C void CAknSelectionListDialog::CAknSelectionListDialog_Reserved()
+    {
+    }
+
+EXPORT_C void CAknMarkableListDialog::CAknSelectionListDialog_Reserved()
+    {
+    }
+
+
+EXPORT_C void CAknMarkableListDialog::HandleListBoxEventL( CEikListBox* aListBox, TListBoxEvent aEventType )
+    {
+    _AKNTRACE( "[%s][%s] aListBox = 0x%x, aEventType = %d.",
+            "CAknMarkableListDialog", __FUNCTION__, aListBox, aEventType );
+    if ( AknLayoutUtils::PenEnabled() )
+        {
+        switch(aEventType)
+            {
+            case EEventEnterKeyPressed:
+                {
+            /* Do nothing -- offerkeyevent handles this */
+                }
+                break;
+            case EEventItemClicked:
+                {    
+                const CListBoxView::CSelectionIndexArray *selections = aListBox->SelectionIndexes();
+                
+                // if current item is only selected item and control or shift is not pressed same time, 
+                // then select tapped index. 
+                if ( aListBox->View()->ItemIsSelected( aListBox->View()->CurrentItemIndex() ) &&
+                     selections->Count() == 1 && 
+                     !((aListBox->EventModifiers() & EModifierCtrl) ||
+                       (aListBox->EventModifiers() & EModifierShift)) )
+                    {
+                    // Close dialog via idle object. 
+                    delete iMarkableExtension->iIdle;
+                    iMarkableExtension->iIdle = NULL;
+                    iMarkableExtension->iIdle = CIdle::NewL(CActive::EPriorityIdle);
+                    if (iMarkableExtension->iIdle)
+                        {                                  
+                        iMarkableExtension->iIdle->Start(TCallBack(ExitViaIdle,this)); 
+                        }
+                    }
+                }
+            default:
+                break;
+            };
+        }
+    else
+        {
+        switch(aEventType)
+            {
+            case EEventEnterKeyPressed:
+            case EEventItemDoubleClicked:
+                {
+                /* Do nothing -- offerkeyevent handles this */
+                }
+                break;
+            default:
+                break;
+            }
+        }
+    }
+
+
+EXPORT_C void CAknMarkableListDialog::SelectionListProcessCommandL(TInt aCommand)
+    {
+    _AKNTRACE( "[%s][%s] aCommand = %d.", "CAknMarkableListDialog", __FUNCTION__, aCommand );
+    AknSelectionService::HandleMarkableListProcessCommandL( aCommand, ListBox() );
+    }
+
+EXPORT_C void CAknMarkableListDialog::ProcessCommandL(TInt aCommand)
+    {
+    _AKNTRACE( "[%s][%s] aCommand = %d.", "CAknMarkableListDialog", __FUNCTION__, aCommand );
+    CAknSelectionListDialog::ProcessCommandL( aCommand );
+    }
+
+EXPORT_C TBool CAknMarkableListDialog::OkToExitL(TInt aButtonId)
+    {
+    TBool b = CAknSelectionListDialog::OkToExitL(aButtonId);
+    if (iSelectionIndexArray)
+    {
+    const CArrayFix<TInt> *array = ListBox()->SelectionIndexes();
+    if (FindBox())
+        {
+        STATIC_CAST(CAknFilteredTextListBoxModel*,ListBox()->Model())->Filter()->UpdateSelectionIndexesL();
+        array = STATIC_CAST(CAknFilteredTextListBoxModel*,ListBox()->Model())->Filter()->SelectionIndexes();
+        }
+    TInt numberOfItems(array->Count());
+    iSelectionIndexArray->Reset();
+    for(TInt i(0); i<numberOfItems; i++)
+        iSelectionIndexArray->AppendL(array->At(i));
+    }
+    _AKNTRACE( "[%s][%s] return value = %d.", "CAknMarkableListDialog", __FUNCTION__, b );
+    return b;
+    }
+
+
+EXPORT_C void CAknMarkableListDialog::PreLayoutDynInitL()
+    {
+    _AKNTRACE_FUNC_ENTER;
+    CAknSelectionListDialog::PreLayoutDynInitL();
+    _AKNTRACE_FUNC_EXIT;
+    }
+
+EXPORT_C void CAknMarkableListDialog::PostLayoutDynInitL()
+    {
+    _AKNTRACE_FUNC_ENTER;
+    CAknSelectionListDialog::PostLayoutDynInitL();
+    
+// Check if we need default icons
+    TBool iconsNeeded = EFalse;
+    if ( IsFormattedCellListBox() )
+        {
+        CFormattedCellListBoxData *boxData = ((CEikFormattedCellListBox*)ListBox())->ItemDrawer()->FormattedCellData();
+        if ( ! boxData->IconArray() ) iconsNeeded = ETrue;
+        }
+    else
+        {
+        CColumnListBoxData *boxData = ((CEikColumnListBox*)ListBox())->ItemDrawer()->ColumnData();
+        if ( ! boxData->IconArray() ) iconsNeeded = ETrue;
+        }
+
+    // loading default bitmaps
+    if ( iconsNeeded )
+        {
+        CArrayPtr<CGulIcon>* icons = new (ELeave) CAknIconArray(4);
+        CleanupStack::PushL( icons );
+        CGulIcon* icon = CGulIcon::NewLC();
+        CFbsBitmap* bitmap;
+        CFbsBitmap* mask;
+
+        MAknsSkinInstance *skin = AknsUtils::SkinInstance();
+        
+        AknsUtils::CreateIconL( skin,
+                                KAknsIIDQgnIndiMarkedAdd,
+                                bitmap,
+                                mask,
+                                AknIconUtils::AvkonIconFileName(),
+                                EMbmAvkonQgn_indi_marked_add,
+                                EMbmAvkonQgn_indi_marked_add_mask );
+            
+        icon->SetBitmap( bitmap );
+        icon->SetMask( mask );
+
+        icons->AppendL(icon);
+        CleanupStack::Pop(); // icon
+ 
+        if ( IsFormattedCellListBox() )
+            {
+            CFormattedCellListBoxData *boxData = ((CEikFormattedCellListBox*)ListBox())->ItemDrawer()->FormattedCellData();
+            boxData->SetIconArray( icons );
+            }
+        else
+            {
+            CColumnListBoxData *boxData = ((CEikColumnListBox*)ListBox())->ItemDrawer()->ColumnData();
+            boxData->SetIconArray( icons );
+            }
+        CleanupStack::Pop(); // icons
+        }
+
+    CEikListBox *listbox = ListBox();
+    // final listbox setup
+    listbox -> ActivateL ();
+    
+    // Initial highlight position
+    listbox -> SetCurrentItemIndex (0);
+
+    _AKNTRACE_FUNC_EXIT;
+    }    
+
+EXPORT_C void CAknMarkableListDialog::DynInitMenuPaneL(TInt aResourceId, CEikMenuPane *aMenuPane)
+    {
+    _AKNTRACE( "[%s][%s] aResourceId = %d.", "CAknMarkableListDialog", __FUNCTION__, aResourceId );
+    AknSelectionService::HandleMarkableListDynInitMenuPane(aResourceId, aMenuPane, ListBox());
+    CAknSelectionListDialog::DynInitMenuPaneL(aResourceId, aMenuPane);
+    }
+
+EXPORT_C TKeyResponse CAknMarkableListDialog::OfferKeyEventL(const TKeyEvent& aKeyEvent,
+                                  TEventCode aType)
+    {
+    _AKNTRACE( "[%s][%s] aKeyEvent(iCode = %d, iScanCode = %d, iModifiers = %d, iRepeats = %d) aType = %d.",
+            "CAknMarkableListDialog", __FUNCTION__, aKeyEvent.iCode, aKeyEvent.iScanCode, aKeyEvent.iModifiers, aKeyEvent.iRepeats, aType );
+    TKeyResponse retval = EKeyWasNotConsumed;
+
+    TBool shiftKeyPressed = (aKeyEvent.iModifiers & EModifierShift);
+    if (aKeyEvent.iCode == EKeyOK && aType == EEventKey 
+    && !shiftKeyPressed && iOkMenuBarResourceId && ListBox()->SelectionIndexes()->Count() > 0)
+    {
+        iMenuBar->SetMenuTitleResourceId( iOkMenuBarResourceId );
+        // This must be trapped so that menubar will be restored on leave
+        TRAP_IGNORE(iMenuBar->TryDisplayMenuBarL( ) );
+        iEikonEnv->EikAppUi( )->HandleStackChanged( );
+        iMenuBar->SetMenuTitleResourceId( iMenuBarResourceId );
+        retval = EKeyWasConsumed;   
+    }
+    else
+    {
+    retval = CAknSelectionListDialog::OfferKeyEventL(aKeyEvent, aType);
+    }
+    return retval;
+    }
+
+EXPORT_C void CAknMarkableListDialog::HandlePointerEventL(const TPointerEvent& aPointerEvent) 
+    { 
+    _AKNTRACE( "[%s][%s] aPointerEvent(iType = %d, iModifiers = %d, iPosition(iX = %d, iY = %d), iParentPosition(iX = %d, iY = %d)).",
+            "CAknMarkableListDialog", __FUNCTION__, aPointerEvent.iType, aPointerEvent.iModifiers, \
+            aPointerEvent.iPosition.iX, aPointerEvent.iPosition.iY, aPointerEvent.iParentPosition.iX, aPointerEvent.iParentPosition.iY );
+    CAknSelectionListDialog::HandlePointerEventL(aPointerEvent); 
+    }
+
+EXPORT_C void* CAknMarkableListDialog::ExtensionInterface( TUid /*aInterface*/ ) 
+    { 
+    return NULL;
+    }
+
+//
+// DEPRECATED METHODS, DO NOT USE THESE
+// 
+EXPORT_C CAknMarkableListDialog* CAknMarkableListDialog::NewL(TInt &aValue, CArrayFix<TInt> *aSelectedItems, MDesCArray *aArray, TInt aMenuBarResourceId, MEikCommandObserver *aCommand)
+    {
+#ifdef AVKON_RDEBUG_INFO
+    RDebug::Print(_L("CAknMarkableListDialog::NewL is deprecated, please do not use it!"));
+#endif
+    CAknMarkableListDialog *dialog = NewLC(aValue, aSelectedItems, aArray, aMenuBarResourceId, NULL, aCommand);
+    CleanupStack::Pop();
+    return dialog;
+    }
+
+//
+// DEPRECATED METHODS, DO NOT USE THESE
+// 
+EXPORT_C CAknMarkableListDialog *CAknMarkableListDialog::NewLC(TInt &aValue, CArrayFix<TInt> *aSelectedItems, MDesCArray *aArray, TInt aMenuBarResourceId, MEikCommandObserver *aCommand)
+    {
+#ifdef AVKON_RDEBUG_INFO
+    RDebug::Print(_L("CAknMarkableListDialog::NewLC() is deprecated, please do not use it!"));
+#endif
+    CAknMarkableListDialog *dialog = new(ELeave)CAknMarkableListDialog(aValue,aSelectedItems, aArray, aMenuBarResourceId, NULL, aCommand);
+    CleanupStack::PushL(dialog);
+    dialog->ConstructL(aMenuBarResourceId);
+    return dialog;
+    }
+
+//
+// DEPRECATED METHODS, DO NOT USE THESE
+// 
+EXPORT_C CAknMarkableListDialog::CAknMarkableListDialog(TInt &aIndex, CArrayFix<TInt> * aSelectedItems, MDesCArray *aArray, MEikCommandObserver *aCommand)
+    : CAknSelectionListDialog(aIndex,aArray, aCommand),
+      iSelectionIndexArray(aSelectedItems),
+      iMenuBarResourceId(NULL),
+      iOkMenuBarResourceId(NULL)
+    {
+#ifdef AVKON_RDEBUG_INFO
+    RDebug::Print(_L("CAknMarkableListDialog::CAknMarkableListDialog is deprecated, please do not use it!"));
+#endif
+    }
+
+//  End of File  
+
+
+