--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/AvKon/src/AknQueryValueDate.cpp Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,445 @@
+/*
+* 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:
+*
+*/
+
+// AknQueryValueDate.cpp
+//
+// Copyright (c) 2001 Symbian Ltd. All rights reserved.
+//
+
+#include "eikenv.h"
+
+#include <eikmfne.h>
+#include <avkon.hrh>
+#include <avkon.rsg>
+#include "AknQueryValueDate.h"
+#include "AknQueryDialog.h"
+#include "aknmfnesettingpage.h"
+
+#include "AknPanic.h"
+
+//-------------------------------------------------
+// class CAknQueryValueDate
+//-------------------------------------------------
+
+/**
+ * First stage of two stage construction.
+ */
+EXPORT_C CAknQueryValueDate* CAknQueryValueDate::NewL()
+ {
+ CAknQueryValueDate* self = NewLC();
+ CleanupStack::Pop();
+ return self;
+ }
+
+/**
+ * First stage of two stage construction
+ */
+EXPORT_C CAknQueryValueDate* CAknQueryValueDate::NewLC()
+ {
+ CAknQueryValueDate* self = new(ELeave) CAknQueryValueDate;
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ return self;
+ }
+
+/**
+ * Destructor.
+ */
+EXPORT_C CAknQueryValueDate::~CAknQueryValueDate()
+ {
+ }
+
+/**
+ * Set the array.
+ *
+ * @param aArray pointer to array, ownership is not passed
+ */
+EXPORT_C void CAknQueryValueDate::SetArrayL(const CAknQueryValueDateArray* 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 CAknQueryValueDate::SetQueryCaption(TInt aResourceId)
+ {
+ iQueryCaptionId = aResourceId;
+ }
+
+/**
+ * Return the current value, which may have been set by the user
+ *
+ * @return The current value
+ *
+ */
+EXPORT_C TTime CAknQueryValueDate::Value() const
+ {
+ return iTime;
+ }
+
+/**
+ * Returns the array as a descriptor array
+ *
+ * @return descriptor array, ownership is not passed
+ */
+EXPORT_C const MDesCArray* CAknQueryValueDate::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* CAknQueryValueDate::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(EAknPanicQueryDateArrayTimeFormatLeave);
+#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 CAknQueryValueDate::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 CAknQueryValueDate::SetCurrentValueIndex(const TInt aIndex)
+ {
+ iCurrentIndex = aIndex;
+ const CAknQueryValueDateArray::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 CAknQueryValueDate::CreateEditorL()
+ {
+ TBool result = EFalse;
+
+ HBufC* queryString = CEikonEnv::Static()->AllocReadResourceLC(iQueryCaptionId);
+ TInt keyPressed;
+
+ if ( iFlags.IsSet( ESettingPageModeBitIndex ) )
+ {
+ CAknDateSettingPage* dlg = new ( ELeave ) CAknDateSettingPage ( queryString,
+ EAknSettingPageNoOrdinalDisplayed, EEikCtDateEditor,
+ R_AVKON_DEFAULT_SETTING_PAGE_DATE_EDITOR, 0, iTime );
+ result = dlg->ExecuteLD( );
+
+ if ( result )
+ keyPressed = EAknSoftkeyOk;
+ else
+ keyPressed = EAknSoftkeyCancel;
+ }
+ else
+ {
+ CAknTimeQueryDialog* dlg = CAknTimeQueryDialog::NewL(iTime);
+ dlg->PrepareLC(R_AVKON_DIALOG_QUERY_VALUE_DATE);
+ dlg->SetPromptL(*queryString);
+ keyPressed = dlg->RunLD();
+ }
+
+ 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 CAknQueryValueDate::ConstructL()
+ {
+ iQueryCaptionId = R_AVKON_TBUF_POPUP_FIELD_DEFAULT_DATE_QUERY_PROMPT;
+ }
+
+/**
+ * Constructor. Does nothing.
+ *
+ */
+CAknQueryValueDate::CAknQueryValueDate()
+ {
+ }
+
+/**
+ * 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 CAknQueryValueDate::CalculateCurrentIndex()
+ {
+ // ensure that if the new value is not in the list, the current index is set to the beginning
+ TInt index = 0;
+ const CAknQueryValueDateArray::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 CAknQueryValueDate::AppendValueIfNewL()
+ {
+ const CAknQueryValueDateArray::TimeArray* array = iArray->Array();
+ CalculateCurrentIndex();
+ if ( iCurrentIndex == array->Count() )
+ {
+ CAknQueryValueDateArray::TimeArray* array = iArray->Array();
+ array->AppendL( iTime );
+ }
+ }
+
+EXPORT_C void CAknQueryValueDate::Reserved_MAknQueryValue()
+ {
+
+ };
+
+
+//-------------------------------------------------
+// class CAknQueryValueDateArray
+//-------------------------------------------------
+
+/**
+ * NewL.
+ *
+ * @param aResourceId Recource id of a TBUF containing a TTime format string. Client
+ * can use R_AVKON_TBUF_POPUP_FIELD_DEFAULT_DATE_FORMAT
+ * if desired, or provide its own resource.
+ */
+EXPORT_C CAknQueryValueDateArray* CAknQueryValueDateArray::NewL(TInt aResourceId)
+ {
+ CAknQueryValueDateArray* 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_DATE_FORMAT
+ * if desired, or provide its own resource.
+ */
+EXPORT_C CAknQueryValueDateArray* CAknQueryValueDateArray::NewLC(TInt aResourceId)
+ {
+ CAknQueryValueDateArray* self = new(ELeave) CAknQueryValueDateArray;
+ CleanupStack::PushL(self);
+ self->ConstructL(aResourceId);
+ return self;
+ }
+
+/**
+ * Destructor.
+ */
+EXPORT_C CAknQueryValueDateArray::~CAknQueryValueDateArray()
+ {
+ 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 CAknQueryValueDateArray::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 CAknQueryValueDateArray::TimeArray* CAknQueryValueDateArray::Array() const
+ {
+ return iArray;
+ }
+
+/**
+ * Return the TTime format string that is used to generate MDesCArray values
+ *
+ * @return format string
+ */
+EXPORT_C const HBufC* CAknQueryValueDateArray::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 CAknQueryValueDateArray::FormattedStringSize() const
+ {
+ return iFormattedStringSize;
+ }
+#else
+EXPORT_C TInt CAknQueryValueDateArray::FormattedStringSize() const
+ {
+ return iFormattedStringSize;
+ }
+#endif // __WINS__
+
+/**
+ * Reports count of contained array
+ *
+ * @return count of contained array
+ */
+EXPORT_C TInt CAknQueryValueDateArray::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 CAknQueryValueDateArray::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(EAknPanicQueryDateArrayTimeFormatLeave);
+#endif
+ }
+ AknTextUtils::DisplayTextLanguageSpecificNumberConversion( textPtr );
+ return textPtr;
+ }
+
+/**
+ * Constructor.
+ */
+CAknQueryValueDateArray::CAknQueryValueDateArray()
+ {
+
+ }
+
+/**
+ * ConstructL
+ *
+ * @param aResourceId id of a resource containing a time format string
+ */
+void CAknQueryValueDateArray::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, "20030829:"); // should use max characters, "Wednesday 30th September 2003"
+ TTime tempTime(KTime);
+ HBufC* tempString = HBufC::NewLC(KSafeSizeOfDescriptorForTTimeFormat);
+ TPtr ptr = tempString->Des();
+ tempTime.FormatL(ptr, *iFormatString);
+ iFormattedStringSize = tempString->Length();
+ iFormattedStringSize++;
+ CleanupStack::PopAndDestroy(); // tempString
+
+ iLastGeneratedTextValue = HBufC::NewL(iFormattedStringSize);
+ }
+
+// End of File