locationsystemui/locationsysui/locutils/src/locphonenumberformat.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 14 Apr 2010 16:23:43 +0300
branchRCL_3
changeset 9 e000e7e1f1b1
parent 8 6fcbaa43369c
permissions -rw-r--r--
Revision: 201013 Kit: 201015

/*
* Copyright (c) 2002 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: 
*     Default implementation for number formatting.
*
*/


// INCLUDE FILES
#include <AknUtils.h>
#include <AknLayoutDef.h>
#include <AknLayout.lag>
#include <eikfrlbd.h>
#include <AknPhoneNumberGrouping.h>
#include "locphonenumberformat.h"

// CONSTANT DEFINITIONS

// maximum phone number length
const TInt KLocPhoneNumberMaxLen = 48;

// ============= CLOCPHONENUMBERFORMAT MEMBER FUNCTIONS ===================

// ---------------------------------------------------------------------------
// CLocPhoneNumberFormat::NewL
// ---------------------------------------------------------------------------
//
EXPORT_C CLocPhoneNumberFormat* CLocPhoneNumberFormat::NewL()
	{
	CLocPhoneNumberFormat *self = new ( ELeave ) CLocPhoneNumberFormat;
	CleanupStack::PushL(self);
	self->ConstructL();
	CleanupStack::Pop(self);
	return self;
	}

// ---------------------------------------------------------------------------
// CLocPhoneNumberFormat::ConstructL
// ---------------------------------------------------------------------------
//
void CLocPhoneNumberFormat::ConstructL()
	{
	iPNGEngine = CAknPhoneNumberGrouping::NewL(KLocPhoneNumberMaxLen);
    }

// ---------------------------------------------------------------------------
// CLocPhoneNumberFormat::CLocPhoneNumberFormat
// ---------------------------------------------------------------------------
//
CLocPhoneNumberFormat::CLocPhoneNumberFormat()
	{
    // Intentionally empty
	}

// ---------------------------------------------------------------------------
// CLocPhoneNumberFormat::~CLocPhoneNumberFormat
// ---------------------------------------------------------------------------
//
CLocPhoneNumberFormat::~CLocPhoneNumberFormat()
	{
	delete iPNGEngine;
	}

// ---------------------------------------------------------------------------
// CLocPhoneNumberFormat::PhoneNumberFormatL
// ---------------------------------------------------------------------------
//
TFormatResult CLocPhoneNumberFormat::PhoneNumberFormatL(
    const TDesC& aNumberToFormat,
    TDes& aFormattedString )
	{
	TFormatResult rc( EResultOK );
	if ( iPNGEngine->Set(aNumberToFormat) != KErrNone )
		{
		// If we cannot group the number then just return 
		// the ungrouped number
		return rc;
		}

	HBufC* groupedPhoneNumber = 
		HBufC::NewL(iPNGEngine->FormattedNumber().Length());
	// CAknPhoneNumberGrouping takes care of grouping based on the 
	// current settings. If the __SERIES60_PHONE_NUMBER_GROUPING 
	// feature flag is disabled then grouping is not done.
	
	TPtr grpPhoneNumberDesc = groupedPhoneNumber->Des();
	iPNGEngine->CopyFormattedNumber(grpPhoneNumberDesc);
	if (aFormattedString.MaxLength() < groupedPhoneNumber->Length())
		{
		// Store only as much as can be fitted into the resultant 
		// Descriptor
		rc = EResultTruncated;
		aFormattedString = 
			groupedPhoneNumber->Right( groupedPhoneNumber->Length() -
										(groupedPhoneNumber->Length() - 
										aFormattedString.MaxLength()) );
		}
	else
		{
		aFormattedString.Copy(*groupedPhoneNumber);
		}

	delete groupedPhoneNumber;
	return rc;
	}

// ---------------------------------------------------------------------------
// CLocPhoneNumberFormat::PhoneNumberGroupL
// ---------------------------------------------------------------------------
//	
EXPORT_C HBufC* CLocPhoneNumberFormat::PhoneNumberGroupL( const TDesC& aNumberToGroup )
    {
	if ( iPNGEngine->Set(aNumberToGroup) != KErrNone )
		{
		// If we cannot group the number then just return NULL
		return NULL;
		}

	HBufC* groupedPhoneNumber = HBufC::NewL(iPNGEngine->FormattedNumber().Length());
		
	// CAknPhoneNumberGrouping takes care of grouping based on the 
	// current settings. If the __SERIES60_PHONE_NUMBER_GROUPING 
	// feature flag is disabled then grouping is not done.
	
	TPtr grpPhoneNumberDesc = groupedPhoneNumber->Des();
	iPNGEngine->CopyFormattedNumber( grpPhoneNumberDesc );
	
	return groupedPhoneNumber;	
    }

// ---------------------------------------------------------------------------
// CLocPhoneNumberFormat::PhoneNumberFormatL
// ---------------------------------------------------------------------------
//
EXPORT_C TFormatResult CLocPhoneNumberFormat::PhoneNumberFormatL(
    const TDesC& aNumberToFormat,
    TDes& aFormattedString,
    AknTextUtils::TClipDirection aClipDirection,
    CEikFormattedCellListBox *aListBox,
    TInt aItemIndex,
    TInt aSubCellNumber,
    TInt aIcons )
	{
	TFormatResult rc = PhoneNumberFormatL( aNumberToFormat, aFormattedString );
    if (aIcons == 0)
    	{
  		// There is no Icon so just use the AknTextUtils API
   		if( AknTextUtils::ClipToFit( aFormattedString, aClipDirection, 
   										aListBox, aItemIndex,
   										aSubCellNumber ))
   			{
   			rc = EResultClipped;
   			}
    	}
	else
		{
		// Adjust for the Icon Space.
	    CFormattedCellListBoxData *data = 
	        aListBox->ItemDrawer()->FormattedCellData();
	    const CFont *font = data->Font( aListBox->ItemDrawer()->Properties( 
	                                            aItemIndex ), aSubCellNumber );
		
		//Obtain the layout parameters for this element from the Avkon Layout

	    TAknLayoutText textLayout;
	    textLayout.LayoutText(aListBox->Rect() , 
			AKN_LAYOUT_TEXT_List_pane_texts__menu_single__Line_1(aIcons));
	     
		TRect rect = textLayout.TextRect();
	    TInt width = rect.Width();

		TInt clipgap = data->SubCellTextClipGap( aSubCellNumber );

		if ( AknTextUtils::ClipToFit( aFormattedString, *font, width,
	                                  aClipDirection, width + clipgap ) )
			{
			rc = EResultClipped;
			}
		}
    return rc;
    }

//  End of File