calendarui/views/inc/calendaycontainer.h
author andy simpson <andrews@symbian.org>
Thu, 02 Sep 2010 15:47:07 +0100
branchRCL_3
changeset 67 1539a383d7b6
parent 48 bf573002ff72
parent 66 bd7edf625bdd
permissions -rw-r--r--
Merge after removal of incorrect RCL_3 drop

/*
* Copyright (c) 2002 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 Day view container of calendar application.
 *                The class derived from CCalenContainer.
 *
*/


#ifndef CALENDAYCONTAINER_H
#define CALENDAYCONTAINER_H

//  INCLUDES
#include <eiklbo.h>
#include <caleninstanceid.h>            // TCalenInstanceId
#include <gestureobserver.h>

#include "calencontainer.h"
#include "CalendarVariant.hrh"

// CONSTANTS
const TInt KIndexError = -1;

// FORWARD DECLARATIONS
class CCalenDayListBoxModel;
class CCalenDayListBox;
class CCalenDayListBoxView;
class CCalenDayView;
class CCalInstance;
class CAknsFrameBackgroundControlContext;
class TCalenInstanceId;

namespace GestureHelper
    {
    class CGestureHelper;
    }

//  CLASS DEFINITIONS
/**
 * CCalenDayContainer container control class for DayView.
 */
NONSHARABLE_CLASS(  CCalenDayContainer ) : public CCalenContainer,
                                                   public MEikListBoxObserver,
                                                   public GestureHelper::MGestureObserver
    {
public: // Data

    NONSHARABLE_STRUCT( SItemInfo )
        {
        TTimeIntervalMinutes iStartTime;
        TCalenInstanceId iId;
        TBool iTimedNote;
        TInt iTopLine;
        TInt iBottomLine;

        // Fetched instance is temporarily stored to iTmpInstance 
        // This is destroyed after construction phase is over.
        CCalInstance* iTmpInstance;
        TUint32 iColor;
        };

public:  // Constructors and destructor
    /**
     * C++ default constructor.
     */
    CCalenDayContainer( CCalenNativeView* aView,
                        TTime& aDate,
                        TInt& aHighlightedRowNumber,
                        TInt& aFirstEntryOnScreenIndex,
                        MCalenServices& aServices );
    /**
     * Destructor.
     */
    virtual ~CCalenDayContainer();

public: // From CalenContainer
    /**
     * Create icon index
     */
    void CreateIconIndicesL( RArray<MCalenServices::TCalenIcons>& aIndexArray );
	
    /**
     * Handles list box events.
     * @param aListBox   The originating list box.
     * @param aEventType A code for the event.
     */
    void HandleListBoxEventL(CEikListBox* aListBox, TListBoxEvent aEventType);
    
public:     // New function
    /**
     * Refresh Day view data and draws
     */
    void UpdateContainerL();

    /**
     * Update time format (12/24)
     */
    void UpdateTimeFormat();

    /**
     * @return ETrue, if day view doesn't have any instances to show.
     */ 
    TBool IsEmptyView() const;
    
    /**
     * Get the available preview pane rect for this container
     */
    TRect PreviewRectL();
    
    //void SetActiveContextFromHighlightL();

#ifdef RD_CALEN_MIDNIGHT_VISUALIZATION    
    TBool IsMidnightVisualization() const;
#endif // RD_CALEN_MIDNIGHT_VISUALIZATION
    
    /**
     * Get instances for day. List of instances is processed during construction 
     * of list box data and destroyed once it's done.
     * Step 1 of construction of listbox data.
     */
    void GetInstanceListL();
    
    /**
     * Setup layout table.
     * Step 2 of construction of listbox data
     */
    void CreateSlotTableL();
    
    /**
     * Completes population.
     * Step 3 of construction of listbox data.
     */
    void CompletePopulationL();

    /**
     * Get the available info bar rect for this container
     */
    TRect InfoBarRectL( TBool aToolbarAvailable );    

    /**
     * Sets the context based on the highlighted item.
     */
    void SetContextFromHighlightL();

    /**
     * Sets the highlighted item based on the context.
     */
    void SetHighlightFromContextL();

    /**
     * Delete note command notification handler
     */
    void NotifyDeleteItemL();
    
    /**
     * Returns ETrue if event has geo coordinates else EFalse
     */
    TBool IsEventHasMapLocationL();
	
	/**
     * Returns ETrue if event has location text else EFalse
     */
    TBool IsEventHasNoLocationTextL();
  
    /**
     * This method is called after pointer event in Navi
     * decoration object.
     * @param aDirection right or left
     */
    void HandleNaviDecoratorEventL(TInt aEventID);
    
    /**
     * Handles long tap events
     */
    void HandleLongTapEventL( const TPoint& aPenEventLocation, 
                              const TPoint& aPenEventScreenLocation );
    
    /**From MGestureObserver
     * Handle the gesture event
     * @param aEvent event describing the gesture 
     */
    virtual void HandleGestureL( const GestureHelper::MGestureEvent& aEvent );
    
    /**
     * Check whether entry exists or not
     */
    TBool IsValidEntryL();
private:    // New function

#ifdef RD_CALEN_MIDNIGHT_VISUALIZATION    
    void GetMidnightVisualizationL();
#endif // RD_CALEN_MIDNIGHT_VISUALIZATION
    /** 
     * Destroy all CCalInstances. This is called during construction of view data
     * once we have constructed actual listbox data.
     */
    void DestroyInstanceListL();

    /**
     * Set Listbox data to ListBox
     * Part of step 3 of construction of listbox data
     */
    void CreateListBoxDataL();

    /**
     * Called in the final stage of population. If we've just deleted an entry,
     * update which row is highlighted
     */
    void UpdateHighlightedRowIfDeletedL();

    // FIXME document these
    //void SetActiveContextForFreshDayL(TTime& aDay);
    //void SetActiveContextFromEntryL(const CCalEntry& aEntry,const TCalTime& aInstanceTime);
    
    /**
     * Handles pressing left or right.
     */
    void HandleHorizontalScrollL( TTimeIntervalDays aDirection );

    /**
     * Handles pressing up or down.
     */
    void HandleVerticalScrollL( TInt aNewCursor );

    /**
     * Sets highlight item in ListBox
     * @param aIndex Index of ListBox
     * @param aTopItem Index of top item
     */
    void SetHighlightAndVisibleItem(TInt aIndex, TInt aTopItem = KIndexError);

    TInt FindItemIndex(const TCalenInstanceId& aId) const;

    TInt FindItemIndexForRow(TInt aListIndex) const;
    
public:
    SItemInfo& FindItem(TInt aListIndex) const;
    
    MCalenServices& Services();
    
private:

    
    /**
     * Searches list item that is nearest to aTime
     * @param aTime 
     * @return if there is such item, index in ListBox is returned
     *         othwerise returns KIndexError.
     */
    TInt SearchNearestItem(TTimeIntervalMinutes aTime) const;

    void SetVisibleLines(TInt aHighlightFirstLine,
                         TInt aPreferredTopLine);

    

    CCalenDayListBoxView* View();

    CCalenDayView& DayView() const;
    public:

    enum TDayLayoutVariant
        {
        ENoLayoutVariantSet = 0,
        EListScrollCaleDayPane,
        EPopupToolbarWindowCp02,
        EScrollPaneCp09,
        EBgCalePane,
        EListCalePane,
        EListScrollCaleDayPaneT1
        };
    TInt LayoutVariantIndex(TDayLayoutVariant aLayout) const;
    
    /**
     * From CCalenContainer.
     * (no implementation)
     * This methods is called after calendar settings have changed.
     */
    void UpdateSize();

private:    // From CCoeControl
    /**
     * From CCoeControl Resizes child controls
     */
    void SizeChanged();
    void FocusChanged( TDrawNow aDrawNow );
    void HandleResourceChange(TInt aType);

    /**
     * From CCoeControl Gets child control count
     * @return Child control count
     */
    TInt CountComponentControls() const;
    /**
     * From CCoeControl Gets child control pointer
     * @param aIndex Child control index
     * @return child control pointer
     */
    CCoeControl* ComponentControl(TInt aIndex) const;
    /**
     * From CCoeControl Process key event
     * @param aKeyEvent The key event.
     * @param aType EEventKey | EEventKeyUp | EEventKeyDown.
     * @return EKeyWasNotConsumed: Key event was not consumed.
     */
    TKeyResponse OfferKeyEventL(
        const TKeyEvent& aKeyEvent, TEventCode aType);

    /**
     * From CCoeControl Handle pointer event
     * @param aPointerEvent Event to be handled.
     */
    void HandlePointerEventL(const TPointerEvent& aPointerEvent);

    /**
     * From CCoeControl Drawing day name
     * @param aRect Clipping rectangle
     */
    void Draw(const TRect& aRect) const;

    /**
     * Pass skin information if needed
     */
    TTypeUid::Ptr MopSupplyObject(TTypeUid aId);

    /**
     * From CCoeControl Gets help context
     * @param aContext Help context
     */
    void GetHelpContext(TCoeHelpContext& aContext) const;

private:    // From CCalenContainer
    /**
     * From CCalenContainer Third phase constructor.
     * This function was called CCalenView::ConstructL().
     */
    void ConstructImplL();


    
    /**
     * From CCalenContainer Date cahnge operation notification handler.
     * (i.e. GotoDate).
     */
    void NotifyChangeDateL();

    /**
     * Notify that item is added or changed.
     * @param aEntry is the entry added or modified.
     * @param aInstanceTime is time of the modified instance.
     */ 
    //void NotifyEntryChangeL(const CCalEntry& aEntry,const TCalTime& aInstanceTime);

    
private: // New Functions
    /** 
     * Updates icons after e.g. skin change
     */ 
    void UpdateIconsL();
    
private:    // From MActiveStep
    /**
     * From MActiveStep Updates DayView data
     * @return 0 is DoStepL() exit code
     */
    //TInt DoStepL();

private:    // Data
    CCalenDayListBox* iListBox;
    CCalenDayListBoxModel* iListBoxModel;

    RPointerArray<CCalInstance> iInstanceList;
    CArrayFixFlat<SItemInfo>* iLayoutTable;

    /*enum TStepPopulate
        {
        ENothingDone,
        EPopulationDone,
        ESlotTableDone,
        EDone
        };
    TStepPopulate iStepsCompleted;*/
    TInt iDeletedIndex;
    TBool iMidnight;
    CAknsFrameBackgroundControlContext* iBackgroundSkinContext;

    TBool iDateWasNull;
// View specific data references
    TTime& iDate;                   // Current day
    TInt& iHighlightedRowNumber;
    TInt& iFirstEntryOnScreenIndex;
    
    /**
     * Gesture helper provides functionality to convert a stream of pointer 
     * events into a logical gesture.
     * Own.
     */
    GestureHelper::CGestureHelper* iGestureHelper;
    TBool iGestureHandled;
    };

#endif // CALENDAYCONTAINER_H

// End of File