calendarui/regionalplugins/KoreanLunar/src/CalenKoreanLunarPlugin.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 14 Sep 2010 21:17:03 +0300
branchRCL_3
changeset 31 97232defd20e
permissions -rw-r--r--
Revision: 201033 Kit: 201035

/*
* 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