--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook/View/src/CPbkFieldFormatter.cpp Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,221 @@
+/*
+* 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:
+* Provides methods for formatting a field for display.
+*
+*/
+
+
+// INCLUDE FILES
+#include "CPbkFieldFormatter.h" // This class
+#include "PbkFieldFormatterFactory.h"
+#include "MPbkPhoneNumberFormat.h"
+#include "TPbkContactItemField.h"
+#include "CPbkFieldInfo.h"
+#include "CPbkSyncronizationConstants.h"
+#include <AknUtils.h>
+#include <PbkView.rsg>
+
+// ==================== LOCAL FUNCTIONS ====================
+
+/// Unnamed namespace for this-file-only helper funtions
+namespace {
+
+// LOCAL CONSTANTS AND MACROS
+enum TPanicCode
+ {
+ EPanicPostCond_ReallocBufferL = 1
+ };
+
+#ifdef _DEBUG
+void Panic(TPanicCode aReason)
+ {
+ _LIT(KPanicText, "CPbkFieldFormatter");
+ User::Panic(KPanicText, aReason);
+ }
+#endif
+
+const TInt KBufferLength = 128;
+
+}
+
+// ================= MEMBER FUNCTIONS =======================
+
+inline CPbkFieldFormatter::CPbkFieldFormatter()
+ {
+ }
+
+inline void CPbkFieldFormatter::ConstructL()
+ {
+ iBuffer = HBufC::NewL(KBufferLength);
+ iNumberFormatter = PbkFieldFormatterFactory::CreatePhoneNumberFormatterL(
+ KBufferLength);
+ }
+
+CPbkFieldFormatter* CPbkFieldFormatter::NewL()
+ {
+ CPbkFieldFormatter* self = new(ELeave) CPbkFieldFormatter;
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CPbkFieldFormatter::~CPbkFieldFormatter()
+ {
+ delete iTimeFormat;
+ delete iNumberFormatter;
+ delete iBuffer;
+ }
+
+TPtrC CPbkFieldFormatter::FormatFieldContentL
+ (const TPbkContactItemField& aField)
+ {
+ TPtr text(iBuffer->Des());
+
+ switch (aField.PbkFieldType())
+ {
+ case KStorageTypeText:
+ {
+ if (aField.PbkFieldId() == EPbkFieldIdPersonalRingingToneIndication)
+ {
+ // Ringing tone filename is displayed without the extension
+ text.Set(ReallocBufferL(KMaxFileName));
+ text.Copy(aField.PbkFieldText());
+ TParsePtr fileNameParser(text);
+ TPtrC baseName(fileNameParser.Name());
+ text.Copy(baseName);
+ }
+ else if (aField.PbkFieldId() == EPbkFieldIdDTMFString)
+ {
+ TPtrC dtmfNumber(aField.PbkFieldText());
+ HBufC* numberBuffer = HBufC::NewLC(dtmfNumber.Length());
+ TPtr number = numberBuffer->Des();
+ number.Copy(dtmfNumber);
+ AknTextUtils::DisplayTextLanguageSpecificNumberConversion(number);
+ text.Set(ReallocBufferL(number.Length()));
+ text.Copy(number);
+ CleanupStack::PopAndDestroy(numberBuffer);
+ }
+ else if (aField.FieldInfo().IsPhoneNumberField())
+ {
+ TPtrC phoneNumber(aField.PbkFieldText());
+ iNumberFormatter->SetMaxBufferLengthL(phoneNumber.Length());
+ TPtrC formattedPhoneNumber(iNumberFormatter->FormatPhoneNumberForDisplay(phoneNumber));
+ text.Set(ReallocBufferL(formattedPhoneNumber.Length()));
+ text.Copy(formattedPhoneNumber);
+ }
+ else if (aField.PbkFieldId() == EPbkFieldIdSyncronization)
+ {
+ // localize syncronization field content
+ TPtrC syncFieldText(aField.PbkFieldText());
+ if (!syncFieldText.CompareF(KPbkContactSyncPublic))
+ {
+ HBufC* textBuffer = CCoeEnv::Static()->AllocReadResourceLC(
+ R_QTN_CALE_CONFIDENT_PUBLIC);
+ TPtr localizedSyncText = textBuffer->Des();
+ text.Set(ReallocBufferL(localizedSyncText.Length()));
+ text.Copy(localizedSyncText);
+ CleanupStack::PopAndDestroy(textBuffer);
+ }
+ else if (!syncFieldText.CompareF(KPbkContactSyncNoSync))
+ {
+ HBufC* textBuffer = CCoeEnv::Static()->AllocReadResourceLC(
+ R_QTN_CALE_CONFIDENT_NONE);
+ TPtr localizedSyncText = textBuffer->Des();
+ text.Set(ReallocBufferL(localizedSyncText.Length()));
+ text.Copy(localizedSyncText);
+ CleanupStack::PopAndDestroy(textBuffer);
+ }
+ else
+ {
+ // otherwise sync setting is the default value - private
+ HBufC* textBuffer = CCoeEnv::Static()->AllocReadResourceLC(
+ R_QTN_CALE_CONFIDENT_PRIVATE);
+ TPtr localizedSyncText = textBuffer->Des();
+ text.Set(ReallocBufferL(localizedSyncText.Length()));
+ text.Copy(localizedSyncText);
+ CleanupStack::PopAndDestroy(textBuffer);
+ }
+ }
+ else
+ {
+ TPtrC fieldText(aField.PbkFieldText());
+ text.Set(ReallocBufferL(fieldText.Length()));
+ text.Copy(fieldText);
+
+ // If field is numeric, language specific conversion is needed.
+ if (aField.FieldInfo().EditMode() == EPbkFieldEditModeNumeric )
+ {
+ AknTextUtils::DisplayTextLanguageSpecificNumberConversion(text);
+ }
+ }
+ break;
+ }
+
+ case KStorageTypeDateTime:
+ {
+ TInt error = KErrNone;
+ do
+ {
+ TRAP(error, aField.PbkFieldTime().FormatL(text, *iTimeFormat));
+ AknTextUtils::DisplayTextLanguageSpecificNumberConversion(text);
+ if (error == KErrOverflow)
+ {
+ // allocate bigger buffer for formatting text
+ text.Set(ReallocBufferL(2*text.MaxLength()));
+ }
+ else if (error)
+ {
+ // rethrow other errors
+ User::Leave(error);
+ }
+ } while (error == KErrOverflow);
+ break;
+ }
+
+ default:
+ {
+ text.Zero();
+ break;
+ }
+ }
+ return text;
+ }
+
+void CPbkFieldFormatter::SetTimeFormatL
+ (const TDesC& aTimeFormat)
+ {
+ HBufC* timeFormat = aTimeFormat.AllocL();
+ delete iTimeFormat;
+ iTimeFormat = timeFormat;
+ }
+
+TPtr CPbkFieldFormatter::ReallocBufferL
+ (TInt aNewSize)
+ {
+ const TInt currMaxLength = iBuffer->Des().MaxLength();
+ if (aNewSize > currMaxLength)
+ {
+ iBuffer = iBuffer->ReAllocL(aNewSize);
+ }
+
+ //PostCond:
+ __ASSERT_DEBUG(iBuffer->Des().MaxLength() >= aNewSize,
+ Panic(EPanicPostCond_ReallocBufferL));
+
+ return iBuffer->Des();
+ }
+
+// End of File