--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/AvKon/src/AknTextDecorationMetrics.cpp Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,259 @@
+/*
+* Copyright (c) 2004 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: Series 60 text layout metrics
+*
+*/
+
+
+// INCLUDE FILES
+
+#include <CdlRefs.h>
+#include <avkon.hrh>
+#include <gdi.h>
+#include <aknenv.h>
+#include <aknlayout.cdl.h>
+#include <aknappui.h>
+#include <aknlayoutscalable_avkon.cdl.h> // Scalable layout API
+#include <AknUtils.h>
+#include <AknLayout2ScalableDef.h>
+
+#include "AknTextDecorationMetrics.h"
+#include <AknFontSpecification.h>
+#include <AknLayoutFont.h>
+
+// CONSTANTS
+
+/**
+* constants for setting defaults from screensize
+* Some of these are currently estimated using magic numbers:
+* - underline thickness
+* - underline position
+*/
+
+const TInt KUnderLineScreenHeight(400);
+
+
+//========================== MEMBER FUNCTIONS ===============================
+
+EXPORT_C TAknTextDecorationMetrics::TAknTextDecorationMetrics( TInt aFontId )
+ {
+ TAknFontSpecification spec( aFontId );
+ SetMetricsFromSizeAndBoldness( spec.FontCategory(), spec.TextPaneHeight(), spec.Weight() == EStrokeWeightBold );
+ }
+
+EXPORT_C TAknTextDecorationMetrics::TAknTextDecorationMetrics( const CFont* aFont )
+ {
+ if ( aFont )
+ {
+ TBool isBold = ( aFont->FontSpecInTwips().iFontStyle.StrokeWeight() != EStrokeWeightNormal );
+ const CAknLayoutFont* aknFont = CAknLayoutFont::AsCAknLayoutFontOrNull( aFont );
+ if ( aknFont )
+ {
+ SetMetricsFromSizeAndBoldness( aknFont->FontCategory(), aknFont->TextPaneHeight(), isBold );
+ }
+ else
+ {
+ SetMetricsFromSizeAndBoldness( EAknFontCategoryUndefined, aFont->FontMaxHeight(), isBold );
+ }
+ }
+ else
+ {
+ SetDefaultMetrics( EAknFontCategoryUndefined, EFalse);
+ }
+ }
+
+EXPORT_C TAknTextDecorationMetrics::TAknTextDecorationMetrics( const TAknFontSpecification& aSpecification )
+ {
+ TBool isBold = ( aSpecification.Weight() != EStrokeWeightNormal );
+ SetMetricsFromSizeAndBoldness( aSpecification.FontCategory(), aSpecification.TextPaneHeight(), isBold );
+ }
+
+EXPORT_C void TAknTextDecorationMetrics::GetLeftAndRightMargins( TInt& aLeft, TInt& aRight ) const
+ {
+ aLeft = iLeftMargin;
+ aRight = iRightMargin;
+ }
+
+EXPORT_C void TAknTextDecorationMetrics::GetTopAndBottomMargins( TInt& aTop, TInt& aBottom ) const
+ {
+ aTop = iTopMargin;
+ aBottom = iBottomMargin;
+ }
+
+EXPORT_C TInt TAknTextDecorationMetrics::CursorWidth() const
+ {
+ return iCursorWidth;
+ }
+
+EXPORT_C TInt TAknTextDecorationMetrics::BaselineToUnderlineOffset() const
+ {
+ return iBaselineToUnderlineOffset;
+ }
+
+EXPORT_C TInt TAknTextDecorationMetrics::UnderlineHeight() const
+ {
+ return iUnderlineHeight;
+ }
+
+void TAknTextDecorationMetrics::SetMetricsFromSizeAndBoldness( TAknFontCategory aCategory, TInt /*aHeight*/, TBool aIsBold )
+ {
+ // Currently font height independent
+ SetDefaultMetrics( aCategory, aIsBold );
+ }
+
+void TAknTextDecorationMetrics::SetDefaultMetrics( TAknFontCategory aCategory, TBool /*aIsBold*/ )
+ {
+ // Use screen for parent of the highlight and cursor layouts
+ TRect screen = iAvkonAppUi->ApplicationRect();
+
+ TAknWindowComponentLayout highlightParentPane;
+ TAknTextComponentLayout highlightTextPane;
+ TAknWindowComponentLayout highlightPane;
+
+ GetHighlightLayoutsFromCategory( aCategory, highlightParentPane, highlightTextPane, highlightPane );
+
+ TAknWindowLineLayout highlightParentWindowLayout = highlightParentPane.LayoutLine();
+ TAknWindowLineLayout highlightWindowLayout = highlightPane.LayoutLine();
+ TAknTextLineLayout highlightTextLayout = highlightTextPane.LayoutLine();
+
+ // Parent is positioned in the screen. This misses out 2 levels of the layout, but
+ // these are (and are necessarily so) dummy layers which cannot supply any real info.
+ TAknLayoutRect highlightParentRect;
+ highlightParentRect.LayoutRect( screen, highlightParentWindowLayout );
+ // two subcomponents are positioned in the parent:
+ TAknLayoutRect highlightLayoutRect;
+ highlightLayoutRect.LayoutRect( highlightParentRect.Rect(), highlightWindowLayout );
+ TAknLayoutText highlightLayoutText;
+ highlightLayoutText.LayoutText( highlightParentRect.Rect(), highlightTextLayout, NULL );
+
+ TRect textRect = highlightLayoutText.TextRect();
+ TRect highlightRect = highlightLayoutRect.Rect();
+ TRect parentRect = highlightParentRect.Rect();
+
+ iTopMargin = textRect.iTl.iY - highlightRect.iTl.iY;
+ iBottomMargin = highlightRect.iBr.iY - textRect.iBr.iY;
+ iLeftMargin = textRect.iTl.iX - parentRect.iTl.iX;
+ iRightMargin = parentRect.iBr.iX - textRect.iBr.iX;
+
+ // Cursor and underlines
+ TInt screenWidth = screen.Width();
+ TInt screenHeight = screen.Height();
+
+ TAknWindowComponentLayout cursorLayout;
+ TAknWindowComponentLayout cursorLayoutGraphic;
+ GetCursorLayoutsFromCategory( aCategory, cursorLayout, cursorLayoutGraphic );
+
+ TAknWindowLineLayout graphic = TAknWindowComponentLayout::Compose(cursorLayout, cursorLayoutGraphic).LayoutLine();
+ TAknLayoutRect cursor;
+ cursor.LayoutRect( screen, graphic );
+ iCursorWidth = cursor.Rect().Width();
+
+ //if screen height < 400, underline height is 1, else is 2 pixel;
+ iUnderlineHeight = (TInt8) ( screenHeight <= KUnderLineScreenHeight ? 1 : 2 );
+
+ iBaselineToUnderlineOffset = (TInt8) (Max(iBottomMargin,1) + iUnderlineHeight);
+ }
+
+void TAknTextDecorationMetrics::GetHighlightLayoutsFromCategory(
+ TAknFontCategory aCategory,
+ TAknWindowComponentLayout& aHighlightParentPane,
+ TAknTextComponentLayout& aHighlightTextPane,
+ TAknWindowComponentLayout& aHighlightPane ) const
+ {
+
+ switch( aCategory )
+ {
+ case (EAknFontCategoryPrimarySmall):
+ aHighlightParentPane =
+ AknLayoutScalable_Avkon::copy_highlight_primary_small_pane();
+ aHighlightTextPane =
+ AknLayoutScalable_Avkon::copy_highlight_primary_small_pane_t1();
+ aHighlightPane =
+ AknLayoutScalable_Avkon::copy_highlight_primary_small_pane_g1();
+ break;
+
+ case (EAknFontCategorySecondary):
+ aHighlightParentPane =
+ AknLayoutScalable_Avkon::copy_highlight_secondary_pane();
+ aHighlightTextPane =
+ AknLayoutScalable_Avkon::copy_highlight_secondary_pane_t1();
+ aHighlightPane =
+ AknLayoutScalable_Avkon::copy_highlight_secondary_pane_g1();
+ break;
+
+ case (EAknFontCategoryTitle):
+ aHighlightParentPane =
+ AknLayoutScalable_Avkon::copy_highlight_title_pane();
+ aHighlightTextPane =
+ AknLayoutScalable_Avkon::copy_highlight_title_pane_t1();
+ aHighlightPane =
+ AknLayoutScalable_Avkon::copy_highlight_title_pane_g1();
+ break;
+
+ case (EAknFontCategoryDigital):
+ aHighlightParentPane =
+ AknLayoutScalable_Avkon::copy_highlight_digital_pane();
+ aHighlightTextPane =
+ AknLayoutScalable_Avkon::copy_highlight_digital_pane_t1();
+ aHighlightPane =
+ AknLayoutScalable_Avkon::copy_highlight_digital_pane_g1();
+ break;
+
+ case (EAknFontCategoryPrimary): // Fall through
+ default: // Use Primary for all other cases
+ aHighlightParentPane =
+ AknLayoutScalable_Avkon::copy_highlight_primary_pane();
+ aHighlightTextPane =
+ AknLayoutScalable_Avkon::copy_highlight_primary_pane_t1();
+ aHighlightPane =
+ AknLayoutScalable_Avkon::copy_highlight_primary_pane_g1();
+ }
+ }
+
+void TAknTextDecorationMetrics::GetCursorLayoutsFromCategory(
+ TAknFontCategory aCategory,
+ TAknWindowComponentLayout& aCursorLayout,
+ TAknWindowComponentLayout& aCursorLayoutGraphic ) const
+ {
+ switch( aCategory )
+ {
+ case (EAknFontCategoryPrimarySmall):
+ aCursorLayout = AknLayoutScalable_Avkon::cursor_primary_small_pane();
+ aCursorLayoutGraphic = AknLayoutScalable_Avkon::cursor_primary_small_pane_g1();
+ break;
+
+ case (EAknFontCategorySecondary):
+ aCursorLayout = AknLayoutScalable_Avkon::cursor_secondary_pane();
+ // secondary uses primary small g1
+ aCursorLayoutGraphic = AknLayoutScalable_Avkon::cursor_primary_small_pane_g1();
+ break;
+
+ case (EAknFontCategoryTitle):
+ aCursorLayout = AknLayoutScalable_Avkon::cursor_title_pane();
+ aCursorLayoutGraphic = AknLayoutScalable_Avkon::cursor_title_pane_g1();
+ break;
+
+ case (EAknFontCategoryDigital):
+ aCursorLayout = AknLayoutScalable_Avkon::cursor_digital_pane();
+ aCursorLayoutGraphic = AknLayoutScalable_Avkon::cursor_digital_pane_g1();
+ break;
+
+ case (EAknFontCategoryPrimary): // Fall through
+ default: // Others default to primary
+ aCursorLayout = AknLayoutScalable_Avkon::cursor_primary_pane();
+ aCursorLayoutGraphic = AknLayoutScalable_Avkon::cursor_primary_pane_g1();
+ }
+ }
+
+// End of File