uifw/AvKon/src/AknTextDecorationMetrics.cpp
changeset 0 2f259fa3e83a
--- /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