calendarui/views/src/calenweekview.cpp
author Simon Howkins <simonh@symbian.org>
Mon, 22 Nov 2010 16:01:09 +0000
branchRCL_3
changeset 93 d216ae5a8733
parent 66 bd7edf625bdd
child 67 1539a383d7b6
permissions -rw-r--r--
Adjusted to avoid exports, etc, from a top-level bld.inf

/*
* Copyright (c) 2002-2008 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 Week View of Calendar application.
 *
*/


#include <aknnavi.h>
#include <aknnavide.h>
#include <bldvariant.hrh> // For FeatureIds (lint warns without)
#include <eikmenup.h>
#include <eikspane.h>
#include <featmgr.h>
#include <StringLoader.h>
#include <aknappui.h>
#include <Calendar.rsg>
#include <calencommonui.rsg>
#include <calencommands.hrh>            // Calendar commands
#include <calencontext.h>
#include <CalenStatusPaneUtils.h>
#include <calenservices.h>
#include <caleninstanceid.h>
#include <calenviewutils.h>
#include <CalenInterimUtils2.h>

#include "calendarui_debug.h"
#include "calenweekview.h"
#include "calentitlepane.h"
#include "calenweekcontainer.h"
#include "calensend.h"
#include "ToDo.hrh"
#include "CalenUid.h"
#include "calendar.hrh"


// Button position of the MSK CBA button
const TInt KSK2CBAPosition = 2;

//  LOCAL CONSTANTS AND MACROS
#define iWeekContainer static_cast<CCalenWeekContainer*>( iContainer )

// ================= MEMBER FUNCTIONS =======================

// ----------------------------------------------------------------------------
// CCalenWeekView::NewLC
// Two-phased constructor.
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
EXPORT_C CCalenWeekView* CCalenWeekView::NewL( MCalenServices& aServices )
    {
    TRACE_ENTRY_POINT;

    CCalenWeekView* self = new(ELeave) CCalenWeekView( aServices );
    CleanupStack::PushL(self);
    self->ConstructL();
    CleanupStack::Pop( self );

    TRACE_EXIT_POINT;
    return self;
    }

// ----------------------------------------------------------------------------
// CCalenWeekView::~CCalenWeekView
// Destructor.
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
CCalenWeekView::~CCalenWeekView()
    {
    TRACE_ENTRY_POINT;
    TRACE_EXIT_POINT;
    }

// ----------------------------------------------------------------------------
// CCalenWeekView::CCalenWeekView
// C++ constructor can NOT contain any code, that might leave.
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
CCalenWeekView::CCalenWeekView( MCalenServices& aServices )
    : CCalenNativeView( aServices ),
      iPopulationStep( ENothingDone )
    {
    TRACE_ENTRY_POINT;
    TRACE_EXIT_POINT;
    }

// ----------------------------------------------------------------------------
// CCalenWeekView::ConstructL
// By default Symbian OS constructor is private.
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekView::ConstructL()
    {
    TRACE_ENTRY_POINT;

    CommonConstructL( R_CALEN_WEEKVIEW_INFO );
    //iLocalisedViewName = StringLoader::LoadL( R_CALEN_VIEW_WEEK, iCoeEnv );

    TRACE_EXIT_POINT;
    }

// ----------------------------------------------------------------------------
// CCalenWeekView::SetStatusPaneFromActiveContextL
// Set a date text to StatusPane
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekView::SetStatusPaneFromActiveContextL()
    {
    TRACE_ENTRY_POINT;

    if( !iWeekContainer->IsVisible() )
        {
        return;
        }
        
    TTime activeDay = CCalenContainer::DateFromContextL( iServices.Context() );
    // Title pane
    CCalenSetting* setting = CCalenSetting::InstanceL();
    CleanupReleasePushL( *setting );
    HBufC* title = iSPUtils->WeekNameByActiveTimeL( activeDay, 
                                                                        setting->WeekFormat(),
                                                                        setting->WeekTitle() );
    CleanupStack::PopAndDestroy( setting );
    CleanupStack::PushL( title );
    iSPUtils->UnderLineTitleText( EFalse );
    iSPUtils->SetTitleText( title );    // ownership passed
    CleanupStack::Pop( title );

    CAknNavigationDecorator* naviLabel = iSPUtils->ShowNaviPaneL( activeDay );

    TTime start = (activeDay);
    TLocale locale;
    TInt column(activeDay.DayNoInWeek() - locale.StartOfWeek());
    if (column < 0)
        {
        column += KCalenDaysInWeek;
        }
    start -= TTimeIntervalDays(column);

    ShowValidScrollButtons( *naviLabel,
                            start -TTimeIntervalDays(1),
                            start +TTimeIntervalDays( KCalenDaysInWeek ) );

    iSPUtils->RefreshStatusPane();
    TRACE_EXIT_POINT;
    }

// ----------------------------------------------------------------------------
// CCalenWeekView::DoActivateImplL
// CCalenNativeView::DoActivateL() calls DoActivateImplL()
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekView::DoActivateImplL( const TVwsViewId& aPrevViewId,
                                      TUid aCustomMessageId,
                                      const TDesC8& /*aCustomMessage*/ )
    {
    TRACE_ENTRY_POINT;
    if( aPrevViewId.iAppUid == KUidCalendar )    // switch from internal view
            {
            iShowBackButtonOnCba =
                ( aCustomMessageId == KUidCalenShowBackCba ? ETrue : EFalse );
            }
        else
            {
            iShowBackButtonOnCba = EFalse;
            }
    iWeekContainer->SetCursorToActiveDayL();
    //SetStatusPaneFromActiveContextL();
    
    TRACE_EXIT_POINT;
    }

// ----------------------------------------------------------------------------
// CCalenWeekView::DoDeactivateImpl
// CCalenNativeView::DoActivateL() calls DoActivateImplL()
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekView::DoDeactivateImpl()
    {
    TRACE_ENTRY_POINT;

    if (!iAvkonAppUi->IsDisplayingMenuOrDialog())
        {
        iSPUtils->HideNaviPane();
        //iNaviContainer->Pop(iNaviLabel);
        //delete iNaviLabel;
        //iNaviLabel = NULL;
        }
    
    TRACE_EXIT_POINT;
    }

// ----------------------------------------------------------------------------
// CCalenWeekView::OnLocaleChangedL
// Called when cross over midinight or locale change.
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekView::OnLocaleChangedL( TInt aReason )
    {
    TRACE_ENTRY_POINT;

    if(!iContainer)
        {
        return;
        }

    if (iContainer->IsVisible())
        {
        if (!IsContainerFocused())
            {
            iLocChangeReason = EChangesLocale;
            }
        else
            {
            if (aReason & EChangesLocale)
                {
                iWeekContainer->RedrawLocaleChangeL(
                    CCalenWeekContainer::ERedrawAll);
                }

            if (aReason & EChangesSystemTime)
                {
               // iWeekContainer->NotifyDocChange();
                }
            else
                {
                iWeekContainer->RedrawLocaleChangeL(
                    CCalenWeekContainer::ERedrawWeek);
                //SetStatusPaneFromActiveContextL();
                }
            }
        }
    else
        {
        iWeekContainer->RedrawLocaleChangeL(
            CCalenWeekContainer::ERedrawWeek);
        }

    TRACE_EXIT_POINT;
    }

// ----------------------------------------------------------------------------
// CCalenWeekView::CreateContainerImplL
// Creates CCalenContainer
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
CCalenContainer* CCalenWeekView::CreateContainerImplL()
    {
    TRACE_ENTRY_POINT;

    TRACE_EXIT_POINT;
    return new(ELeave) CCalenWeekContainer( this,
                                            iTime,
                                            iSelectedRowNumber,
                                            iFirstRowTime,
                                            iServices );
    }

// ----------------------------------------------------------------------------
// CCalenWeekView::RedrawStatusPaneL
// Redraw status pane when Form is closed
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekView::RedrawStatusPaneL()
    {
    TRACE_ENTRY_POINT;

    iWeekContainer->RedrawLocaleChangeL(
        CCalenWeekContainer::ERedrawWeek);
    SetStatusPaneFromActiveContextL();

    TRACE_EXIT_POINT;
    }

// ----------------------------------------------------------------------------
// CCalenWeekView::DynInitMenuPaneL
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekView::DynInitMenuPaneL(TInt aResourceId,
                                      CEikMenuPane* aMenuPane)
    {
    TRACE_ENTRY_POINT;


    iWeekContainer->HidePopup();


    CCalenNativeView::DynInitMenuPaneL(aResourceId, aMenuPane);
    switch (aResourceId)
        {
        case R_CALENDAR_WEEK_MENUPANE:
            {

#ifdef RD_CALEN_EXTERNAL_CAL
            TBool isit=ExtCalendarAvailableL();
            if (!isit)
                {
                ReleaseServiceHandler();
                TInt dummy;
                if (aMenuPane->MenuItemExists(ECalenExtAiwCommandId,dummy))
                    {
                    aMenuPane->DeleteMenuItem(ECalenExtAiwCommandId);
                    }
                }
#endif //RD_CALEN_EXTERNAL_CAL

            if ( ! FeatureManager::FeatureSupported(KFeatureIdHelp) )
                {
                aMenuPane->DeleteMenuItem(EAknCmdHelp);
                }
            if( !iServices.InterimUtilsL().MRViewersEnabledL( ETrue ) )
                {
                aMenuPane->DeleteMenuItem( ECalenNewMeetingRequest );
                }

            // Offer the menu pane to the services for customisation by the
            // the view manager/plugins
            iServices.OfferMenuPaneL( aResourceId, aMenuPane );

            break;
            }
        default:
            // Should we do ASSERT( EFalse );
            break;
        }

    TRACE_EXIT_POINT;
    }

// ----------------------------------------------------------------------------
// CCalenWeekView::HandleCommandL
// Command handling week view.
// We will handle MSK Open here. Other commands are passed to
// to the CCalenNativeView.
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekView::HandleCommandL( TInt aCommand )
    {
    TRACE_ENTRY_POINT;

    switch ( aCommand )
        {
        case ECalenForwardsToDayView:
        case EAknSoftkeyOpen:
            iWeekContainer->SetActiveContextFromHighlightL();
            CCalenNativeView::HandleCommandL( ECalenForwardsToDayView );
            break;

        // Special handling for new timed notes. Instead of creating at 8am on
        // current day, as per other views, just use the current context time.
        case ECalenNewMeeting:
        case ECalenNewMeetingRequest:
            {
            // set the editoractive for not showing the preview popup or preview pane
            SetEditorActive(ETrue);
            iServices.IssueCommandL( aCommand );
            }
            break;
        case EAknSoftkeyBack:
            {
            
            SetCbaL( R_CALEN_MONTH_AND_WEEK_VIEW_CBA );
            
            iServices.IssueNotificationL(ECalenNotifyWeekViewClosed);
            }
            break;
        default:
            CCalenNativeView::HandleCommandL( aCommand );
            break;
        }

    TRACE_EXIT_POINT;
    }
// ---------------------------------------------------------
// CCalenWeekView::UpdateCbaL
// Set context menubar and also CBA button back / exit.
// (other items were commented in a header).
// ---------------------------------------------------------
//
void CCalenWeekView::UpdateCbaL()
    {
    TRACE_ENTRY_POINT;

    if( iShowBackButtonOnCba )
        {
        CEikButtonGroupContainer*  cba = Cba();
        cba->SetCommandL( KSK2CBAPosition, R_CALEN_BACK_CBA_BUTTON);
        cba->DrawNow();
        }
    else
        {
        SetCbaL(R_CALEN_MONTH_AND_WEEK_VIEW_CBA);
        }
 
    TRACE_EXIT_POINT;
    }

// ----------------------------------------------------------------------------
// CCalenWeekView::Id
// From CAknView
// Return the UID of the week view
// (other items were commented in a header)
// ----------------------------------------------------------------------------
//
TUid CCalenWeekView::Id() const
    {
    TRACE_ENTRY_POINT;

    TRACE_EXIT_POINT;
    return KUidCalenWeekView;
    }

// ----------------------------------------------------------------------------
// CCalenWeekView::ClearViewSpecificDataL
// Clears any cached data for the specific view, e.g. currently
// highlighted row, column, etc.
// (other items were commented in a header)
// ----------------------------------------------------------------------------
//
void CCalenWeekView::ClearViewSpecificDataL()
    {
    TRACE_ENTRY_POINT;

    iTime = Time::NullTTime();
    iSelectedRowNumber = KErrNotFound;
    iFirstRowTime = -1;

    TRACE_EXIT_POINT;
    }

// ----------------------------------------------------------------------------
// CCalenWeekView::IsViewSpecificDataNullL
// From CCalenNativeView
// Returns ETrue if the view specific data is null, EFalse otherwise.
// (other items were commented in a header)
// ----------------------------------------------------------------------------
//
TBool CCalenWeekView::IsViewSpecificDataNullL()
    {
    TRACE_ENTRY_POINT;
    TRACE_EXIT_POINT;
    return ( iTime == Time::NullTTime() ) &&
           ( iSelectedRowNumber == KErrNotFound ) &&
           ( iFirstRowTime.Int() == -1 );
    }

// ----------------------------------------------------------------------------
// CCalenWeekView::ActiveStepL
// From CCalenView
// (other items were commented in a header)
// ----------------------------------------------------------------------------
//
CCalenView::TNextPopulationStep CCalenWeekView::ActiveStepL()
    {
    TRACE_ENTRY_POINT;
    switch( iPopulationStep )
        {
        case ENothingDone:
            {
			iWeekContainer->CheckLayoutAndExtensionL();
			
            RArray<TInt> colIdArray;
            CCalenNativeView::GetActiveCollectionidsL( iServices, colIdArray );
            if(colIdArray.Count() > 0)
                {
                if( !iServices.InstanceViewL(colIdArray) )
                    {
                    colIdArray.Reset();
                    return  CCalenView::EWaitForInstanceView;
                    }
                }
            else
                {
                if( !iServices.InstanceViewL() )
                    {
                    colIdArray.Reset();
                    return CCalenView::EWaitForInstanceView;
                    }
                }
            colIdArray.Reset();
            // else fall through...
            //lint -fallthrough
            }
        case ERequestedInstanceView:
            {
            iWeekContainer->BeginPopulationWithInstanceViewL();
            iPopulationStep = ESlotTable1Next;
            TRACE_EXIT_POINT;
            return CCalenView::EWaitForInstanceView;
            }
        case ESlotTable1Next:
            {
            iWeekContainer->FirstPopulateOfSlotTableL();
            iPopulationStep = ESlotTable2Next;
            TRACE_EXIT_POINT;
            return CCalenView::EKeepGoing;
            }
        case ESlotTable2Next:
            {
            iWeekContainer->SecondPopulateOfSlotTableL();
            iPopulationStep = ESetListBoxDataNext;
            TRACE_EXIT_POINT;
            return CCalenView::EKeepGoing;
            }
        case ESetListBoxDataNext:
        default:
            {
            iWeekContainer->CompletePopulationL();
            iPopulationStep = EPopulationDone;
            TRACE_EXIT_POINT;
            return CCalenView::EDone;
            }
        }
    }

// ----------------------------------------------------------------------------
// CCalenWeekView::CancelPopulation
// From CCalenView
// (other items were commented in a header)
// ----------------------------------------------------------------------------
//
void CCalenWeekView::CancelPopulation()
    {
    TRACE_ENTRY_POINT;

    iPopulationStep = ENothingDone;

    TRACE_EXIT_POINT;
    }

// ----------------------------------------------------------------------------
// CCalenWeekView::CyclePosition
// From CCalenView
// (other items were commented in a header)
// ----------------------------------------------------------------------------
//
CCalenView::TCyclePosition CCalenWeekView::CyclePosition() const
    {
    TRACE_ENTRY_POINT;
    TRACE_EXIT_POINT;
    return CCalenView::EReplaceWeekView;
    }

// ----------------------------------------------------------------------------
// CCalenWeekView::LocalisedViewNameL
// From CCalenView
// (other items were commented in a header)
// ----------------------------------------------------------------------------
//
const TDesC& CCalenWeekView::LocalisedViewNameL( CCalenView::TViewName aViewName )
    {
    TRACE_ENTRY_POINT;
    
    HBufC* ret = NULL;

    switch ( aViewName )
        {
        case CCalenView::EMenuName:
            if ( !iMenuName )
                {
                iMenuName = StringLoader::LoadL( R_CALEN_VIEW_WEEK, iCoeEnv );
                }
            ret = iMenuName;
            break;
        case CCalenView::ESettingsName:
            if ( !iSettingsName )
                {
                iSettingsName = StringLoader::LoadL( R_CALEN_QTN_DEFAULT_WEEK_VIEW,
                                                     iCoeEnv );
                }
            ret = iSettingsName;
            break;
        default:
            ASSERT( EFalse );
            break;
        }

    TRACE_EXIT_POINT;
    return *ret;
    }

// ----------------------------------------------------------------------------
// CCalenWeekView::ViewIcon
// From CCalenView
// (other items were commented in a header)
// ----------------------------------------------------------------------------
//
CGulIcon* CCalenWeekView::ViewIconL() const
    {
    TRACE_ENTRY_POINT;
    TRACE_EXIT_POINT;
    return iServices.GetIconL( MCalenServices::ECalenWeekViewIcon );
    }

// ----------------------------------------------------------------------------
// CCalenWeekView::UpdatePreviewPaneL
// Updates preview pane/preview popup
// (other items were commented in a header)
// ----------------------------------------------------------------------------
//
void CCalenWeekView::UpdatePreviewPaneL()
    {
    TRACE_ENTRY_POINT;
    
    CCalenWeekContainer* cnt = static_cast<CCalenWeekContainer*>( iContainer );
    if(cnt)
        {
        cnt->UpdatePreviewPaneL();
        }
    
    TRACE_EXIT_POINT;
    }

// ----------------------------------------------------------------------------
// CCalenWeekView::HidePreviewPane
// Hides preview pane/preview popup
// (other items were commented in a header)
// ----------------------------------------------------------------------------
//
void CCalenWeekView::HidePreviewPane()
    {
    TRACE_ENTRY_POINT;
    
    CCalenWeekContainer* cnt = static_cast<CCalenWeekContainer*>( iContainer );
    if(cnt)
        {
        cnt->HidePopup();
        }
    
    TRACE_EXIT_POINT;
    }

// End of File