diff -r 000000000000 -r 2f259fa3e83a uifw/AvKon/src/AknSelectionList.cpp --- /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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#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 *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 *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 * 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* CAknSelectionListDialog::IconArray() const + { + if (IsFormattedCellListBox()) + { + return ((CEikFormattedCellListBox*)ListBox())->ItemDrawer()->FormattedCellData()->IconArray(); + } + else + { + return ((CEikColumnListBox*)ListBox())->ItemDrawer()->ColumnData()->IconArray(); + } + } + +EXPORT_C void CAknSelectionListDialog::SetIconArrayL(CArrayPtr* aIcons) + { + CArrayPtr* 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 *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); iAppendL(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* 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 *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 *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 * 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 + + +