diff -r 000000000000 -r 2f259fa3e83a uifw/AvKon/src/AknDateFormatUtils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/AvKon/src/AknDateFormatUtils.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,130 @@ +/* +* Copyright (c) 2003 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: Implementation of visual - Symbian OS date formats for +* +*/ + + +#include + +#include +#include +#include + +/** +* Current implementation of this should work for any RTL language if it sets the +* digit type to digit types checked for below +* +* It is meant as a patch for S60 2.0, not as a complete solution to the problem of date +* presentation. +*/ +TBool AknDateFormatUtils::DateFieldReOrderingNeeded(TLanguage* aForceLanguage ) + { + TBool reorderingNeeded(EFalse); + TLocale locale; + TLanguage language = (aForceLanguage != NULL) ? *aForceLanguage : AknLangUtils::UserLanguage(); + + // Reordering needed in case of RTL language, we have arabic digits and if the separator is not + // numeric separator. + if ( TBidiText::ScriptDirectionality( language ) == TBidiText::ERightToLeft ) + { + TInt digitType = locale.DigitType(); + if ( digitType == EDigitTypeArabicIndic || + digitType == EDigitTypeEasternArabicIndic ) + { + TChar sep( locale.DateSeparator(1) ); + if ( sep.GetBdCategory() != TChar::ECommonNumberSeparator ) + { + reorderingNeeded = ETrue; + } + } + } + + return reorderingNeeded; + } + +TAknVisualDateFormat AknDateFormatUtils::MapSymbianDateFormatToWesternVisualDateFormat( + TDateFormat aFormat ) + { + TAknVisualDateFormat visualFormat(EVisualDayMonthYear); + switch ( aFormat ) + { + case EDateEuropean: + visualFormat = EVisualDayMonthYear; + break; + + case EDateAmerican: + visualFormat = EVisualMonthDayYear; + break; + + case EDateJapanese: + visualFormat = EVisualYearMonthDay; + break; + } + return visualFormat; + } + +TDateFormat AknDateFormatUtils::MapWesternVisualDateFormatToSymbianDateFormat( + TAknVisualDateFormat aFormat ) + { + TDateFormat osFormat(EDateEuropean); + switch( aFormat ) + { + case EVisualDayMonthYear: + osFormat = EDateEuropean; + break; + case EVisualMonthDayYear: + osFormat = EDateAmerican; + break; + case EVisualYearMonthDay: + osFormat = EDateJapanese; + break; + } + return osFormat; + } + +EXPORT_C TAknVisualDateFormat AknDateFormatUtils::MapSymbianDateFormatToVisualDateFormat( + TDateFormat aFormat, TLanguage* aForceLanguage ) + { + // Get the western mapping first + TAknVisualDateFormat visualFormat = + MapSymbianDateFormatToWesternVisualDateFormat( aFormat ); + + if ( DateFieldReOrderingNeeded( aForceLanguage ) ) + { + if ( visualFormat == EVisualDayMonthYear ) + visualFormat = EVisualYearMonthDay; + else if ( visualFormat == EVisualYearMonthDay ) + visualFormat = EVisualDayMonthYear; + } + + return visualFormat; + } + +EXPORT_C TDateFormat AknDateFormatUtils::MapVisualDateFormatToSymbianDateFormat( + TAknVisualDateFormat aFormat, TLanguage* aForceLanguage ) + { + // Get the western mapping first + TDateFormat osFormat = + MapWesternVisualDateFormatToSymbianDateFormat( aFormat ); + + if ( DateFieldReOrderingNeeded( aForceLanguage ) ) + { + if ( osFormat == EDateEuropean ) + osFormat = EDateJapanese; + else if ( osFormat == EDateJapanese ) + osFormat = EDateEuropean; + } + return osFormat; + }