uiacceltk/hitchcock/coretoolkit/src/HuiTextMesh.cpp
changeset 0 15bf7259bb7c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiTextMesh.cpp	Tue Feb 02 07:56:43 2010 +0200
@@ -0,0 +1,373 @@
+/*
+* Copyright (c) 2006-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:   Implementation of CHuiTextMesh. CHuiTextMesh stores a cached 
+*                version of a text string.
+*
+*/
+
+
+ 
+#include <AknUtils.h>
+#include "alf/alfconstants.h"
+
+#include "uiacceltk/HuiTextMesh.h"
+#include "uiacceltk/HuiStatic.h"
+#include "uiacceltk/HuiFont.h"
+#include "uiacceltk/HuiTexture.h"
+#include "uiacceltk/HuiGc.h"
+#include "uiacceltk/HuiUtil.h"
+#include "uiacceltk/HuiPanic.h"
+#include "uiacceltk/HuiEnv.h"
+#include "uiacceltk/huitextstylemanager.h"
+#include "uiacceltk/huitextstyle.h"
+#include "uiacceltk/HuiDisplay.h"
+#include "HuiRosterImpl.h"
+
+  
+CHuiTextMesh::CHuiTextMesh()
+        : iTextStyleId(0),
+          iLineSpacing(0),        
+          iTextMeshScale(1.0),        
+          iLineMode(ELineModeTruncate),
+          iMaxLineWidth(KMaxTInt),
+          iScaledMaxLineWidth(KMaxTInt),
+          iMaxLineCount(KMaxTInt),          
+          iRasterizedShadow(EFalse)
+    {
+    }
+
+    
+void CHuiTextMesh::ConstructL()
+    {
+    // Register as observer
+    CHuiStatic::Env().iActionObservers.AppendL(*this);
+    RPointerArray<CHuiDisplay> displays = CHuiStatic::Env().Displays();
+    for(TInt i = 0; i<displays.Count(); i++)
+        {
+        displays[i]->iVisibleAreaObservers.AppendL(*this);
+        
+        if (displays[i]->IsDisplayTypeTvOut())
+            {
+            displays[i]->iDeletionObservers.AppendL(*this);
+            }
+        }
+    ReleaseFont();
+        
+    CalculateTvOutScales();
+    }
+   
+
+CHuiTextMesh::~CHuiTextMesh()
+    {
+    // Remove observers
+    CHuiStatic::Env().iActionObservers.RemoveIfFound(*this);
+    RPointerArray<CHuiDisplay> displays = CHuiStatic::Env().Displays();
+    for(TInt i = 0; i<displays.Count(); i++)
+        {
+        displays[i]->iVisibleAreaObservers.RemoveIfFound(*this);
+        
+        if (displays[i]->IsDisplayTypeTvOut())
+            {
+            displays[i]->iDeletionObservers.RemoveIfFound(*this);
+            }
+        }
+        
+    delete iString;
+    iPictographInterface = NULL;
+    }
+    
+    
+void CHuiTextMesh::Reset()
+    {
+    delete iString; 
+    iString = 0;
+    }
+
+
+void CHuiTextMesh::SetLineMode(TLineMode aLineMode)
+    {
+    iLineMode = aLineMode;
+    }
+    
+
+CHuiTextMesh::TLineMode CHuiTextMesh::LineMode() const
+    {
+    return iLineMode;
+    }
+
+
+TBool CHuiTextMesh::SetMaxLineWidth(TInt aMaxLineWidth)
+    {
+    // Note: this do not tell if only scaling has been changed.
+    TBool isDifferent = (iMaxLineWidth != aMaxLineWidth);
+    iMaxLineWidth = aMaxLineWidth;
+
+    // Max line width has to be scaled to get proper line wrapping
+    if(iTextMeshScale != 1 && aMaxLineWidth != KMaxTInt)
+        {
+        // Scale width with Y-scale to retain correct font proportions
+        iScaledMaxLineWidth = HUI_ROUND_FLOAT_TO_INT( aMaxLineWidth * iTextMeshScale );
+        } 
+
+    return isDifferent;
+    }
+
+
+TInt CHuiTextMesh::MaxLineWidth() const
+    {
+    if(iTextMeshScale != 1)
+        {
+        return iScaledMaxLineWidth;
+        } 
+
+    return iMaxLineWidth;
+    }
+
+
+TBool CHuiTextMesh::SetMaxLineCount(TInt aMaxLineCount)
+    {
+    TBool isDifferent = (iMaxLineCount != aMaxLineCount);
+    iMaxLineCount = aMaxLineCount;
+    return isDifferent;
+    }
+
+
+TInt CHuiTextMesh::MaxLineCount() const
+    {
+    return iMaxLineCount;
+    }
+      
+
+void CHuiTextMesh::SetFontL(const THuiFont& aFont, TBool aRefreshTextures)
+    {
+    THuiTextStyle* textStyle = CHuiStatic::Env().TextStyleManager().TextStyle(iTextStyleId);
+    textStyle->SetFont(aFont);
+    
+    if(iString && aRefreshTextures)
+        {
+        BuildL(ETrue);
+        }
+    }
+
+
+void CHuiTextMesh::SetTextL(const TDesC& aText, TBool aRasterize)
+    {
+    delete iString; iString = 0;
+    iString = aText.AllocL();
+
+    // Rasterize text into textures.
+    BuildL(aRasterize);    
+    }
+
+    
+const TDesC* CHuiTextMesh::Text() const
+    {
+    return iString;
+    }
+    
+    
+void CHuiTextMesh::EnableRasterizedShadow(const TBool aIsEnabled)
+    {
+    TBool isChanged = ETrue;
+    if ( (iRasterizedShadow && aIsEnabled) || 
+         ( !iRasterizedShadow && !aIsEnabled ) )
+        {
+        isChanged = EFalse;
+        }
+        
+    iRasterizedShadow = aIsEnabled;
+        
+    if(isChanged && iString)
+        {
+        // Status of rasterized shadow has changed.
+        // Assuming the sharp shadow is prerendered.
+        TRAP_IGNORE(BuildL(ETrue))
+        }
+    }
+   
+   
+TBool CHuiTextMesh::RasterizedShadow() const
+    {
+    if ( iVisual )
+        {
+        return TBool(iVisual->DropShadowHandler());
+        }
+    return iRasterizedShadow;
+    }
+     
+   
+TSize CHuiTextMesh::Extents() const
+    {
+    TSize extents = iExtents;
+    
+    if(iTextMeshScale != 1)
+        {
+        extents.iHeight = iScaledExtents.iHeight;
+        extents.iWidth = iScaledExtents.iWidth;
+        }
+    
+    return extents;
+    }
+    
+void CHuiTextMesh::ExpandRectWithShadow(TRect& /*aRect*/) const
+    {
+    }
+
+void CHuiTextMesh::SetExtents(const TSize& aExtents)
+    {
+    TBool isChanged = (iExtents != aExtents);
+    
+    iExtents = aExtents;
+    
+    if(iTextMeshScale != 1 && isChanged)
+        {
+        iScaledExtents.iHeight = HUI_ROUND_FLOAT_TO_INT( aExtents.iHeight/iTextMeshScale );
+        iScaledExtents.iWidth = HUI_ROUND_FLOAT_TO_INT( aExtents.iWidth/iTextMeshScale );
+        }
+    }
+
+
+void CHuiTextMesh::InitPictographsL(CAknPictographInterface* aInterface)
+    {
+    iPictographInterface = aInterface;    
+    }
+
+
+void CHuiTextMesh::SetTextStyle(TInt aTextStyleId)
+    {
+    iTextStyleId = aTextStyleId;
+    ReleaseFont(); 
+    }
+
+
+TInt CHuiTextMesh::TextStyle() const
+	{
+	return iTextStyleId;
+	}
+
+
+void CHuiTextMesh::BuildPictographsL()
+    {        
+    }
+
+
+void CHuiTextMesh::SetLineSpacing(TInt aLineSpacingInPixels)
+    {
+    iLineSpacing = aLineSpacingInPixels;
+    }
+    
+    
+void CHuiTextMesh::ReleaseFont()
+    {
+    THuiTextStyle* textStyle = CHuiStatic::Env().TextStyleManager().TextStyle(iTextStyleId);
+    textStyle->Font().ReleaseFont();
+    }
+    
+
+void CHuiTextMesh::CalculateTvOutScales()
+    {
+    // Calculate the TV Out scales
+    RPointerArray<CHuiDisplay> displays = CHuiStatic::Env().Displays();
+    for(TInt i = 0; i<CHuiStatic::Env().DisplayCount(); i++)
+        {
+        if (displays[i]->IsDisplayTypeTvOut())
+            {
+            // Scale with height to retain correct font proportions
+            iTextMeshScale = (TReal32)displays[i]->Size().iHeight / (TReal32)displays[i]->RosterImpl().Rect().Height();
+            }
+        }
+    }
+    
+    
+void CHuiTextMesh::NotifyDisplayVisibleAreaChanged(CHuiDisplay& aDisplay)
+    {
+    if (aDisplay.IsDisplayTypeTvOut())
+        {
+        iTextMeshScale = (TReal32)aDisplay.Size().iHeight / (TReal32)aDisplay.RosterImpl().Rect().Height();
+        }
+        
+    ReleaseFont();
+    }
+
+
+void CHuiTextMesh::NotifyDisplayDeletion(CHuiDisplay& aDisplay)
+    {
+    if (iString && aDisplay.IsDisplayTypeTvOut())
+        {
+        iTextMeshScale = 1.0;
+        ReleaseFont();
+        ResetLines();
+        ResetPictographLines();
+        // Updates the mesh and the extents
+        TRAP_IGNORE(BuildL(ETrue));
+        }
+    }
+
+
+void CHuiTextMesh::HandleActionL(const THuiActionCommand& aActionCommand)
+    {
+    if(aActionCommand.Id() == KHuiActionNewTVOutDisplayUid.iUid)
+        {
+        // find the TvOut display
+        RPointerArray<CHuiDisplay> displays = CHuiStatic::Env().Displays();
+        for(TInt i = 0; i<displays.Count(); i++)
+            {
+            if (displays[i]->IsDisplayTypeTvOut())
+                {
+                // Register as observer
+                displays[i]->iVisibleAreaObservers.AppendIfNotFoundL(*this);
+                displays[i]->iDeletionObservers.AppendIfNotFoundL(*this);
+                
+                // calculate new scale factors
+                CalculateTvOutScales();
+                }
+            }
+            
+        ReleaseFont();
+        ResetLines();
+        ResetPictographLines();
+        // Updates the mesh and the extents
+        if(Text() != NULL)
+            {
+            BuildL(ETrue);
+            }
+        }
+            
+    else if ( aActionCommand.Id() == KAknsMessageSkinChange )
+        {
+        // When the resolution/skin changes and this text visual is not in 
+        // the roster, the change notification is not received through the normal
+        // route aka CHuiVisual::NotifySkinChangedL() 
+        //
+        // Setting the iMaxLineWidth into -1 is a hack. It would be better to
+        // set the iMeshUpdated into EFalse in the CHuiTextVisual, but this class
+        // has no pointer to the owning text visual. The text visual calls the 
+        // SetMaxLineWidth function before it draws this mesh so the "changed" 
+        // notification is informed through that function call.
+        iMaxLineWidth = -1;
+        }
+    else
+        {
+        // For PC lint
+        }
+    }
+
+void CHuiTextMesh::SetRelatedVisual(CHuiVisual* aVisual)
+    {
+    iVisual = aVisual;
+    }
+
+void CHuiTextMesh::UpdateMeshL(const TDesC8& /*aBuffer*/)
+    {
+    }