diff -r 000000000000 -r 2f259fa3e83a uifw/EikStd/coctlsrc/AknPhoneNumberInlineTextSource.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/EikStd/coctlsrc/AknPhoneNumberInlineTextSource.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,196 @@ +/* +* Copyright (c) 2002-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: ?Description +* +*/ + + +// INCLUDE FILES + +#include "AknPhoneNumberInlineTextSource.h" +#include +#include + + +// MODULE TEMPLATES + +// MODULE DATA STRUCTURES + +// ============================ MEMBER FUNCTIONS =============================== + +//////////////////////////////////////////////////////////////////////////////// +// +// CAknPhoneNumberInlineTextSource +// +//////////////////////////////////////////////////////////////////////////////// + +CAknPhoneNumberInlineTextSource::CAknPhoneNumberInlineTextSource( const CPlainText& aText ) + : CAknInlineTextSource(), iText(aText) + {} + +CAknPhoneNumberInlineTextSource::~CAknPhoneNumberInlineTextSource() + { + delete iPhoneNumberGrouping; + } + +const CPlainText& CAknPhoneNumberInlineTextSource::Text() const + { + return iText; + } + +CPNGNumberGrouping* CAknPhoneNumberInlineTextSource::PhoneNumberGrouping() const + { + return iPhoneNumberGrouping; + } + +void CAknPhoneNumberInlineTextSource::ConstructNumberGroupingEngineL( TInt aMaxFormattedLength ) + { + // This ordering in order to guarantee that once we have a valid iPhoneNumberGrouping, + // we never lose it. + CPNGNumberGrouping* phoneNumberGrouping = CPNGNumberGrouping::NewL( aMaxFormattedLength ,EFalse ); + delete iPhoneNumberGrouping; // Can be deleted since the NewL did not leave + iPhoneNumberGrouping = phoneNumberGrouping; + } + +void CAknPhoneNumberInlineTextSource::FormatPhoneNumberL( const TDesC& aPhoneNumberBuf, TInt aOffset ) + { + TInt inputCount = aPhoneNumberBuf.Length(); + + // Check if the number grouping engine needs to be re-created: + if ( inputCount > iPhoneNumberGrouping->MaxDisplayLength() ) + { + ConstructNumberGroupingEngineL( 2 * inputCount ); // Arbitrary but reasonable increase factor of 2 + } + + iPhoneNumberGrouping->Set( aPhoneNumberBuf ); + (void)iPhoneNumberGrouping->FormattedNumber(); + if ( iPhoneNumberGrouping->IsChangedByGrouping() ) + { + TInt count = iPhoneNumberGrouping->Length(); + TInt spaceCount = 0; // Accumulates spaces + for ( TInt index = 0; index < count; index++ ) + { + if ( iPhoneNumberGrouping->IsCharacterInsertedByNumberGrouping( index ) ) + { + spaceCount++; + TTmDocPos docPos; + docPos.iLeadingEdge = EFalse; // Trailing edge; + if ( index == 0 ) // Use leading edge for the firt position + docPos.iLeadingEdge = ETrue; + docPos.iPos = aOffset + index - spaceCount + 1; // +1 because it is trailing edge + TPtrC ptr( iPhoneNumberGrouping->FormattedNumber().Ptr()+index, 1 ); // handling one character at a time + CAknPositionedInlineText* inlineText = + CAknPositionedInlineText::NewL( docPos, ptr ); + CleanupStack::PushL( inlineText ); + InlineTextStore()->InsertInlineTextL( inlineText ); // Ownership is passed in + CleanupStack::Pop(); // inlineText + } + } + } + } + +//////////////////////////////////////////////////////////////////////////////// +// +// CAknPlainPhoneNumberInlineTextSource +// +//////////////////////////////////////////////////////////////////////////////// + +const TInt KInitialPlainPhoneNumberGroupingSize(10); // Good enough for 10 digit 123 456 7890 + + +EXPORT_C CAknPlainPhoneNumberInlineTextSource* CAknPlainPhoneNumberInlineTextSource::NewL( + const CPlainText& aText ) + { + CAknPlainPhoneNumberInlineTextSource* self = + new (ELeave) CAknPlainPhoneNumberInlineTextSource( aText ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +CAknPlainPhoneNumberInlineTextSource::CAknPlainPhoneNumberInlineTextSource( const CPlainText& aText ) + : CAknPhoneNumberInlineTextSource(aText) + {} + +CAknPlainPhoneNumberInlineTextSource::~CAknPlainPhoneNumberInlineTextSource() + { + } + +void CAknPlainPhoneNumberInlineTextSource::ConstructL() + { + ConstructNumberGroupingEngineL( KInitialPlainPhoneNumberGroupingSize ); + CAknInlineTextSource::ConstructL(); + } + +TPtrC CAknPlainPhoneNumberInlineTextSource::PhoneNumberFromEditor(TInt& aStartPos) const + { + // Using DocumentLength() avoids including the 0x2029 (end of paragraph) + // character at the end + TInt length = Text().DocumentLength(); + aStartPos = 0; + + for(TInt i = 0; i < length; i++ ) + { + TBuf<1> buf(Text().Read(i, 1 )); + TLex lex(buf); + TInt num = 0; + //TBuf to TInt + TInt res = lex.Val(num); + + if(KErrNone != res) + { + aStartPos = i + 1; + } + } + + return Text().Read(aStartPos, length - aStartPos ); + } + +/* + * This dictates the update policy. Formatting is triggered every call to CheckFormatting + * + */ +void CAknPlainPhoneNumberInlineTextSource::CheckFormattingL(const TTmDocPos& /*aFrom*/, const TTmDocPos& /*aTo*/ ) + { + DoFormatL(); + } + +void CAknPlainPhoneNumberInlineTextSource::DoFormatL() + { + + if ( ( Text().DocumentLength() != StoredNumberLength() ) || + ( CompareTextWithUnformattedNumber() != 0 ) ) + { + // Clear whole buffer + InlineTextStore()->Clear(); + TInt sartPos = 0; + TPtrC phoneNumberPtr = PhoneNumberFromEditor(sartPos); + + FormatPhoneNumberL( phoneNumberPtr, sartPos); + } + } + +TInt CAknPlainPhoneNumberInlineTextSource::CompareTextWithUnformattedNumber() const + { + TInt sartPos = 0; + return PhoneNumberFromEditor(sartPos).Compare( PhoneNumberGrouping()->UnFormattedNumber() ); + } + +TInt CAknPlainPhoneNumberInlineTextSource::StoredNumberLength() const + { + return PhoneNumberGrouping()->UnFormattedNumber().Length(); + } + +// End of File