/*
* 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: 
*
*/



#include "musuistatuspanehandler.h"
#include "musuidefinitions.h"
#include "muslogger.h" // debug logging
#include <musui.mbg>

#include <eikspane.h>
#include <barsread.h>
#include <StringLoader.h>
#include <akntitle.h>
#include <aknenv.h>
#include <akncontext.h>
#include <AknIndicatorContainer.h>
#include <aknnavi.h> // Navi pane container ( CAknNavigationControlContainer )
#include <AknVolumePopup.h>
#include <eikapp.h>
#include <eikenv.h>
#include <eikappui.h>


// constants
#define KMUSMBMFILENAME iEikonEnvironment.EikAppUi()->Application()->BitmapStoreName()


// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
CMusUiStatusPaneHandler* CMusUiStatusPaneHandler::NewL( CEikonEnv& aEikonEnv )
    {
    CMusUiStatusPaneHandler* self = 
                        new ( ELeave ) CMusUiStatusPaneHandler( aEikonEnv );
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );
    return self;
    }


// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
CMusUiStatusPaneHandler::~CMusUiStatusPaneHandler()
    {
    MUS_LOG( "mus: [MUSUI ]  -> CMusUiStatusPaneHandler::~CMusUiStatusPaneHandler" );
    
    delete iNaviPaneText;
    delete iMediaControl;
    delete iVolumePopup;
    
    MUS_LOG( "mus: [MUSUI ]  <- CMusUiStatusPaneHandler::~CMusUiStatusPaneHandler" );
    }


// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
CMusUiStatusPaneHandler::CMusUiStatusPaneHandler( CEikonEnv& aEikonEnv )
    :iEikonEnvironment( aEikonEnv )
    {
    }


// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void CMusUiStatusPaneHandler::ConstructL()
    {
    MUS_LOG( "mus: [MUSUI ]  -> CMusUiStatusPaneHandler::ConstructL" );
    
    CEikStatusPane* statusPane = iEikonEnvironment.AppUiFactory()->StatusPane();
    
    iNaviPane = STATIC_CAST(
                CAknNavigationControlContainer*,
                statusPane->ControlL( TUid::Uid( EEikStatusPaneUidNavi ) ) );
    iTitlePane = STATIC_CAST(
                CAknTitlePane*,
                statusPane->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) );
    iContextPane = STATIC_CAST(
                CAknContextPane*,
                statusPane->ControlL( TUid::Uid( EEikStatusPaneUidContext ) ) );

    iVolumePopup = CAknVolumePopup::ConstructFromResourceL( 
                                        R_AVKON_NAVI_PANE_VOLUME_INDICATOR );

    iMediaControl = CreateMediaNaviL();
    
    MUS_LOG( "mus: [MUSUI ]  <- CMusUiStatusPaneHandler::ConstructL" );
    }


// -----------------------------------------------------------------------------
// Updates statuspane icons
// -----------------------------------------------------------------------------
//
void CMusUiStatusPaneHandler::SetStatusPaneIconsL( TInt32 aIconId,
                                                   TInt32 aIconMaskId )
    {
    MUS_LOG( "mus: [MUSUI ]  -> CMusUiStatusPaneHandler::SetStatusPaneIconsL" )

	iContextPane->SetPictureFromFileL( KMUSMBMFILENAME, aIconId, aIconMaskId );
													 
    MUS_LOG( "mus: [MUSUI ]  <- CMusUiStatusPaneHandler::SetStatusPaneIconsL" )
    }


// -----------------------------------------------------------------------------
// Updates statuspane icons
// -----------------------------------------------------------------------------
//
void CMusUiStatusPaneHandler::SetStatusPaneIconsL( CFbsBitmap* aBitmap )
    {
    MUS_LOG( "mus: [MUSUI ]  -> CMusUiStatusPaneHandler::SetStatusPaneIconsL" );
    CEikImage* image = new (ELeave) CEikImage();
    image->SetBitmap( aBitmap );
    CEikImage* oldImage = iContextPane->SwapPicture( image );
    delete oldImage;
    MUS_LOG( "mus: [MUSUI ]  <- CMusUiStatusPaneHandler::SetStatusPaneIconsL" );
    }


// -----------------------------------------------------------------------------
// Hides navi-pane decorators and clears text
// -----------------------------------------------------------------------------
//
void CMusUiStatusPaneHandler::ClearNaviPaneL()
    {
    MUS_LOG( "mus: [MUSUI ]  -> CMusUiStatusPaneHandler::ClearNaviPaneL" );
    delete iNaviPaneText;
    iNaviPaneText = NULL;

    // Pushes default decorator object (empty one) to top of the stack
    // and draws it
    iNaviPane->PushDefaultL();

    MUS_LOG( "mus: [MUSUI ]  <- CMusUiStatusPaneHandler::ClearNaviPaneL" );
    }


// -----------------------------------------------------------------------------
// Sets title-pane text
// -----------------------------------------------------------------------------
//
void CMusUiStatusPaneHandler::SetTitleL( const TDesC& aTitle )
    {
    MUS_LOG( "mus: [MUSUI ]  -> CMusUiStatusPaneHandler::SetTitleL" );
    iTitlePane->SetTextL( aTitle );
    MUS_LOG( "mus: [MUSUI ]  <- CMusUiStatusPaneHandler::SetTitleL" );
    }


// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void CMusUiStatusPaneHandler::SetTitleFromResourceL( TInt aResourceId )
    {
    MUS_LOG( "mus: [MUSUI ]  -> CMusUiStatusPaneHandler::SetTitleFromResourceL" );
    HBufC* titlePaneTitle =  StringLoader::LoadLC( aResourceId );
    iTitlePane->SetTextL( *titlePaneTitle );
    CleanupStack::PopAndDestroy( titlePaneTitle );
    MUS_LOG( "mus: [MUSUI ]  <- CMusUiStatusPaneHandler::SetTitleFromResourceL" );
    }
    

// -----------------------------------------------------------------------------
// Get the current volume setting.
// -----------------------------------------------------------------------------
//
TInt CMusUiStatusPaneHandler::GetVolumeControlValue() const
    {
    MUS_LOG( "mus: [MUSUI ]  -> CMusUiStatusPaneHandler::GetVolumeControlValue" );
             
    TInt volume = iVolumePopup->Value();
    
    MUS_LOG1( "mus: [MUSUI ]  <- CMusUiStatusPaneHandler::GetVolumeControlValue: [%d]",
                            volume );                        
    return volume;
    }


// -----------------------------------------------------------------------------
// Activates volume control.
// -----------------------------------------------------------------------------
//
void CMusUiStatusPaneHandler::ActivateVolumeControlL( TInt aVolume, TBool aOnlyIfVisible )
    {
    MUS_LOG( "mus: [MUSUI ]  -> CMusUiStatusPaneHandler::ActivateVolumeControlL" );

    if ( aVolume < KMusVolumeMuted || aVolume > KMusVolumeMaximum )
        {
        MUS_LOG( "mus: [MUSUI ]  <- CMusUiStatusPaneHandler::SetVolumeControlValue: returning" );
        return;
        }

    if ( !aOnlyIfVisible || (aOnlyIfVisible && iVolumePopup->IsVisible()) )
        {
        iVolumePopup->SetValue( aVolume );
        iVolumePopup->ShowVolumePopupL();
        }
    MUS_LOG( "mus: [MUSUI ]  <- CMusUiStatusPaneHandler::ActivateVolumeControlL" );
    }
    

// -----------------------------------------------------------------------------
// Activate media navi pane.
// -----------------------------------------------------------------------------
//
void CMusUiStatusPaneHandler::ActivateNaviPaneMediaL()
    {
    MUS_LOG( "mus: [MUSUI ]  -> CMusUiStatusPaneHandler::ActivateNaviPaneMediaL" );
    iNaviPane->PushL( *iMediaControl );
    MUS_LOG( "mus: [MUSUI ]  <- CMusUiStatusPaneHandler::ActivateNaviPaneMediaL" );
    }
  

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void CMusUiStatusPaneHandler::ShowNaviPaneIconL(
                        TMusUiNaviMediaDecorator aIcon )
    {
    MUS_LOG( "mus: [MUSUI ]  -> CMusUiStatusPaneHandler::ShowNaviPaneIconL" );
    CMusUiNaviMediaDecorator* mediaNavi =
                            static_cast<CMusUiNaviMediaDecorator*>(
                                            iMediaControl->DecoratedControl() );
    mediaNavi->ShowIcon( aIcon );
    MUS_LOG( "mus: [MUSUI ]  <- CMusUiStatusPaneHandler::ShowNaviPaneIconL" );
    }


// -----------------------------------------------------------------------------
// Sets navi-pane label for left side
// -----------------------------------------------------------------------------
//
void CMusUiStatusPaneHandler::SetLeftLabelL( const TDesC& aLabel )
    {
    MUS_LOG( "mus: [MUSUI ]  -> CMusUiStatusPaneHandler::SetLeftLabelL" );

    static_cast<CMusUiNaviMediaDecorator*>
                    ( iMediaControl->DecoratedControl() )->SetLeftLabelL( aLabel );
    iNaviPane->DrawNow();
    
    MUS_LOG( "mus: [MUSUI ]  <- CMusUiStatusPaneHandler::SetLeftLabelL" );
    }


// -----------------------------------------------------------------------------
// Sets navi-pane label for right side
// -----------------------------------------------------------------------------
//
void CMusUiStatusPaneHandler::SetRightLabelL( const TDesC& aLabel )
    {
    MUS_LOG( "mus: [MUSUI ]  -> CMusUiStatusPaneHandler::SetRightLabelL" );

    static_cast<CMusUiNaviMediaDecorator*>
                    ( iMediaControl->DecoratedControl() )->SetRightLabelL( aLabel );
    iNaviPane->DrawNow();
    
    MUS_LOG( "mus: [MUSUI ]  <- CMusUiStatusPaneHandler::SetRightLabelL" );
    }


// -----------------------------------------------------------------------------
// Create media navi pane.
// -----------------------------------------------------------------------------
//
CAknNavigationDecorator* CMusUiStatusPaneHandler::CreateMediaNaviL()
    {
    MUS_LOG( "mus: [MUSUI ]  -> CMusUiStatusPaneHandler::CreateMediaNaviL" );
    CMusUiNaviMediaDecorator* naviDecorator = CMusUiNaviMediaDecorator::NewL();
    CleanupStack::PushL( naviDecorator );

    CAknNavigationDecorator* decoratedFolder =
                            CAknNavigationDecorator::NewL(
                                    iNaviPane,
                                    naviDecorator,
                                    CAknNavigationDecorator::ENotSpecified );
    CleanupStack::Pop( naviDecorator );// decoratedFolder owns naviDecorator now

    CleanupStack::PushL( decoratedFolder );
    decoratedFolder->SetContainerWindowL( *iNaviPane );
    naviDecorator->SetContainerWindowL( *decoratedFolder );
    CleanupStack::Pop( decoratedFolder );

    decoratedFolder->MakeScrollButtonVisible( EFalse );

    MUS_LOG( "mus: [MUSUI ]  <- CMusUiStatusPaneHandler::CreateMediaNaviL" );
    return decoratedFolder;
    }


// -----------------------------------------------------------------------------
// Get Volump Popup control pointer
// -----------------------------------------------------------------------------
//
CAknVolumePopup* CMusUiStatusPaneHandler::GetVolumePopup() const
    {
    return iVolumePopup;
    }


// end of file
