diff -r 000000000000 -r 2f259fa3e83a uifw/AvKon/src/aknlistquerycontrol.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/AvKon/src/aknlistquerycontrol.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,263 @@ +/* +* 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 +#include +#include + +#include +#include + +#include "AknPanic.h" +#include "AknUtils.h" + +#include "aknQueryControl.h" +#include "aknlistquerycontrol.h" + +#include +#include + +#include +#include + +#include // for testability hooks +EXPORT_C CAknListQueryControl::CAknListQueryControl() + { + AKNTASHOOK_ADD( this, "CAknListQueryControl" ); + } + +EXPORT_C void CAknListQueryControl::FocusChanged(TDrawNow aDrawNow) + { + if (iListBox) iListBox->SetFocus(IsFocused(), aDrawNow); + if (iHeading) iHeading->SetFocus(IsFocused(), aDrawNow); + } + +EXPORT_C void CAknListQueryControl::ConstructFromResourceL(TResourceReader &aRes) + { + if( CAknEnv::Static()->TransparencyEnabled() ) + { + CEikDialog* dlg; + MopGetObject( dlg ); + if ( dlg ) + { + dlg->Extension()->iPublicFlags.Set( CEikDialogExtension::EClipChildControlRect ); + } + } + + + TInt actuallisttype = 0; + TInt listtype = aRes.ReadInt16(); + if (listtype != EAknListQueryWithMsgBox) + { + SEikControlInfo controlInfo=EikControlFactory::CreateByTypeL(listtype); + iListType = listtype; + iListBox = STATIC_CAST(CEikFormattedCellListBox*, controlInfo.iControl); + iListBox->SetContainerWindowL(*this); + iListBox->CopyControlContextFrom(this); + iListBox->ConstructFromResourceL(aRes); + } + else + { + actuallisttype = aRes.ReadInt16(); + SEikControlInfo controlInfo=EikControlFactory::CreateByTypeL(actuallisttype); + iListType = actuallisttype; + iListBox = STATIC_CAST(CEikFormattedCellListBox*, controlInfo.iControl); + iListBox->SetContainerWindowL(*this); + iListBox->CopyControlContextFrom(this); + iListBox->ConstructFromResourceL(aRes); + + TPtrC msg = aRes.ReadTPtrC(); + iMessageBox = new(ELeave)CAknMessageQueryControl; + iMessageBox->SetContainerWindowL(*this); + iMessageBox->CopyControlContextFrom(this); + iMessageBox->SetListQLayout(ETrue); + iMessageBox->SetMessageTextL(&msg); + } + + TPtrC label = aRes.ReadTPtrC(); + iHeading = new(ELeave)CAknPopupHeadingPane; + iHeading->SetContainerWindowL(*this); + iHeading->CopyControlContextFrom(this); + iHeading->ConstructL(label); + iHeading->SetLayout( CAknPopupHeadingPane::EListHeadingPane ); + + TPtrC bmpFile=aRes.ReadTPtrC(); + TInt bmpId=aRes.ReadInt16(); + TInt bmpMask=aRes.ReadInt16(); + TInt animationId = aRes.ReadUint32(); + if ( animationId != 0 ) + { + iHeading->SetHeaderAnimationL( animationId ); + } + else if ( bmpFile.CompareF(KNullDesC) != 0) + { + CEikImage* image = new(ELeave) CEikImage; + CleanupStack::PushL( image ); + image->CreatePictureFromFileL(bmpFile,bmpId,bmpMask); + iHeading->SetHeaderImageL( image ); + CleanupStack::PopAndDestroy(); // image + } + } + +EXPORT_C CAknListQueryControl::~CAknListQueryControl() + { + AKNTASHOOK_REMOVE(); + delete iListBox; + delete iHeading; + delete iMessageBox; + } + +EXPORT_C TSize CAknListQueryControl::MinimumSize() + { + if ( !Heading() ) + { + if (iLayout && iLayout->iListRect.Valid()) + { + return TSize(iLayout->iListRect.Rect().Size().iWidth, TRect(TPoint(0,0),iLayout->iListRect.Rect().iBr).Size().iHeight ); + } + return TSize(30,30); // this should be enough for all layouts - can't be taken from LAF + } + + if (iLayout && iLayout->iListRect.Valid()) + { + return TSize(iLayout->iListRect.Rect().Size().iWidth, TRect(TPoint(0,0),iLayout->iListRect.Rect().iBr).Size().iHeight); + } + + return TSize(50,50); // this should be enough for all layouts - can't be taken from LAF + } + +EXPORT_C TInt CAknListQueryControl::CountComponentControls() const + { + TInt count = 1; + if ( iListBox->ScrollBarFrame() ) + { + count++; + } + if (Heading()) + { + count++; + } + if (MessageBox()) + { + count++; + } + return count; + } + +EXPORT_C CCoeControl* CAknListQueryControl::ComponentControl(TInt anIndex) const + { + if ( anIndex == 0 ) + { + return iListBox; + } + if ( iListBox->ScrollBarFrame() ) + { + if ( anIndex == 1) + { + // Actually listbox owns scrollbar and is the parent control for it, + // but scrollbar rect is outside of listbox rect. That's why we + // need to return non-window owning scrollbar here. + return iListBox->ScrollBarFrame()->ComponentControl(0); + } + else if ( anIndex == 2 ) + { + return Heading(); + } + else if ( anIndex == 3 ) + { + return MessageBox(); + } + } + else if ( anIndex == 1 ) // no scrollbar + { + return Heading(); + } + else if ( anIndex == 2 ) // no scrollbar + { + return MessageBox(); + } + return 0; + } + +EXPORT_C TKeyResponse CAknListQueryControl::OfferKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType) + { + return iListBox->OfferKeyEventL(aKeyEvent, aType); + } + +EXPORT_C void CAknListQueryControl::Draw(const TRect &aRect) const + { + CWindowGc& gc=SystemGc(); + //This isn't needed as background is also drawn in this method. + //AknPopupLayouts::HandleDraw(iEikonEnv, gc, *iLayout, iListBox, Heading()); + + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + MAknsControlContext* cc = AknsDrawUtils::ControlContext( this ); + + TRect bgRect = Rect(); + bgRect.iBr.iY = iLayout->iWindowRect.iBr.iY; + + if( CAknEnv::Static()->TransparencyEnabled() ) + { + if ( aRect != iListBox->Rect() ) + { + TRegionFix<4> dontDrawRegion; + TRegionFix<16> drawRegion; + dontDrawRegion.AddRect( iListBox->Rect() ); + if ( Heading() ) + { + dontDrawRegion.AddRect(Heading()->Rect()); + } + /*if ( MessageBox() ) + { + dontDrawRegion.AddRect(MessageBox()->Rect()); + }*/ + drawRegion.AddRect( bgRect ); + drawRegion.SubRegion( dontDrawRegion ); + gc.SetClippingRegion( drawRegion ); + AknsDrawUtils::Background( skin, cc, this, gc, bgRect, KAknsDrawParamNoClearUnderImage ); + gc.CancelClippingRegion(); + } + } + else + { + AknsDrawUtils::Background( skin, cc, this, gc, bgRect ); + } + } + +EXPORT_C void CAknListQueryControl::SetLayout(TAknPopupWindowLayoutDef *aLayout) + { + iLayout = aLayout; + } + +EXPORT_C void CAknListQueryControl::HandlePointerEventL(const TPointerEvent& aPointerEvent) + { + + CAknControl::HandlePointerEventL(aPointerEvent); + } + +EXPORT_C void* CAknListQueryControl::ExtensionInterface( TUid /*aInterface*/ ) + { + return NULL; + } + +CAknMessageQueryControl* CAknListQueryControl::MessageBox() const + { + return iMessageBox; + } + +// End of File