--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/calendarui/regionalplugins/calenregionalutil/src/calenlunarlocalizer.cpp Tue Feb 02 10:12:19 2010 +0200
@@ -0,0 +1,360 @@
+/*
+* Copyright (c) 2007 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: Calendar Lunar Plugin
+*
+*/
+
+
+#include "calendarui_debug.h"
+
+#include "calenlunarlocalizer.h"
+
+#include "calenlunarinfo.h"
+#include "calenlunarlocalizedinfo.h"
+#include "calenextrarowformatter.h"
+#include <calenregionalutil.rsg>
+
+#include <AknBidiTextUtils.h>
+#include <avkon.rsg>
+#include <badesca.h>
+#include <eikenv.h>
+#include <StringLoader.h>
+#include <bautils.h>
+#include <data_caging_path_literals.hrh>
+
+//CONSTANTS
+const TInt KCharMonth = 0x6708;
+const TInt KCharFirstMonth = 0x6b63;
+const TInt KCharChu = 0x521d;
+const TInt KCharTen = 0x5341;
+const TInt KCharTwenty= 0x5eff;
+_LIT(KChineseDigits,
+ "\x0030\x4e00\x4e8c\x4e09\x56db\x4e94\x516d\x4e03\x516b\x4e5d");
+
+_LIT( KResourceChinesePluginFile, "calenregionalutil.rsc" );
+#define KResourcePath KDC_RESOURCE_FILES_DIR
+
+
+// -----------------------------------------------------------------------------
+// CCalenLunarLocalizer::NewL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CCalenLunarLocalizer* CCalenLunarLocalizer::NewL()
+ {
+ TRACE_ENTRY_POINT;
+
+ CCalenLunarLocalizer* self = new (ELeave) CCalenLunarLocalizer;
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+
+ TRACE_EXIT_POINT;
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCalenLunarLocalizer::~CCalenLunarLocalizer
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CCalenLunarLocalizer::~CCalenLunarLocalizer()
+ {
+ TRACE_ENTRY_POINT;
+
+ delete iFestivalNames;
+ delete iSolarTermNames;
+ delete iHeavenlyStemNames;
+ delete iTerrestialBranchNames;
+ delete iAnimalYearNames;
+ delete iGregorianDateFormat;
+ delete iRowFormatter;
+
+ if( iResourceFileOffset )
+ {
+ CCoeEnv::Static()->DeleteResourceFile( iResourceFileOffset );
+ }
+
+ TRACE_EXIT_POINT;
+ }
+
+// -----------------------------------------------------------------------------
+// CCalenLunarLocalizer::CCalenLunarLocalizer
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CCalenLunarLocalizer::CCalenLunarLocalizer() : iEikEnv( CEikonEnv::Static() )
+ {
+ TRACE_ENTRY_POINT;
+ TRACE_EXIT_POINT;
+ }
+
+// -----------------------------------------------------------------------------
+// CCalenLunarLocalizer::ConstructL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CCalenLunarLocalizer::ConstructL()
+ {
+ TRACE_ENTRY_POINT;
+ iRowFormatter = CCalenExtraRowFormatter::NewL();
+
+ TFileName dllName;
+ // Get the complate path of the DLL from where it is currently loaded
+ Dll::FileName( dllName );
+
+ TFileName resourceFilename;
+ resourceFilename.Append(dllName.Mid(0,2));
+ resourceFilename.Append(KResourcePath);
+ resourceFilename.Append(KResourceChinesePluginFile);
+ BaflUtils::NearestLanguageFile( CEikonEnv::Static()->FsSession(), resourceFilename );
+ // Add the resource file.
+ iResourceFileOffset = CEikonEnv::Static()->AddResourceFileL( resourceFilename );
+
+
+ iFestivalNames = iEikEnv->ReadDesCArrayResourceL(R_CALEN_CHI_FESTIVALS);
+ iSolarTermNames = iEikEnv->ReadDesCArrayResourceL(R_CALEN_CHI_SOLAR_ITEMS);
+ iHeavenlyStemNames = iEikEnv->ReadDesCArrayResourceL(R_CALEN_CHI_HEAV_STEMS);
+ iTerrestialBranchNames = iEikEnv->ReadDesCArrayResourceL(R_CALEN_CHI_TERR_BRANCHES);
+ iAnimalYearNames = iEikEnv->ReadDesCArrayResourceL(R_CALEN_CHI_ANIMAL_YEARS);
+
+ iGregorianDateFormat = StringLoader::LoadL(R_QTN_DATE_USUAL_WITH_ZERO);
+
+
+#ifdef _DEBUG
+ // Validate assumptions
+ TInt maxStem = -1;
+ for (TInt i = 0; i < iHeavenlyStemNames->Count(); i++)
+ {
+ maxStem = Max( maxStem, iHeavenlyStemNames->MdcaPoint(i).Length() );
+ }
+
+ TInt maxBranch = -1;
+ for (TInt i = 0; i < iTerrestialBranchNames->MdcaPoint(i).Length() ; i++)
+ {
+ maxBranch = Max( maxBranch, iTerrestialBranchNames->MdcaPoint(i).Length() );
+ }
+ ASSERT( maxStem + maxBranch <= 100);
+#endif
+
+ TRACE_EXIT_POINT;
+ }
+
+// -----------------------------------------------------------------------------
+// CCalenLunarLocalizer::LocalizeL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CCalenLunarLocalizedInfo* CCalenLunarLocalizer::LocalizeL( TCalenLunarInfo& aInfo )
+ {
+ TRACE_ENTRY_POINT;
+
+
+ CCalenLunarLocalizedInfo* localized = CCalenLunarLocalizedInfo::NewL();
+ CleanupStack::PushL( localized );
+
+ if ( aInfo.HasFestival() )
+ {
+ localized->iFestival.Set( iFestivalNames->MdcaPoint( aInfo.iFestival ) );
+ }
+
+ if ( aInfo.HasSolarTerm() )
+ {
+ localized->iSolarTerm.Set( iSolarTermNames->MdcaPoint( aInfo.iSolarTerm ) );
+ }
+
+ // Animal year
+ localized->iAnimalYear.Set( iAnimalYearNames->MdcaPoint( aInfo.AnimalYear() ) );
+
+
+ // Lunar year
+ CPtrCArray* yearSubs = new (ELeave) CPtrCArray(2);
+ CleanupStack::PushL( yearSubs );
+ yearSubs->AppendL( iHeavenlyStemNames->MdcaPoint( aInfo.iHeavenlyStem ) );
+ yearSubs->AppendL( iTerrestialBranchNames->MdcaPoint( aInfo.iTerrestialBranch ) );
+
+ HBufC* tmp = StringLoader::LoadLC( R_CALE_LUNAR_YEAR, *yearSubs, iEikEnv );
+ RDebug::Print( *tmp );
+ localized->iLunarYear = *tmp;
+ CleanupStack::PopAndDestroy( tmp );
+ CleanupStack::PopAndDestroy( yearSubs );
+
+ RDebug::Print( localized->iLunarYear );
+
+ LocalizeMonthAndDayL(localized, aInfo);
+
+ // Full lunar date
+ CPtrCArray* subs = new (ELeave) CPtrCArray(2);
+ CleanupStack::PushL( subs );
+ subs->AppendL( localized->LunarMonthAndDay() );
+ subs->AppendL( localized->LunarYear() );
+
+ tmp = StringLoader::LoadLC( R_CALE_LUNAR_FULL_DATE, *subs );
+ localized->iFullLunarDate = *tmp;
+ CleanupStack::PopAndDestroy( tmp );
+ CleanupStack::PopAndDestroy( subs );
+
+
+ aInfo.iGregorianDate.FormatL( localized->iGregorianDate,
+ *iGregorianDateFormat );
+ CleanupStack::Pop( localized );
+
+
+
+ TRACE_EXIT_POINT;
+ return localized;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CCalenLunarLocalizer::GetExtraRowTextL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TPtrC CCalenLunarLocalizer::GetExtraRowTextL( CCalenLunarLocalizedInfo& aLocInfo, TInt aMaxWidth,
+ const CFont& aFont, TBool aTwoLines )
+ {
+ TRACE_ENTRY_POINT;
+
+ RArray<CCalenLunarLocalizedInfo::TField> fields;
+ CleanupClosePushL( fields );
+ fields.AppendL( CCalenLunarLocalizedInfo::EFestival );
+ fields.AppendL( CCalenLunarLocalizedInfo::ESolarTerm );
+ fields.AppendL( CCalenLunarLocalizedInfo::ELunarMonthAndDay );
+ fields.AppendL( CCalenLunarLocalizedInfo::EAnimalYear );
+ fields.AppendL( CCalenLunarLocalizedInfo::ELunarYear );
+
+ TPtrC text = iRowFormatter->FormatExtraRowInformationL( aLocInfo, fields, aMaxWidth, aFont
+
+ , aTwoLines
+
+ );
+ CleanupStack::PopAndDestroy( &fields );
+
+
+ TRACE_EXIT_POINT;
+ return text;
+ }
+
+// -----------------------------------------------------------------------------
+// CCalenLunarLocalizer::LocalizeMonthAndDayL
+// -----------------------------------------------------------------------------
+//
+void CCalenLunarLocalizer::LocalizeMonthAndDayL(CCalenLunarLocalizedInfo* aLocInfo,
+ TCalenLunarInfo& aInfo)
+ {
+ // Lunar Month and Day
+ TInt dateResource = aInfo.iLunarDate.iLeapMonth ? R_CALE_LUNAR_LEAP_DATE : R_CALE_LUNAR_DATE;
+ TBuf<10> month;
+ TBuf<10> day;
+ GetChineseMonth(aInfo.iLunarDate, month);
+ GetChineseDay(aInfo.iLunarDate, day);
+
+ CPtrCArray* monthAndDaySubs = new (ELeave) CPtrCArray(2);
+ CleanupStack::PushL( monthAndDaySubs );
+ monthAndDaySubs->AppendL(month);
+ monthAndDaySubs->AppendL(day);
+
+ HBufC* tmp = StringLoader::LoadLC( dateResource, *monthAndDaySubs );
+ aLocInfo->iLunarMonthAndDay = *tmp;
+ CleanupStack::PopAndDestroy( tmp );
+ CleanupStack::PopAndDestroy( monthAndDaySubs );
+ }
+
+// -----------------------------------------------------------------------------
+// CCalenLunarLocalizer::GetChineseMonth
+// -----------------------------------------------------------------------------
+//
+void CCalenLunarLocalizer::GetChineseMonth(const TChineseDate& aChineseDate,
+ TDes& aDes)
+ {
+ TRACE_ENTRY_POINT;
+
+ if (aChineseDate.iMonth == 1)
+ {
+ aDes.Append(KCharFirstMonth); // Special character for first month
+ }
+ else
+ {
+ GetChineseDigits(aChineseDate.iMonth, aDes);
+ }
+
+ aDes.Append(KCharMonth);
+
+ TRACE_EXIT_POINT;
+ }
+
+// -----------------------------------------------------------------------------
+// CCalenLunarLocalizer::GetChineseDay
+// -----------------------------------------------------------------------------
+//
+void CCalenLunarLocalizer::GetChineseDay(const TChineseDate& aChineseDate,
+ TDes& aDes)
+ {
+ TRACE_ENTRY_POINT;
+
+ if (aChineseDate.iDay <= 10) // day
+ {
+ aDes.Append(KCharChu);
+ }
+
+ GetChineseDigits(aChineseDate.iDay, aDes);
+
+ TRACE_EXIT_POINT;
+ }
+
+// -----------------------------------------------------------------------------
+// CCalenLunarLocalizer::GetChineseDigits
+// -----------------------------------------------------------------------------
+//
+void CCalenLunarLocalizer::GetChineseDigits(TInt aNum, TDes& aDes)
+ {
+ TRACE_ENTRY_POINT;
+
+ ASSERT( 0 < aNum && aNum <= 30 );
+ TInt tens = aNum / 10;
+ TInt ones = aNum % 10;
+ if (aNum < 10)
+ {
+ aDes.Append((KChineseDigits())[ones]);
+ }
+ else if (10 == aNum)
+ {
+ aDes.Append(KCharTen);
+ }
+ else if (10 < aNum && aNum < 20)
+ {
+ aDes.Append(KCharTen);
+ aDes.Append((KChineseDigits())[ones]);
+ }
+ else if (20 == aNum)
+ {
+ aDes.Append((KChineseDigits())[tens]);
+ aDes.Append(KCharTen);
+ }
+ else if (20 < aNum && aNum < 30)
+ {
+ aDes.Append(KCharTwenty);
+ aDes.Append((KChineseDigits())[ones]);
+ }
+ else if (30 == aNum)
+ {
+ aDes.Append((KChineseDigits())[tens]);
+ aDes.Append(KCharTen);
+ }
+ else
+ {
+ __ASSERT_DEBUG(EFalse, User::Invariant());
+ }
+
+ TRACE_EXIT_POINT;
+ }
+
+//EOF
+
+