diff -r 000000000000 -r 15bf7259bb7c uiacceltk/hitchcock/Client/src/alflayoutmetrics.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uiacceltk/hitchcock/Client/src/alflayoutmetrics.cpp Tue Feb 02 07:56:43 2010 +0200 @@ -0,0 +1,713 @@ +/* +* Copyright (c) 2006 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: Layout metrics +* +*/ + + + +#include "alf/alflayoutmetrics.h" +#include "alf/alftextstylemanager.h" +#include "alf/alftextstyle.h" +#include "alf/alftextvisual.h" +#include "alf/alfvisual.h" +#include "alf/alfutil.h" +#include "alf/alfenv.h" +#include "alfclient.h" + +#include +#include +#include +#include + + +_LIT(KHeader,"Comp Type|id|variety|name|Alias|type|Width|Height|Left|Right|Top|Bottom|Remarks|parent_id|parent_variety|Multi Row|Number of rows|style 1|style 2|style 3|Concatenated rows"); +_LIT(KDelimeterChar,"|"); +_LIT(KTypeText,"Text"); +_LIT(KTypePane,"Pane"); +_LIT(KVariety,"0"); +_LIT(KFontPrimary,"qfn_primary"); +_LIT(KFontPrimarySmall,"qfn_primary_small"); +_LIT(KFontSecondary,"qfn_secondary"); +_LIT(KFontTitle,"qfn_title"); +_LIT(KFontDigital,"qfn_digital"); +_LIT(KFontEmpty," "); +_LIT(KFontUnknown,"unknown font"); +_LIT(KRemarks," "); +_LIT(KParentVariety,"0"); +_LIT(KMultiRowYes,"true"); +_LIT(KMultiRowNo,"-"); +_LIT(KNumberOfRowsNone,"-"); +_LIT(KStyle1Plain,"plain"); +_LIT(KStyle1Bold,"bold"); +_LIT(KStyle1Empty,"-"); +_LIT(KStyle2Regular,"regular"); +_LIT(KStyle2Italic,"italic"); +_LIT(KStyle2Empty,"-"); +_LIT(KStyle3None,"none"); +_LIT(KStyle3Empty,"-"); +_LIT(KStyleConcatenatedRowsDefault,"true"); +_LIT(KStyleConcatenatedRowsEmpty,"-"); +_LIT(KNewLine,"\n"); +_LIT(KReportFileNameDefaultStart, "\\pqp_apps_"); +_LIT(KReportFileNameDefaultLscEnd, "_lsc.txt"); +_LIT(KReportFileNameDefaultPrtEnd, "_prt.txt"); + + + +const TInt KParentIdStart = 200000; +const TInt KIdStart = 100000; + + +struct TMarkedVisualEntry + { + public: + ~TMarkedVisualEntry() + { + } + TMarkedVisualEntry(): + iLogicalName(NULL), + iAlias(NULL), + iVisual(NULL), + iTextSize(0,0), + iMaxLineCount(0), + iFontId(0), + iTextStyle(EAlfTextStyleNotAHuiStyle), + iVisualPosition(0,0), + iVisualSize(0,0) + { + } + + HBufC* iLogicalName; + HBufC* iAlias; + CAlfTextVisual* iVisual; + TSize iTextSize; + TInt iMaxLineCount; + TInt iFontId; + TAlfPreconfiguredTextStyle iTextStyle; + TPoint iVisualPosition; + TPoint iVisualSize; + }; + +struct CAlfLayoutMetricsUtility::TMetricsPrivateData + { + RArray iEntries; // Owned + TBool iAutoMarking; + CAlfEnv* iEnv; + }; + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// Constructor +// --------------------------------------------------------------------------- +// +CAlfLayoutMetricsUtility::CAlfLayoutMetricsUtility() + { + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CAlfLayoutMetricsUtility::~CAlfLayoutMetricsUtility() + { + if ( iMetricsData ) + { + TInt count = iMetricsData->iEntries.Count(); + for(TInt i = 0; i < count; i++) + { + delete iMetricsData->iEntries[i].iLogicalName; + iMetricsData->iEntries[i].iLogicalName = NULL; + + delete iMetricsData->iEntries[i].iAlias; + iMetricsData->iEntries[i].iAlias = NULL; + } + iMetricsData->iEntries.Close(); + } + + delete iMetricsData; + iMetricsData = NULL; + } + +// --------------------------------------------------------------------------- +// ?description +// --------------------------------------------------------------------------- +// +CAlfLayoutMetricsUtility* CAlfLayoutMetricsUtility::NewL(CAlfEnv& aEnv) + { + CAlfLayoutMetricsUtility* self = + CAlfLayoutMetricsUtility::NewLC(aEnv); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// ?description +// --------------------------------------------------------------------------- +// +CAlfLayoutMetricsUtility* CAlfLayoutMetricsUtility::NewLC(CAlfEnv& aEnv) + { + CAlfLayoutMetricsUtility* self = new( ELeave ) CAlfLayoutMetricsUtility; + CleanupStack::PushL( self ); + self->ConstructL(aEnv); + return self; + } + +// --------------------------------------------------------------------------- +// ?description +// --------------------------------------------------------------------------- +// +void CAlfLayoutMetricsUtility::ConstructL(CAlfEnv& aEnv) + { + iMetricsData = new (ELeave) TMetricsPrivateData; + iMetricsData->iAutoMarking = EFalse; + iMetricsData->iEnv = &aEnv; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +EXPORT_C void CAlfLayoutMetricsUtility::MarkVisual(TDesC* aLogicalName, + CAlfTextVisual* aVisual) + { + TRAP_IGNORE(MarkVisualL(aLogicalName, aVisual)) + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CAlfLayoutMetricsUtility::MarkVisualL(TDesC* aLogicalName, + CAlfTextVisual* aVisual) + { + TInt count = iMetricsData->iEntries.Count(); + for(TInt i = 0; i < count; i++) + { + if (aVisual == iMetricsData->iEntries[i].iVisual) + { + delete iMetricsData->iEntries[i].iLogicalName; + iMetricsData->iEntries[i].iLogicalName = NULL; + + delete iMetricsData->iEntries[i].iAlias; + iMetricsData->iEntries[i].iAlias = NULL; + + iMetricsData->iEntries.Remove(i); + break; + } + } + + TMarkedVisualEntry entry; + if (aLogicalName) + { + entry.iLogicalName = aLogicalName->AllocL(); + } + + entry.iVisual = aVisual; + iMetricsData->iEntries.Append(entry); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +EXPORT_C void CAlfLayoutMetricsUtility::UnmarkVisual(CAlfTextVisual* aVisual) + { + TInt count = iMetricsData->iEntries.Count(); + for(TInt i = 0; i < count; i++) + { + if (aVisual == iMetricsData->iEntries[i].iVisual) + { + delete iMetricsData->iEntries[i].iLogicalName; + iMetricsData->iEntries[i].iLogicalName = NULL; + + delete iMetricsData->iEntries[i].iAlias; + iMetricsData->iEntries[i].iAlias = NULL; + + iMetricsData->iEntries.Remove(i); + break; + } + } + + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +EXPORT_C void CAlfLayoutMetricsUtility::MeasureVisuals() + { + TRAP_IGNORE(MeasureVisualsL()) + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CAlfLayoutMetricsUtility::MeasureVisualsL() + { + TInt count = iMetricsData->iEntries.Count(); + for(TInt i = 0; i < count; i++) + { + CAlfTextVisual* visual = iMetricsData->iEntries[i].iVisual; + if (visual->EffectiveOpacity() > 0.0) + { + iMetricsData->iEntries[i].iTextSize = + TSize(visual->Size().IntValueNow().iX - visual->HorizontalPadding()*2, + visual->TextExtents().iHeight); + + iMetricsData->iEntries[i].iMaxLineCount = visual->MaxLineCount(); + // iMetricsData->iEntries[i].iFontId = visual->FontId(); + // CAlfTextVisual::FontId() has been deprecated for long and returns only zero. + iMetricsData->iEntries[i].iFontId = 0; + iMetricsData->iEntries[i].iTextStyle = visual->Style(); + iMetricsData->iEntries[i].iVisualPosition = visual->Pos().IntValueNow(); + iMetricsData->iEntries[i].iVisualPosition.iX += visual->HorizontalPadding(); + iMetricsData->iEntries[i].iVisualSize = visual->Size().IntValueNow(); + iMetricsData->iEntries[i].iVisualSize.iX -= visual->HorizontalPadding(); + + delete iMetricsData->iEntries[i].iAlias; + iMetricsData->iEntries[i].iAlias = NULL; + iMetricsData->iEntries[i].iAlias = visual->Text().AllocL(); + + if (!iMetricsData->iEntries[i].iLogicalName) + { + iMetricsData->iEntries[i].iLogicalName = visual->Text().AllocL(); + } + + // If max linecount has not been set to textvisual, + // we kindly here calculate it. + if (iMetricsData->iEntries[i].iMaxLineCount > 1) + { + if (iMetricsData->iEntries[i].iMaxLineCount == KMaxTInt && + iMetricsData->iEntries[i].iTextSize.iHeight) + { + iMetricsData->iEntries[i].iMaxLineCount = + iMetricsData->iEntries[i].iVisualSize.iY/iMetricsData->iEntries[i].iTextSize.iHeight; + } + } + } + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +EXPORT_C void CAlfLayoutMetricsUtility::EnableAutoMarking(TBool aEnabled) + { + iMetricsData->iAutoMarking = aEnabled; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +EXPORT_C TBool CAlfLayoutMetricsUtility::AutoMarking() + { + return iMetricsData->iAutoMarking; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +EXPORT_C void CAlfLayoutMetricsUtility::WriteReport() + { + TBuf<512> b; + + b.Zero(); + b.Append(KHeader); + b.Append(KNewLine); + + PrintToFile(b); + + TInt count = iMetricsData->iEntries.Count(); + for(TInt i = 0; i < count; i++) + { + TMarkedVisualEntry e = iMetricsData->iEntries[i]; + + TSize screensize = AlfUtil::ScreenSize(); + + const TDesC* multiRow = &KMultiRowNo; + TBuf<12> rows; + rows.Zero(); + + if (e.iMaxLineCount > 1) + { + multiRow = &KMultiRowYes; + rows.AppendNum(e.iMaxLineCount); + } + else + { + rows.Append( KNumberOfRowsNone ); + } + + + TBuf<64> font; + font.Zero(); + + TBuf<64> style1; + style1.Zero(); + + TBuf<64> style2; + style2.Zero(); + + TBuf<64> style3; + style3.Zero(); + + if (e.iFontId) + { + // We use secret knowledge to decode font id + const TUint encodedMask = 0x80000000; // 1 bits starting at bit 31 = 1000.0000.0000.0000.0000.0000.0000.0000 + const TUint categoryMask = 0x0000000F; // 4 bits starting at bit 0 = 0000.0000.0000.0000.0000.0000.0000.1111 + const TUint weightMask = 0x00000010; // 1 bits starting at bit 4 = 0000.0000.0000.0000.0000.0000.0001.0000 + const TUint postureMask = 0x00000020; // 1 bits starting at bit 5 = 0000.0000.0000.0000.0000.0000.0010.0000 + + if ((e.iFontId & encodedMask) != 0) + { + TInt category = (e.iFontId & categoryMask); + { + if (category == KAknFontCategoryPrimary) + { + font.Append(KFontPrimary); + } + else if (category == KAknFontCategorySecondary) + { + font.Append(KFontSecondary); + } + else if (category == KAknFontCategoryTitle) + { + font.Append(KFontTitle); + } + else if (category == KAknFontCategoryPrimarySmall) + { + font.Append(KFontPrimarySmall); + } + else if (category == KAknFontCategoryDigital) + { + font.Append(KFontDigital); + } + else + { + font.Append(KFontUnknown); + } + } + + TInt weight = (e.iFontId & weightMask) >> 4; + if (weight == EStrokeWeightBold) + { + style1.Append(KStyle1Bold); + } + else + { + style1.Append(KStyle1Plain); + } + + TInt posture = (e.iFontId & postureMask) >> 5; + if (posture == EPostureItalic) + { + style2.Append(KStyle2Italic); + } + else + { + style2.Append(KStyle2Regular); + } + + style3.Append(KStyle3None); + } + else + { + font.Append(KFontUnknown); + style1.Append(KStyle1Plain); + style2.Append(KStyle2Regular); + style3.Append(KStyle3None); + } + } + else + { + TInt fontStyleId = 0; + iMetricsData->iEnv->Client().LayoutMetricsTextStyleData(fontStyleId, e.iTextStyle); + + CAlfTextStyleManager* tsm = &iMetricsData->iEnv->TextStyleManager(); + CAlfTextStyle* ts = tsm->TextStyle(e.iTextStyle); + + if (ts->IsBold()) + { + style1.Append(KStyle1Bold); + } + else + { + style1.Append(KStyle1Plain); + } + + if (ts->IsItalic()) + { + style2.Append(KStyle2Italic); + } + else + { + style2.Append(KStyle2Regular); + } + + style3.Append(KStyle3None); + + switch (fontStyleId) + { + case EAknLogicalFontPrimaryFont: + { + font.Append(KFontPrimary); + break; + } + case EAknLogicalFontSecondaryFont: + { + font.Append(KFontSecondary); + break; + } + case EAknLogicalFontTitleFont: + { + font.Append(KFontTitle); + break; + } + case EAknLogicalFontPrimarySmallFont: + { + font.Append(KFontPrimarySmall); + break; + } + case EAknLogicalFontDigitalFont: + { + font.Append(KFontDigital); + break; + } + default: + { + font.Append(KFontPrimary); + break; + } + } + } + + b.Zero(); + b.Append( KTypeText ); + b.Append( KDelimeterChar ); + b.AppendNum( i + KIdStart ); + b.Append( KDelimeterChar ); + b.Append( KVariety ); + b.Append( KDelimeterChar ); + b.Append( (_L("%S"), *e.iLogicalName)); + b.Append( KDelimeterChar ); + b.Append( (_L("%S"), *e.iAlias)); + b.Append( KDelimeterChar ); + b.Append( font ); + b.Append( KDelimeterChar ); + b.AppendNum( e.iTextSize.iWidth ); + b.Append( KDelimeterChar ); + b.AppendNum( e.iTextSize.iHeight ); + b.Append( KDelimeterChar ); + b.AppendNum( e.iVisualPosition.iX ); + b.Append( KDelimeterChar ); + b.AppendNum( screensize.iWidth - e.iVisualPosition.iX - e.iVisualSize.iX ); + b.Append( KDelimeterChar ); + b.AppendNum( e.iVisualPosition.iY ); + b.Append( KDelimeterChar ); + b.AppendNum( screensize.iHeight - e.iVisualPosition.iY - e.iVisualSize.iY ); + b.Append( KDelimeterChar ); + b.Append( KRemarks ); + b.Append( KDelimeterChar ); + if (e.iMaxLineCount > 1) + { + b.AppendNum( i + KParentIdStart ); + } + else + { + b.Append( KParentVariety ); + } + b.Append( KDelimeterChar ); + b.AppendNum( 0 ); // Parent variety, always 0 + b.Append( KDelimeterChar ); + b.Append( KMultiRowNo ); // Multi row attribute is in the parent pane + b.Append( KDelimeterChar ); + b.Append( KNumberOfRowsNone ); // Number of rows attribute is in the parent pane + b.Append( KDelimeterChar ); + b.Append( style1 ); + b.Append( KDelimeterChar ); + b.Append( style2 ); + b.Append( KDelimeterChar ); + b.Append( style3 ); + b.Append( KDelimeterChar ); + b.Append( KStyleConcatenatedRowsDefault ); + b.Append( KNewLine ); + + PrintToFile(b); + + // For multirow texts a parent pane is needed. + if (e.iMaxLineCount > 1) + { + b.Zero(); + b.Append( KTypePane ); + b.Append( KDelimeterChar ); + b.AppendNum( i + KParentIdStart ); + b.Append( KDelimeterChar ); + b.Append( KVariety ); + b.Append( KDelimeterChar ); + b.Append( (_L("%S"), *e.iLogicalName)); + b.Append( _L("_parent_pane")); + b.Append( KDelimeterChar ); + b.Append( _L("Parent pane for ")); + b.Append( (_L("%S"), *e.iLogicalName)); + b.Append( _L(" (multirow text)")); + b.Append( KDelimeterChar ); + b.Append( KFontEmpty ); + b.Append( KDelimeterChar ); + b.AppendNum( e.iTextSize.iWidth ); + b.Append( KDelimeterChar ); + b.AppendNum(e.iVisualSize.iY ); + b.Append( KDelimeterChar ); + b.AppendNum( e.iVisualPosition.iX ); + b.Append( KDelimeterChar ); + b.AppendNum( screensize.iWidth - e.iVisualPosition.iX - e.iVisualSize.iX ); + b.Append( KDelimeterChar ); + b.AppendNum( e.iVisualPosition.iY ); + b.Append( KDelimeterChar ); + b.AppendNum( screensize.iHeight - e.iVisualPosition.iY - e.iVisualSize.iY ); + b.Append( KDelimeterChar ); + b.Append( KRemarks ); + b.Append( KDelimeterChar ); + b.AppendNum( 0 ); + b.Append( KDelimeterChar ); + b.Append( KParentVariety ); + b.Append( KDelimeterChar ); + b.Append( *multiRow ); + b.Append( KDelimeterChar ); + b.Append( rows ); + b.Append( KDelimeterChar ); + b.Append( KStyle1Empty ); + b.Append( KDelimeterChar ); + b.Append( KStyle2Empty ); + b.Append( KDelimeterChar ); + b.Append( KStyle3Empty ); + b.Append( KDelimeterChar ); + b.Append( KStyleConcatenatedRowsEmpty ); + b.Append( KNewLine ); + PrintToFile(b); + } + } + } + + +// --------------------------------------------------------------------------- +// ?description +// --------------------------------------------------------------------------- +// +void CAlfLayoutMetricsUtility::PrintToFile( TDesC16& aBuf ) + { + RFs fs; + TBuf<512> filename; + filename.Zero(); + TSize screensize = AlfUtil::ScreenSize(); + filename.Append( KReportFileNameDefaultStart ); + if (screensize == TSize(240,320)) + { + filename.Append(_L("qvga")); + filename.Append(KReportFileNameDefaultPrtEnd); + } + else if (screensize == TSize(320,240)) + { + filename.Append(_L("qvga")); + filename.Append(KReportFileNameDefaultLscEnd); + } + else if (screensize == TSize(480,640)) + { + filename.Append(_L("vga")); + filename.Append(KReportFileNameDefaultPrtEnd); + } + else if (screensize == TSize(640,480)) + { + filename.Append(_L("vga")); + filename.Append(KReportFileNameDefaultLscEnd); + } + else if (screensize == TSize(360,640)) + { + filename.Append(_L("qhd")); + filename.Append(KReportFileNameDefaultPrtEnd); + } + else if (screensize == TSize(640,360)) + { + filename.Append(_L("qhd")); + filename.Append(KReportFileNameDefaultLscEnd); + } + else if (screensize == TSize(320,480)) + { + filename.Append(_L("hvga")); + filename.Append(KReportFileNameDefaultPrtEnd); + } + else if (screensize == TSize(480,320)) + { + filename.Append(_L("hvga")); + filename.Append(KReportFileNameDefaultLscEnd); + } + else + { + filename.AppendNum(screensize.iWidth); + filename.Append(_L("x")); + filename.AppendNum(screensize.iHeight); + if (screensize.iWidth < screensize.iHeight) + { + filename.Append(KReportFileNameDefaultPrtEnd); + } + else + { + filename.Append(KReportFileNameDefaultLscEnd); + } + } + + + if ( fs.Connect() == KErrNone ) + { + RFile file; + + // Open file in an exclusive mode so that only one thread + // can acess it simultaneously + TUint fileMode = EFileWrite | EFileShareExclusive; + + TInt err = file.Open( fs, filename, fileMode ); + + // Create a file if it doesn't exist + if ( err == KErrNotFound ) + { + err = file.Create( fs, filename, fileMode ); + } + + // Check if we have access to a file + if ( err == KErrNone ) + { + TInt offset = 0; + if ( file.Seek( ESeekEnd, offset ) == KErrNone ) + { + // Append text to the end of file + TPtr8 ptr8( (TUint8*)aBuf.Ptr(), aBuf.Size(), aBuf.Size() ); + file.Write( ptr8 ); + } + file.Close(); + } + + fs.Close(); + } + } + + +