diff -r 000000000000 -r 2f259fa3e83a uifw/AvKon/src/AknQueryValueDate.cpp --- /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 +#include +#include +#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. + *

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