uifw/AvKon/src/AknQueryValueTime.cpp
changeset 0 2f259fa3e83a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/AvKon/src/AknQueryValueTime.cpp	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,439 @@
+/*
+* 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: 
+*
+*/
+
+// AknQueryValueTime.cpp
+//
+// Copyright (c) 2001 Symbian Ltd.  All rights reserved.
+//
+
+#include "eikenv.h"
+
+#include <eikmfne.h>
+#include <avkon.hrh>
+#include <avkon.rsg>
+#include "AknQueryValueTime.h"
+#include "AknQueryDialog.h"
+#include "aknmfnesettingpage.h"
+
+#include "AknPanic.h"
+
+//-------------------------------------------------
+// class CAknQueryValueTime
+//-------------------------------------------------
+
+/**
+ * First stage of two stage construction.
+ */
+EXPORT_C CAknQueryValueTime* CAknQueryValueTime::NewL()
+	{
+	CAknQueryValueTime* self = NewLC();
+	CleanupStack::Pop();
+	return self;
+	}
+
+/**
+ * First stage of two stage construction.
+ */
+EXPORT_C CAknQueryValueTime* CAknQueryValueTime::NewLC()
+	{
+	CAknQueryValueTime* self = new(ELeave) CAknQueryValueTime;
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+
+/**
+ * Destructor.
+ */
+EXPORT_C CAknQueryValueTime::~CAknQueryValueTime()
+	{
+	}
+
+/**
+ * Set the array.
+ * 
+ * @param aArray pointer to array, ownership is not passed
+ */
+EXPORT_C void CAknQueryValueTime::SetArrayL(const CAknQueryValueTimeArray* aArray)
+	{
+	iArray = aArray;
+	}
+
+/**
+ * Set the string used for the query caption to be a string other than the default.
+ *
+ * @param aResourceId		resource id of string to use for caption.
+ *
+ */
+EXPORT_C void CAknQueryValueTime::SetQueryCaption(TInt aResourceId)
+	{
+	iQueryCaptionId = aResourceId;
+	}
+
+/**
+ * Return the current value, which may have been set by the user
+ *
+ * @return The current value
+ *
+ */
+EXPORT_C TTime CAknQueryValueTime::Value() const
+	{
+	return iTime;
+	}
+
+/**
+ * Returns the array as a descriptor array
+ * 
+ * @return descriptor array, ownership is not passed
+ */
+EXPORT_C const MDesCArray* CAknQueryValueTime::MdcArray() const
+	{
+	return iArray;
+	}
+
+/**
+ * Returns the current value as text
+ * 
+ * @return	descriptor representing current value, new 
+ * descriptor is created and left on cleanup stack, ownership passed back to client
+ */
+EXPORT_C HBufC* CAknQueryValueTime::CurrentValueTextLC()
+	{
+	HBufC* buf = HBufC::NewMaxLC(iArray->FormattedStringSize());
+	TPtr ptr = buf->Des();
+#ifndef _DEBUG
+	iTime.FormatL(ptr, *(iArray->FormatString()));
+#else
+	TRAPD(err, iTime.FormatL(ptr, *(iArray->FormatString())));
+	if(err != KErrNone)
+		Panic(EAknPanicQueryTimeArrayTimeFormatLeave);
+#endif
+    AknTextUtils::DisplayTextLanguageSpecificNumberConversion( ptr );
+	return buf;
+	}
+
+/**
+ * Returns the index in the array of the current value. 
+ * If there are duplicates, returns the index of the first match.
+ * If there are no matches, returns zero;
+ *
+ * @return index in array of current value
+ */
+EXPORT_C TInt CAknQueryValueTime::CurrentValueIndex() const
+	{
+	return iCurrentIndex;
+	}
+
+/**
+ * Changes the current value to correspond to a value in the array.
+ *
+ * @param aIndex	index in array of value to set as current
+ */
+EXPORT_C void CAknQueryValueTime::SetCurrentValueIndex(const TInt aIndex)
+	{
+	iCurrentIndex = aIndex;
+	const CAknQueryValueTimeArray::TimeArray* timeArray = iArray->Array();
+	if (IsValidIndex(aIndex))
+	    iTime = (*timeArray)[aIndex];
+	}
+
+/**
+ * Creates a dialog containing a query control. If the value is edited and the Dialog
+ * OK'd, the new value will be set as the current value. Otherwise the current value 
+ * remains unchanged.
+ *
+ * @return	ETrue if current value was altered; EFalse otherwise
+ */
+EXPORT_C TBool CAknQueryValueTime::CreateEditorL()
+	{
+	TBool result = EFalse;
+	TInt keyPressed;
+
+	HBufC* queryString = CEikonEnv::Static()->AllocReadResourceLC(iQueryCaptionId);
+
+	if ( iFlags.IsSet( ESettingPageModeBitIndex ) )
+		{
+		CAknTimeSettingPage* dlg =  new ( ELeave ) CAknTimeSettingPage ( queryString, 
+			EAknSettingPageNoOrdinalDisplayed, EEikCtTimeEditor,
+			R_AVKON_DEFAULT_SETTING_PAGE_TIME_EDITOR, 0, iTime );
+		result =  dlg->ExecuteLD( );
+
+		if ( result )
+			keyPressed = EAknSoftkeyOk;
+		else
+			keyPressed = EAknSoftkeyCancel;
+		}
+	else	
+		{
+		CAknTimeQueryDialog* dlg = CAknTimeQueryDialog::NewL(iTime);
+		keyPressed = dlg->ExecuteLD(R_AVKON_DIALOG_QUERY_VALUE_TIME,*queryString);
+		}
+
+	CleanupStack::PopAndDestroy(); // queryString
+
+	switch(keyPressed)
+		{
+	case EAknSoftkeyOk:
+		result = ETrue;
+		if ( iFlags.IsSet( EAutoAppendBitIndex ) )
+			{
+			AppendValueIfNewL();
+			}
+		CalculateCurrentIndex();
+		break;
+	case EAknSoftkeyCancel:
+		// fall through
+	case EAknSoftkeyBack:
+		// fall through
+	default:
+		result = EFalse;
+		break;
+		}
+
+	return result;
+	}
+
+/**
+ * Two stage construction
+ *
+ */
+void CAknQueryValueTime::ConstructL()
+	{
+	iQueryCaptionId = R_AVKON_TBUF_POPUP_FIELD_DEFAULT_TIME_QUERY_PROMPT;
+	}
+
+/**
+ * Constructor.
+ *
+ */
+CAknQueryValueTime::CAknQueryValueTime()
+	{
+	}
+
+/**
+ * Search for the current time in the list, and set the curent index 
+ * to be the found index. If not found, set current index to 1 after the size of the array.
+ *
+ */
+void CAknQueryValueTime::CalculateCurrentIndex()
+	{
+	// ensure that if the new value is not in the list, the current index is set to the beginning
+	TInt index = 0; 
+	const CAknQueryValueTimeArray::TimeArray* timeArray = iArray->Array();
+	TInt length = timeArray->Count();
+	// search through array to find match for current value
+	TBool match = EFalse;
+	for(TInt i = 0; i < length; i++)
+		{
+		if((*timeArray)[i] == iTime)
+			{
+			index = i;
+			match = ETrue;
+			break;
+			}
+		}
+	if(!match)
+		index = length;
+	iCurrentIndex = index;
+	}
+
+/**
+ * Append the current value if it is new
+ */
+void CAknQueryValueTime::AppendValueIfNewL()
+	{
+	const CAknQueryValueTimeArray::TimeArray* array = iArray->Array();
+	CalculateCurrentIndex();
+	if ( iCurrentIndex == array->Count() ) 
+		{
+		CAknQueryValueTimeArray::TimeArray* array = iArray->Array();
+		array->AppendL( iTime );
+		}
+	}
+
+EXPORT_C void CAknQueryValueTime::Reserved_MAknQueryValue()
+	{
+	};
+
+
+//-------------------------------------------------
+// class CAknQueryValueTimeArray
+//-------------------------------------------------
+
+/**
+ * NewL.
+ *
+ * @param aResourceId	Recource id of a TBUF containing a TTime format string. Client
+ *							can use R_AVKON_TBUF_POPUP_FIELD_DEFAULT_TIME_FORMAT
+ *							if desired, or provide its own resource.
+ */
+EXPORT_C CAknQueryValueTimeArray* CAknQueryValueTimeArray::NewL(TInt aResourceId)
+	{
+	CAknQueryValueTimeArray* self = NewLC(aResourceId);
+	CleanupStack::Pop();
+	return self;
+	}
+
+/**
+ * NewLC.
+ *
+ * @param aResourceId	Recource id of a TBUF containing a TTime format string. Client
+ *							can use R_AVKON_TBUF_POPUP_FIELD_DEFAULT_TIME_FORMAT
+ *							if desired, or provide its own resource.
+ */
+EXPORT_C CAknQueryValueTimeArray* CAknQueryValueTimeArray::NewLC(TInt aResourceId)
+	{
+	CAknQueryValueTimeArray* self = new(ELeave) CAknQueryValueTimeArray;
+	CleanupStack::PushL(self);
+	self->ConstructL(aResourceId);
+	return self;
+	}
+
+/**
+ * Destructor.
+ */
+EXPORT_C CAknQueryValueTimeArray::~CAknQueryValueTimeArray()
+	{
+	delete iLastGeneratedTextValue;
+	delete iFormatString;
+	}
+
+/**
+ * Set the array of values. 
+ * Note that client can use any implementation of array class, but must pass in a 
+ * TArray generated from it (by calling the Array() method on the array class)
+ *
+ * @param array of values, ownership is not passed
+ */
+EXPORT_C void CAknQueryValueTimeArray::SetArray(TimeArray& aArray)
+	{
+	iArray = &aArray;
+	}
+
+/**
+ * Get the array of values as a TArray. 
+ * Note that client can use any implementation of array class, but the array is 
+ * treated as a TArray.
+ *
+ * @return array of values, ownership is not passed
+ */
+EXPORT_C CAknQueryValueTimeArray::TimeArray* CAknQueryValueTimeArray::Array() const
+	{
+	return iArray;
+	}
+
+/**
+ * Return the TTime format string that is used to generate MDesCArray values
+ *
+ * @return format string
+ */
+EXPORT_C const HBufC* CAknQueryValueTimeArray::FormatString() const
+	{
+	return iFormatString;
+	}
+
+/**
+ * Return the size of a maximal time string formated using the format string 
+ * that was supplied during construction of this instance.
+ * Two versions to eliminate compiler warnings.
+ *
+ * @return length of formatted string.
+ */
+#ifdef __WINS__
+EXPORT_C const TInt CAknQueryValueTimeArray::FormattedStringSize() const
+	{
+	return iFormattedStringSize;
+	}
+#else
+EXPORT_C TInt CAknQueryValueTimeArray::FormattedStringSize() const
+	{
+	return iFormattedStringSize;
+	}
+#endif // __WINS__
+
+/**
+ * Reports count of contained array
+ *
+ * @return count of contained array
+ */
+EXPORT_C TInt CAknQueryValueTimeArray::MdcaCount() const
+	{
+	return iArray->Count();
+	}
+
+/**
+ * Returns array element, converting value to text. 
+ * <p> WARNING: the returned pointer is only valid until the next time this
+ * method is invoked. 
+ *
+ * @param index of element to return
+ * @return descriptor representing array element, ownership is not passed
+ */
+EXPORT_C TPtrC CAknQueryValueTimeArray::MdcaPoint(TInt aIndex) const
+	{
+	// only storing the last used string saves memory by avoiding keeping an array 
+	// of descriptors in memory. 
+	TTime time = (*iArray)[aIndex];
+	TPtr textPtr = iLastGeneratedTextValue->Des();
+
+	// clear the last value in case of formatting failure
+	textPtr.Zero();
+
+	// we have set the size so that it should have enough room
+	TRAPD(err, time.FormatL(textPtr, *iFormatString));
+	if(err != KErrNone)
+		{
+#ifdef _DEBUG
+		// only other cause for leave is bad formatting, that must be 
+		// caught during debugging of application code
+		Panic(EAknPanicQueryTimeArrayTimeFormatLeave);
+#endif
+		}
+    AknTextUtils::DisplayTextLanguageSpecificNumberConversion( textPtr );
+	return textPtr;
+	}
+
+/**
+ * Constructor.
+ */
+CAknQueryValueTimeArray::CAknQueryValueTimeArray()
+	{
+
+	}
+
+/**
+ * ConstructL
+ *
+ * @param aResourceId	id of a resource containing a time format string
+ */
+void CAknQueryValueTimeArray::ConstructL(TInt aResourceId)
+	{
+	iFormatString = CEikonEnv::Static()->AllocReadResourceL(aResourceId);
+
+	// work out size of a formatted time string, and use this for time string size
+	_LIT(KTime, "235959.999999"); // should use max characters, where e.g. 9am may not
+	TTime tempTime(KTime);
+	HBufC* tempString = HBufC::NewLC(KSafeSizeOfDescriptorForTTimeFormat);
+	TPtr ptr = tempString->Des();
+	tempTime.FormatL(ptr, *iFormatString);
+	iFormattedStringSize = tempString->Length()+KMaxAmPmName+1; // need to add 1 to this length as TTime needs it (this is a defect in TTime)
+	CleanupStack::PopAndDestroy(); // tempString
+
+	iLastGeneratedTextValue = HBufC::NewL(iFormattedStringSize);
+	}
+
+// End of File