calendarui/regionalplugins/KoreanLunar/src/CalenKoreanLunarPlugin.cpp
branchRCL_3
changeset 31 97232defd20e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/calendarui/regionalplugins/KoreanLunar/src/CalenKoreanLunarPlugin.cpp	Tue Sep 14 21:17:03 2010 +0300
@@ -0,0 +1,647 @@
+/*
+* Copyright (c) 2002-2004 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 : Class looking after alarm fields for forms.
+*
+*/
+
+//debug
+#include "calendarui_debug.h"
+
+//user includes
+#include "CalenKoreanLunarPlugin.h"
+#include "CalenLunarInfoProvider.h"
+#include "CalenLunarLocalizedInfo.h"
+#include "CalenLunarLocalizer.h"
+#include "CalenLunarPanic.h"
+#include <CalenKoreanLunarPluginData.rsg>
+#include "CalenLunarSettingItem.h"
+#include "CalenKoreanLunarPrivateCRKeys.h"
+#include "CleanupResetAndDestroy.h"
+
+//system includes
+#include <AknMessageQueryDialog.h>
+#include <data_caging_path_literals.hrh>
+#include <eikenv.h>
+#include <eikmenup.h>
+#include <eiklabel.h>
+#include <CentralRepository.h>
+#include <StringLoader.h>
+#include <AknUtils.h>
+#include <aknsutils.h>
+#include <aknbiditextutils.h>
+#include <CalendarConverter.h>
+
+// CONSTANTS
+_LIT( KResourceDrive, "z:" );
+_LIT( KFieldSeparator, "\n" );
+_LIT( KHeaderSeparator, "\n  ");
+_LIT( KResourceFile, "CalenKoreanLunarPluginData.rsc" );
+const TInt KFieldCount = 2;
+#define KResourcePath KDC_RESOURCE_FILES_DIR
+
+// -----------------------------------------------------------------------------
+// CCalenKoreanLunarPlugin::CreateKoreanPluginL()
+// -----------------------------------------------------------------------------
+//
+CCalenKoreanLunarPlugin* CCalenKoreanLunarPlugin::CreateKoreanPluginL( 
+        MCalenServices* aServices )
+    {
+    TRACE_ENTRY_POINT;
+
+    CCalenKoreanLunarPlugin* plugin = new (ELeave) CCalenKoreanLunarPlugin( 
+            KCalenKoreanPluginEnabled, aServices );
+    CleanupStack::PushL( plugin );
+    plugin->ConstructL();
+    plugin->SetLunarLocalizerL();
+    CleanupStack::Pop( plugin );
+
+    TRACE_EXIT_POINT;
+    return plugin;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenKoreanLunarPlugin::~CCalenKoreanLunarPlugin()
+// -----------------------------------------------------------------------------
+//
+CCalenKoreanLunarPlugin::~CCalenKoreanLunarPlugin()
+    {
+    TRACE_ENTRY_POINT;
+    
+    // Deregister services
+    if ( iServices )
+        {
+        iServices->CancelNotifications( this );
+        iServices->Release();
+        }
+    
+    delete iLocInfo;
+    delete iInfoProvider;
+    if ( iLocalizer != NULL )
+        delete iLocalizer;
+
+    iResourceLoader.Close();    
+    delete iLabel;    
+    delete iConverter;
+    TRACE_EXIT_POINT;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenKoreanLunarPlugin::CCalenKoreanLunarPlugin()
+// -----------------------------------------------------------------------------
+//
+CCalenKoreanLunarPlugin::CCalenKoreanLunarPlugin(
+        TUint32 aCenRepLunarEnabledId, MCalenServices* aServices )
+    : iLocalizer( NULL ),
+      iResourceLoader( *( CEikonEnv::Static() ) ),
+      iCenRepLunarEnabledId( aCenRepLunarEnabledId ),
+      iServices( aServices )
+
+    {
+    TRACE_ENTRY_POINT;
+    TRACE_EXIT_POINT;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenKoreanLunarPlugin::SetLunarLocalizerL()
+// -----------------------------------------------------------------------------
+//
+void CCalenKoreanLunarPlugin::SetLunarLocalizerL()
+    {
+    TRACE_ENTRY_POINT;
+
+    iLocalizer = CCalenLunarLocalizer::NewL();
+
+    TRACE_EXIT_POINT;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenKoreanLunarPlugin::CustomPreviewPaneL()
+// -----------------------------------------------------------------------------
+//
+MCalenPreview* CCalenKoreanLunarPlugin::CustomPreviewPaneL( TRect& aRect )
+	{
+	return NULL;
+	}
+
+// -----------------------------------------------------------------------------
+// CCalenKoreanLunarPlugin::ConstructL()
+// -----------------------------------------------------------------------------
+//
+void CCalenKoreanLunarPlugin::ConstructL()
+    {
+    TRACE_ENTRY_POINT;
+
+    TFileName resource( KResourceDrive );
+    resource.Append( KResourcePath );
+    resource.Append( KResourceFile );
+
+    TInt err( iResourceLoader.Open( resource ) );
+    __ASSERT_ALWAYS( err == KErrNone, Panic( EPanicLunarResourceLoading ) );
+
+    LoadEnabledStatusL();
+
+    iInfoProvider = CCalenLunarInfoProvider::NewL( CEikonEnv::Static()->FsSession() );
+    iServices->RegisterForNotificationsL( this, ECalenNotifyContextChanged );
+	iServices->GetCommandRange( iStart, iEnd );    
+	iConverter = CKoreanCalConv::NewL();
+	
+    TRACE_EXIT_POINT;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenKoreanLunarPlugin::GetCustomViewsL()
+// -----------------------------------------------------------------------------
+//
+void CCalenKoreanLunarPlugin::GetCustomViewsL( RPointerArray<CCalenView>& 
+    /*aCustomViewArray*/ )
+	{
+    TRACE_ENTRY_POINT;
+    TRACE_EXIT_POINT;
+	}
+
+// -----------------------------------------------------------------------------
+// CCalenKoreanLunarPlugin::GetCustomSettingsL()
+// -----------------------------------------------------------------------------
+//
+void CCalenKoreanLunarPlugin::GetCustomSettingsL( 
+    RPointerArray<CAknSettingItem>& /*aCustomSettingArray*/ )
+	{
+    TRACE_ENTRY_POINT;   
+    TRACE_EXIT_POINT;
+	}
+
+// -----------------------------------------------------------------------------
+// CCalenKoreanLunarPlugin::InfobarL()
+// -----------------------------------------------------------------------------
+//
+CCoeControl* CCalenKoreanLunarPlugin::InfobarL( const TRect& aRect )
+	{
+	TRACE_ENTRY_POINT;
+	
+	if ( !iLabel )
+        {
+        iLabel = new ( ELeave ) CEikLabel;
+        }
+	iRect = aRect;
+    FormatExtraRowStringL( *iLabel );
+    iLabel->SetTextL( iExtraRowText );
+    iLabel->SetRect( aRect );
+    iLabel->SetLabelAlignment( ELayoutAlignCenter );
+    
+    if ( !GetColor() )
+        iLabel->OverrideColorL( EColorLabelText, iSkinColor ); 
+    
+    TRACE_EXIT_POINT;
+    return iLabel;
+	}
+
+// -----------------------------------------------------------------------------
+// CCalenKoreanLunarPlugin::InfobarL()
+// -----------------------------------------------------------------------------
+//
+const TDesC& CCalenKoreanLunarPlugin::InfobarL()
+	{
+    TRACE_ENTRY_POINT;
+    TRACE_EXIT_POINT;
+	return iExtraRowText;	
+	}
+
+// -----------------------------------------------------------------------------
+// CCalenKoreanLunarPlugin::GetColor()
+// -----------------------------------------------------------------------------
+//
+TInt CCalenKoreanLunarPlugin::GetColor()
+    {
+    TRACE_ENTRY_POINT;
+    // Query the text colour based on the theme
+    TInt err = AknsUtils::GetCachedColor( AknsUtils::SkinInstance(), iSkinColor,
+				KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG6 );
+    
+    TRACE_EXIT_POINT;
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenKoreanLunarPlugin::PreviewPaneL()
+// -----------------------------------------------------------------------------
+//
+CCoeControl* CCalenKoreanLunarPlugin::PreviewPaneL( TRect& aRect )
+	{
+    TRACE_ENTRY_POINT;
+
+   
+	if (iLabel)
+	    {
+		delete iLabel;
+		iLabel = NULL;
+	    }
+
+    
+    if ( !iLabel )
+        {
+        iLabel = new ( ELeave ) CEikLabel;
+        }
+    FormatExtraRowStringL( *iLabel
+	#ifdef RD_CALENDAR_PREVIEW
+							   , EFalse
+	#endif // RD_CALENDAR_PREVIEW
+							   );
+    iLabel->SetTextL( iExtraRowText );
+    iLabel->SetRect( aRect );
+    iLabel->SetLabelAlignment( ELayoutAlignCenter );
+    
+    if ( !GetColor() )
+    	iLabel->OverrideColorL( EColorLabelText, iSkinColor );
+
+	TRACE_EXIT_POINT;
+	return iLabel;	
+	}
+
+// -----------------------------------------------------------------------------
+// CCalenKoreanLunarPlugin::RemoveViewsFromCycle()
+// -----------------------------------------------------------------------------
+//
+void CCalenKoreanLunarPlugin::RemoveViewsFromCycle( RArray<TInt>& /*aViews*/ )
+	{
+    TRACE_ENTRY_POINT;
+    TRACE_EXIT_POINT;
+	}
+
+// -----------------------------------------------------------------------------
+// CCalenKoreanLunarPlugin::CustomiseMenuPaneL()
+// -----------------------------------------------------------------------------
+//
+TBool CCalenKoreanLunarPlugin::CustomiseMenuPaneL( TInt aResourceId, 
+    CEikMenuPane* aMenuPane )
+	{	
+	TRACE_ENTRY_POINT;
+	
+	if ( iLunarEnabled )
+		{
+		CEikMenuPaneItem* item = new ( ELeave ) CEikMenuPaneItem();
+		CleanupStack::PushL( item );
+		item->iData.iCommandId = iStart;
+	
+		HBufC* tmp = StringLoader::LoadLC( R_CALENDAR_SHOW_LUNAR_DATA );
+		item->iData.iText = *tmp;
+		CleanupStack::PopAndDestroy( tmp );
+	
+		item->iData.iCascadeId = 0;
+		item->iData.iFlags = 0;
+		
+		TInt pos = aMenuPane->NumberOfItemsInPane()-2;
+		if ( pos < 1 )
+			{
+			pos = 1;
+			}
+		
+		aMenuPane->InsertMenuItemL( item->iData, pos );
+		
+		CleanupStack::Pop( item );
+		return ETrue;
+		}
+	TRACE_EXIT_POINT;
+	return EFalse;		
+	}
+
+// -----------------------------------------------------------------------------
+// CCalenKoreanLunarPlugin::CanBeEnabledDisabled()
+// -----------------------------------------------------------------------------
+//
+TBool CCalenKoreanLunarPlugin::CanBeEnabledDisabled()
+	{
+    TRACE_ENTRY_POINT;
+    TRACE_EXIT_POINT;
+    return ETrue;
+	}
+
+// -----------------------------------------------------------------------------
+// CCalenKoreanLunarPlugin::CalenCustomisationExtensionL()
+// -----------------------------------------------------------------------------
+//
+TAny* CCalenKoreanLunarPlugin::CalenCustomisationExtensionL( TUid aExtensionUid )
+	{
+    TRACE_ENTRY_POINT;
+	TRACE_EXIT_POINT;
+	return NULL;
+	}
+
+// -----------------------------------------------------------------------------
+// CCalenKoreanLunarPlugin::CommandHandlerL()
+// -----------------------------------------------------------------------------
+//
+MCalenCommandHandler* CCalenKoreanLunarPlugin::CommandHandlerL( TInt aCommand )
+	{
+    TRACE_ENTRY_POINT;   
+    
+	if ( aCommand == iStart )
+		{
+		return this;
+		}
+	else
+		{
+		return NULL;
+		}
+	
+	TRACE_EXIT_POINT;  
+	}
+
+// -----------------------------------------------------------------------------
+// CCalenKoreanLunarPlugin::HandleCommandL()
+// -----------------------------------------------------------------------------
+//
+TBool CCalenKoreanLunarPlugin::HandleCommandL( const TCalenCommand& aCommand )
+	{
+	TRACE_ENTRY_POINT;
+
+	TInt command( aCommand.Command() );
+	if ( command == iStart )
+		{
+		ShowDetailsL();
+		}
+	TRACE_EXIT_POINT;
+	return EFalse;		
+	}
+
+// -----------------------------------------------------------------------------
+// CCalenKoreanLunarPlugin::CalenCommandHandlerExtensionL()
+// -----------------------------------------------------------------------------
+//
+TAny* CCalenKoreanLunarPlugin::CalenCommandHandlerExtensionL( TUid aExtensionUid )
+	{
+    TRACE_ENTRY_POINT;
+    TRACE_EXIT_POINT;  
+	return NULL;	
+	}
+
+// -----------------------------------------------------------------------------
+// CCalenKoreanLunarPlugin::HandleNotification()
+// -----------------------------------------------------------------------------
+//
+void CCalenKoreanLunarPlugin::HandleNotification( 
+    const TCalenNotification aNotification )
+	{
+	TRACE_ENTRY_POINT;
+
+    if ( aNotification == ECalenNotifyContextChanged )
+        {
+        TRAP_IGNORE( UpdateInfoBarL() );
+        }
+
+	TRACE_EXIT_POINT;
+	}
+
+// -----------------------------------------------------------------------------
+// GetCenRepIntL()
+// -----------------------------------------------------------------------------
+//
+TInt GetCenRepIntL( const TUid& aCRUid, TInt aKeyId )
+    {
+    TRACE_ENTRY_POINT;
+
+    CRepository* repository = CRepository::NewL( aCRUid );
+    CleanupStack::PushL( repository );
+    TInt tmp = 0;
+    TInt err = repository->Get( aKeyId, tmp );
+    if ( err == KErrNotFound )
+        {
+        tmp = 0;
+        }
+    else
+        {
+        User::LeaveIfError( err );
+        }
+    CleanupStack::PopAndDestroy( repository );
+
+    TRACE_EXIT_POINT;
+    return tmp;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenKoreanLunarPlugin::LoadEnabledStatusL()
+// -----------------------------------------------------------------------------
+//
+TBool CCalenKoreanLunarPlugin::LoadEnabledStatusL()
+    {
+    TRACE_ENTRY_POINT;
+
+    TInt enabled = 0;
+    TRAPD( err, enabled = GetCenRepIntL( KCRUidCalenKoreanPlugin, iCenRepLunarEnabledId ) );
+    if ( err == KErrNone )
+        {
+        iLunarEnabled = static_cast<TBool>( enabled );
+        }
+    else
+        {
+        iLunarEnabled = ETrue;
+        }
+    
+    TRACE_EXIT_POINT;
+    return iLunarEnabled;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenKoreanLunarPlugin::StoreEnabledStatusL()
+// -----------------------------------------------------------------------------
+//
+void CCalenKoreanLunarPlugin::StoreEnabledStatusL( TBool aEnabled )
+    {
+    TRACE_ENTRY_POINT;
+
+    CRepository* repository = CRepository::NewL( KCRUidCalenKoreanPlugin );
+    CleanupStack::PushL( repository );
+
+    User::LeaveIfError( repository->Set( iCenRepLunarEnabledId, 
+            static_cast<TInt>( aEnabled ) ) );
+    CleanupStack::PopAndDestroy( repository );
+
+    iLunarEnabled = aEnabled;
+
+    TRACE_EXIT_POINT;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenKoreanLunarPlugin::FormatExtraRowStringL()
+// -----------------------------------------------------------------------------
+//
+void CCalenKoreanLunarPlugin::FormatExtraRowStringL( CEikLabel& aLabel
+#ifdef RD_CALENDAR_PREVIEW
+                                               , TBool aTwoLines
+#endif // RD_CALENDAR_PREVIEW
+                                               )
+    {
+    TRACE_ENTRY_POINT;
+
+    // added hero to have always lates date
+	TTime focusTime = iServices->Context().FocusDateAndTimeL().TimeLocalL();	
+    TCalenLunarInfo info = iInfoProvider->GetLunarInfoL( focusTime );
+    
+    if ( iLocInfo )
+        {
+        delete iLocInfo;
+        iLocInfo = NULL;
+        }
+    
+	iLocInfo = iLocalizer->LocalizeL( info );
+    // add end	
+	
+    const CFont* font = NULL;
+    font = AknLayoutUtils::FontFromId( EAknLogicalFontPrimarySmallFont, NULL );    
+    aLabel.SetFont( font );
+    
+    TInt maxWidth = iRect.Size().iWidth;
+    
+    if ( font && iLocInfo )
+        {
+        iExtraRowText.Set( iLocalizer->GetExtraRowTextL( *iLocInfo,
+                                                         maxWidth,
+                                                         *font
+#ifdef RD_CALENDAR_PREVIEW
+                                                         , aTwoLines
+#endif // RD_CALENDAR_PREVIEW
+                                                         ) );
+        }
+    else
+        {
+        iExtraRowText.Set( KNullDesC );
+        }
+
+    TRACE_EXIT_POINT;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenKoreanLunarPlugin::ShowDetailsL()
+// -----------------------------------------------------------------------------
+//
+void CCalenKoreanLunarPlugin::ShowDetailsL( )
+    {
+    TRACE_ENTRY_POINT;
+
+    HBufC* msg = HBufC::NewLC( 1000 );
+
+    if ( iLocInfo )
+        {
+        // Headers
+        TInt headerIds[KFieldCount] = {
+            R_CALENDAR_LUNAR_INFO_DATE,
+            R_CALENDAR_LUNAR_INFO_WESTERN_DATE
+            };
+
+        RPointerArray<HBufC> headers;
+        CleanupResetAndDestroyPushL( headers );
+
+        for ( TInt i = 0; i < KFieldCount; i++ )
+            {
+            headers.Append( StringLoader::LoadL( headerIds[i] ) );
+            }
+
+        CPtrCArray* fields = new ( ELeave ) CPtrCArray( KFieldCount );
+        CleanupStack::PushL( fields );
+        fields->AppendL( iLocInfo->LunarMonthAndDay() );
+        fields->AppendL( iLocInfo->GregorianDate() );
+
+        for ( TInt i = 0; i < KFieldCount; i++ )
+            {
+            TPtrC field = fields->At( i );
+            if ( field != KNullDesC )
+                {
+                msg->Des().Append( *( headers[i] ) );
+                msg->Des().Append( KHeaderSeparator );
+                msg->Des().Append( field );
+                if ( i < KFieldCount - 1 ) // not last
+                    {
+                    msg->Des().Append( KFieldSeparator );
+                    }
+                }
+            }
+        CleanupStack::PopAndDestroy( fields );
+        CleanupStack::PopAndDestroy( &headers );
+        }
+
+    TPtrC ptr( *msg );
+    CAknMessageQueryDialog* dlg = CAknMessageQueryDialog::NewL( ptr );
+    CleanupStack::PushL( dlg );
+    dlg->PrepareLC( R_CALEN_LUNAR_DETAILS_DIALOG );
+    CleanupStack::Pop( dlg );
+
+    dlg->RunLD();
+    CleanupStack::PopAndDestroy( msg );
+
+    TRACE_EXIT_POINT;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenKoreanLunarPlugin::DateTimeToKoreanL()
+// -----------------------------------------------------------------------------
+//
+void CCalenKoreanLunarPlugin::DateTimeToKoreanL( const TDateTime& aDateTime, 
+    TKoreanDate& aKoreanDate )
+    {
+    TRACE_ENTRY_POINT;
+    iConverter->DateTimeToKoreanL( aDateTime, aKoreanDate );
+    TRACE_EXIT_POINT;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenKoreanLunarPlugin::KoreanToDateTimeL()
+// -----------------------------------------------------------------------------
+//
+void CCalenKoreanLunarPlugin::KoreanToDateTimeL( TKoreanDate& aKoreanDate, 
+    TDateTime& aDateTime )
+    {
+    TRACE_ENTRY_POINT;
+    iConverter->KoreanToDateTimeL( aKoreanDate, aDateTime );
+    TRACE_EXIT_POINT;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenKoreanLunarPlugin::DateRange()
+// -----------------------------------------------------------------------------
+//
+void CCalenKoreanLunarPlugin::DateRange( TDateTime& aLower, TDateTime& aUpper )
+    {
+    TRACE_ENTRY_POINT;
+    iConverter->DateRange( aLower, aUpper );
+    TRACE_EXIT_POINT;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenKoreanLunarPlugin::DateRange()
+// -----------------------------------------------------------------------------
+//
+void CCalenKoreanLunarPlugin::DateRange( TKoreanDate& aLower, TKoreanDate& aUpper )
+    {
+    TRACE_ENTRY_POINT;
+    iConverter->DateRange( aLower, aUpper );
+    TRACE_EXIT_POINT;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenKoreanLunarPlugin::UpdateInfoBarL()
+// -----------------------------------------------------------------------------
+//
+void CCalenKoreanLunarPlugin::UpdateInfoBarL()
+    {
+    TRACE_ENTRY_POINT;
+      
+    if ( iLabel )
+        {
+        FormatExtraRowStringL( *iLabel );
+        iLabel->SetTextL( iExtraRowText );
+        }
+        
+    TRACE_EXIT_POINT;
+    }
+
+// End of file