--- /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 <NumberGrouping.h>
+#include <eikedwin.h>
+
+
+// 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