diff -r 000000000000 -r 2f259fa3e83a uifw/AvKon/src/aknlistquerydialog.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/AvKon/src/aknlistquerydialog.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,826 @@ +/* +* Copyright (c) 2002-2009 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 +#include +#include +#include +#include + +#include "aknPopupHeadingPane.h" +#include "aknlistquerycontrol.h" +#include "aknlistquerysearchcontrol.h" +#include "aknlists.h" + +#include "aknenv.h" +#include "aknborders.h" +#include "aknconsts.h" + +#include "avkon.hrh" +#include +#include + +#include "aknlistquerydialog.h" +#include +#include + +#include +#include "aknmessagequerycontrol.h" + +#include + +#include +#include + +#include +#include +#include +#include +#include + +#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#endif + +#include // for testability hooks +NONSHARABLE_CLASS(CAknListQueryMediatorObserver): public CBase, public MAknDialogMediatorObserver + { +public: + CAknListQueryMediatorObserver(CArrayFixFlat* aItemIdArray, CAknListQueryDialog& aOwner) + :iItemIdArray(aItemIdArray), iOwner(aOwner) + {} + + ~CAknListQueryMediatorObserver() + { + NotifyMediatorExit(); + delete iItemIdArray; + } + + void SetExternalObserver(MAknDialogMediatorObserver* aObs) + { + iExternalObserver = aObs; + } + + // From MAknDialogMediatorObserver + TAknDialogMediatorObserverCommand MediatorCommandL( TUid aDomain, + TUid aCategory, + TInt aCommandId, + const TDesC8& aData ); + + void UpdateL(TInt aSelectionIndex); + + void NotifyMediatorExit() + { + if (iExternalObserver) + iExternalObserver->NotifyMediatorExit(); + } + +private: + CArrayFixFlat* iItemIdArray; + CAknListQueryDialog& iOwner; + MAknDialogMediatorObserver* iExternalObserver; + }; + +TAknDialogMediatorObserverCommand CAknListQueryMediatorObserver::MediatorCommandL( TUid aDomain, + TUid aCategory, + TInt aCommandId, + const TDesC8& aData ) + { + TAknDialogMediatorObserverCommand ret = EHandleAsNormal; + if (iExternalObserver) + { + ret = iExternalObserver->MediatorCommandL(aDomain, aCategory, aCommandId, aData); + } + + if (ret == EHandleAsNormal && aData.Length() >= sizeof(SAknIntegerUpdate)) + { + SAknIntegerUpdate* params = (SAknIntegerUpdate*) &aData; + + if (params->iCmd == EAknListQueryUpdateSelection) + { + TInt newSelectionId = params->iId; + for (TInt i = iItemIdArray->Count()-1; i >= 0; i--) + { + if (newSelectionId == iItemIdArray->At(i)) + { + CEikListBox* listBox = iOwner.ListBox(); + if (listBox) + { + listBox->SetCurrentItemIndex( i ); + } + + break; + } + } + return EDoNothingWithThisCommand; + } + + } + + return EHandleAsNormal; + } + +void CAknListQueryMediatorObserver::UpdateL(TInt aSelectionIndex) + { + CAknMediatorFacade* dialogClient = AknMediatorFacade(&iOwner); + if (dialogClient) + { + if (aSelectionIndex < iItemIdArray->Count()) + { + SAknIntegerUpdate s = + { + EAknListQueryUpdateSelection, + iItemIdArray->At(aSelectionIndex) + }; + + TPckg pck(s); + dialogClient->ResetBuffer(); + dialogClient->BufStream() << pck; + dialogClient->BufStream().CommitL(); + dialogClient->PostUpdatedDataL(); + } + } + + } + +EXPORT_C CAknListQueryDialog::CAknListQueryDialog(TInt* aIndex) + : CAknQueryDialog(ENoTone) + { + iIndex = aIndex; + iEnterKeyPressed = EFalse; + + GfxTransEffect::Register(this,KGfxContextMenuControlUid); + AKNTASHOOK_ADD( this, "CAknListQueryDialog" ); + } + + +EXPORT_C CAknListQueryDialog::CAknListQueryDialog(CListBoxView::CSelectionIndexArray* aSelectionIndexArray) + : CAknQueryDialog(ENoTone) + { + iSelectionIndexArray = aSelectionIndexArray; + iEnterKeyPressed = EFalse; + + GfxTransEffect::Register(this,KGfxContextMenuControlUid); + AKNTASHOOK_ADD( this, "CAknListQueryDialog" ); + } + +EXPORT_C CAknListQueryDialog::~CAknListQueryDialog() + { + AKNTASHOOK_REMOVE(); + if (iMediatorObs) + CEikDialog::SetMediatorObserver(0); // Cover UI support cannot handle dialog it self as external observer + + delete iMediatorObs; + delete iIdle; + } + +EXPORT_C CEikListBox *CAknListQueryDialog::ListBox() const + { + return ListControl()->Listbox(); + } + + +EXPORT_C CAknListQueryControl* CAknListQueryDialog::ListControl() const + { + CCoeControl* controlPtr = FindControlOnAnyPageWithControlType(EAknCtListQueryControl); + if (controlPtr) + return STATIC_CAST(CAknListQueryControl*,controlPtr); + return 0; + } + +EXPORT_C CAknMessageQueryControl* CAknListQueryDialog::MessageBox() const + { + CAknMessageQueryControl* msgCtrl = NULL; + CAknListQueryControl* listControl = ListControl(); + if (listControl) + { + msgCtrl = listControl->MessageBox(); + if (msgCtrl) return msgCtrl; + } + + //if not found let's try dialog (old resources) + //this only corrects scrollbar height though + CCoeControl* controlPtr = FindControlOnAnyPageWithControlType(EAknCtMessageQuery); + if (controlPtr) + return STATIC_CAST(CAknMessageQueryControl*,controlPtr); + return 0; + } + +EXPORT_C CAknPopupHeadingPane* CAknListQueryDialog::QueryHeading() const + { + CAknListQueryControl* listControl = ListControl(); + if (listControl) + return listControl->Heading(); + + return NULL; + } + + +EXPORT_C void CAknListQueryDialog::PreLayoutDynInitL() + { + CAknListQuerySearchControl *control1 = (CAknListQuerySearchControl*)ControlOrNull(EFindControl); + CAknSearchField *control = NULL; + CAknSearchField::TSearchFieldStyle flags = CAknSearchField::EPopupWindow; + + if (control1) + { + control = CAknSearchField::NewL( *control1, flags, 0, 40 ); + control1->iFind = control; + } + + CAknDialog::PreLayoutDynInitL(); + + CEikListBox* listbox = ListBox(); + if (listbox) + { + listbox->CreateScrollBarFrameL(ETrue, EFalse, EFalse); + listbox->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff, + CEikScrollBarFrame::EAuto); + listbox->ScrollBarFrame()->DrawBackground( EFalse, EFalse ); + listbox->SetListBoxObserver(this); + + CAknListQueryControl* listControl = ListControl(); + if (listControl) + listControl->SetLayout(&iLayout); + } + + if (FindBox()) + { + STATIC_CAST(CAknFilteredTextListBoxModel*,ListBox()->Model())->CreateFilterL(ListBox(),FindBox()); + + // The next line is needed so that drawing order of list query control and find pane becomes + // correct. Seems that dialog page draws focused line last. + SetLineNonFocusing(EListQueryControl); + Line(EFindControl)->SetDrawNoWhiteBackground(ETrue); + } + } + +EXPORT_C void CAknListQueryDialog::SetIconArrayL(CArrayPtr* aIcons) + { + CEikFormattedCellListBox* listbox = STATIC_CAST(CEikFormattedCellListBox*,ListBox()); + CArrayPtr* oldicons = listbox->ItemDrawer()->FormattedCellData()->IconArray(); + + if (oldicons) + { + oldicons->ResetAndDestroy(); + delete oldicons; + } + listbox->ItemDrawer()->FormattedCellData()->SetIconArrayL(aIcons); + } + +EXPORT_C void CAknListQueryDialog::PostLayoutDynInitL() + { + CEikFormattedCellListBox* listbox = STATIC_CAST(CEikFormattedCellListBox*,ListBox()); + + // Now we'll load default icons if existing icon array does not exists. + if (!listbox->ItemDrawer()->FormattedCellData()->IconArray()) + { + CArrayPtr* icons = new(ELeave) CAknIconArray(10); + CleanupStack::PushL(icons); + +/* This macro leaves the "icon" on the cleanupstack as "icons" does NOT take +ownership of them. +*/ +#define __ADD_ICON_C__(NAME) {CGulIcon* icon = CGulIcon::NewLC();\ + CFbsBitmap* bitmap = 0;\ + CFbsBitmap* mask = 0;\ + AknIconUtils::CreateIconL( bitmap, mask, KAvkonBitmapFile,\ + NAME, NAME ## _mask);\ + icon->SetBitmap(bitmap);\ + icon->SetMask(mask);\ + icons->AppendL(icon);\ + } + + // for every icon added by __ADD_ICON_C, add a CleanupStack::Pop at the bottom. + __ADD_ICON_C__(EMbmAvkonQgn_prop_checkbox_on) + __ADD_ICON_C__(EMbmAvkonQgn_prop_checkbox_off) + +#undef __ADD_ICON_C__ + + listbox->ItemDrawer()->FormattedCellData()->SetIconArrayL(icons); + CleanupStack::Pop(); // icon for EMbmAvkonQgn_prop_checkbox_off + CleanupStack::Pop(); // icon for EMbmAvkonQgn_prop_checkbox_on + CleanupStack::Pop(); // icons array + } + } + +EXPORT_C void CAknListQueryDialog::SetSizeAndPosition(const TSize & /*aSize*/) + { + AknPopupLayouts::TAknPopupLayouts layout = AknPopupLayouts::EMenuWindow; + CAknListQueryControl *control = ListControl(); + + switch(control->Listtype()) + { + case EAknCtSinglePopupMenuListBox: + layout = AknPopupLayouts::EMenuWindow; + break; + case EAknCtSingleGraphicPopupMenuListBox: + layout = AknPopupLayouts::EMenuGraphicWindow; + break; + case EAknCtSingleGraphicHeadingPopupMenuListBox: + layout = AknPopupLayouts::EMenuGraphicHeadingWindow; + break; + case EAknCtMenuDoublePopupMenuListBox: + layout = AknPopupLayouts::EMenuDoubleWindow; + break; + case EAknCtDoubleLargeGraphicPopupMenuListBox: + layout = AknPopupLayouts::EMenuDoubleLargeGraphicWindow; + break; + case EAknCtSingleHeadingPopupMenuListBox: + layout = AknPopupLayouts::EMenuGraphicHeadingWindow; + break; + case EAknCtDouble2PopupMenuListBox: + layout = AknPopupLayouts::EMenuDoubleLargeGraphicWindow; + break; + case EAknCtSingle2GraphicPopupMenuListBox: + layout = AknPopupLayouts::EMenuWindow; + break; + case EAknCtDoubleGraphicPopupMenuListBox: + layout = AknPopupLayouts::EMenuDoubleWindow; + break; + + default: + __ASSERT_DEBUG(0,Panic(EAknPanicListBoxNotSupportedByListQuery)); + } + + // A linked list for HandleSizeChanged(). + TAknPopupLayoutsNode list = { 0, EListNode, control->Listbox() }; + TAknPopupLayoutsNode heading = { &list, EHeadingNode, QueryHeading() }; + TAknPopupLayoutsNode windowOwning = { &heading, EWindowOwningNode, this }; + TAknPopupLayoutsNode messageBox = { &windowOwning, EMessageBoxNode, MessageBox() }; + TAknPopupLayoutsNode *listBegin = &messageBox; + + if (FindBox()) + { + layout = AknPopupLayouts::TAknPopupLayouts(EAknPopupLayoutsFind + layout); + AknPopupLayouts::HandleSizeChanged( iLayout, layout, listBegin); + // set layout for fixed find box in popup window - this makes highlights working + STATIC_CAST(CAknFilteredTextListBoxModel*,ListBox()->Model())->Filter()->SetParentControl(this); + TRect parentrect = Rect(); + if ( AknLayoutUtils::PenEnabled() ) + { + TRect screen; + TAknLayoutRect cbaRect; + AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EScreen, screen ); + cbaRect.LayoutRect( screen, + AknLayoutScalable_Avkon::popup_sk_window( 0 ).LayoutLine() ); + TSize size( parentrect.Size() ); + // subtract softkey height + size.iHeight -= cbaRect.Rect().Height(); + parentrect.SetSize(size); + } + + // popup_find_window overlaps listbox, but this doesn't matter because findbox + // doesn't draw background + AknLayoutUtils::LayoutControl(FindBox(), parentrect, AknLayoutScalable_Avkon::find_popup_pane_cp2(0).LayoutLine()); + Line(EFindControl)->SetRect(FindBox()->Rect()); + } + + AknPopupLayouts::HandleSizeChanged( iLayout, layout, listBegin); + + CFormattedCellListBoxData *boxData = + ((CEikFormattedCellListBox*)ListBox())->ItemDrawer()->FormattedCellData(); + + TRect windowRect = Rect(); + + TAknLayoutRect topLeft; + topLeft.LayoutRect(windowRect, SkinLayout::Popup_windows_skin_placing__frame_general__Line_2()); + + TAknLayoutRect bottomRight; + bottomRight.LayoutRect(windowRect, SkinLayout::Popup_windows_skin_placing__frame_general__Line_5()); + + TRect outerRect = TRect(topLeft.Rect().iTl, bottomRight.Rect().iBr); + TRect innerRect = TRect(topLeft.Rect().iBr, bottomRight.Rect().iTl); + + boxData->SetSkinPopupFrame(&KAknsIIDQsnFrPopup,&KAknsIIDQsnFrPopupCenter); + boxData->SetSkinPopupFramePosition(outerRect,innerRect); + + } + +EXPORT_C void CAknListQueryDialog::HandleListBoxEventL(CEikListBox* aListBox, + TListBoxEvent aEventType) + { + if ( AknLayoutUtils::PenEnabled() ) + { + switch(aEventType) + { + case EEventEnterKeyPressed: + { + iEnterKeyPressed = ETrue; + break; + } + case EEventPenDownOnItem: + { + iDragActioned = 0; + } + break; + case EEventItemDraggingActioned: + case EEventPanningStarted: + case EEventFlickStarted: + { + iDragActioned = 1; + } + break; + case EEventItemClicked: + case EEventItemSingleClicked: + { + if( !iIdle && !aListBox->IsMultiselection() && !iDragActioned) + { + iIdle = CIdle::NewL(CActive::EPriorityIdle); + if (iIdle) + { + iIdle->Start(TCallBack(ClosePopupAcceptingChanges, this)); + } + } + } + break; + default: + { + break; + } + } + } + else + { + switch(aEventType) + { + case EEventEnterKeyPressed: + { + iEnterKeyPressed = ETrue; + break; + } + case EEventItemDoubleClicked: + default: + { + break; + } + } + } + } + + +// ----------------------------------------------------------------------------- +// If a parent to the supplied control has its Gc set, this function will find +// it and return it. +// ----------------------------------------------------------------------------- +// +LOCAL_C CWindowGc* FindRedirGc(const CCoeControl* aControl) + { + const CCoeControl* parent = aControl; + CWindowGc* gc = NULL; + while(parent) + { + if(NULL != (gc = parent->GetGc())) + { + return gc; + } + parent = parent->Parent(); + } + return NULL; + } + +// ----------------------------------------------------------------------------- +// CleanupItem to enable redraws again on the listbox view. +// ----------------------------------------------------------------------------- +// +LOCAL_C void CleanupDisableRedraw( TAny *aView ) + { + ((CListBoxView*)aView)->SetDisableRedraw(EFalse); + } + +EXPORT_C TKeyResponse CAknListQueryDialog::OfferKeyEventL(const TKeyEvent& aKeyEvent, + TEventCode aType) + { + if (aType==EEventKey && aKeyEvent.iCode == EKeyEscape) + { + CloseState(); + return EKeyWasConsumed; + } + + TBool needRefresh = EFalse; + TKeyResponse res = AknFind::HandleFindOfferKeyEventL(aKeyEvent, aType, this, ListBox(), FindBox(), EFalse, needRefresh); + if (needRefresh && FindBox()) + { + DrawNow(); + } + if ( res == EKeyWasConsumed ) + return res; + + CEikListBox* listbox = ListBox(); + + if (listbox) + { + TInt redirstate = 0; + TBool redrawdisabled = EFalse; + CWindowGc* redirgc = NULL; + RProperty::Get(KPSUidAvkonDomain, KAknTfxServerRedirectionStatus,redirstate); + if (redirstate & ETfxScreenRedirected) + { + //If screen is redirected + redirgc = FindRedirGc(this); + if(redirgc) + { + //And this dialog has a redirgc, we assume its in transition + if(EFalse == listbox->View()->RedrawDisabled()) + { + //Then we turn of redraws, since listbox view, when navigating, handles its gc in + // a way that is incompatible with the redirection gc. + listbox->View()->SetDisableRedraw(ETrue); + CleanupStack::PushL(TCleanupItem(CleanupDisableRedraw, listbox->View())); + redrawdisabled = ETrue; + } + } + } + + TInt currentSelection = listbox->CurrentItemIndex(); + if( currentSelection == KErrNotFound ) + { + MakeLeftSoftkeyVisible(EFalse); + } + else + { + MakeLeftSoftkeyVisible(ETrue); + } + + TKeyResponse response = listbox->OfferKeyEventL( aKeyEvent, aType); + if (currentSelection != listbox->CurrentItemIndex() && iMediatorObs) + { + iMediatorObs->UpdateL(listbox->CurrentItemIndex()); + } + + if (iEnterKeyPressed) + TryExitL(EAknSoftkeyOk); + + if(redrawdisabled) + { + CleanupStack::PopAndDestroy(); //enables redraw again + } + return response; + + } + + return CAknQueryDialog::OfferKeyEventL(aKeyEvent,aType); + } + + + +EXPORT_C void CAknListQueryDialog::SetItemTextArray(MDesCArray* aItemTextArray) + { + STATIC_CAST(CTextListBoxModel*,ListBox()->Model())->SetItemTextArray(aItemTextArray); + } + +EXPORT_C void CAknListQueryDialog::SetOwnershipType(TListBoxModelItemArrayOwnership aOwnershipType) + { + STATIC_CAST(CTextListBoxModel*,ListBox()->Model())->SetOwnershipType(aOwnershipType); + } + +EXPORT_C TBool CAknListQueryDialog::OkToExitL(TInt aButtonId) + { + CEikListBox* listbox = ListBox(); + + if(aButtonId == GetLeftCBAShortKeyPress() || aButtonId == EEikBidOk) + { + if(iIndex) + { + *iIndex = listbox->CurrentItemIndex(); + if (FindBox()) + { + if (*iIndex != -1) + *iIndex = STATIC_CAST(CAknFilteredTextListBoxModel*,ListBox()->Model())->Filter()->FilteredItemIndex(*iIndex); + } + } + else 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)); + } + return ETrue; + } + else if(aButtonId == GetRightCBAShortKeyPress()) + return ETrue; + return EFalse; + } + +EXPORT_C TInt CAknListQueryDialog::BorderStyle() + { +#ifndef RD_NO_DIALOG_BORDERS + return QueryHeading() ? AknBorderId::EAknBorderPopupsWithHeading : AknBorderId::EAknBorderPopups; +#else + return TGulBorder::ENone; +#endif + } + +EXPORT_C void CAknListQueryDialog::CloseState() + { + TRAP_IGNORE(TryExitL(EAknSoftkeyCancel)); + } + +EXPORT_C void CAknListQueryDialog::ActivateL() + { + TBool notShowingPopup = ListBox()->Model()->NumberOfItems() == 0; + if (notShowingPopup) + { + // We do not show if there's no list items. + MakeVisible(EFalse); + + // Stops transition + GfxTransEffect::Deregister(this); + + if (QueryHeading() && QueryHeading()->Prompt()) + { + TPtr headTitle= QueryHeading()->PromptText(); + iAvkonEnv->ExecuteEmptyPopupListL(ListBox()->View()->EmptyListText(), &headTitle); // show empty popup. + } + else + { + const TDesC *title = 0; // use default if not found + iAvkonEnv->ExecuteEmptyPopupListL(ListBox()->View()->EmptyListText(), title); // show empty popup. + } + + delete iIdle; + iIdle = NULL; + iIdle = CIdle::NewL(-20); + if (iIdle) + iIdle->Start(TCallBack(ClosePopup, this)); + } + else + { + CAknQueryDialog::ActivateL(); + } + } + +TInt CAknListQueryDialog::ClosePopup(TAny *aObj) + { + CAknListQueryDialog *popup = (CAknListQueryDialog*)aObj; + delete popup->iIdle; + popup->iIdle = 0; + popup->CloseState(); + return EFalse; + } + +EXPORT_C void CAknListQueryDialog::HandlePointerEventL(const TPointerEvent& aPointerEvent) + { + // list query is dismissed if tapped outside + if ( aPointerEvent.iType == TPointerEvent::EButton1Down ) + { + if( !Rect().Contains( aPointerEvent.iPosition ) ) + { + if ( !iIdle ) + { + MTouchFeedback* feedback = MTouchFeedback::Instance(); + if ( feedback ) + { + feedback->InstantFeedback( ETouchFeedbackPopUp ); + } + iIdle = CIdle::NewL(CActive::EPriorityIdle); + iIdle->Start(TCallBack(ClosePopup, this)); + return; + } + } + + TInt index; + if ( ListBox()->View()->XYPosToItemIndex( aPointerEvent.iPosition, index ) ) + { + ListBox()->View()->ItemDrawer()->SetFlags( + CListItemDrawer::EPressedDownState ); + } + } + + CAknQueryDialog::HandlePointerEventL( aPointerEvent ); + } + +// --------------------------------------------------------- +// CAknListQueryDialog::ClosePopupAcceptingChanges +// Callback function for CIdle to close and accept changes +// --------------------------------------------------------- +// + +TInt CAknListQueryDialog::ClosePopupAcceptingChanges(TAny *aObj) + { + if ( AknLayoutUtils::PenEnabled() ) + { + CAknListQueryDialog *popup = (CAknListQueryDialog*)aObj; + delete popup->iIdle; + popup->iIdle = NULL; + TRAP_IGNORE( popup->TryExitL( EAknSoftkeyOk ) ); + return EFalse; + } + else + { + return EFalse; + } + } + + +EXPORT_C void* CAknListQueryDialog::ExtensionInterface( TUid /*aInterface*/ ) + { + return NULL; + } + +EXPORT_C void CAknListQueryDialog::CEikDialog_Reserved_1() + { + } + +EXPORT_C void CAknListQueryDialog::CEikDialog_Reserved_2() + { + } + +EXPORT_C void CAknListQueryDialog::CAknDialog_Reserved() + { + } + +EXPORT_C void CAknListQueryDialog::CAknQueryDialog_Reserved() + { + } + +EXPORT_C CAknSearchField *CAknListQueryDialog::FindBox() const + { + CAknListQuerySearchControl *control = (CAknListQuerySearchControl*)ControlOrNull(EFindControl); + if (control) { return control->iFind; } + return NULL; + } + +EXPORT_C void CAknListQueryDialog::SetTone(TInt aTone) + { + iTone = (TTone)aTone; + } + +EXPORT_C void CAknListQueryDialog::HandleResourceChange(TInt aType) + { + if (aType==KEikDynamicLayoutVariantSwitch) + { + if (MessageBox()) + { + MessageBox()->SizeChanged(); + } + } + CAknQueryDialog::HandleResourceChange(aType); + } + +EXPORT_C void CAknListQueryDialog::PublishDialogL(TInt aDialogIndex, TUid aCatUid, CArrayFixFlat* aItemIds) + { + CEikDialog::PublishDialogL(aDialogIndex, aCatUid); + delete iMediatorObs; + iMediatorObs = 0; + + if (aItemIds) + { + CAknMediatorFacade* coverData = AknMediatorFacade(this); + if (coverData) // cover functionality enabled + { + // publish dialog resets the buffer -> Just append data + TInt count = aItemIds->Count(); + coverData->BufStream().WriteInt32L(EAknListQueryItemsInfo); + coverData->BufStream().WriteInt32L(count); + for(TInt i = 0;i < count; i++) + { + coverData->BufStream().WriteInt32L(aItemIds->At(i)); + } + coverData->BufStream().CommitL(); // make sure that this data was added ok + iMediatorObs = new (ELeave) CAknListQueryMediatorObserver(aItemIds, *this); // take ownership after other leaving + CEikDialog::SetMediatorObserver(iMediatorObs); // methods so we don't cause + } // double deletion in case of leave + else + { + delete aItemIds; // we own these currently, as we don't use info, delete directly + } + } + } + +EXPORT_C void CAknListQueryDialog::SetMediatorObserver(MAknDialogMediatorObserver* aObserver) + { + if (iMediatorObs) // built in update channel is in use + { + iMediatorObs->SetExternalObserver(aObserver); + } + else + { + CEikDialog::SetMediatorObserver(aObserver); + } + } + +// End of File +