calendarui/views/inc/calenweeklistboxlayout.h
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:32:31 +0100
branchRCL_3
changeset 66 bd7edf625bdd
parent 0 f979ecb2b13e
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* Copyright (c) 2005 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:   Layout calculations for week view listbox. 
*                Week view implementation differs from LAF specification model
*                and some calculations are needed.
*
*/



#ifndef CALENWEEKLISTBOXLAYOUT_H
#define CALENWEEKLISTBOXLAYOUT_H

#include <AknUtils.h>
#include <e32std.h>

#include "CalendarVariant.hrh"

/**
 * TWeekListBoxLayout provides helper functions to calculate correct layout values
 * for week view listbox.
 * 
 * Long description below is divided to two sections:
 * 1) Rationale: Why listbox layout calculations are needed?
 * 2) (Naming) conventions explained 
 *
 *
 * 1) Rationale: Why listbox layout calculations are needed
 *    -----------------------------------------------------
 *
 * Week view implementation differs from LAF specification. 
 * LAF specification defines week view grid and time pane in the left side of grid. 
 * But implementation uses listbox which combines both grid and time pane.
 * 
 * Implementation implements week view as specially customized Uikon listbox. Uikon listboxes have
 * list items (= list rows), which have several subcells (rectangle inside row).
 * For week view listbox, first column is for hour labels, and it can't be focused.
 * Next 7 columns are for day columns of scrollable grid. Each row is one list item. 
 *
 * Following images might help you to imagine the idea: 
 *
 * Week view: 
 *
 *         Mo  Tu  We  Th  Fr  Sa  Su
 *  -----------------------------------
 *   8:00 |___|___|___|___|___|___|___|
 *   9:00 |___|___|_#_|___|___|___|___|
 *  10:00 |___|___|_#_|___|_#_|___|___|
 *  11:00 |___|___|___|___|_#_|___|___|
 * ... 
 *
 * Listbox: used in implementation, not defined in LAF
 * 
 *   8:00 |___|___|___|___|___|___|___|
 *   9:00 |___|___|_#_|___|___|___|___|
 *  10:00 |___|___|_#_|___|_#_|___|___|
 *  11:00 |___|___|___|___|_#_|___|___|
 * ... 
 *
 * Time pane: defined in LAF
 *   8:00 
 *   9:00 
 *  10:00 
 *  11:00 
 * ...
 *
 * Week view grid: defined in LAF
 *
 *  |___|___|___|___|___|___|___|
 *  |___|___|_#_|___|___|___|___|
 *  |___|___|_#_|___|_#_|___|___|
 *  |___|___|___|___|_#_|___|___|
 * ...
 *
 *
 * 2) (Naming) conventions explained 
 *    ------------------------------
 * 
 * Following conventions are used:
 * - TAknLayoutRect/TAknLayoutText are written similar way as Avkon Layout system functions:
 *   lower case, with underscore _ separating words. 
 *   e.g. TAknLayotRect cale_week_time_pane 
 * 
 * - TRect types has _Rect ending 
 *   e.g. TRect main_pane_Rect 
 * 
 * - cached (member variables) have i_ in the beginning
 *   e.g TAknLayoutRect i_grid_cale_week_pane
 * 
 * - Layout values that can't be read from layout data but has to be calculated are always TRects. 
 *   They have Rect ending. They are written in CamelCase, e.g. ListBoxRect
 * 
 * - all layout rects are main pane relative unless otherwise noted. Especially data that is read through layout APIs 
 *   is always main pane relative because parents are passed to LayoutRect functions
 * 
 * - if layout rect is not main_pane relative, it is indicated by writing layout rect that it is relative to in the end
 *   of name: e.g. hourCellRect_in_ListItemRect 
 *   We only need ListItemRect relative stuff, because listbox subcell rects are given as list item relative. 
 *
 *  @lib Calendar.exe
 *  @since S60 v3.0
 */

NONSHARABLE_CLASS( TWeekListBoxLayout )
    {
public:
    /**
     * Constructor
     */ 
    TWeekListBoxLayout( TBool aUseExtraRowLayout, TBool aUseToolbarLayout
                        , TBool aUsePreview, TRect aMainPane );

    /**
     * List box rect relative to main pane.
     * This is used directly to set list box size in CCalenWeekCont.
     * 
     * Layout data defines both week view grid and time pane relative to listscroll_cale_week_pane
     * We calculate listbox size by combaining these two.
     */ 
    TRect ListBoxRect();

    /**
     * Return height of single line of list.
     */
    TInt ListItemHeight();

    /**
     * ListItemRect returns rect for list item line relative to main pane. 
     * This is used to make coordinate system conversions between main pane and list item,
     * because list's subcell rects are given relative to list item.
     */ 
    TRect ListItemRect();


    /**
     * WeekGridRect returns rect for list item line relative to main pane (with out time). 
     * This is used to make coordinate system conversions between main pane and list item,
     * because list's subcell rects are given relative to list item.
     */
    TRect WeekGridRect();


    /**
     * Equivalent to cale_week_time_pane_t1 
     */ 
    TAknLayoutText HourTextLayout();

    /** 
     * Layout rect of hour text subcell rect. Relative to list item rect
     * Used for SetSubCellSizeL. Margins are calculated based on this and actual text rect layout.
     */
    TRect HourSubCellRect_in_ListItemRect();

    /**
     * Layout rect for week grid cell relative to list item rect
     * Used directly for SetSubcellSize. Used also for icon layout for memo, todo and anniversary icons. 
     * 
     */
    TRect GridSubCellRect_in_ListItemRect(TInt aSubCellIndex);


    /**
     * @returns ETrue, if extra row layout has to be used
     * Extra row layout is used for regional calendar variants. 
     */
    TBool UseExtraRowLayout() const;

    TBool UseToolbarLayout() const;

    enum TWeekLayoutVariant
        {
        EListScrollCaleWeekPane,
        EPopupToolbarWindowCp01,
        EScrollPaneCp08,
        EBgCalePaneCp01,
        EGridCaleWeekPane,
        ECaleWeekDayHeadingPane,
        ECaleWeekTimePane,
        ECaleWeekTimePaneT1,
        EBgCaleSidePane,
        ECaleWeekScrollPaneG1,
        EBgCaleHeadingPane,
        EListScrollCaleWeekPaneT1,
        ECellCaleWeekPane,
        ECaleWeekDayHeadingPaneT1,
        ECellCaleWeekPaneG2
        };

    /**
     * Return currently used variant index to LAF
     */    
    TInt LayoutVariantIndex(TWeekLayoutVariant) const;

private: 
    TAknLayoutRect i_grid_cale_week_pane;
    TAknLayoutRect i_listscroll_cale_week_pane;
    TBool iUseExtraRowLayout;
    TBool iUseToolbarLayout;
    };

#endif // CALENWEEKLISTBOXLAYOUT_H