/*
* 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:  MPX Common playback view's container implementation.
*
*/



#ifndef CMPXCOMMONPLAYBACKVIEWCONTAINER_H
#define CMPXCOMMONPLAYBACKVIEWCONTAINER_H


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

#include "mpxcommonplaybackviewdefs.h"
#include "mpxalbumartutilobserver.h"
#include "mpxbutton.h"
#include "mpxplaybackframeworkdefs.h"
#include "mpxconstants.h"


// FORWARD DECLARATIONS
class MEikCommandObserver;
class MAknsControlContext;
class CAknIconArray;
class CMPXPlaybackViewInfoLabel;
class MMPXLayoutSwitchObserver;
class CMPXCommonUiHelper;
class CMPXButtonManager;
class MMPXPlaybackViewLayout;

// CLASS DECLARATION

/**
 *  Container class for audio view.
 *
 *  @lib mpxplaybackview.lib
 *  @since S60 v3.0
 */
class CMPXCommonPlaybackViewContainer : public CCoeControl,
                                                 public MMPXAlbumArtUtilObserver,
                                                 public MMPXButtonCmdObserver,
 						                        public MHWRMLightObserver
    {
public:

    /**
     * Symbian 2nd phase constructor.
     *
     * @param aRect Frame rectangle for container.
     */
    IMPORT_C virtual void ConstructL( const TRect& aRect );

    /**
     * Destructor.
     */
    IMPORT_C virtual ~CMPXCommonPlaybackViewContainer();

    /**
     * Updates time indicators.
     *
     * @since S60 3.0
     * @param  aPlaybackPosInSeconds, New playback postions
     * @param  aTotalLengthInSeconds, Clips duration
     */
    IMPORT_C virtual void UpdateTimeIndicatorsL(
        TInt aPlaybackPosInSeconds,
        TInt aTotalLengthInSeconds );

    /**
     * Updates label
     *
     * @since S60 3.0
     * @param aLabel Label which is updated
     * @param aText New text value
     */
    IMPORT_C virtual void UpdateLabelL(
        TMPXPbvTextIndicator aLabel,
        const TDesC& aText );

    /**
     * Sets main pane mode.
     *
     * @since S60 3.0
     * @param aMode Playback mode.
     */
    IMPORT_C virtual void SetMode( TMPXPbvPlaybackMode aMode );

    /**
     * Set random mode.
     *
     * @since S60 3.0
     * @param aRandomMode ETrue if random is on.
     */
    IMPORT_C virtual void SetRandomMode( TBool aRandomMode );

    /**
     * Set repeat mode.
     *
     * @since S60 3.0
     * @param aRepeatAll ETrue if repeat all is on.
     * @param aRepeatOne ETrue if repeat one is on.
     */
    IMPORT_C virtual void SetRepeatMode(
        TBool aRepeatAll,
        TBool aRepeatOne );

    /**
     * Set Real Audio mode.
     *
     * @since S60 3.2
     * @param aRealAudioMode ETrue if a Real Audio file is being played.
     */
    IMPORT_C virtual void SetRealAudioMode( TBool aRealAudioMode );

    /**
    * Update buttons according to current state.
    *
    * @since 3.0
    */
    IMPORT_C virtual void UpdateButtons( TMPXPlaybackState aState );

    /**
     * Set layout for all elements and set sizes for icons.
     *
     * @since S60 3.0
     */
    IMPORT_C virtual void UpdateLayout();

    /**
     * Updates duration label.
     *
     * @since S60 3.0
     * @param  aTotalLengthInSeconds, Clips duration
     */
    IMPORT_C virtual void UpdateDurationLabelL( TInt aTotalLengthInSeconds );

    /**
     * Force softkey label colors to what is specified in skin
     * for Music Player soft keys.
     *
     * @since S60 3.0
     */
    IMPORT_C virtual void UpdateSoftkeyColors();

    /**
     * Handles foreground events
     *
     * @since S60 3.0
     * @param aForeground ETrue if app is going to foreground, EFalse otherwise
     */
    IMPORT_C virtual void HandleForegroundEventL( TBool aForeground );

// from base class MMPXAlbumArtUtilObserver

    /**
     * From MMPXAlbumArtUtilObserver.
     * Notify that extraction of album art started.
     */
    IMPORT_C virtual void ExtractAlbumArtStarted();

    /**
     * From MMPXAlbumArtUtilObserver.
     * Album art is extracted from file and ready to use.
     *
     * @param aBitmap a converted image. Ownership is transferred.
     * @param aErr error code
     */
    IMPORT_C virtual void ExtractAlbumArtCompleted(
        CFbsBitmap* aBitmap,
        TInt aErr );

// from base class CoeControl

    /**
     * From CoeControl.
     * Handles key events.
     *
     * @param aKeyEvent The key event.
     * @param aType The type of key event.
     */
    IMPORT_C virtual TKeyResponse OfferKeyEventL(
        const TKeyEvent& aKeyEvent,
        TEventCode aType );

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

    /**
     * From CoeControl.
     * Gets the control's help context.
     *
     * @param aContext The control's help context.
     */
    IMPORT_C virtual void GetHelpContext( TCoeHelpContext& aContext ) const;

    /**
     * Starts marquee for a playback label
     *
     * @param aLabel Label to start marquee
     */
    IMPORT_C virtual void StartMarquee( TMPXPbvTextIndicator aLabel );

protected:






    /**
     * Creates labels.
     */
    IMPORT_C virtual void CreateLabelsL();

    /**
     * Creates icons.
     * Any subclass which overrides this must call this base class method
     * first or else the common icons will not be created.
     */
    IMPORT_C virtual void CreateIconsL();

    /**
     * Deletes all icon objects.
     */
    IMPORT_C void FreeIcons();

    /**
     * Draw an icon
     *
     * @since 3.0
     * @param aGc            Graphics context to draw to
     * @param aDirtyRect     Part of the screen that needs redrawing
     * @param aIndicatorRect Position for the icon
     * @param aIcon          Icon and mask
     * @param aInvertMask    Invert mask (see CBitmapContext::BitBltMasked)
     */
    IMPORT_C virtual void DrawIndicator(
        CWindowGc& aGc ,
        const TRect& aDirtyRect,
        const TRect& aIndicatorRect,
        const CGulIcon* aIcon,
        TBool aInvertMask = ETrue ) const;

    /**
     * Redraw part of the screen to the bitmap context.
     *
     * @param aRect Area to be redrawn.
     * 
     */
  IMPORT_C virtual void RedrawRect(
         const TRect& aRect) const;

    /**
     * Update progress bar graphics based on current playback
     * and download position.
     */
    IMPORT_C virtual void UpdateProgressBarGraphics();

    /**
     * Update progress bar graphics and redraw.
     * Refresh happens only when backlight is ON and
     * UI is in foreground.
     * Note: Some display types may not need backlight. In that case
     * code may need to be adjusted accordingly.
     */
    IMPORT_C virtual void RefreshProgressBar();

    /**
     * Update label text color according to skin
     */
    IMPORT_C virtual void UpdateLabelColorsL();

    /**
     * Update skin control context for background
     *
     * @param aRect Area to be updated.
     */
    IMPORT_C virtual void UpdateBackgroundSkinControlContext( const TRect& aRect );

    /**
     * Set FMTX mode.
     *
     * @since S60 3.2
     * @param aFMTXMode ETrue if the view supports FMTX label.
     */
    IMPORT_C virtual void SetFMTXMode( TBool aFMTXMode );

// from base class CoeControl

    /**
     * From CCoeControl.
     * Responds to changes to the size and position of the contents of this
     * control.
     */
    IMPORT_C virtual void SizeChanged();

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

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

    /**
     * From CCoeControl.
     * Draws the control.
     *
     * @param aRect The rectangular region of the control to be drawn.
     */
    IMPORT_C virtual void Draw( const TRect& aRect ) const;

// from base class MMPXButtonCmdObserver

    /**
     * From MMPXButtonCmdObserver
     * Handle a button command.
     * @param aCommand Command id, as specified in the button constructor.
     */
   IMPORT_C virtual void HandleButtonCommandL( TInt aCommand );

    /**
     * From CCoeControl.
     * Handle events from the touch screen
     * since 5.0
     */
    IMPORT_C virtual void HandlePointerEventL(const TPointerEvent& aPointerEvent);

public:

    /**
     * Gets song position (from touch progress bar)
     * since 5.0
     */
    IMPORT_C virtual TInt GetNewSongPosition();
    
    /**
     * Sets song position (from currently playback position)
     * since 5.0
     */
    void SetNewSongPosition( const TInt64& aPositon );

    /**
     * From MBacklightControlObserver.
     * Callback for change in backlight status
     *
	 * @param aTarget The target of light change event; keypad, screen or both
	 * @param aStatus New status of the target
     */
    IMPORT_C virtual void LightStatusChanged( TInt aTarget, CHWRMLight::TLightStatus aStatus );

    /**
     * Restore Buttons' state in some special case
     *
     * @since S60 3.0
     */
    void RestoreButtons( TMPXPlaybackState aState );

    TInt CallSetPosition();

    static TInt CallSetPosition( TAny* aAny );
    
    /**
     * Sets the ordinal position of a window.
     *
     * @param aNewOrdinalPosition The window's new ordinal position
     * 
     * @since S60 3.0
     */
    void AdjustOrdinalPosition( TInt aNewOrdinalPosition );

    /**
     * Records the transition animation begin state. 
     */
    void BeginTransition();

    /**
     * Mark the end state. Triggers the transtition.
     */
    void EndTransition();

    /**
     * Sets the transtition type for animation.
     */
    void SetTransitionType( TTransitionType aTransitionType );

private:

    /**
     * Set layout for all elements and set sizes for icons.
     */
    void DoUpdateLayoutL();



 protected:   // data

    MEikCommandObserver* iCommandObserver;  // not owned
    MMPXLayoutSwitchObserver*    iLayoutObserver;   // not owned
    RPointerArray<CMPXPlaybackViewInfoLabel> iLabels;   // owned


 


    HBufC* iMinSecFormatString;         // owned
    HBufC* iShortFormatString;          // owned

    CGulIcon* iPlayIcon;                // owned
    CGulIcon* iPauseIcon;               // owned
    CGulIcon* iRandomIcon;              // owned
    CGulIcon* iRepeatOneIcon;           // owned
    CGulIcon* iRepeatAllIcon;           // owned

    CGulIcon* iDownloadSlider;          // owned
    CGulIcon* iPlaybackSlider;          // owned
    CGulIcon* iSliderBackground;        // owned

    CGulIcon* iDefaultAlbumArt;         // owned
    CFbsBitmap* iTrackAlbumArt;         // owned

#ifdef RD_RA_SUPPORT_FOR_MUSIC_PLAYER
    CGulIcon* iRealIcon;                // owned
#endif

    MAknsControlContext* iBackground;   // owned

    CMPXCommonUiHelper* iCommonUiHelper;    // owned

    TRect iBackgroundLayout;
    TRect iIconLayout;
    TRect iRandomIconRect;
    TRect iRepeatIconRect;
    TRect iSliderPaneRect;
    TRect iSliderBackgroundRect;
    TRect iPlaybackSliderRect;
    TRect iDownloadSliderRect;
    TRect iAlbumArtRect;
#ifdef RD_RA_SUPPORT_FOR_MUSIC_PLAYER
    TRect iRealIconRect;
#endif

    TMPXPbvPlaybackMode iMode;

    TBool iRepeatAllMode;
    TBool iRepeatOneMode;
    TBool iRandomMode;
#ifdef RD_RA_SUPPORT_FOR_MUSIC_PLAYER
    TBool iRealAudioMode;
#endif
    TBool iFMTXMode;

    TRect iCurrentLayout;

    // Progress bar position - download
    TReal iDownloadRatio;

    // Progress bar position - playback
    TReal iPlaybackRatio;

    TBool iEqualizerEnabled;
    TBool iEnableButtons;
    TBool iEnableVolumeIndicator;
    TBool iEnableMarquee;
    TBool iDisplayAlbumArt;
    TBool iPrerollCompleted;

    CMPXButtonManager*  iButtonManager; // owned
    CIdle* iIdle;
    TInt iIdleTaskCompleted;
    MMPXPlaybackViewLayout* iLayout;    // not owned
    CPeriodic* iSeekTimer;

    TInt iTrackTotalLengthInSeconds;
    TInt64 iNewSongPosition; // Final position from touch progress bar
    TBool iTouchDown;        // Flag indicating touch progress bar is in use
    TBool iActiveView;

    TBool iIsForeground;
    CHWRMLight::TLightStatus iLightStatus;
    CHWRMLight *iLight;

    TBool iDragProgressBar; //Flag drag progress bar
    TTransitionType iTransitionType; // Transition direction
    };

#endif  // CMPXCOMMONPLAYBACKVIEWCONTAINER_H

// End of File
