/*
* Copyright (c) 2002-2006 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:  View switcher.
*
*/

#ifndef _XNVIEWSWITCHER_H
#define _XNVIEWSWITCHER_H

//  System includes
#include <e32base.h>
#include <akntouchgesturefw.h>

// User includes
#include "xnviewmanager.h"

class CXnViewControlAdapter;

using namespace AknTouchGestureFw;

// Class declaration

/**
 * This class handles view swithing when "finger follow" feature is used. 
 * The windows of current, next and previous views are moved along with the finger. 
 * Final view switch animation has been handled here as well.
 * 
*  @ingroup group_xnlayoutengine
*  @lib xn3layoutengine.lib
*  @since S60 5.2
*/   
NONSHARABLE_CLASS( CXnViewSwitcher ) : public CBase
   {

    /**
     * Important information of a view to be dragged.
     */
    struct TViewInformation
        {
        CXnControlAdapter*  iAdapter;
        CXnViewData*        iViewData;
        TBool               iReadyToDraw;
        TBool               iBgDrawn;
        };
    
    /**
     * States for the view swithcing using "finger follow".
     */
    enum TViewSwitchState
        {
        KViewSwitchIdle,
        KViewSwitchBegin,
        KViewSwitchDragOngoing,
        KViewSwitchScroll
        };
    
public:
    // Constructors and destructor
    
    /**
     * 2 phase construction.
     */
    static CXnViewSwitcher* NewL();

    /**
     * Destructor.
     */
    ~CXnViewSwitcher();

    /**
     * Is finger follow feature activated
     */
    TBool FingerFollowSupported() const;

    /**
     * Try to handle and consume pointer event
     */
    TBool ProcessPointerEventL( const TPointerEvent& aPointerEvent );

    /**
     * Check if flick or some gesture occured during drag
     */            
    void TouchGesture( TAknTouchGestureFwType& aTouchGesture );

    /**
     * Updates the client rect
     */            
    void SizeChanged( TRect aRect );


private: // constructors
    
    /**
     * C++ default constructor
     */    
    CXnViewSwitcher();
    
    /**
     * 2nd phase constructor
     */
    void ConstructL();

    /**
     * View scroll timer callback
     */    
    static TInt TimerCallback( TAny *aPtr );

    /**
     * Gets value of finger follow support from AI repository
     */    
    TBool IsFingerFollowSupportedL() const;

    /**
     * Adjusts current view position. Used in final animation.
     */    
    void Scroll();

    /**
     * Moves windows according to the current view position.
     */    
    void DoScroll();
    
    /**
     * Start view dragging by setting up view control adapters
     */    
    TBool SetupViewsL();

    /**
     * Layouts and renders the given view out of sight. 
     */    
    void PrepareViewL( CXnViewSwitcher::TViewInformation& aView );
    
    /**
     * Removes focused node and sends the up event in order to prevent activate triggers and long tapping.
     */
    void StartViewDraggingL();

    /**
     * Stop view dragging and start view scroll
     */    
    void StartViewScrolling();

    /**
     * View scrolling ended. 
     */    
    void ViewSwitchEndedL();

    /**
     * Get view data
     */    
    CXnViewData* ViewData( CXnViewData& aCurrentViewData, TInt aView );

    /**
     * Clear view information of current, next and previous views.
     */    
    void ClearViews();
    
    /**
     * Sets whether next, current or previous view is to be activeted. 
     * Updated also background if needed.
     */    
    void UpdateViewToBeActivated( TInt aOffset );

    /**
     * Changes background image and runs NGA effect. 
     */    
    void ChangeBackground( CXnViewData& aCurrent, CXnViewData& aNext );

private: // data
    
    /** 
     * AppUi 
     */
    CXnAppUiAdapter& iAppUi;

    /** 
     * Client rect set by UI Engine 
     */
    TRect iRect;
    
    /** 
     * Whether the feature is supported or not. ETrue when finger follow is supported 
     */
    TBool iFingerFollowSupported;

    /**
     * Timer for animating view switch.
     * Own.  
     */    
    CPeriodic* iTimer;

    /** 
     * Important information of the current view. 
     */
    TViewInformation iCurrentView;

    /** 
     * Important information of the view coming from the right side. 
     */
    TViewInformation iNextView;    

    /** 
     * Important information of the view coming from the left side. 
     */
    TViewInformation iPreviousView;

    /**
     * Flick gesture type. 
     */
    //TAknTouchGestureFwType iTouchGesture;
    
    /**
     * The state of view switch. 
     */
    TViewSwitchState iViewSwitchState;
    
    /**
     * Scroll speed in pixels. 
     */
    TInt iScrollSpeed;

    /**
     * Total scroll distance from the beginning in mode KViewSwitchDragOngoing.
     * Remaining distance to be scrolled in mode KViewSwitchScroll. 
     */
    TInt iScrollDistance;

    /**
     * Measures the scroll distance in current direction. I.e. if direction changes, 
     * this is set to 0. 
     */
    TInt iScrollDirectionDistance;

    /**
     * Position of the current view in the beginning. 
     */
    TPoint iViewStartPosition;

    /**
     * Position in the beginning. 
     */
    TPoint iStartPosition;

    /**
     * Current view position from the beginning. 
     */
    TPoint iViewPosition;

    /**
     * View to be activated. 
     */
    TInt iActivateView;
    
    /**
     * Tick amount to be used when calculating drag speed. 
     */    
    TInt iTickAmount;

    /**
     * Scroll direction. 
     */    
    TInt iDirection;
    
   };
    
#endif      // _XNVIEWSWITCHER_H
            
// End of File
