calendarui/commonutils/src/CalenStatusPaneUtilsImpl.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 19 Aug 2010 09:53:43 +0300
branchRCL_3
changeset 28 96907930389d
parent 25 bf573002ff72
permissions -rw-r--r--
Revision: 201031 Kit: 201033

/*
* 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:  For view of calendar application.
 *
*/

 //debug
 #include "calendarui_debug.h"
 #include "calencontext.h"
 #include "CalenStatusPaneUtilsImpl.h"
 #include "calentitlepane.h"
 #include "calencustomnavilabel.h"
 #include <Calendar.rsg>
 
 #include <aknnavi.h>
 #include <AknUtils.h>
 #include <akntitle.h>
 #include <StringLoader.h>
 #include <avkon.hrh>
 #include <eikspane.h>
 
 
 #include <calennavilabel.h>
 #include <aknnavide.h>
 
 
 
 // ================= MEMBER FUNCTIONS =========================================

// local static funtions
static void ReplaceNewlines(TDes& aBuf)
    {
    TRACE_ENTRY_POINT;
    
    _LIT(KReplaceNewline, "\n");
    const TChar KSpace(' ');
    AknTextUtils::ReplaceCharacters( aBuf, KReplaceNewline, KSpace );
    
    TRACE_EXIT_POINT;
    }

static void ReplaceNewlines(HBufC& aBuf)
    {
    TRACE_ENTRY_POINT;
    
    TPtr ptr = aBuf.Des();
    ReplaceNewlines( ptr );
    
    TRACE_EXIT_POINT;
    }

// -----------------------------------------------------------------------------
// ?classname::?member_function
// ?implementation_description
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CCalenStatusPaneUtilsImpl::HideNaviPane()
    {
    TRACE_ENTRY_POINT;
    
    if( ( iNaviLabel != NULL ) && ( iNaviContainer->Top() == iNaviLabel ) )
        {
        if( iNaviLabel->ControlType() == CAknNavigationDecorator::ENotSpecified 
                  || iNaviLabel->ControlType() == CAknNavigationDecorator::ENaviLabel)
            {
            iNaviContainer->Pop( iNaviLabel );
            delete iNaviLabel;
            iNaviLabel = NULL;          
            }
        }
    
    TRACE_EXIT_POINT;
    }
// -----------------------------------------------------------------------------
// ?classname::?member_function
// ?implementation_description
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
 CAknNavigationDecorator* CCalenStatusPaneUtilsImpl::ShowNaviPaneL( const TTime& aActiveDay )
    {
    TRACE_ENTRY_POINT;
    
    TTime activeDay = aActiveDay;
    TBuf<KNaviLabelSize> naviDes;
    
   /* if( iNaviLabel != NULL )
        {
        delete iNaviLabel;
        iNaviLabel = NULL;
        iNaviContainer->Pop( iNaviLabel );
        }
    */
    activeDay.FormatL(naviDes, *iLongDateFormat);
    AknTextUtils::DisplayTextLanguageSpecificNumberConversion(naviDes);

    iNaviLabel = iNaviContainer->Top();
    if(iNaviLabel != NULL && iNaviLabel->ControlType() != CAknNavigationDecorator::ENaviLabel)
        {
        HideNaviPane();
        }
    // iNaviLabel should be of type CAknNavigationDecorator::ENaviLabel for
    // displaying date in navi pane.
    if(iNaviLabel != NULL && iNaviLabel->ControlType() == CAknNavigationDecorator::ENaviLabel)
        {
        CCoeControl* coeRes = iNaviLabel->DecoratedControl();
        CAknNaviLabel *actualLabel = static_cast<CAknNaviLabel*>(coeRes);
        actualLabel->SetTextL(naviDes);
        iNaviContainer->ReplaceL(*iNaviLabel, *iNaviLabel);
        }
    else
        {
        CCalenNaviLabel* label = new (ELeave) CCalenNaviLabel;
        CleanupStack::PushL(label);
        label->SetContainerWindowL( *iNaviContainer );
        label->SetTextL(naviDes);
        label->SetNaviLabelType(CAknNaviLabel::ENavigationLabel);
        CleanupStack::Pop( label ); // label
        iNaviLabel = CAknNavigationDecorator::NewL( iNaviContainer, 
                                           static_cast<CAknNaviLabel*>(label),
                                           CAknNavigationDecorator::ENaviLabel );
        iNaviLabel->SetContainerWindowL( *iNaviContainer );
        iNaviLabel->SetControlContext( iNaviContainer );
        iNaviLabel->MakeScrollButtonVisible(EFalse);
        iNaviContainer->PushL(*iNaviLabel);
        }
    

    TRACE_EXIT_POINT;
    return iNaviLabel;
    }
 // -----------------------------------------------------------------------------
 // ?classname::?member_function
 // ?implementation_description
 // (other items were commented in a header).
 // -----------------------------------------------------------------------------
 //
  CAknNavigationDecorator* CCalenStatusPaneUtilsImpl::ShowNaviPaneL( const TDesC& aName, const TRgb aColor )
     {
     TRACE_ENTRY_POINT;
     
     iNaviLabel = iNaviContainer->Top();
     if(iNaviLabel != NULL && iNaviLabel->ControlType() != CAknNavigationDecorator::ENotSpecified)
         {
         HideNaviPane();
         }
     // iNaviLabel should be of type CAknNavigationDecorator::ENotSpecified for
     // displaying calendar name and icon in navi pane.
     if(iNaviLabel != NULL && iNaviLabel->ControlType() == CAknNavigationDecorator::ENotSpecified)
         {
         CCoeControl* coeRes = iNaviLabel->DecoratedControl();
         CCustomNaviControl *actualLabel = static_cast<CCustomNaviControl*>(coeRes);
         actualLabel->SetCalendarNameAndColorL(aName, aColor);
         actualLabel->DrawDeferred();
         iNaviContainer->ReplaceL(*iNaviLabel, *iNaviLabel);
         }
     else
         {
         CCustomNaviControl *customControl = CCustomNaviControl::NewL(aName, aColor);
         CleanupStack::PushL(customControl);
         customControl->SetContainerWindowL(*iNaviContainer);
         CleanupStack::Pop( customControl ); // customControl
         
         iNaviLabel = CAknNavigationDecorator::NewL(iNaviContainer, customControl, CAknNavigationDecorator::ENotSpecified);
         
         iNaviLabel->SetContainerWindowL( *iNaviContainer );
         iNaviLabel->SetControlContext( iNaviContainer );
         iNaviLabel->MakeScrollButtonVisible(EFalse);
         iNaviContainer->PushL(*iNaviLabel);
         }
    TRACE_EXIT_POINT;
    return iNaviLabel;
    }

// -----------------------------------------------------------------------------
// ?classname::?member_function
// ?implementation_description
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
CCalenStatusPaneUtilsImpl* CCalenStatusPaneUtilsImpl::NewL( CEikStatusPane* aStatusPane )
    {
    TRACE_ENTRY_POINT;
    
    CCalenStatusPaneUtilsImpl* self = new(ELeave) CCalenStatusPaneUtilsImpl( aStatusPane );
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );
    
    TRACE_EXIT_POINT;
    return self;
    }
    
// -----------------------------------------------------------------------------
// ?classname::?member_function
// ?implementation_description
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
CCalenStatusPaneUtilsImpl::CCalenStatusPaneUtilsImpl( CEikStatusPane* aStatusPane )
    : iStatusPane( aStatusPane )
    {
    TRACE_ENTRY_POINT;
    TRACE_EXIT_POINT;
    }

// -----------------------------------------------------------------------------
// ?classname::?member_function
// ?implementation_description
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CCalenStatusPaneUtilsImpl::ConstructL()
    {
    TRACE_ENTRY_POINT;
    
    iTitlePane = static_cast<CCalenTitlePane*>(
                            iStatusPane->ControlL( TUid::Uid( EEikStatusPaneUidTitle )));
    iNaviContainer = static_cast<CAknNavigationControlContainer*>(
                            iStatusPane->ControlL(TUid::Uid( EEikStatusPaneUidNavi )));
    // Date format strings are used in all status pane variants
    iNoYearDateFormat = StringLoader::LoadL(R_QTN_DATE_WITHOUT_YEAR_WITH_ZERO);
    iShortDateFormat = StringLoader::LoadL(R_QTN_DATE_SHORT_WITH_ZERO);
    iLongDateFormat = StringLoader::LoadL(R_QTN_DATE_USUAL_WITH_ZERO);
    
    // construct Month name array
    iMonthArray = new(ELeave)CDesCArrayFlat(12);

    for (TInt i(0); i < 12; ++i)
        {
        HBufC* month = StringLoader::LoadLC(KMonthNames[i]);
        iMonthArray->AppendL(*month);
        CleanupStack::PopAndDestroy(month);
        }

    // construct Day name array
    iDayNameArray = new(ELeave)CDesCArrayFlat(KCalenDaysInWeek);
    for (TInt i(0); i < KCalenDaysInWeek; ++i)
        {
        HBufC* day = StringLoader::LoadLC( KDayNames[i] );
        iDayNameArray->AppendL(*day);
        CleanupStack::PopAndDestroy(day);
        }
    TRACE_EXIT_POINT;
    }

// -----------------------------------------------------------------------------
// ?classname::?member_function
// ?implementation_description
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
CCalenStatusPaneUtilsImpl::~CCalenStatusPaneUtilsImpl() 
    {
    TRACE_ENTRY_POINT;
    
    delete iNoYearDateFormat;
    delete iShortDateFormat;
    delete iLongDateFormat;
    delete iMonthArray;
    delete iDayNameArray;
    if( iNaviLabel && iNaviContainer->Top() == iNaviLabel)
        {
        delete iNaviLabel;
        }
    
    
    
    TRACE_EXIT_POINT;
    }

// -----------------------------------------------------------------------------
// ?classname::?member_function
// ?implementation_description
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CCalenStatusPaneUtilsImpl::SetTitleTextL( TDes& aText )
    {
    TRACE_ENTRY_POINT;
    // In Arabic variant, month names are not displayed because there is no
    // universal way to represent months in Arabic market area. 
    // Instead, Avkon.loc contains month numbers for month names.
    // They are defined as latin numbers. 
    // We need to convert number to display digits (e.g. Arabic-Indic) 
    AknTextUtils::DisplayTextLanguageSpecificNumberConversion( aText );
    TBool isOneRowTitle = iTitlePane->MaxNumberOfVisibleTextRows() == 1;
    if ( isOneRowTitle )
        {
        ReplaceNewlines( aText );
        }
    iTitlePane->SetTextL( aText );
    
    TRACE_EXIT_POINT;
    }

// -----------------------------------------------------------------------------
// ?classname::?member_function
// ?implementation_description
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CCalenStatusPaneUtilsImpl::SetTitleText( HBufC* aText )
    {
    TRACE_ENTRY_POINT;
    // In Arabic variant, month names are not displayed because there is no
    // universal way to represent months in Arabic market area. 
    // Instead, Avkon.loc contains month numbers for month names.
    // They are defined as latin numbers. 
    // We need to convert number to display digits (e.g. Arabic-Indic) 
    TPtr ptr( aText->Des() );
    AknTextUtils::DisplayTextLanguageSpecificNumberConversion( ptr );
    TBool isOneRowTitle = iTitlePane->MaxNumberOfVisibleTextRows() == 1;
    if ( isOneRowTitle )
        {
        ReplaceNewlines( *aText );
        }
    iTitlePane->SetText( aText );
    
    TRACE_EXIT_POINT;
    }

// -----------------------------------------------------------------------------
// ?classname::?member_function
// ?implementation_description
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CCalenStatusPaneUtilsImpl::UnderLineTitleText( TBool aUnderLine )
    {
    TRACE_ENTRY_POINT;
    
    // Only CCalenTitlePane can SetUnderLine
    iTitlePane->SetUnderLine( aUnderLine );
    
    TRACE_EXIT_POINT;
    }
    
// -----------------------------------------------------------------------------
// ?classname::?member_function
// ?implementation_description
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CCalenStatusPaneUtilsImpl::MonthNameByActiveTime( TDes& name, const TTime& aTime )
    {
    TRACE_ENTRY_POINT;
    
    name = (*iMonthArray)[aTime.DateTime().Month()];
    
    TRACE_EXIT_POINT;
    }

// -----------------------------------------------------------------------------
// ?classname::?member_function
// ?implementation_description
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CCalenStatusPaneUtilsImpl::DayNameByActiveTime( TDes& name, const TTime& aTime )
    {
    TRACE_ENTRY_POINT;
    
    name = (*iDayNameArray)[aTime.DayNoInWeek()];
    
    TRACE_EXIT_POINT
    }
    
// -----------------------------------------------------------------------------
// ?classname::?member_function
// ?implementation_description
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
HBufC* CCalenStatusPaneUtilsImpl::WeekNameByActiveTimeL( const TTime& aTime,
                                                                              TDay aDayFormat,
                                                                              TCalenWeekTitle aType )
    {
    TRACE_ENTRY_POINT;

    HBufC* firstRow = NULL;
    // Calculate first day of week
    TTime firstDay(aTime);
    TLocale locale;
    TInt column = aTime.DayNoInWeek() - locale.StartOfWeek();
    if (column < 0)
        {
        column += KCalenDaysInWeek;
        }
    firstDay -= TTimeIntervalDays(column);

    // Decide what goes to first row 
    // Week view duration is shown. 
    if ( aDayFormat != EMonday || aType == EWeekTitleDuration)
        {
        TTime lastDay(firstDay + TTimeIntervalDays(KCalenDaysInWeek - 1));

        CDesCArrayFlat* array = new(ELeave)CDesCArrayFlat(2);
        CleanupStack::PushL(array);
        TBuf<KWeekTitleSize> tmp;
        TBool isOneRowTitle = iTitlePane->MaxNumberOfVisibleTextRows() == 1;

        const TDesC& fmt = isOneRowTitle ? 
                                *iNoYearDateFormat : *iShortDateFormat;

        firstDay.FormatL(tmp, fmt );
        AknTextUtils::DisplayTextLanguageSpecificNumberConversion(tmp);
        array->AppendL(tmp);

        lastDay.FormatL(tmp, fmt );
        AknTextUtils::DisplayTextLanguageSpecificNumberConversion(tmp);
        array->AppendL(tmp);

        firstRow = StringLoader::LoadL( R_CALENDAR_WEEK_PERIOD_TITLE, *array );
        CleanupStack::PopAndDestroy( array );
        }
    // Week number is shown
    else
        {
        firstRow = StringLoader::LoadL( R_CALENDAR_WEEK_VIEW_TITLE,
                                                   firstDay.WeekNoInYear() );
        }
        
    TRACE_EXIT_POINT;
    return firstRow;
    }

// -----------------------------------------------------------------------------
// ?classname::?member_function
// ?implementation_description
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CCalenStatusPaneUtilsImpl::RefreshStatusPane()
    {
    TRACE_ENTRY_POINT;
    
    iStatusPane->DrawNow();
    
    TRACE_EXIT_POINT;
    }
// End of file