/*
* Copyright (c) 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:  Button state manager for common playback view
*
*/



#ifndef CMPXBUTTONMANAGER_H
#define CMPXBUTTONMANAGER_H

//  INCLUDES
#include <coecntrl.h>
#include <AknUtils.h>

#include "mpxbutton.h"
#include "mpxplaybackframeworkdefs.h"

//  FORWARD DECLARATIONS
class CWindowGc;
class MAknsControlContext;
class MMPXPlaybackViewLayout;

class CAknButton;
class CAknViewAppUi;
class CGulIcon;
// CLASS DECLARATION

/**
*  Button state manager for playback view.
*
*  @lib mpxplaybackview.dll
*  @since S60 v3.0
*/
NONSHARABLE_CLASS( CMPXButtonManager ) :public CCoeControl,
                                        public MCoeControlObserver,
                                        public MCoeControlBackground
    {
    public:  // Constructors and destructor

        /**
        * Two-phased constructor.
        * since 5.0
        * @param aObserver          Observer to receive commands from button
        *                           pushes.
        * @param aLayout            Layout for this view
        * @param aContainer			Container for this control
        */
        static CMPXButtonManager* NewL(
            MMPXButtonCmdObserver* aObserver,
            MMPXPlaybackViewLayout* aLayout,
            const CCoeControl &aContainer);
        /**
        * Destructor.
        */
        virtual ~CMPXButtonManager();

    public:

        /**
        * Update button state based on the state of the engine
        * @param aState State of the playback engine
        */
        void UpdateButtonStates(TMPXPlaybackState aState);

        /**
        * Handle a key event.
        * @see CCoeControl::OfferKeyEventL
        */
        TKeyResponse OfferKeyEventL(
            const TKeyEvent& aKeyEvent,
            TEventCode aType);

        /**
        * Set parent rectangle for the button layout
        * @since 3.0
        * @param aRect Parent rectangle
        */
        void SetParentRect(const TRect& aRect);

        /**
        * Sets to enable/display the button or not
        */
        void SetEnabled( TBool aEnabled );

        /**
         * Handles losing foreground
         *
         * @since S60 3.0
         */
        void HandleForegroundLostL();

	    /**
	     * From CCoeControl.
	     * Gets the number of controls contained in a compound control.
	     * since 5.0
	     *
	     * @return The number of component controls contained by this control.
	     */
	    TInt CountComponentControls() const;

	    /**
	     * From CCoeControl.
	     * Gets an indexed component of a compound control.
	     * since 5.0
	     *
	     * @param aIndex The index of the control.
	     * @return The component control with an index of aIndex.
	     */
	    CCoeControl* ComponentControl( TInt aIndex ) const;

		/**
		* From MCoeControlObserver.
		* To handle the button events.
		* since 5.0
		*/
		void HandleControlEventL( CCoeControl* aControl, TCoeEvent aEventType );

	    /**
	     * From CoeControl.
	     * Handles a change to the control's resources.
		 * since 5.0
	     *
	     * @param aType A message UID value.
	     */
	    void HandleResourceChange( TInt aType );

	    void CMPXButtonManager::SizeChanged();

	    /**
	     * From MCoeControlBackground
		 * since 5.0
	     */
	    void Draw(CWindowGc& aGc, const CCoeControl& aControl, const TRect& aRect) const;
        
	    /**
        * restore button state in some special case
        * @since S60 3.0
        * @param aState State of the playback engine
        */
        void RestoreButtonStates( TMPXPlaybackState aState );

    private:
        /**
        * C++ default constructor.
        */
        CMPXButtonManager(
            MMPXButtonCmdObserver* aObserver,
            MMPXPlaybackViewLayout* aLayout);
        /**
        * By default Symbian 2nd phase constructor is private.
        */
        void ConstructL(const CCoeControl &aContainer);

    private: // New functions

        /**
        * Create the rocker button using multiple avkon buttons
        */
        void CreateRockerAvkonButtonsL(const CCoeControl &aContainer);

        /**
        * Sets the avkon rocker button state and send observer commands
        */
        TKeyResponse SetAvkonButtonStateL( const TKeyEvent& aKeyEvent, TEventCode aType );

        /**
        * Callback for long-press timer
        */
        static TInt TimerCallback(TAny* aPtr);

        /**
        * Handle long press event.
        */
        void HandleLongPressL();

    private:    // Data
        TRect iParentRect;
        TInt iButton;
        MMPXButtonCmdObserver* iObserver;          // not owned

        TBool iIsEmbedded;
        TBool iProgDownloadMode;
        TBool iIsCDPreview;
        TBool iKeyDownEventReceived;
        MMPXPlaybackViewLayout* iLayout;    // not owned
        TBool iEnabled;
        TBool iKeyDownReceived;
        TBool iIsSeeking;
        RPointerArray<CAknButton> iAvkonButtons;        // owned
        TInt iRockerAvkonButtonCount;
        TBool iVolumeInRocker;
        TBool iIsTouchUi;
        TBool iStopInRocker;
        TBool iIsLongPress;
        CPeriodic* iLongKeyTimer;
        TInt iLongPressCommandId;
    };

#endif      // CMPXBUTTONMANAGER_H

// End of File
