diff -r 000000000000 -r 2f259fa3e83a uifw/AvKon/src/aknstylusactivatedpopupcontent.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/AvKon/src/aknstylusactivatedpopupcontent.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,954 @@ +/* +* Copyright (c) 2005-2007 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: Content for stylus activated pop-up. +* +*/ + + +#include +#include +#include +#include // TResourceReader +#include +#include +#include +#include +#include +#include +#include + +#include "akntextcontrol.h" +#include "aknstylusactivatedpopupcontent.h" + +#ifdef RD_SCALABLE_UI_V2 +// CONSTANTS +const TInt KMaxNbrOfInfoLines = 2; +const TInt KMaxNbrOfCmdLinks = 2; +const TInt KNoItemHighlighted = -1; + +#endif // RD_SCALABLE_UI_V2 + + +NONSHARABLE_CLASS( CAknStylusActivatedItem ) : public CBase + { +public: + CAknStylusActivatedItem(); + ~CAknStylusActivatedItem(); + void ConstructL( TDesC& aText, TInt aCommandId ); +public: + //Member data + TRect iRect; + HBufC* iText; + TInt iCommandId; + }; + +// ----------------------------------------------------------------------------- +// Default constructor +// ----------------------------------------------------------------------------- +// +CAknStylusActivatedItem::CAknStylusActivatedItem() + { + } + +// ----------------------------------------------------------------------------- +// CAknStylusActivatedItem::ConstructL +// ----------------------------------------------------------------------------- +// +void CAknStylusActivatedItem::ConstructL( TDesC& aText, TInt aCommandId ) + { + iText = aText.AllocL(); + iCommandId = aCommandId; + } + +// ----------------------------------------------------------------------------- +// Destructor +// ----------------------------------------------------------------------------- +// +CAknStylusActivatedItem::~CAknStylusActivatedItem() + { + delete iText; + } + + +// ======== MEMBER FUNCTIONS ======== + +// ----------------------------------------------------------------------------- +// Default constructor. +// ----------------------------------------------------------------------------- +// +#ifdef RD_SCALABLE_UI_V2 +CAknStylusActivatedPopUpContent::CAknStylusActivatedPopUpContent(): + iHighlightedItem( KNoItemHighlighted ) + { + } +#endif // RD_SCALABLE_UI_V2 + + +// ----------------------------------------------------------------------------- +// CAknStylusActivatedPopUpContent::NewL +// ----------------------------------------------------------------------------- +// +#ifdef RD_SCALABLE_UI_V2 +EXPORT_C CAknStylusActivatedPopUpContent* + CAknStylusActivatedPopUpContent::NewL( + const TDesC& aTitleText, + const TDesC& aText ) + { + CAknStylusActivatedPopUpContent* self = + new ( ELeave ) CAknStylusActivatedPopUpContent(); + + CleanupStack::PushL( self ); + self->ConstructL( aTitleText, aText ); + CleanupStack::Pop(); // self + return self; + } +#else +EXPORT_C CAknStylusActivatedPopUpContent* + CAknStylusActivatedPopUpContent::NewL( + const TDesC& /*aTitleText*/, + const TDesC& /*aText*/ ) + { + return NULL; + } +#endif // RD_SCALABLE_UI_V2 + + +// ----------------------------------------------------------------------------- +// CAknStylusActivatedPopUpContent::NewL +// ----------------------------------------------------------------------------- +// +#ifdef RD_SCALABLE_UI_V2 +EXPORT_C CAknStylusActivatedPopUpContent* + CAknStylusActivatedPopUpContent::NewL( + const TDesC& aTitleText, + const TDesC& aText, + const RArray& aLinkArray ) + { + CAknStylusActivatedPopUpContent* self = + new ( ELeave ) CAknStylusActivatedPopUpContent(); + + CleanupStack::PushL( self ); + self->ConstructL( aTitleText, aText, aLinkArray ); + CleanupStack::Pop(); // self + return self; + } +#else +EXPORT_C CAknStylusActivatedPopUpContent* + CAknStylusActivatedPopUpContent::NewL( + const TDesC& /*aTitleText*/, + const TDesC& /*aText*/, + const RArray& /*&aLinkArray*/ ) + { + return NULL; + } +#endif // RD_SCALABLE_UI_V2 + + +// ----------------------------------------------------------------------------- +// CAknStylusActivatedPopUpContent::NewL +// ----------------------------------------------------------------------------- +// +#ifdef RD_SCALABLE_UI_V2 +EXPORT_C CAknStylusActivatedPopUpContent* + CAknStylusActivatedPopUpContent::NewL( TResourceReader& aReader ) + { + CAknStylusActivatedPopUpContent* self = + new ( ELeave ) CAknStylusActivatedPopUpContent(); + + CleanupStack::PushL( self ); + self->ConstructFromResourceL( aReader ); + CleanupStack::Pop(); // self + return self; + } +#else +EXPORT_C CAknStylusActivatedPopUpContent* + CAknStylusActivatedPopUpContent::NewL( TResourceReader& /*aReader*/ ) + { + return NULL; + } +#endif // RD_SCALABLE_UI_V2 + + +// ----------------------------------------------------------------------------- +// CAknStylusActivatedPopUpContent::NewL +// ----------------------------------------------------------------------------- +// +#ifdef RD_SCALABLE_UI_V2 +EXPORT_C CAknStylusActivatedPopUpContent* + CAknStylusActivatedPopUpContent::NewL( const TInt aResourceId ) + { + CAknStylusActivatedPopUpContent* self = + new ( ELeave ) CAknStylusActivatedPopUpContent(); + + CleanupStack::PushL( self ); + self->ConstructFromResourceL( aResourceId ); + CleanupStack::Pop(); // self + return self; + } +#else +EXPORT_C CAknStylusActivatedPopUpContent* + CAknStylusActivatedPopUpContent::NewL( const TInt /*aResourceId*/ ) + { + return NULL; + } +#endif // RD_SCALABLE_UI_V2 + + +// ----------------------------------------------------------------------------- +// Destructor +// ----------------------------------------------------------------------------- +// +#ifdef RD_SCALABLE_UI_V2 +CAknStylusActivatedPopUpContent::~CAknStylusActivatedPopUpContent() + { + iLinkArray.ResetAndDestroy(); + delete iTitleText; + delete iText; + } +#endif // RD_SCALABLE_UI_V2 + + +// ----------------------------------------------------------------------------- +// CAknStylusActivatedPopUpContent::ConstructFromResourceL +// ----------------------------------------------------------------------------- +// +#ifdef RD_SCALABLE_UI_V2 +EXPORT_C void CAknStylusActivatedPopUpContent::ConstructFromResourceL( + const TInt aResourceId ) + { + if ( aResourceId ) + { + TResourceReader reader; + iCoeEnv->CreateResourceReaderLC( reader, aResourceId ); + ConstructFromResourceL( reader ); + CleanupStack::PopAndDestroy(); // reader + } + } +#else +EXPORT_C void CAknStylusActivatedPopUpContent::ConstructFromResourceL( + const TInt /*aResourceId*/ ) + { + } +#endif // RD_SCALABLE_UI_V2 + + +// ----------------------------------------------------------------------------- +// CAknStylusActivatedPopUpContent::SetCommandObserver +// ----------------------------------------------------------------------------- +// +#ifdef RD_SCALABLE_UI_V2 +EXPORT_C void CAknStylusActivatedPopUpContent::SetCommandObserver( + MEikCommandObserver& aCommandObserver ) + { + iCommandObserver = &aCommandObserver; + } +#else +EXPORT_C void CAknStylusActivatedPopUpContent::SetCommandObserver( + MEikCommandObserver& /*aCommandObserver*/ ) + { + } +#endif // RD_SCALABLE_UI_V2 + + +// ----------------------------------------------------------------------------- +// From class CCoeControl. +// CAknStylusActivatedPopUpContent::ConstructFromResourceL +// ----------------------------------------------------------------------------- +// +#ifdef RD_SCALABLE_UI_V2 +EXPORT_C void CAknStylusActivatedPopUpContent::ConstructFromResourceL( + TResourceReader& aReader ) + { + // read title and info texts + TPtrC titleText = aReader.ReadTPtrC(); + TPtrC infotext = aReader.ReadTPtrC(); + + // read function link count + TInt numberOfLinks = aReader.ReadInt16(); + + __ASSERT_ALWAYS( numberOfLinks <= KMaxNbrOfCmdLinks, + Panic( EAknPanicOutOfRange ) ); + + if ( numberOfLinks > 0 ) + { + RArray linkArray; + CleanupClosePushL( linkArray ); + for ( TInt i = 0; i < numberOfLinks; i++ ) + { + TAknContentLink link; + link.iLinkId = aReader.ReadInt8(); + TPtrC linkTextTPtrC = aReader.ReadTPtrC(); + HBufC* buf = linkTextTPtrC.AllocLC(); + + link.iLinkText = buf; + linkArray.AppendL( link ); + + // possible extension + aReader.ReadInt32(); + } + ConstructL( titleText, infotext, linkArray ); + CleanupStack::PopAndDestroy( numberOfLinks ); + CleanupStack::PopAndDestroy( &linkArray ); + } + else + { + ConstructL( titleText, infotext ); + } + } +#else +EXPORT_C void CAknStylusActivatedPopUpContent::ConstructFromResourceL( + TResourceReader& /*aReader*/ ) + { + } +#endif // RD_SCALABLE_UI_V2 + + +// ----------------------------------------------------------------------------- +// From class CCoeControl. +// CAknStylusActivatedPopUpContent::HandleResourceChange +// ----------------------------------------------------------------------------- +// +#ifdef RD_SCALABLE_UI_V2 +EXPORT_C void CAknStylusActivatedPopUpContent::HandleResourceChange( + TInt aType ) + { + CCoeControl::HandleResourceChange( aType ); + if ( aType == KEikDynamicLayoutVariantSwitch ) + { + SizeChanged(); + } + } +#else +EXPORT_C void CAknStylusActivatedPopUpContent::HandleResourceChange( + TInt /*aType*/ ) + { + } +#endif // RD_SCALABLE_UI_V2 + + +// ----------------------------------------------------------------------------- +// From class CCoeControl. +// CAknStylusActivatedPopUpContent::SetContainerWindowL +// ----------------------------------------------------------------------------- +// +#ifdef RD_SCALABLE_UI_V2 +EXPORT_C void CAknStylusActivatedPopUpContent::SetContainerWindowL( + const CCoeControl& aContainer ) + { + CCoeControl::SetContainerWindowL( aContainer ); + + if( iText ) + { + iText->SetContainerWindowL( aContainer ); + } + + iTitleText->SetContainerWindowL( aContainer ); + } +#else +EXPORT_C void CAknStylusActivatedPopUpContent::SetContainerWindowL( + const CCoeControl& /*aContainer*/ ) + { + } +#endif // RD_SCALABLE_UI_V2 + + +// ----------------------------------------------------------------------------- +// From class MCoeControlObserver. +// CAknStylusActivatedPopUpContent::HandleControlEventL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CAknStylusActivatedPopUpContent::HandleControlEventL( + CCoeControl* /*aControl*/, + TCoeEvent /*aEventType*/ ) + { + } + +#ifdef RD_SCALABLE_UI_V2 + +// ----------------------------------------------------------------------------- +// CAknStylusActivatedPopUpContent::ConstructL +// ----------------------------------------------------------------------------- +// +void CAknStylusActivatedPopUpContent::ConstructL( const TDesC& aTitleText, + const TDesC& aText ) + { + // titletext must be always given + __ASSERT_ALWAYS( aTitleText.Length(), Panic( EAknPanicNullPointer ) ); + // either of infotext or cmds must be given + __ASSERT_ALWAYS( aText.Length() > 0 || iLinkArray.Count() > 0, + Panic( EAknPanicOutOfRange ) ); + + iTitleText = new ( ELeave ) CEikLabel; + iTitleText->SetTextL( aTitleText ); + + if( aText.Length() > 0 ) + { + iText = CAknTextControl::NewL(); + iText->SetTextL( aText ); + } + TInt numOfLines = iLinkArray.Count(); + if ( iText ) + { + numOfLines++; + } + + TInt variety = GetVariety( numOfLines ); + + TRect rectPopUpWindow = PopUpWindowRectFromLayout( + AknLayoutScalable_Avkon::popup_touch_info_window( variety ) ); + + TRect rectHeadingSubPane = RectFromLayout( rectPopUpWindow, + AknLayoutScalable_Avkon::heading_sub_pane() ); + + TAknLayoutText layoutText; + layoutText.LayoutText( rectHeadingSubPane, + AknLayoutScalable_Avkon::heading_sub_pane_t1() ); + + iTitleText->SetFont( layoutText.Font() ); + + TAknWindowComponentLayout infoPaneLayout = + AknLayoutScalable_Avkon::list_touch_info_pane( 1 ); // with heading + TRect rectInfoPane = RectFromLayout( rectPopUpWindow, infoPaneLayout ); + + TAknTextComponentLayout textLayout = + AknLayoutScalable_Avkon::list_single_touch_info_pane_t1(); + TAknLayoutText textRect; + textRect.LayoutText( rectInfoPane, textLayout ); + + + TRgb textColor = KRgbBlack; + AknsUtils::GetCachedColor( AknsUtils::SkinInstance(), textColor, + KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG55 ); + AknLayoutUtils::OverrideControlColorL( *iTitleText, EColorLabelText, + textColor ); + + + // Font for command links + iFont = textRect.Font(); + + if( iText ) + { + textRect.LayoutText( rectInfoPane, textLayout ); + + CArrayFixFlat* lineWidths + = new ( ELeave ) CArrayFixFlat( KMaxNbrOfInfoLines ); + CleanupStack::PushL( lineWidths ); + + for ( TInt i = 0; i < KMaxNbrOfInfoLines; i++ ) + { + lineWidths->AppendL( textRect.TextRect().Width() ); + } + + // get correct font from layout + const CFont *font = textRect.Font(); + + // parse text + iText->ParseTextL( font, lineWidths ); + CleanupStack::PopAndDestroy( lineWidths ); + + if ( iText->Line( 1 ) ) + { + // text didn't fit in one line -> change layout to allow 2 lines + variety++; + + rectPopUpWindow = PopUpWindowRectFromLayout( + AknLayoutScalable_Avkon::popup_touch_info_window( variety ) ); + + rectInfoPane = RectFromLayout( rectPopUpWindow, infoPaneLayout ); + textRect.LayoutText( rectInfoPane, textLayout ); + + lineWidths + = new ( ELeave ) CArrayFixFlat( KMaxNbrOfInfoLines ); + CleanupStack::PushL( lineWidths ); + for ( TInt i = 0; i < KMaxNbrOfInfoLines; i++ ) + { + lineWidths->AppendL( textRect.TextRect().Width() ); + } + // parse text + iText->ParseTextL( font, lineWidths ); + CleanupStack::PopAndDestroy( lineWidths ); + } + AknLayoutUtils::OverrideControlColorL( *iText, EColorLabelText, + textColor ); + } + } + + +// ----------------------------------------------------------------------------- +// CAknStylusActivatedPopUpContent::ConstructL +// ----------------------------------------------------------------------------- +// +void CAknStylusActivatedPopUpContent::ConstructL( + const TDesC& aTitleText, + const TDesC& aText, + const RArray& aLinkArray ) + { + if ( &aLinkArray ) + { + __ASSERT_ALWAYS( ( aLinkArray.Count() > 0 ) && + ( aLinkArray.Count() <= KMaxNbrOfCmdLinks ), + Panic( EAknPanicOutOfRange ) ); + + + for ( TInt i = 0; i < aLinkArray.Count(); i++ ) + { + CAknStylusActivatedItem* item = + new (ELeave) CAknStylusActivatedItem; + CleanupStack::PushL( item ); + item->ConstructL( *( aLinkArray[i].iLinkText ), + aLinkArray[i].iLinkId ); + iLinkArray.AppendL( item ); + CleanupStack::Pop( item ); + } + ConstructL( aTitleText, aText ); + } + } +#endif // RD_SCALABLE_UI_V2 + + +// ----------------------------------------------------------------------------- +// From class CCoeControl. +// CAknStylusActivatedPopUpContent::ComponentControl +// ----------------------------------------------------------------------------- +// +#ifdef RD_SCALABLE_UI_V2 +EXPORT_C CCoeControl* CAknStylusActivatedPopUpContent::ComponentControl( + TInt aIndex ) const + { + switch ( aIndex ) + { + case 0: + return iTitleText; + case 1: + if( iText ) + { + return iText; + } + default: + __ASSERT_ALWAYS( aIndex >= 0, Panic( EAknPanicOutOfRange ) ); + return NULL; + } + } +#else +EXPORT_C CCoeControl* CAknStylusActivatedPopUpContent::ComponentControl( + TInt /*aIndex*/ ) const + { + return NULL; + } +#endif // RD_SCALABLE_UI_V2 + + +// ----------------------------------------------------------------------------- +// From class CCoeControl. +// CAknStylusActivatedPopUpContent::CountComponentControls +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CAknStylusActivatedPopUpContent::CountComponentControls() const + { +#ifdef RD_SCALABLE_UI_V2 + TInt count = 0; + if( iTitleText ) + { + count++; + } + if( iText ) + { + count++; + } + return count; +#else + return 0; +#endif // RD_SCALABLE_UI_V2 + } + + +// ----------------------------------------------------------------------------- +// From class CCoeControl. +// CAknStylusActivatedPopUpContent::Draw +// ----------------------------------------------------------------------------- +// +EXPORT_C void CAknStylusActivatedPopUpContent::Draw( + const TRect& aRect ) const + { +#ifdef RD_SCALABLE_UI_V2 + CWindowGc& gc = SystemGc(); + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + + if ( aRect.Intersects( Rect() ) ) + { + TRect rect( Rect() ); + + TRect headingAreaRect( AlignedRectFromLayout( + AknLayoutScalable_Avkon::heading_sub_pane() ) ); + + TRect headingBgRect( RectFromLayout( headingAreaRect, + AknLayoutScalable_Avkon::bg_popup_heading_pane_cp() ) ); + + TRect headingCenterRect( RectFromLayout( headingBgRect, + AknLayoutScalable_Avkon::bg_popup_heading_pane_g1() ) ); + + AknsDrawUtils::DrawFrame( skin, gc, headingBgRect, headingCenterRect, + KAknsIIDQsnFrPopupHeading, + KAknsIIDQsnFrPopupHeadingCenter ); + } + + gc.Reset(); + + TRgb textColor; + AknsUtils::GetCachedColor( skin, textColor, KAknsIIDQsnHighlightColors, + EAknsCIQsnHighlightColorsCG3 ); + + gc.SetPenStyle( CGraphicsContext::ESolidPen ); + gc.SetPenColor( textColor ); + + TRgb highlightcolor = AKN_LAF_COLOR( 244 ); + AknsUtils::GetCachedColor( skin, highlightcolor, + KAknsIIDQsnHighlightColors, EAknsCIQsnHighlightColorsCG1 ); + + gc.SetBrushColor( highlightcolor ); + const CFont* font = iFont; + if ( !font ) + { + font = iCoeEnv->NormalFont(); + } + gc.UseFont( font ); + + gc.SetUnderlineStyle( EUnderlineOn ); + + for ( TInt i=0; i < iLinkArray.Count(); i++ ) + { + if ( !aRect.Intersects( iLinkArray[i]->iRect ) ) + { + continue; + } + + TRect rect( iLinkArray[i]->iRect ); + if ( Background() ) + { + Background()->Draw( gc, *this, rect ); + } + + // buffer for visually ordered text + HBufC* visualText(NULL); + TRAPD( err, visualText = HBufC::NewL( 255 + + KAknBidiExtraSpacePerLine ) ); + if ( err != KErrNone ) + { + return; + } + TPtr ptr = visualText->Des(); + TInt clipWidth = rect.Width(); + + if ( iHighlightedItem == i ) + { + gc.SetBrushStyle( CGraphicsContext::ESolidBrush ); + } + else + { + gc.SetBrushStyle( CGraphicsContext::ENullBrush ); + } + + // bidi processing - using AknBidiTextUtils. + AknBidiTextUtils::ConvertToVisualAndClip( + *(iLinkArray[i]->iText), + ptr, + *font, + clipWidth, + clipWidth ); + + TInt baselineOffset = 0; + baselineOffset = font->AscentInPixels() + + ( rect.Height() - font->AscentInPixels() ) / 2; + gc.DrawText( ptr, rect, baselineOffset, + CGraphicsContext::ELeft ); + delete visualText; + } +#endif // RD_SCALABLE_UI_V2 + } + + +// ----------------------------------------------------------------------------- +// From class CCoeControl. +// CAknStylusActivatedPopUpContent::MinimumSize +// ----------------------------------------------------------------------------- +// +EXPORT_C TSize CAknStylusActivatedPopUpContent::MinimumSize() + { +#ifdef RD_SCALABLE_UI_V2 + TInt nbrOfInfoLines = 0; + if( iText ) + { + nbrOfInfoLines = iText->NumberOfLines(); + } + + TPtrC ptrLabel =( *iTitleText->Text() ); + TInt minWidth = iTitleText->CalcMinimumSize( ptrLabel ).iWidth; + + CEikLabel* textLabel; + for ( TInt i=0; i < nbrOfInfoLines; i++ ) + { + textLabel = static_cast(iText->ComponentControl(i)); + TPtrC ptrText = ( *textLabel->Text() ); + minWidth = Max( textLabel->CalcMinimumSize( ptrText ).iWidth, minWidth ); + } + + // choose the longest one + for ( TInt i = 0; i < iLinkArray.Count(); i++ ) + { + TInt tempWidth = iFont->TextWidthInPixels( *( iLinkArray[i]->iText ) ); + minWidth = Max( minWidth, tempWidth ); + } + + TRect tempRect; + TInt rectWidth = 0; + TAknWindowComponentLayout infoPaneLayout = + AknLayoutScalable_Avkon::list_touch_info_pane( 1 ); // with heading + + // Check layout data varieties from largest to smallest + for ( TInt i=7; i >= 4; i-- ) + { + tempRect = RectFromLayout( iAvkonAppUi->ApplicationRect(), + AknLayoutScalable_Avkon::popup_touch_info_window( i ) ); + + TRect rectInfoPane = RectFromLayout( tempRect, infoPaneLayout ); + + TAknTextComponentLayout textLayout = + AknLayoutScalable_Avkon::list_single_touch_info_pane_t1(); + TAknLayoutText textRect; + textRect.LayoutText( rectInfoPane, textLayout ); + + + if ( textRect.TextRect().Width() > minWidth || !rectWidth ) + { + rectWidth = rectInfoPane.Width(); + } + else + { + break; + } + } + TInt variety = GetVariety( nbrOfInfoLines + + iLinkArray.Count() ); + TRect rectPopUpWindow = PopUpWindowRectFromLayout( + AknLayoutScalable_Avkon::popup_touch_info_window( variety ) ); + + TAknWindowComponentLayout headingPaneLayout = + AknLayoutScalable_Avkon::heading_sub_pane(); // with heading + + TRect rectInfoPane = RectFromLayout( rectPopUpWindow, infoPaneLayout ); + TRect rectHeadingPane = RectFromLayout( rectPopUpWindow, headingPaneLayout ); + TInt rectHeight = rectInfoPane.Height() + rectHeadingPane.Height(); + + return TSize( rectWidth, rectHeight ); +#else + return TSize(); +#endif // RD_SCALABLE_UI_V2 + } + + +// ----------------------------------------------------------------------------- +// From class CCoeControl. +// CAknStylusActivatedPopUpContent::SizeChanged +// ----------------------------------------------------------------------------- +// +EXPORT_C void CAknStylusActivatedPopUpContent::SizeChanged() + { +#ifdef RD_SCALABLE_UI_V2 + TInt nbrOfInfoLines = 0; + if( iText ) + { + nbrOfInfoLines = iText->NumberOfLines(); + } + TInt nbrOfCmdLines = iLinkArray.Count(); + + TInt variety = GetVariety( nbrOfInfoLines + nbrOfCmdLines ); + + TRect rectHeadingSubPane( AlignedRectFromLayout( + AknLayoutScalable_Avkon::heading_sub_pane() ) ); + + TAknLayoutText layoutText; + layoutText.LayoutText( rectHeadingSubPane, + AknLayoutScalable_Avkon::heading_sub_pane_t1() ); + + iTitleText->SetRect( layoutText.TextRect() ); + iTitleText->SetFont( layoutText.Font() ); + + TAknTextLineLayout textLayout; + TRect rectSingleInfoPane; + TInt textrow = 0; + + // with heading + TRect rectInfoPane( AlignedRectFromLayout( + AknLayoutScalable_Avkon::list_touch_info_pane( 1 ) ) ); + + if( iText ) + { + iText->SetRect( rectInfoPane ); + textLayout = + AknLayoutScalable_Avkon::list_single_touch_info_pane_t1(); + TAknLayoutText layoutText; + + // set rects/layouts for info text lines + for ( ; textrow < nbrOfInfoLines; textrow++ ) + { + rectSingleInfoPane = RectFromLayout( rectInfoPane, + AknLayoutScalable_Avkon::list_single_touch_info_pane( textrow ) ); + layoutText.LayoutText( rectSingleInfoPane, textLayout ); + iText->Line( textrow )->SetRect( layoutText.TextRect() ); + iText->Line( textrow )->SetFont( layoutText.Font() ); + } + } + + // layout data for cmd texts + textLayout = AknLayoutScalable_Avkon::list_single_touch_info_pane_t2(); + + // set rects/layouts for cmd links + for ( TInt i = 0; i < nbrOfCmdLines; i++ ) + { + rectSingleInfoPane = RectFromLayout( rectInfoPane, + AknLayoutScalable_Avkon::list_single_touch_info_pane( textrow++ ) ); + + layoutText.LayoutText( rectSingleInfoPane, textLayout ); + if ( i == 0 ) + { + iFont = layoutText.Font(); + } + TInt tempWidth = iFont->TextWidthInPixels( *(iLinkArray[i]->iText) ); + TRect tempRect = TRect( layoutText.TextRect() ); + tempRect.SetWidth( Min( tempWidth, layoutText.TextRect().Width() ) ); + + iLinkArray[i]->iRect = tempRect; + } +#endif // RD_SCALABLE_UI_V2 + } + +// ----------------------------------------------------------------------------- +// RectFromLayout +// ----------------------------------------------------------------------------- +// +TRect CAknStylusActivatedPopUpContent::RectFromLayout( const TRect& aParent, + const TAknWindowComponentLayout& aComponentLayout ) const + { + TAknWindowLineLayout lineLayout = aComponentLayout.LayoutLine(); + TAknLayoutRect layoutRect; + layoutRect.LayoutRect( aParent, lineLayout ); + return layoutRect.Rect(); + } + +// ----------------------------------------------------------------------------- +// PopUpWindowRectFromLayout +// ----------------------------------------------------------------------------- +// +TRect CAknStylusActivatedPopUpContent::PopUpWindowRectFromLayout( const + TAknWindowComponentLayout& aComponentLayout ) const + { + // get popup window width from the widest variety + TAknWindowLineLayout lineLayout = aComponentLayout.LayoutLine(); + lineLayout.iW = AknLayoutScalable_Avkon:: + popup_touch_info_window( 3 ).LayoutLine().iW; + TAknLayoutRect layoutRect; + layoutRect.LayoutRect( iAvkonAppUi->ApplicationRect(), lineLayout ); + + return layoutRect.Rect(); + } + +// ----------------------------------------------------------------------------- +// AlignedRectFromLayout +// ----------------------------------------------------------------------------- +// +TRect CAknStylusActivatedPopUpContent::AlignedRectFromLayout( + const TAknWindowComponentLayout& aComponentLayout ) const + { + TAknWindowLineLayout lineLayout = aComponentLayout.LayoutLine(); + TAknLayoutRect layoutRect; + + TRect rect( Rect() ); + layoutRect.LayoutRect( rect, lineLayout ); + + TRect result( rect.iTl.iX, layoutRect.Rect().iTl.iY - rect.iTl.iY, rect.iBr.iX, + layoutRect.Rect().iBr.iY - rect.iTl.iY ); + + return result; + } + +// ----------------------------------------------------------------------------- +// GetVariety +// ----------------------------------------------------------------------------- +// +TInt CAknStylusActivatedPopUpContent::GetVariety( const TInt aNbrOfLines ) + { + // Heading is mandatory -> varieties 0...3 are omitted + switch ( aNbrOfLines ) + { + case 1: + // 1 row of text (info/command) + return 4; + case 2: + // 2 rows of text (2 info / 2 cmds / 1 info, 1 cmds) + return 5; + case 3: + // 3 rows of text (1 info, 2 cmds / 2 info, 1 cmd) + return 6; + case 4: + // 4 rows of text (2 info, 2 cmds) + return 7; + default: + return 4; + } + } + + +// ----------------------------------------------------------------------------- +// From class CCoeControl +// CAknStylusActivatedPopUpContent::HandlePointerEventL +// ----------------------------------------------------------------------------- +// +void CAknStylusActivatedPopUpContent::HandlePointerEventL( + const TPointerEvent& aPointerEvent ) + { +#ifdef RD_SCALABLE_UI_V2 + for ( TInt i=0; i < iLinkArray.Count(); i++ ) + { + if ( iLinkArray[i]->iRect.Contains( aPointerEvent.iPosition ) ) + { + if ( iHighlightedItem != i ) + { + TInt previousItem = iHighlightedItem; + iHighlightedItem = i; + if ( previousItem != KNoItemHighlighted ) + { + DrawNow( iLinkArray[previousItem]->iRect ); + } + DrawNow( iLinkArray[iHighlightedItem]->iRect ); + } + if ( aPointerEvent.iType == TPointerEvent::EButton1Down ) + { + MTouchFeedback* feedback = MTouchFeedback::Instance(); + + if ( feedback ) + { + feedback->InstantFeedback( ETouchFeedbackBasic ); + } + } + + // Nofity command observer + if ( aPointerEvent.iType == TPointerEvent::EButton1Up ) + { + iCommandObserver->ProcessCommandL( iLinkArray[i]->iCommandId ); + } + } + } +#endif // RD_SCALABLE_UI_V2 + } +