uifw/AvKon/src/akntext.cpp
changeset 0 2f259fa3e83a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/AvKon/src/akntext.cpp	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,255 @@
+/*
+* 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: 
+*     Stores and handles text labels for note dialogs. Each note dialog
+*     can have two different labels, one singular and one plural labels.
+*     For example:-
+*        "You have 1 new message" is the singular label and
+*        "You have 2 new messages" is the plural label.
+*     This class supports the ability to change number inside the label, e.g.:-
+*        "You have 100 new messages" is also supported.
+*
+*/
+
+
+#include <StringLoader.h>
+#include "AknPanic.h"
+#include "akntext.h"
+#include "AknUtils.h"
+
+
+_LIT(KNumberId, "%N");
+_LIT(KDigitId,  "%d");
+_LIT(KUnsignedId, "%U");
+
+CAknText::CAknText()
+	{
+	iPlurality = ENotSpecified;
+	iType      = ENotFormatted;
+	}
+
+CAknText::CAknText(const TType& aType) : iType(aType)
+	{
+	iPlurality = ENotSpecified;
+	}
+
+CAknText::~CAknText()
+	{
+	delete iUnformattedSingularText;
+	delete iUnformattedPluralText;
+	delete iText;
+	delete iTextCopy;
+	}
+	
+
+void CAknText::ConstructFromResourceL(TResourceReader& aRes)
+	{
+	if (iType == ENotFormatted)
+		{
+	    iUnformattedSingularText = aRes.ReadHBufCL();
+	    iUnformattedPluralText   = aRes.ReadHBufCL();
+
+	    if (iUnformattedSingularText)
+			iPlurality = ESingular;
+
+		if (iUnformattedPluralText && !iUnformattedSingularText)
+			iPlurality = EPlural;
+
+		FormatL();
+		}
+	else if (iType == EFormatted)
+		{
+		iText = aRes.ReadHBufCL();
+		if (iText)
+			iTextCopy = iText->Des().AllocL();
+		}
+	}
+
+CAknText& CAknText::operator=(CAknText& aNoteText)
+	{
+	if (&aNoteText == this)
+		return *this;
+
+	iType = aNoteText.iType;
+
+	if (aNoteText.iPlurality != ENotSpecified)
+		iPlurality = aNoteText.iPlurality;
+
+	if (aNoteText.iNumberHasBeenSet)
+		{
+		iNumber           = aNoteText.iNumber;
+		iNumberHasBeenSet = aNoteText.iNumberHasBeenSet;
+		}
+
+#define __TRANSFER_PTR_(P1,P2)  if (P1) { delete P2; P2 = P1; P1 = NULL; } 
+	
+	__TRANSFER_PTR_(aNoteText.iUnformattedSingularText,iUnformattedSingularText);
+	__TRANSFER_PTR_(aNoteText.iUnformattedPluralText,iUnformattedPluralText);
+	__TRANSFER_PTR_(aNoteText.iText,iText);
+	__TRANSFER_PTR_(aNoteText.iTextCopy,iTextCopy);
+	    
+#undef  __TRASFER_PTR_
+
+	TRAP_IGNORE(FormatL());
+	return *this;
+	}
+
+
+void CAknText::SetPluralityL(TBool aIsPlural)
+	{
+	iType = ENotFormatted;
+	if (aIsPlural)
+		iPlurality = EPlural;
+	else
+		iPlurality = ESingular;
+	FormatL();
+	}
+
+void CAknText::SetNumberL(TInt aNumber)
+	{
+	iType = ENotFormatted;
+	iNumberHasBeenSet = ETrue;
+	iNumber = aNumber;
+	SetPluralityL(iNumber > 1); 
+	}
+
+void CAknText::DoSetTextL(HBufC*& aBuffer, const TDesC& aText)
+	{
+	if (!aBuffer || aBuffer->Des().MaxLength() < aText.Length() )
+		{
+		delete aBuffer;
+		aBuffer = NULL;
+		aBuffer = aText.AllocL();
+		}
+	else 
+		{
+		*aBuffer = aText;
+		}
+	}
+
+void CAknText::SetL(const TDesC& aText)
+	{
+	if (TextIsNotFormatted(aText))
+		{
+		if (iPlurality == ESingular)
+			{
+			DoSetTextL(iUnformattedSingularText,aText);
+			}
+		else
+			{
+			DoSetTextL(iUnformattedPluralText,aText);
+			}
+		FormatL();
+		}
+	else
+		{
+		DoSetTextL(iText,aText);
+		DoSetTextL(iTextCopy,aText);
+		iType = EFormatted;
+		}
+	}
+
+/**
+ * Return a copy of the text, that the client can modify
+ */
+TPtr CAknText::Get() const
+	{
+	if (iText && iTextCopy)
+		{
+		if (iTextCopy->Des().MaxLength() >= iText->Des().Length())
+			{
+			*iTextCopy = *iText;
+			return iTextCopy->Des(); 
+			}
+		}
+	return TPtr(0,0);
+	}
+
+void CAknText::FormatL()
+	{
+	if (iType == EFormatted)
+		return;
+
+	if (iPlurality == ENotSpecified)
+		return;
+
+	if (iPlurality == ESingular && iUnformattedSingularText)
+		DoFormatTextL(iUnformattedSingularText);
+	
+	else if (iPlurality == EPlural && iUnformattedPluralText)
+		DoFormatTextL(iUnformattedPluralText);
+	}
+
+void CAknText::DoFormatTextL(HBufC* aUnformattedText)
+	{
+	__ASSERT_DEBUG(aUnformattedText,Panic(EAknPanicNullPointer));
+
+	TPtr unformattedText = TranslateDintoN(aUnformattedText);
+
+	TInt len = aUnformattedText->Length() + 10; //10 is because biggest int32 has 10 digits at most
+	if (!iText || iText->Des().MaxLength() < len)
+		{
+		delete iText;
+		iText = NULL;
+		iText = HBufC::NewL(len); 
+		}
+
+	TPtr formattedText = iText->Des();
+    
+
+    if ( unformattedText.Find(KNumberId) != KErrNotFound) // threre is a number key
+        {    
+        StringLoader::Format( formattedText, unformattedText, -1, iNumber);
+        }
+    else
+    	{
+        formattedText.Zero();
+        formattedText.Append(unformattedText);
+	    }	
+
+
+	if (iText && (!iTextCopy || iTextCopy->Des().MaxLength() < iText->Des().Length()))
+		{
+		delete iTextCopy;
+		iTextCopy = NULL;
+		iTextCopy = iText->Des().AllocL();
+		}
+	}
+
+// Translate %d and %U into %N
+TPtr CAknText::TranslateDintoN(HBufC* aUnformattedText)
+	{
+	TPtr text = aUnformattedText->Des();
+	
+	TInt pos = text.Find(KDigitId);
+    if ( pos == KErrNotFound )
+        {
+        pos = text.Find(KUnsignedId);
+        }
+	if (pos != KErrNotFound)
+		{
+		text[pos+1] = 'N';
+		}
+	
+	return text;
+	}
+	
+TBool CAknText::TextIsNotFormatted(const TDesC& aText)
+	{
+	return ( ( (aText.Find(KNumberId) != KErrNotFound) ||
+				(aText.Find(KDigitId) != KErrNotFound) ) && iType == ENotFormatted);
+
+	}
+
+// End of File