--- /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 <AknUtils.h>
+#include <AknPanic.h>
+#include <AknPreviewPopUpController.h>
+#include <barsread.h> // TResourceReader
+#include <eiklabel.h>
+#include <fbs.h>
+#include <aknappui.h>
+#include <aknlayoutscalable_avkon.cdl.h>
+#include <AknsDrawUtils.h>
+#include <AknBidiTextUtils.h>
+#include <touchfeedback.h>
+
+#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<TAknContentLink>& 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<TAknContentLink>& /*&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<TAknContentLink> 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<TInt>* lineWidths
+ = new ( ELeave ) CArrayFixFlat<TInt>( 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<TInt>( 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<TAknContentLink>& 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<CEikLabel*>(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
+ }
+