diff -r 000000000000 -r 2f259fa3e83a uifw/AvKon/src/AknQueryValueText.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/AvKon/src/AknQueryValueText.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,408 @@ +/* +* 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: +* +*/ + +// AknQueryValueText.cpp +// +// Copyright (c) 2001 Symbian Ltd. All rights reserved. +// + +#include "eikenv.h" + +#include +#include +#include +#include "AknQueryValueText.h" +#include "AknQueryDialog.h" +#include "akntextsettingpage.h" + +#include "AknPanic.h" + +//------------------------------------------------- +// class CAknQueryValueText +//------------------------------------------------- + +/** + * First stage of two stage construction. + */ +EXPORT_C CAknQueryValueText* CAknQueryValueText::NewL() + { + CAknQueryValueText* self = NewLC(); + CleanupStack::Pop(); + return self; + } + +/** + * First stage of two stage construction. + */ +EXPORT_C CAknQueryValueText* CAknQueryValueText::NewLC() + { + CAknQueryValueText* self = new(ELeave) CAknQueryValueText; + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +/** + * Destructor. + */ +EXPORT_C CAknQueryValueText::~CAknQueryValueText() + { + delete iText; + } + +/** + * Set the array. + * + * @param aArray pointer to array, ownership is not passed + */ +EXPORT_C void CAknQueryValueText::SetArrayL(const CAknQueryValueTextArray* 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 CAknQueryValueText::SetQueryCaption(TInt aResourceId) + { + iQueryCaptionId = aResourceId; + } + +/** + * Return the current value, which may have been set by the user + * + * @return The current value, ownership is not passed + * + */ +EXPORT_C HBufC* CAknQueryValueText::Value() const + { + return iText; + } + +/** + * Returns the array as a descriptor array + * + * @return descriptor array, ownership is not passed + */ +EXPORT_C const MDesCArray* CAknQueryValueText::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* CAknQueryValueText::CurrentValueTextLC() + { + HBufC* buf = HBufC::NewMaxLC(iText->Length()); + TPtr ptr = buf->Des(); + ptr = *iText; + 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 CAknQueryValueText::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 CAknQueryValueText::SetCurrentValueIndex(const TInt aIndex) + { + iCurrentIndex = aIndex; + const CAknQueryValueTextArray::TextArray* textArray = iArray->Array(); + TPtrC newPtr; + if (IsValidIndex(iCurrentIndex)) + newPtr.Set(textArray->MdcaPoint(aIndex)); + else + newPtr.Set(KNullDesC); + + if (newPtr.Length() > iText->Des().MaxLength()) + { + HBufC* newtext = HBufC::New(newPtr.Length()); + if (newtext) + { + delete iText; + iText = NULL; + iText = newtext; + } + else + {// there was a problem allocating more mem so do nothing and return + return; + } + } + TPtr currentPtr = iText->Des(); + currentPtr = newPtr; + + } + +/** + * 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 CAknQueryValueText::CreateEditorL() + { + TBool result = EFalse; + TInt keyPressed; + + HBufC* queryString = CEikonEnv::Static()->AllocReadResourceLC(iQueryCaptionId); + TPtr textPtr = iText->Des(); + + if ( iFlags.IsSet( ESettingPageModeBitIndex ) ) + { + CAknTextSettingPage* dlg = new ( ELeave ) CAknTextSettingPage ( + queryString, EAknSettingPageNoOrdinalDisplayed, + EEikCtEdwin, R_AVKON_DEFAULT_SETTING_PAGE_TEXT_EDITOR, + 0, textPtr, 0 ); + result = dlg->ExecuteLD( ); + + if ( result ) + keyPressed = EAknSoftkeyOk; + else + keyPressed = EAknSoftkeyCancel; + } + else + { + CAknTextQueryDialog* dlg = CAknTextQueryDialog::NewL(textPtr); + keyPressed = dlg->ExecuteLD(R_AVKON_DIALOG_QUERY_VALUE_TEXT,*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 CAknQueryValueText::ConstructL() + { + iQueryCaptionId = R_AVKON_TBUF_POPUP_FIELD_DEFAULT_TEXT_QUERY_PROMPT; + iText = HBufC::NewL(CAknQueryValueTextArray::KSafeSizeOfDescriptorForTextFormat); + } + +/** + * Constructor. + * + */ +CAknQueryValueText::CAknQueryValueText() + { + } + +/** + * Search for the current value in the list, and set the current index + * to be the found index. If not found, set current index to 1 after the size of the array. + * + */ +void CAknQueryValueText::CalculateCurrentIndex() + { + // ensure that if the new value is not in the list, the current index is set to the beginning + TInt index = 0; + const CAknQueryValueTextArray::TextArray* textArray = iArray->Array(); + TInt length = textArray->MdcaCount(); + // search through array to find match for current value + TInt res = 0; + for(TInt i = 0; i < length; i++) + { + res = textArray->MdcaPoint(i).Compare(*iText); + if(res == 0) + { + index = i; + break; + } + } + if(res) // no match found, set index to last option + index = length; + iCurrentIndex = index; + } + +/** + * Append the current value if it is new + * + * + */ +void CAknQueryValueText::AppendValueIfNewL() + { + const CAknQueryValueTextArray::TextArray* array = iArray->Array(); + CalculateCurrentIndex(); + if ( iCurrentIndex == array->MdcaCount() ) + { + CAknQueryValueTextArray::TextArray* array = iArray->Array(); + array->AppendL(*iText); + } + } + +EXPORT_C void CAknQueryValueText::Reserved_MAknQueryValue() + { + + }; + + +//------------------------------------------------- +// class CAknQueryValueTextArray +//------------------------------------------------- + +/** + * NewL. + */ +EXPORT_C CAknQueryValueTextArray* CAknQueryValueTextArray::NewL() + { + CAknQueryValueTextArray* self = NewLC(); + CleanupStack::Pop(); + return self; + } + +/** + * NewLC. + */ +EXPORT_C CAknQueryValueTextArray* CAknQueryValueTextArray::NewLC() + { + CAknQueryValueTextArray* self = new(ELeave) CAknQueryValueTextArray; + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +/** + * Destructor. + */ +EXPORT_C CAknQueryValueTextArray::~CAknQueryValueTextArray() + { + } + +/** + * 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 passed + */ +EXPORT_C void CAknQueryValueTextArray::SetArray(TextArray& 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 CAknQueryValueTextArray::TextArray* CAknQueryValueTextArray::Array() const + { + return iArray; + } + +/** + * 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 CAknQueryValueTextArray::FormattedStringSize() const + { + return iFormattedStringSize; + } +#else +EXPORT_C TInt CAknQueryValueTextArray::FormattedStringSize() const + { + return iFormattedStringSize; + } +#endif // __WINS__ + +/** + * Reports count of contained array + * + * @return count of contained array + */ +EXPORT_C TInt CAknQueryValueTextArray::MdcaCount() const + { + return iArray->MdcaCount(); + } + +/** + * Returns array element, pass through to contained descriptor array + * + * @param index of element to return + * @return descriptor representing array element, ownership is not passed + */ +EXPORT_C TPtrC CAknQueryValueTextArray::MdcaPoint(TInt aIndex) const + { + return iArray->MdcaPoint(aIndex); + } + +/** + * Constructor. + */ +CAknQueryValueTextArray::CAknQueryValueTextArray() + { + + } + +/** + * ConstructL + * + * @param aResourceId id of a resource containing a time format string + */ +void CAknQueryValueTextArray::ConstructL() + { + iFormattedStringSize = KSafeSizeOfDescriptorForTextFormat; + } + +// End of File