uifw/AvKon/src/aknlistquerycontrol.cpp
changeset 0 2f259fa3e83a
--- /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 <e32std.h>
+#include <barsread.h>
+#include <eikfrlb.h>  
+
+#include <AknLayoutDef.h>
+#include <AknLayout.lag>
+
+#include "AknPanic.h"
+#include "AknUtils.h"
+
+#include "aknQueryControl.h"   
+#include "aknlistquerycontrol.h"
+
+#include <AknsDrawUtils.h>
+#include <AknsBasicBackgroundControlContext.h>
+
+#include <eikdialg.h>
+#include <eikdialogext.h>
+
+#include <AknTasHook.h> // 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