--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/calendarui/editors/src/KoreanLunarDateEditor.cpp Tue Sep 14 21:17:03 2010 +0300
@@ -0,0 +1,261 @@
+/*
+* Copyright (c) 2010 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:
+*
+*/
+
+#include <barsread.h>
+#include <aknextendedinputcapabilities.h>
+#include "KoreanLunarDateEditor.h"
+#include "KoreanLunarDateUtil.h"
+
+// debug
+#include "calendarui_debug.h"
+
+_LIT( KDelimiter, "/" );
+_LIT( KLunarIndicator, "\xC74C\xB825" );
+_LIT( KLeapIndicator, "\xC724\xB2EC" );
+
+const TInt KNumFields = 4; /* [Indicators][month]/[day] */
+const TInt KMinLeapMonth = 2;
+const TInt KMinMonth = 1;
+const TInt KMaxLeapMonth = 11;
+const TInt KMaxMonth = 12;
+const TInt KMinDay = 1;
+const TInt KMaxDay = 31;
+
+
+/**
+ * Public method for constructing a CKoreanLunarDateEditor object.
+ */
+CKoreanLunarDateEditor* CKoreanLunarDateEditor::NewL(MCalenServices* aServices)
+ {
+ TRACE_ENTRY_POINT;
+ CKoreanLunarDateEditor* editor=new(ELeave)CKoreanLunarDateEditor(aServices);
+ CleanupStack::PushL(editor);
+ editor->ConstructL(0); // flags are not used
+ CleanupStack::Pop(editor);
+
+ TRACE_EXIT_POINT;
+ return editor;
+ }
+
+
+CKoreanLunarDateEditor::CKoreanLunarDateEditor(MCalenServices* aServices):iServices(aServices)
+ {
+ TRACE_ENTRY_POINT;
+ TRACE_EXIT_POINT;
+ }
+
+
+void CKoreanLunarDateEditor::ConstructL( const TInt /* aFlags */ )
+ {
+ TRACE_ENTRY_POINT;
+ HBufC* charField;
+ iConverter = CKoreanCalConv::NewL();
+ iDateUtil = CKoreanLunarDateUtil::NewL(iServices);
+ iLeap = EFalse;
+// todo add editable field to first place to go around avkon crash if avkon can not be fixed
+ CreateFieldArrayL( KNumFields );
+
+ iIndicatorField = HBufC::NewL(2);
+ iIndicatorField->Des().Append( KLunarIndicator );
+ AddField( CEikMfneSeparator::NewL( iIndicatorField ) );
+
+
+ iMonthField = CEikMfneNumber::NewL( *Font(),
+ KMinMonth,
+ KMaxMonth,
+ KMinMonth,
+ (CEikMfneNumber::EFillWithLeadingZeros|CEikMfneNumber::EPreserveOldWidthBeforeEditing) );
+ AddField( iMonthField );
+ iMonthField->SetValue( KMinMonth, *Font() );
+ charField = HBufC::NewLC(1);
+ charField->Des().Append( KDelimiter );
+ AddField( CEikMfneSeparator::NewL( charField ) );
+ CleanupStack::Pop(); // charField
+
+ iDayField = CEikMfneNumber::NewL( *Font(),
+ KMinDay,
+ KMaxDay,
+ KMinDay,
+ (CEikMfneNumber::EFillWithLeadingZeros|CEikMfneNumber::EPreserveOldWidthBeforeEditing) );
+ AddField( iDayField );
+ iDayField->SetValue( KMinDay, *Font() );
+ MObjectProvider* mop = InputCapabilities().ObjectProvider();
+ if( mop )
+ {
+ CAknExtendedInputCapabilities* extendedInputCapabilities = mop->MopGetObject( extendedInputCapabilities );
+ if( extendedInputCapabilities )
+ {
+ extendedInputCapabilities->SetCapabilities( CAknExtendedInputCapabilities::ESupportsOnlyASCIIDigits );
+ }
+ }
+ TRACE_EXIT_POINT;
+ }
+
+/**
+ * Method for Setting the date.
+ *
+ */
+void CKoreanLunarDateEditor::SetDate( const TTime& aDate, TBool newEntry )
+ {
+ TRACE_ENTRY_POINT;
+ iDate = aDate.DateTime();
+ TKoreanDate lunarDate;
+ TInt err = KErrNone;
+
+ if( !newEntry )
+ {
+ TRAP( err, iConverter->DateTimeToKoreanL( iDate, lunarDate ) );
+ }
+
+ if( newEntry || err != KErrNone )
+ { /* Use always initial values in case of new entry or
+ failed conversion */
+ if( iLeap )
+ {
+ iMonthField->SetValue( KMinLeapMonth, *Font() );
+ iDayField->SetValue( KMinDay, *Font() );
+ }
+ else
+ {
+ iMonthField->SetValue( KMinMonth, *Font() );
+ iDayField->SetValue( KMinDay, *Font() );
+ }
+ }
+ else
+ {
+ iMonthField->SetValue( lunarDate.iMonth, *Font() );
+ iDayField->SetValue( lunarDate.iDay, *Font() );
+ }
+ //DrawNow();
+ TBool error = EFalse;
+ TBool dataAltered = ETrue;
+ // needs to call this to make redraw work correctly
+ HandleInteraction(EFalse, 2, 0, CEikMfneField::ECursor, dataAltered, error);
+ TRACE_EXIT_POINT;
+ }
+
+/**
+ * Method for reading the editor value.
+ *
+ */
+TTime CKoreanLunarDateEditor::Date()
+ {
+ TRACE_ENTRY_POINT;
+ TRAP_IGNORE( iDate = iDateUtil->GetNearestGregorianDateL( iMonthField->Value(), iDayField->Value(), iLeap, iDate ) );
+
+ TRACE_EXIT_POINT;
+ return TTime(iDate);
+ }
+
+/**
+ * Method for setting the editor to leap mode.
+ * Gets one parameter:
+ * const TBool aLeap - ETrue if leap mode is to be enabled, EFalse if disabled.
+ *
+ */
+void CKoreanLunarDateEditor::SetLeap( const TBool aLeap )
+ {
+ TRACE_ENTRY_POINT;
+ if( aLeap != iLeap )
+ {
+ iLeap = aLeap;
+ if( iLeap )
+ {
+ iIndicatorField->Des().Replace( 0, 2, KLeapIndicator );
+ iMonthField->SetValue( KMinLeapMonth, *Font() );
+ iDayField->SetValue( KMinDay, *Font() );
+ iMonthField->SetMinimumAndMaximum( KMinLeapMonth,
+ KMaxLeapMonth,
+ *Font() );
+ }
+ else
+ {
+ iIndicatorField->Des().Replace( 0, 2, KLunarIndicator );
+ iMonthField->SetValue( KMinMonth, *Font() );
+ iDayField->SetValue( KMinDay, *Font() );
+ iMonthField->SetMinimumAndMaximum( KMinMonth,
+ KMaxMonth,
+ *Font() );
+ }
+ DrawNow();
+ }
+ TRACE_EXIT_POINT;
+ }
+
+/**
+ * Method for reading the leap mode status.
+ *
+ */
+TBool CKoreanLunarDateEditor::Leap() const
+ {
+ TRACE_ENTRY_POINT;
+ TRACE_EXIT_POINT;
+
+ return iLeap;
+ }
+
+/**
+ * Method for constructing the control from resources.
+ * Gets one parameter:
+ * TResourceReader& aResourceReader - Reference to a resource reader associated to a
+ * Korean lunar date editor control resource.
+ *
+ */
+void CKoreanLunarDateEditor::ConstructFromResourceL(TResourceReader& aResourceReader)
+ {
+ TRACE_ENTRY_POINT;
+ TUint32 flags = aResourceReader.ReadUint8();
+ ConstructL( flags );
+ TRACE_EXIT_POINT;
+ }
+
+
+void CKoreanLunarDateEditor::PrepareForFocusLossL()
+ {
+ TRACE_ENTRY_POINT;
+ CEikMfne::PrepareForFocusLossL();
+ CKoreanLunarDateUtil* dateUtil = CKoreanLunarDateUtil::NewLC(iServices);
+ TTime nowTime;
+ nowTime.HomeTime();
+
+ TRAP_IGNORE( iDate = dateUtil->GetNearestGregorianDateL( iMonthField->Value(), iDayField->Value(), iLeap, nowTime.DateTime() ) );
+ /* Pop and destroy dateUtil */
+ CleanupStack::PopAndDestroy();
+ TRACE_EXIT_POINT;
+ }
+
+void CKoreanLunarDateEditor::HandleControlStateChangeL( TInt aControlId )
+ {
+ TRACE_ENTRY_POINT;
+ TRACE_EXIT_POINT;
+ }
+
+void* CKoreanLunarDateEditor::ExtensionInterface( TUid /*aInterface*/ )
+ {
+ TRACE_ENTRY_POINT;
+ TRACE_EXIT_POINT;
+
+ return NULL;
+ }
+
+void CKoreanLunarDateEditor::CEikMfne_Reserved()
+ {
+ TRACE_ENTRY_POINT;
+ TRACE_EXIT_POINT;
+ }
+
+// End of file