taskswitcher/teleportui/hgteleportapp/inc/hgteleportfastswapgrid.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 18 Jan 2010 20:10:36 +0200
changeset 2 08c6ee43b396
permissions -rw-r--r--
Revision: 201001 Kit: 201003

/*
 * ============================================================================
 *  Name        : hgteleportfastswapgrid.h
 *  Part of     : Hg Teleport
 *  Description : Teleport Fast Swap area UI
 *  Version     : %version:  12 %
 *
 *  Copyright © 2009 Nokia.  All rights reserved.
 *  This material, including documentation and any related computer
 *  programs, is protected by copyright controlled by Nokia.  All
 *  rights are reserved.  Copying, including reproducing, storing,
 *  adapting or translating, any or all of this material requires the
 *  prior written consent of Nokia.  This material also contains
 *  confidential information which may not be disclosed to others
 *  without the prior written consent of Nokia.
 * ============================================================================
 *
 */

#ifndef HGTELEPORTFASTSWAPGRID_H_
#define HGTELEPORTFASTSWAPGRID_H_

#include <AknGrid.h>
#include <aknconsts.h>
#include "hgteleportdevicestate.h"

class CAknsFrameBackgroundControlContext;
class CHgTeleportFastSwapTimer;

/**
 * Observer for handling fast swap grid events
 */
class MHgTeleportFastSwapGridObserver
    {
public:
    /**
     * Called when close icon is tapped on the grid item.
     * 
     * @param  aItemIdx  index of the the item for which close icon
     *                   has been tapped
     */
    virtual void HandleCloseEventL( TInt aItemIdx ) = 0;
    };


class MHgTeleportFastSwapTimerObserver
    {
public:
    /**
     * Called when timer is completed
     */
    virtual void TimerCompletedL( CHgTeleportFastSwapTimer* aSource ) = 0;
    };


/**
 * Avkon grid implementing custom item drawer
 */
class CHgTeleportFastSwapGrid: 
    public CAknGrid,
    public MHgDeviceStateObserver
    {
public: // enums
    enum TFastSwapGridBehaviour
        {
        // Highlight always visible
        EHybrid,
        
        // Touch only highlight handling
        ETouchOnly
        };
    
public: // Constructor and destructor
    CHgTeleportFastSwapGrid();
    ~CHgTeleportFastSwapGrid();
    void ConstructL( const CCoeControl* aParent );
    
public: // From CCoeControl
    void HandlePointerEventL( const TPointerEvent &aPointerEvent );
    TTypeUid::Ptr MopSupplyObject( TTypeUid aId );
    void HandleResourceChange( TInt aType );
    void SizeChanged();
    
public: //From MHgDeviceStateObserver
    /**
     * Called when a change, to which the observer is registered,
     * has happened.
     */
    virtual void HandleDeviceStateChanged( TChangeType aChangeType );
    
public: // New functions

    /**
     * Sets fast swap grid observer
     */
    void SetFastSwapGridObserver( MHgTeleportFastSwapGridObserver* aObserver  );

    /**
     * Set indexes of items which can be closed.
     * Copies item index array.
     */
    void SetCloseItemsL( RArray<TInt>& aItemIndex );

    /**
     * Checks if the item of given index is closable
     */
    TBool CanCloseItem( TInt aItemIndex );

    /**
     * Checks if the given item's close icon has been tapped.
     */
    TBool IsItemCloseHit( TInt aItemIndex );

    /**
     * Resets index of the item that has been close icon hit
     */
    void ResetCloseHit();
    
    /**
     * Sets grid behaviour
     * 
     * @param  aBehaviour  behaviour to be set
     */
    void SetGridBehaviour( TFastSwapGridBehaviour aBehaviour );
    
    /**
     * Getter for grid behaviour
     * 
     * @return  girds behaviour
     */
    TFastSwapGridBehaviour GridBehaviour();
    
    /**
     * Shows highlight. In touch only behaviour highlight
     * will be shown only for ammount of time.
     */
    void ShowHighlight();
    
    /**
     * Hides highlight.
     */
    void HideHighlight();
    
    /**
     * Checks if the highlight is currently visible.
     * 
     * @return  ETrue  if highlight is visible
     *          EFalse if highlight is not visible
     */
    TBool IsHighlightVisible();
    
    /**
     * Sets visible view, items outside of view will not be drawn
     */
    void SetVisibleViewRect( const TRect aRect );
    
    /**
     * Returns visible view. Items outside of visible rectangle are not drawn.
     */
    TRect VisibleViewRect();

private: // From CAknGrid
    virtual void CreateItemDrawerL();

private: // New functions
    
    /**
     * Loads close icon bitmap and mask
     */
    void LoadCloseIcon();
    
    /**
     * Redraws grid and parent controls
     */
    void Redraw();
    
private: // Data
    // Background context for grid
    CAknsFrameBackgroundControlContext* iBgContext;
    
    // Close icon handling
    RArray<TInt> iCloseItems;
    TInt iCloseIconHitIdx;
    MHgTeleportFastSwapGridObserver* iFastSwapGridObserver;

    // Highlight handling
    TFastSwapGridBehaviour iBehaviour;
    TBool iHighlightVisible;
    
    // Visible view rectangle (horizontal scrolling support)
    TRect iVisibleViewRect;
    };



/**
 * Custom item drawer for drawing grid items
 */
class CHgTeleportGridItemDrawer: public CFormattedCellListBoxItemDrawer
    {

public: // Constructor and destructor
    CHgTeleportGridItemDrawer( CHgTeleportFastSwapGrid* aGrid,
                               CFormattedCellListBoxData* aData );
    ~CHgTeleportGridItemDrawer();

public: // New functions

    /**
     * Sets close icon drawn for items that can be closed.
     * Ownership transferred.
     */
    void SetCloseIcon( CFbsBitmap* aBmp, CFbsBitmap* aMask );

    /**
     * Returns close icon coordinates for the given item rectangle
     */
    TRect GetCloseIconRect( const TRect& aItemRect ) const;
    
    /**
     * Sets screen offset for the item drawer to not draw items on the
     * grid edges
     */
    void SetEdgeOffset( TInt aLeftOffset, TInt aRightOffset );

private: // From CFormattedCellListBoxItemDrawer
    void DrawActualItem( TInt aItemIndex, const TRect& aActualItemRect,
                         TBool aItemIsCurrent, TBool aViewIsEmphasized,
                         TBool aViewIsDimmed, TBool aItemIsSelected ) const;
private: // New functions
    /**
     * Checks if the item rectangle is visible in the view.
     * 
     * @param   aItemRect  rectangle of the item to be checked 
     * @return  ETrue      if rectangle is fully or partially visible
     *          EFalse     if rectangle is not visible
     */
    TBool IsItemRectVisible( const TRect& aItemRect ) const;
    
private: // Data
    // Not owned
    CHgTeleportFastSwapGrid* iGrid;
    // Owned
    CFbsBitmap* iCloseIcon;
    CFbsBitmap* iCloseIconMask;
    
    TRect iScreenRect;
    TInt iLeftOffset;
    TInt iRightOffset;
    };



/**
 * Timer class for handling highlight bevaiour
 */
class CHgTeleportFastSwapTimer : public CTimer
    {
public:
    // Constructor
    CHgTeleportFastSwapTimer( MHgTeleportFastSwapTimerObserver& aObserver );
    // Destructor
    ~CHgTeleportFastSwapTimer();
    // 2nd phase constructor
    void ConstructL();
    
private: // From CTimer
    void RunL();
    
private: // Data
    MHgTeleportFastSwapTimerObserver* iObserver; // not own
    };

#endif /* HGTELEPORTFASTSWAPGRID_H_ */