--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/AvKon/src/aknPopupHeadingPane.cpp Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,1201 @@
+/*
+* Copyright (c) 2002-2005 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 <barsread.h>
+
+#include <eiklabel.h>
+#include <eikimage.h>
+#include <avkon.rsg>
+#include <avkon.hrh>
+
+#include <AknLayoutDef.h>
+#include <AknLayout.lag>
+#include <avkon.mbg>
+
+#include "AknPanic.h"
+#include "aknPopupHeadingPane.h"
+#include "akntextcontrol.h"
+#include "AknBitmapAnimation.h"
+#include "aknconsts.h"
+
+#include <AknsDrawUtils.h>
+#include <StringLoader.h>
+
+#include <AknsUtils.h>
+#include <AknIconUtils.h>
+
+#include <AknUtils.h>
+#include <aknlayoutscalable_avkon.cdl.h>
+#include <layoutmetadata.cdl.h>
+#include <aknbutton.h>
+#include "AknHeadingPaneTouchObserver.h"
+
+// ================= Extension class ========================
+NONSHARABLE_CLASS(CAknPopupHeadingPaneExtension) : public CBase
+ {
+ public:
+ CAknPopupHeadingPaneExtension();
+ ~CAknPopupHeadingPaneExtension();
+
+ public: // data
+ TAknsItemID iFrameId;
+ TAknsItemID iFrameCenterId;
+ MAknHeadingPaneTouchObserver* iTouchObserver;
+ };
+
+CAknPopupHeadingPaneExtension::CAknPopupHeadingPaneExtension()
+ {
+ }
+
+CAknPopupHeadingPaneExtension::~CAknPopupHeadingPaneExtension()
+ {
+ }
+
+
+
+class CAknPopupHeadingAttributes: public CBase, public MCoeControlObserver
+ {
+ public:
+ void SetEnableCloseButton();
+ TBool IsEnableCloseButton() const;
+ static TInt CallBackByOneShot(TAny* aThisPtr);
+
+ public: // from MCoeControlObserver
+ virtual void HandleControlEventL(CCoeControl *aControl, TCoeEvent aEventType);
+ public:
+ CAknPopupHeadingPane::THeadingPaneLayout iLayout;
+ CCoeBrushAndPenContext* iBrushAndPenContext;
+ CAknTextControl* iPage;
+ CAknButton* iCloseButton;
+ CAsyncCallBack* iAsyncOneShot;
+
+ TInt iCurrentPage;
+ TInt iMaxPage;
+ TBool iEnableCloseButton;
+
+ ~CAknPopupHeadingAttributes()
+ {
+ if (iAsyncOneShot)
+ {
+ iAsyncOneShot->Cancel();
+ delete iAsyncOneShot;
+ iAsyncOneShot = NULL;
+ }
+ delete iBrushAndPenContext;
+ delete iPage;
+ delete iCloseButton;
+ }
+ };
+
+void CAknPopupHeadingAttributes::SetEnableCloseButton()
+ {
+ CAknEnv* env = CAknEnv::Static();
+ TBool japaneseUi = (env && env->IsFeatureLanguage(KFeatureIdJapanese))?
+ ETrue : EFalse;
+ if (AknLayoutUtils::PenEnabled() && japaneseUi)
+ {
+ iEnableCloseButton = ETrue;
+ }
+ else
+ {
+ iEnableCloseButton = EFalse;
+ }
+ }
+
+TBool CAknPopupHeadingAttributes::IsEnableCloseButton() const
+ {
+ return iEnableCloseButton;
+ }
+
+/**
+ * Call back function:
+ */
+TInt CAknPopupHeadingAttributes::CallBackByOneShot(TAny* /*aThisPtr*/)
+ {
+ // Simulate RSK down key event
+ TKeyEvent key;
+ key.iCode = EKeyCBA2; // = EKeyDevice1
+ // Special flag that implies the simulated key event is sent by this call back function
+ key.iModifiers = EModifierKeyboardExtend;
+ key.iScanCode = EStdKeyDevice1;
+ key.iRepeats = 0;
+ TRAP_IGNORE( CCoeEnv::Static()->SimulateKeyEventL(key, EEventKey) );
+ return KErrNone;
+ }
+void CAknPopupHeadingAttributes::HandleControlEventL(CCoeControl* aControl, TCoeEvent aEventType)
+ {
+ if (aControl == iCloseButton)
+ {
+ // Handle the event sent by Close button control
+ switch (aEventType)
+ {
+ case MCoeControlObserver::EEventRequestExit:
+ {
+ if (!iAsyncOneShot)
+ {
+ iAsyncOneShot = new (ELeave) CAsyncCallBack(EPriorityHigh);
+ // setting call back
+ TCallBack callback(CallBackByOneShot, this);
+ iAsyncOneShot->Set(callback);
+ iAsyncOneShot->CallBack();
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+EXPORT_C CAknPopupHeadingPane::~CAknPopupHeadingPane()
+ {
+ AknsUtils::DeregisterControlPosition(this);
+ delete iExtension;
+ delete iPrompt;
+ delete iHeaderImage;
+ delete iAnimation;
+ delete iAttributes;
+ }
+
+EXPORT_C void CAknPopupHeadingPane::ConstructL(TPtrC aText)
+ {
+ if ( ! iAttributes )
+ {
+ iAttributes = new ( ELeave ) CAknPopupHeadingAttributes;
+ iAttributes->iBrushAndPenContext=CCoeBrushAndPenContext::NewL();
+ iAttributes->iBrushAndPenContext->SetBrushStyle(CGraphicsContext::ENullBrush);
+ SetControlContext(iAttributes->iBrushAndPenContext);
+ }
+
+ if (!iPrompt)
+ {
+ iPrompt = CAknTextControl::NewL();
+ iPrompt->SetContainerWindowL(*this);
+ }
+
+ if (!iAttributes->iPage)
+ {
+ iAttributes->iPage = CAknTextControl::NewL();
+ iAttributes->iPage->SetContainerWindowL(*this);
+ iAttributes->iPage->MakeVisible(EFalse);
+ }
+
+ if (!iAttributes->iCloseButton)
+ {
+ TResourceReader reader;
+ CEikonEnv::Static()->CreateResourceReaderLC( reader, R_AVKON_SCT_HEADING_CLOSE_BUTTON );
+ iAttributes->iCloseButton = CAknButton::NewL(reader);
+ iAttributes->iCloseButton->SetContainerWindowL(*this);
+ iAttributes->iCloseButton->SetObserver(iAttributes);
+ iAttributes->iCloseButton->SetRequestExit( ETrue );
+ iAttributes->iCloseButton->MakeVisible(EFalse);
+ CleanupStack::PopAndDestroy(); //reader buffer
+ iAttributes->SetEnableCloseButton();
+ }
+
+ if ( !iExtension )
+ {
+ iExtension = new (ELeave) CAknPopupHeadingPaneExtension;
+ }
+
+ iExtension->iFrameId = KAknsIIDQsnFrPopupHeading;
+ iExtension->iFrameCenterId = KAknsIIDQsnFrPopupHeadingCenter;
+
+
+ SetTextL(aText);
+ SetNonFocusing();
+ iAttributes->iLayout = EQueryHeadingPane; // QueryHeadingPane by default
+ }
+
+EXPORT_C void CAknPopupHeadingPane::ConstructFromResourceL(TResourceReader &aReader)
+ {
+ if ( ! iAttributes )
+ {
+ iAttributes = new ( ELeave ) CAknPopupHeadingAttributes;
+ iAttributes->iBrushAndPenContext=CCoeBrushAndPenContext::NewL();
+ iAttributes->iBrushAndPenContext->SetBrushStyle(CGraphicsContext::ENullBrush);
+ SetControlContext(iAttributes->iBrushAndPenContext);
+ }
+
+ if (!iPrompt)
+ {
+ iPrompt = CAknTextControl::NewL();
+ iPrompt->SetContainerWindowL(*this);
+ }
+
+ if (!iAttributes->iPage)
+ {
+ iAttributes->iPage = CAknTextControl::NewL();
+ iAttributes->iPage->SetContainerWindowL(*this);
+ iAttributes->iPage->MakeVisible(EFalse);
+ }
+
+ if (!iAttributes->iCloseButton)
+ {
+ TResourceReader reader;
+ CEikonEnv::Static()->CreateResourceReaderLC( reader, R_AVKON_SCT_HEADING_CLOSE_BUTTON );
+ iAttributes->iCloseButton = CAknButton::NewL(reader);
+ iAttributes->iCloseButton->SetContainerWindowL(*this);
+ iAttributes->iCloseButton->MakeVisible(EFalse);
+ iAttributes->iCloseButton->SetObserver(iAttributes);
+ iAttributes->iCloseButton->SetRequestExit( ETrue );
+ CleanupStack::PopAndDestroy(); //reader buffer
+ iAttributes->SetEnableCloseButton();
+ }
+
+ SetTextL(aReader.ReadTPtrC());
+
+ HBufC* bitmapFile = aReader.ReadHBufCL(); // bmp filename
+ TInt bitmapId = aReader.ReadInt16(); // bmp id
+ TInt maskId = aReader.ReadInt16(); // bmp mask id
+ if (bitmapFile != NULL)
+ {
+ CleanupStack::PushL(bitmapFile);
+ iHeaderImage = new (ELeave) CEikImage;
+ iHeaderImage->SetContainerWindowL(*this);
+ iHeaderImage->SetNonFocusing();
+ iHeaderImage->SetAlignment(EHCenterVCenter);
+
+ if (bitmapId != -1)
+ {
+ CFbsBitmap* bitmap;
+ if (maskId != -1)
+ {
+ CFbsBitmap* mask;
+ AknIconUtils::CreateIconLC(bitmap, mask, *bitmapFile, bitmapId, maskId);
+ TAknLayoutRect layout;
+ layout.LayoutRect(Rect(), AknLayoutScalable_Avkon::heading_pane_g2()); // Icon
+ User::LeaveIfError(AknIconUtils::SetSize(bitmap, layout.Rect().Size()));
+ iHeaderImage->SetPicture(bitmap, mask);
+ iHeaderImage->SetPictureOwnedExternally(EFalse);
+ CleanupStack::Pop(2); //bitmap, mask
+ }
+ else
+ {
+ bitmap = AknIconUtils::CreateIconL(*bitmapFile, bitmapId);
+ CleanupStack::PushL(bitmap);
+ TAknLayoutRect layout;
+ layout.LayoutRect(Rect(), AknLayoutScalable_Avkon::heading_pane_g2()); // Icon
+ User::LeaveIfError(AknIconUtils::SetSize(bitmap, layout.Rect().Size()));
+ iHeaderImage->SetPicture(bitmap);
+ iHeaderImage->SetPictureOwnedExternally(EFalse);
+ CleanupStack::Pop(); //bitmap
+ }
+ }
+ CleanupStack::PopAndDestroy(); // bitmapFile
+ }
+
+ TInt animationId = aReader.ReadUint32();
+ if (animationId != 0)
+ {
+ if (!iAnimation)
+ {// no animation previously set
+ SetHeaderAnimationL(animationId);
+ }
+ }
+
+ iHeadingLayoutRef = aReader.ReadUint32();
+
+ // extension needed for heading skinning
+ if ( !iExtension )
+ {
+ iExtension = new (ELeave) CAknPopupHeadingPaneExtension;
+ }
+
+ iExtension->iFrameId = KAknsIIDQsnFrPopupHeading;
+ iExtension->iFrameCenterId = KAknsIIDQsnFrPopupHeadingCenter;
+
+ SetNonFocusing();
+ }
+
+EXPORT_C void CAknPopupHeadingPane::SetTextL(TPtrC aText)
+ {
+ __ASSERT_DEBUG(iPrompt,Panic(EAknPanicNullPointer));
+ iPrompt->SetTextL(aText);
+
+ __ASSERT_DEBUG(iAttributes->iPage,Panic(EAknPanicNullPointer));
+ // Reset page number when be more than one page
+ if (iAttributes->iMaxPage > 1)
+ {
+ HBufC* page = PageTextL();
+ CleanupStack::PushL(page);
+ iAttributes->iPage->SetTextL(*page);
+ CleanupStack::PopAndDestroy(); // page
+ }
+
+ DoSetPromptL();
+ if (!Rect().IsEmpty())
+ {
+ SizeChanged();
+ }
+ }
+
+EXPORT_C void CAknPopupHeadingPane::SetHeaderImageOwnedL(CEikImage *aImage)
+ {
+ delete iHeaderImage;
+ iHeaderImage = aImage;
+
+ if ( iHeaderImage )
+ {
+ iHeaderImage->SetContainerWindowL(*this);
+ iHeaderImage->SetNonFocusing();
+ iHeaderImage->SetAlignment(EHCenterVCenter);
+ }
+
+ DoSetPromptL();
+ if (!Rect().IsEmpty())
+ {
+ SizeChanged();
+ }
+ }
+
+EXPORT_C void CAknPopupHeadingPane::SetHeaderImageL(CEikImage *aImage)
+ {
+ if ( !iHeaderImage )
+ {
+ iHeaderImage = new (ELeave) CEikImage;
+ iHeaderImage->SetContainerWindowL(*this);
+ iHeaderImage->SetNonFocusing();
+ iHeaderImage->SetAlignment(EHCenterVCenter);
+ }
+
+ CFbsBitmap* bitmap = new (ELeave) CFbsBitmap();
+ CleanupStack::PushL(bitmap);
+ CFbsBitmap* mask = new (ELeave) CFbsBitmap();
+ bitmap->Duplicate(aImage->Bitmap()->Handle());
+ mask->Duplicate(aImage->Mask()->Handle());
+ iHeaderImage->SetPicture(bitmap, mask);
+ iHeaderImage->SetPictureOwnedExternally(EFalse);
+ CleanupStack::Pop(); // bitmap
+
+ DoSetPromptL();
+ if (!Rect().IsEmpty())
+ {
+ SizeChanged();
+ }
+ }
+
+EXPORT_C void CAknPopupHeadingPane::SetHeaderAnimationL( TInt aResourceId )
+ {
+ if (aResourceId <= 0)
+ {
+ return;
+ }
+
+ // If header image set, delete it!
+ delete iHeaderImage;
+ iHeaderImage = NULL;
+
+ delete iAnimation;
+ iAnimation = NULL;
+ iAnimation = CAknBitmapAnimation::NewL();
+
+ TResourceReader reader;
+ CCoeEnv::Static()->CreateResourceReaderLC(reader,aResourceId);
+ iAnimation->ConstructFromResourceL(reader);
+ CleanupStack::PopAndDestroy(); //reader buffer
+
+ iAnimation->SetContainerWindowL(*this);
+ iAnimation->SetNonFocusing();
+
+ DoSetPromptL();
+ if (!Rect().IsEmpty())
+ {
+ SizeChanged();
+ }
+ }
+
+EXPORT_C void CAknPopupHeadingPane::SetLayout( THeadingPaneLayout aLayout )
+ {
+ iAttributes->iLayout = aLayout;
+ }
+
+void CAknPopupHeadingPane::DoSetPromptL()
+ {
+ __ASSERT_DEBUG(iPrompt,Panic(EAknPanicNullPointer));
+
+ CArrayFixFlat<TInt>* lineWidths = new(ELeave)CArrayFixFlat<TInt>(1);
+ CleanupStack::PushL(lineWidths);
+
+ TAknTextComponentLayout textLayout = AknLayoutScalable_Avkon::heading_pane_t1(0);
+ if (iHeaderImage || iAnimation)
+ {
+ textLayout = AknLayoutScalable_Avkon::heading_pane_t1(2);
+ }
+
+ if (iAttributes->iPage->IsVisible())
+ {
+ TInt varietyIndex = (AknLayoutUtils::PenEnabled())? 3 : 1;
+ textLayout = AknLayoutScalable_Avkon::heading_pane_t1(varietyIndex);
+ }
+
+ TRect parentRect;
+ TAknLayoutRect popupRect;
+ if(!AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, parentRect))
+ {
+ parentRect = iAvkonAppUi->ClientRect();
+ }
+ popupRect.LayoutRect(parentRect, AknLayoutScalable_Avkon::popup_window_general(1));
+
+ TAknLayoutRect headingRect;
+ TAknWindowComponentLayout headingPaneLayout;
+ if (iAttributes->iLayout == EMessageQueryHeadingPane)
+ {
+ headingPaneLayout = AknLayoutScalable_Avkon::heading_pane_cp5();
+ }
+ else
+ {
+ headingPaneLayout = AknLayoutScalable_Avkon::heading_pane(0);
+ }
+ headingRect.LayoutRect(TRect(TPoint(0,0),popupRect.Rect().Size()), headingPaneLayout);
+ parentRect = headingRect.Rect();
+
+ TAknLayoutText textRect;
+ textRect.LayoutText(parentRect, textLayout);
+
+ lineWidths->AppendL(textRect.TextRect().Width());
+
+ const CFont* promptFont = AknLayoutUtils::FontFromId( textLayout.Font() );
+ iPrompt->ParseTextL(promptFont, lineWidths);
+
+ CleanupStack::PopAndDestroy(); //lineWidths
+
+ lineWidths = new(ELeave)CArrayFixFlat<TInt>(1);
+ CleanupStack::PushL(lineWidths);
+
+ TInt varietyIndex = (iAttributes->IsEnableCloseButton())? 1 : 0;
+ textLayout = AknLayoutScalable_Avkon::heading_pane_t2(varietyIndex);
+ textRect.LayoutText(parentRect, textLayout);
+
+ lineWidths->AppendL(textRect.TextRect().Width());
+ const CFont* fontUsed = AknLayoutUtils::FontFromId( textLayout.Font() );
+ iAttributes->iPage->ParseTextL(fontUsed, lineWidths);
+ CleanupStack::PopAndDestroy(); //lineWidths
+ }
+
+
+EXPORT_C void CAknPopupHeadingPane::SizeChanged()
+ {
+ if (iAttributes->iLayout == EQueryHeadingPane)
+ {
+ LayoutQueryHeadingPane();
+ }
+ else if (iAttributes->iLayout == EColourSelectionGridHeadingPane)
+ {
+ LayoutColourSelectionGridHeadingPane();
+ }
+ else if (iAttributes->iLayout == EMessageQueryHeadingPane)
+ {
+ LayoutMessageQueryHeadingPane();
+ }
+ else
+ {
+ LayoutListHeadingPane();
+ }
+
+ if (iHeaderImage)
+ {
+ TAknLayoutRect layout;
+ layout.LayoutRect(Rect(), AknLayoutScalable_Avkon::heading_pane_g2());
+ AknIconUtils::SetSize(CONST_CAST(CFbsBitmap*, iHeaderImage->Bitmap()), layout.Rect().Size());
+ }
+
+ AknsUtils::RegisterControlPosition(this);
+ }
+
+
+void CAknPopupHeadingPane::LayoutQueryHeadingPane()
+ {
+ TRect parentRect = Rect();
+
+ TAknLayoutRect headingLayoutRect;
+ headingLayoutRect.LayoutRect(parentRect, AknLayoutScalable_Avkon::heading_pane(0));
+ TRect headingrect(headingLayoutRect.Rect());
+
+ iPrompt->SetRect(headingrect);
+ iAttributes->iPage->SetRect(headingrect);
+
+ MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+ TRgb color;
+ TInt error = AknsUtils::GetCachedColor( skin,
+ color,
+ KAknsIIDQsnTextColors,
+ EAknsCIQsnTextColorsCG19 );
+
+
+ TInt headingPaneTextIndex = 0;
+ // Layout the heading text
+ if (iPrompt->NumberOfLines() > 0)
+ {
+ if ( iHeaderImage || iAnimation )
+ {
+ headingPaneTextIndex = 2;
+ if ( iAnimation )
+ {
+ AknLayoutUtils::LayoutControl(iAnimation, headingrect, AknLayoutScalable_Avkon::heading_pane_g2() ); // Icon
+ }
+ else
+ {
+ AknLayoutUtils::LayoutImage(iHeaderImage, headingrect, AknLayoutScalable_Avkon::heading_pane_g2() ); // Icon
+ }
+ }
+ else if (iAttributes->iPage->IsVisible())
+ {
+ // Page number layout needed.
+ headingPaneTextIndex = (AknLayoutUtils::PenEnabled())? 3 : 1;
+ }
+
+ TAknTextComponentLayout headingPrompt = AknLayoutScalable_Avkon::heading_pane_t1(headingPaneTextIndex);
+
+ AknLayoutUtils::LayoutLabel(iPrompt->Line(0), headingrect, headingPrompt);
+ if (!error)
+ {
+ // Ignore error
+ TRAP_IGNORE( AknLayoutUtils::OverrideControlColorL( *iPrompt->Line(0),
+ EColorLabelText, color ) );
+ }
+ }
+
+ // Layout page number text
+ if (iAttributes->iPage->IsVisible() && iAttributes->iPage->NumberOfLines() > 0)
+ {
+ TInt varietyIndex = (iAttributes->IsEnableCloseButton())? 1 : 0;
+ TAknTextComponentLayout headingPrompt2 = AknLayoutScalable_Avkon::heading_pane_t2(varietyIndex);
+
+ AknLayoutUtils::LayoutLabel(iAttributes->iPage->Line(0), headingrect, headingPrompt2);
+ if (!error)
+ {
+ // Ignore error
+ TRAP_IGNORE( AknLayoutUtils::OverrideControlColorL( *iAttributes->iPage->Line(0),
+ EColorLabelText, color ) );
+ }
+ }
+
+ // Layout close button
+ if (iAttributes->IsEnableCloseButton())
+ {
+ TAknLayoutRect buttonLayoutRect;
+ buttonLayoutRect.LayoutRect(headingrect, AknLayoutScalable_Avkon::heading_pane_g1());
+ iAttributes->iCloseButton->SetRect(buttonLayoutRect.Rect());
+ iAttributes->iCloseButton->MakeVisible(ETrue);
+ }
+
+ }
+
+void CAknPopupHeadingPane::LayoutListHeadingPane()
+ {
+ TRect headingrect = Rect();
+ iPrompt->SetRect(headingrect);
+
+ if (iPrompt->NumberOfLines() > 0)
+ {
+ TAknTextComponentLayout textLayout = AknLayoutScalable_Avkon::heading_pane_t1(0);
+
+ if (iAnimation || iHeaderImage)
+ {
+ textLayout = AknLayoutScalable_Avkon::heading_pane_t1(1);
+ }
+
+ MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+ TRgb color;
+ TInt error = AknsUtils::GetCachedColor( skin, color,
+ KAknsIIDQsnTextColors,
+ EAknsCIQsnTextColorsCG19 );
+
+ AknLayoutUtils::LayoutLabel(iPrompt->Line(0), headingrect, textLayout);
+
+ if (!error)
+ {
+ // Ignore error
+ TRAP_IGNORE( AknLayoutUtils::OverrideControlColorL(
+ *iPrompt->Line(0),
+ EColorLabelText, color ) );
+ }
+ TAknWindowLineLayout icon( AknLayoutScalable_Avkon::heading_pane_g2() ); // Icon
+ if ( iAnimation )
+ {
+ AknLayoutUtils::LayoutControl(iAnimation, headingrect, icon );
+ }
+ else if ( iHeaderImage )
+ {
+ TAknLayoutRect r;
+ r.LayoutRect( Rect(), icon );
+ AknLayoutUtils::LayoutImage(iHeaderImage, headingrect, icon );
+ }
+ }
+ }
+
+void CAknPopupHeadingPane::LayoutColourSelectionGridHeadingPane()
+ {
+ TAknWindowLineLayout headingPaneWindowLine;
+ if (iAttributes->iLayout == EColourSelectionGridHeadingPane)
+ {
+ headingPaneWindowLine = AknLayoutScalable_Avkon::heading_pane_cp4();
+ }
+ else
+ {
+ headingPaneWindowLine = AknLayoutScalable_Avkon::heading_pane(1);
+ }
+
+ TAknLayoutRect headingLayoutRect;
+ headingLayoutRect.LayoutRect(Rect(), headingPaneWindowLine);
+ TRect headingrect = headingLayoutRect.Rect();
+ iPrompt->SetRect(headingrect);
+ iAttributes->iPage->SetRect(headingrect);
+
+ MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+ TRgb color;
+ TInt error = AknsUtils::GetCachedColor( skin,
+ color,
+ KAknsIIDQsnTextColors,
+ EAknsCIQsnTextColorsCG19 );
+
+ TInt headingPaneTextIndex = 0;
+ // Layout the heading text
+ if (iPrompt->NumberOfLines() > 0)
+ {
+ if ( iHeaderImage || iAnimation )
+ {
+ headingPaneTextIndex = 2;
+ if ( iAnimation )
+ {
+ AknLayoutUtils::LayoutControl(iAnimation, headingrect, AknLayoutScalable_Avkon::heading_pane_g2() ); // Icon
+ }
+ else
+ {
+ AknLayoutUtils::LayoutImage(iHeaderImage, headingrect, AknLayoutScalable_Avkon::heading_pane_g2() ); // Icon
+ }
+ }
+ else if (iAttributes->iPage->IsVisible())
+ {
+ // Page number layout needed.
+ headingPaneTextIndex = (AknLayoutUtils::PenEnabled())? 3 : 1;
+ }
+
+ TAknTextComponentLayout headingPrompt = AknLayoutScalable_Avkon::heading_pane_t1(headingPaneTextIndex);
+
+ AknLayoutUtils::LayoutLabel(iPrompt->Line(0), headingrect, headingPrompt);
+ if (!error)
+ {
+ // Ignore error
+ TRAP_IGNORE( AknLayoutUtils::OverrideControlColorL( *iPrompt->Line(0),
+ EColorLabelText, color ) );
+ }
+ }
+
+ // Layout page number text
+ if (iAttributes->iPage->IsVisible() && iAttributes->iPage->NumberOfLines() > 0)
+ {
+ TInt varietyIndex = (iAttributes->IsEnableCloseButton())? 1 : 0;
+ TAknTextComponentLayout headingPrompt2 = AknLayoutScalable_Avkon::heading_pane_t2(varietyIndex);
+
+ AknLayoutUtils::LayoutLabel(iAttributes->iPage->Line(0), headingrect, headingPrompt2);
+
+ if (!error)
+ {
+ // Ignore error
+ TRAP_IGNORE( AknLayoutUtils::OverrideControlColorL( *iAttributes->iPage->Line(0),
+ EColorLabelText, color ) );
+ }
+ }
+
+ // Layout close button
+ if (iAttributes->IsEnableCloseButton())
+ {
+ TAknLayoutRect buttonLayoutRect;
+ buttonLayoutRect.LayoutRect(headingrect, AknLayoutScalable_Avkon::heading_pane_g1());
+ iAttributes->iCloseButton->SetRect(buttonLayoutRect.Rect());
+ iAttributes->iCloseButton->MakeVisible(ETrue);
+ }
+ }
+
+void CAknPopupHeadingPane::LayoutMessageQueryHeadingPane()
+ {
+ TRect parentRect = Rect();
+
+ TAknLayoutRect headingLayoutRect;
+ headingLayoutRect.LayoutRect(parentRect, AknLayoutScalable_Avkon::heading_pane_cp5());
+ TRect headingrect(headingLayoutRect.Rect());
+ iPrompt->SetRect(headingrect);
+ iAttributes->iPage->SetRect(headingrect);
+
+ MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+ TRgb color;
+ TInt error = AknsUtils::GetCachedColor( skin,
+ color,
+ KAknsIIDQsnTextColors,
+ EAknsCIQsnTextColorsCG19 );
+
+
+ TInt headingPaneTextIndex = 0;
+ // Layout the heading text
+ if (iPrompt->NumberOfLines() > 0)
+ {
+ if ( iHeaderImage || iAnimation )
+ {
+ headingPaneTextIndex = 2;
+ if ( iAnimation )
+ {
+ AknLayoutUtils::LayoutControl(iAnimation, headingrect, AknLayoutScalable_Avkon::heading_pane_g2() ); // Icon
+ }
+ else
+ {
+ AknLayoutUtils::LayoutImage(iHeaderImage, headingrect, AknLayoutScalable_Avkon::heading_pane_g2() ); // Icon
+ }
+ }
+ else if (iAttributes->iPage->IsVisible())
+ {
+ // Page number layout needed.
+ headingPaneTextIndex = (AknLayoutUtils::PenEnabled())? 3 : 1;
+ }
+ TAknTextComponentLayout headingPrompt = AknLayoutScalable_Avkon::heading_pane_t1(headingPaneTextIndex);
+
+ AknLayoutUtils::LayoutLabel(iPrompt->Line(0), headingrect, headingPrompt);
+ if (!error)
+ {
+ // Ignore error
+ TRAP_IGNORE( AknLayoutUtils::OverrideControlColorL( *iPrompt->Line(0),
+ EColorLabelText, color ) );
+ }
+ }
+
+ // Layout page number text
+ if (iAttributes->iPage->IsVisible() && iAttributes->iPage->NumberOfLines() > 0)
+ {
+ TInt varietyIndex = (iAttributes->IsEnableCloseButton())? 1 : 0;
+ TAknTextComponentLayout headingPrompt2 = AknLayoutScalable_Avkon::heading_pane_t2(varietyIndex);
+
+ AknLayoutUtils::LayoutLabel(iAttributes->iPage->Line(0), headingrect, headingPrompt2);
+
+ if (!error)
+ {
+ // Ignore error
+ TRAP_IGNORE( AknLayoutUtils::OverrideControlColorL( *iAttributes->iPage->Line(0),
+ EColorLabelText, color ) );
+ }
+ }
+
+ // Layout close button
+ if (iAttributes->IsEnableCloseButton())
+ {
+ TAknLayoutRect buttonLayoutRect;
+ buttonLayoutRect.LayoutRect(headingrect, AknLayoutScalable_Avkon::heading_pane_g1());
+ iAttributes->iCloseButton->SetRect(buttonLayoutRect.Rect());
+ iAttributes->iCloseButton->MakeVisible(ETrue);
+ }
+ }
+
+EXPORT_C TSize CAknPopupHeadingPane::MinimumSize()
+ {
+ if (iPrompt->NumberOfLines() == 0)
+ {
+ return TSize(0,0);
+ }
+
+ TRect popupRect = Rect();
+ TRect mainPaneRect;
+ if( iAttributes->iLayout == EColourSelectionGridHeadingPane )
+ {
+ if(!AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EPopupParent, mainPaneRect))
+ {
+ mainPaneRect = iAvkonAppUi->ClientRect();
+ }
+ }
+ else
+ {
+ if(!AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect))
+ {
+ mainPaneRect = iAvkonAppUi->ClientRect();
+ }
+ }
+
+ TAknWindowComponentLayout popupWindowLayout;
+ TAknLayoutRect popupLayoutRect;
+ if ( iAttributes->iLayout == EColourSelectionGridHeadingPane )
+ {
+ TInt colourPopupVariety = 0;
+ if (Layout_Meta_Data::IsLandscapeOrientation())
+ {
+ switch (AknLayoutUtils::CbaLocation())
+ {
+ case AknLayoutUtils::EAknCbaLocationBottom:
+ //Bottom softkeyt
+ colourPopupVariety = 1;
+ break;
+ case AknLayoutUtils::EAknCbaLocationRight:
+ //Right softkeyt
+ colourPopupVariety = 2;
+ break;
+ case AknLayoutUtils::EAknCbaLocationLeft:
+ //Left softkeyt
+ colourPopupVariety = 3;
+ break;
+ default:
+ break;
+ }
+ }
+ popupWindowLayout = AknLayoutScalable_Avkon::popup_large_graphic_colour_window(colourPopupVariety);
+ }
+ else
+ {
+ popupWindowLayout = AknLayoutScalable_Avkon::popup_window_general(1);
+ }
+ popupLayoutRect.LayoutRect(mainPaneRect, popupWindowLayout);
+ popupRect = TRect(TPoint(0,0), popupLayoutRect.Rect().Size());
+
+ TAknWindowComponentLayout headingPaneWindowLayout;
+ if (iAttributes->iLayout == EColourSelectionGridHeadingPane)
+ {
+ headingPaneWindowLayout = AknLayoutScalable_Avkon::heading_pane_cp4();
+ }
+ else if (iAttributes->iLayout == EMessageQueryHeadingPane)
+ {
+ headingPaneWindowLayout = AknLayoutScalable_Avkon::heading_pane_cp5();
+ }
+ else
+ {
+ headingPaneWindowLayout = AknLayoutScalable_Avkon::heading_pane(0);
+ }
+
+ TAknLayoutRect headingPaneRect;
+ headingPaneRect.LayoutRect(popupRect, headingPaneWindowLayout);
+
+ TSize minimumSize;
+ if (iAttributes->iLayout == EColourSelectionGridHeadingPane ||
+ iAttributes->iLayout == EMessageQueryHeadingPane)
+ {
+ minimumSize = TSize(popupRect.Width(), headingPaneRect.Rect().iBr.iY - popupRect.iTl.iY);
+ }
+ else
+ {
+#ifndef RD_NO_DIALOG_BORDERS
+ minimumSize = TSize(headingPaneRect.Rect().Width(), headingPaneRect.Rect().iTl.iY + headingPaneRect.Rect().Height());
+#else
+ minimumSize = headingPaneRect.Rect().Size();
+#endif
+ }
+
+ return minimumSize;
+ }
+
+EXPORT_C void CAknPopupHeadingPane::Draw(const TRect &/*aRect*/) const
+ {
+ TRect parentRect = Rect();
+ CWindowGc &gc = SystemGc();
+ gc.Reset();
+
+ MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+
+ TRect windowRect = parentRect;
+ TAknLayoutRect headingLayoutRect;
+ TAknWindowComponentLayout headingPaneLayout;
+
+ if (iAttributes->iLayout == EMessageQueryHeadingPane)
+ {
+ headingPaneLayout = AknLayoutScalable_Avkon::heading_pane_cp5();
+ }
+ else if(iAttributes->iLayout == EQueryHeadingPane)
+ {
+ headingPaneLayout = AknLayoutScalable_Avkon::heading_pane(0);
+ }
+ else if(iAttributes->iLayout == EColourSelectionGridHeadingPane)
+ {
+ headingPaneLayout = AknLayoutScalable_Avkon::heading_pane_cp4();
+ }
+
+ headingLayoutRect.LayoutRect(parentRect, headingPaneLayout);
+ windowRect = headingLayoutRect.Rect();
+
+ TAknWindowComponentLayout innerArea = AknLayoutScalable_Avkon::bg_popup_heading_pane_g1();
+ TAknLayoutRect inner;
+ inner.LayoutRect(windowRect, innerArea .LayoutLine());
+
+ TRect outerRect = windowRect;
+ TRect innerRect = inner.Rect();
+
+ TBool drawn(EFalse);
+
+ MAknsControlContext* cc = AknsDrawUtils::ControlContext( this ); // get parent's cc
+
+ /*
+ // with transparency on, we can't draw both background and frame
+ if ( CAknEnv::Static()->TransparencyEnabled() )
+ {
+ if ( iExtension )
+ {
+ TRegionFix<1> dontDrawRegion;
+ TRegionFix<4> drawRegion;
+ dontDrawRegion.AddRect( outerRect );
+ drawRegion.AddRect( parentRect );
+ drawRegion.SubRegion( dontDrawRegion );
+ // this causes wserver flush, but only if parentRect != outerRect
+ gc.SetClippingRegion( drawRegion );
+ AknsDrawUtils::Background( skin, cc, this, gc, parentRect );
+ gc.CancelClippingRegion();
+ drawn = AknsDrawUtils::DrawFrame( skin, gc, outerRect, innerRect,
+ iExtension->iFrameId,
+ iExtension->iFrameCenterId );
+ if ( !drawn )
+ {
+ // Couldn't draw frame, draw background again without clipping
+ drawn = AknsDrawUtils::Background( skin, cc, this, gc, parentRect );
+ }
+ }
+ else
+ {
+ drawn = AknsDrawUtils::Background( skin, cc, this, gc, parentRect );
+ }
+ }*/
+
+ drawn = AknsDrawUtils::Background( skin, cc, this, gc, parentRect );
+ if ( iExtension )
+ {
+ drawn |= AknsDrawUtils::DrawFrame( skin, gc, outerRect, innerRect,
+ iExtension->iFrameId,
+ iExtension->iFrameCenterId);
+ }
+ else
+ {
+ drawn = AknsDrawUtils::Background( skin, cc, this, gc, parentRect );
+ }
+
+ if (!drawn) // skin drawing didn't work, so just clear the rect
+ {
+ gc.Clear(parentRect);
+ }
+ }
+
+EXPORT_C CEikLabel* CAknPopupHeadingPane::Prompt() const
+ {
+ return iPrompt->Line(0);
+ }
+
+EXPORT_C TPtr CAknPopupHeadingPane::PromptText() const
+ {
+ return iPrompt->Text();
+ }
+
+CCoeControl* CAknPopupHeadingPane::ComponentControl(TInt anIndex) const
+ {
+ CCoeControl* controls[] =
+ {
+ iPrompt,
+ iHeaderImage,
+ iAnimation,
+ iAttributes->iPage,
+ iAttributes->iCloseButton
+ };
+
+ for ( TUint ii=0; ii < sizeof(controls)/sizeof(CCoeControl*); ii++)
+ if ( controls[ii] && anIndex-- == 0 )
+ {
+ return controls[ii];
+ }
+ return NULL;
+ }
+
+
+TInt CAknPopupHeadingPane::CountComponentControls() const
+ {
+ TInt count = 0;
+ CCoeControl* controls[] =
+ {
+ iPrompt,
+ iHeaderImage,
+ iAnimation,
+ iAttributes->iPage,
+ iAttributes->iCloseButton
+ };
+
+ for (TUint ii=0; ii < sizeof(controls)/sizeof(CCoeControl*); ii++ )
+ {
+ if (controls[ii])
+ {
+ count++;
+ }
+ }
+ return count;
+ }
+
+void CAknPopupHeadingPane::ActivateL()
+ {
+ CCoeControl::ActivateL();
+ if ( iAnimation )
+ {
+ SetAnimationBackGroundFrameL();
+ iAnimation->StartAnimationL();
+ }
+ }
+
+EXPORT_C void CAknPopupHeadingPane::HandlePointerEventL(const TPointerEvent& aPointerEvent)
+ {
+ CAknControl::HandlePointerEventL( aPointerEvent );
+ if( iExtension->iTouchObserver )
+ iExtension->iTouchObserver->HandleHeadingPanePointerEventL( this, aPointerEvent );
+ }
+
+EXPORT_C void CAknPopupHeadingPane::HandleResourceChange( TInt aType )
+ {
+ if (iAttributes->iLayout == EQueryHeadingPane)
+ {
+ LayoutQueryHeadingPane();
+ }
+ else if (iAttributes->iLayout == EColourSelectionGridHeadingPane)
+ {
+ LayoutColourSelectionGridHeadingPane();
+ }
+ else if (iAttributes->iLayout == EMessageQueryHeadingPane)
+ {
+ LayoutMessageQueryHeadingPane();
+ }
+ else
+ {
+ LayoutListHeadingPane();
+ }
+
+ TRAP_IGNORE( DoSetPromptL() );
+
+ CCoeControl::HandleResourceChange( aType );
+
+ if (aType == KEikDynamicLayoutVariantSwitch)
+ {
+ DrawDeferred();
+ }
+ }
+
+EXPORT_C void* CAknPopupHeadingPane::ExtensionInterface( TUid /*aInterface*/ )
+ {
+ return NULL;
+ }
+
+EXPORT_C void CAknPopupHeadingPane::StartAnimationL()
+ {
+ __ASSERT_DEBUG(iAnimation,Panic(EAknPanicNullPointer));
+ SetAnimationBackGroundFrameL();
+ iAnimation->StartAnimationL();
+ }
+
+EXPORT_C TInt CAknPopupHeadingPane::CancelAnimation()
+ {
+ __ASSERT_DEBUG(iAnimation,Panic(EAknPanicNullPointer));
+ return iAnimation->CancelAnimation();
+ }
+
+EXPORT_C CAknPopupHeadingPane::CAknPopupHeadingPane()
+ {
+ }
+
+void CAknPopupHeadingPane::SetAnimationBackGroundFrameL()
+ {
+ if (iAnimation)
+ {
+ // Not set background frame, if there is only one frame in animation.
+ CBitmapAnimClientData *animClientData = iAnimation->BitmapAnimData();
+ if (animClientData != NULL && animClientData->FrameArray().Count() <= 1)
+ {
+ return;
+ }
+
+ const TDisplayMode displayMode(
+ CCoeEnv::Static()->ScreenDevice()->DisplayMode() );
+
+ CFbsBitmap* bitmap = new(ELeave) CFbsBitmap;
+ CleanupStack::PushL(bitmap);
+
+ User::LeaveIfError( bitmap->Create(iAnimation->Rect().Size(), displayMode ) );
+
+ CFbsBitmapDevice* doubleBufferDev = CFbsBitmapDevice::NewL( bitmap );
+ CleanupStack::PushL(doubleBufferDev);
+
+ CFbsBitGc* doubleBufferGc = 0;
+ User::LeaveIfError( doubleBufferDev->CreateContext( doubleBufferGc ) );
+ CleanupStack::PushL(doubleBufferGc);
+
+ MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+ MAknsControlContext* cc = AknsDrawUtils::ControlContext( this );
+
+ AknsDrawUtils::DrawBackground( skin, cc, this, *doubleBufferGc,
+ TPoint(0,0), iAnimation->Rect(), KAknsDrawParamDefault );
+
+ CleanupStack::PopAndDestroy(2); // doubleBufferGc, doubleBufferDev
+
+ CBitmapFrameData* data = CBitmapFrameData::NewL();
+ data->SetBitmapsOwnedExternally( EFalse );
+ data->SetBitmap( bitmap );
+
+ // Set frame to animation
+ iAnimation->BitmapAnimData()->SetBackgroundFrame( data ); // gets ownership
+
+ CleanupStack::Pop(bitmap);
+ }
+ }
+
+void CAknPopupHeadingPane::SetPageL(TInt aCurrent, TInt aMax)
+ {
+ if (aMax > 0 || iAttributes->iCurrentPage != aCurrent)
+ {
+ if (aMax > 0)
+ {
+ iAttributes->iMaxPage = aMax;
+ }
+
+ iAttributes->iPage->MakeVisible(iAttributes->iMaxPage > 1? ETrue: EFalse);
+ iAttributes->iCurrentPage = aCurrent;
+ HBufC* text = PageTextL();
+ CleanupStack::PushL(text);
+ iAttributes->iPage->SetTextL(*text);
+ DoSetPromptL();
+ CleanupStack::PopAndDestroy(); //text
+ DrawDeferred();
+ }
+ }
+
+HBufC* CAknPopupHeadingPane::PageTextL() const
+ {
+ CArrayFix<TInt>* numbers = new(ELeave)CArrayFixFlat<TInt>(2);
+ CleanupStack::PushL(numbers);
+ numbers->AppendL(iAttributes->iCurrentPage);
+ numbers->AppendL(iAttributes->iMaxPage);
+ HBufC* page = StringLoader::LoadL(
+ R_AVKON_SPECIAL_CHARACTERS_PAGE_INDICATOR, *numbers, iEikonEnv);
+ CleanupStack::PopAndDestroy(); // numbers
+ return page;
+ }
+
+EXPORT_C void CAknPopupHeadingPane::SetSkinFrameId(const TAknsItemID &aFrameId)
+ {
+ if (iExtension)
+ {
+ iExtension->iFrameId = aFrameId;
+ }
+ }
+
+EXPORT_C void CAknPopupHeadingPane::SetSkinFrameCenterId(const TAknsItemID &aFrameCenterId)
+ {
+ if (iExtension)
+ {
+ iExtension->iFrameCenterId = aFrameCenterId;
+ }
+ }
+
+void CAknPopupHeadingPane::SetTouchObserver( MAknHeadingPaneTouchObserver* aTouchObserver )
+ {
+ iExtension->iTouchObserver = aTouchObserver;
+ }
+
+// End of File