videditor/VideoEditorUiComponents/src/VeiTimeLabelNavi.cpp
author Mikael Laine <mikael.laine@ixonos.com>
Fri, 29 Jan 2010 14:08:33 +0200
changeset 0 951a5db380a0
permissions -rw-r--r--
Committing the Video Editor package under the Eclipse Public License

/*
* Copyright (c) 2010 Ixonos Plc.
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the "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:
* Ixonos Plc
*
* Description: 
*
*/


//  INCLUDE FILES
// System includes
#include <coecntrl.h>
#include <aknconsts.h>
#include <aknvolumecontrol.h> 
#include <akniconutils.h>
#include <barsread.h>
#include <aknsutils.h>
#include <aknsconstants.h>
#include <aknsdrawutils.h>
#include <aknsitemdef.h>
#include <VideoEditorUiComponents.mbg>
#include <avkon.mbg>

#ifdef RD_TACTILE_FEEDBACK 
#include <touchfeedback.h>
#endif /* RD_TACTILE_FEEDBACK  */

// User includes
#include "VeiTimeLabelNavi.h"
#include "VideoEditorCommon.h"
#include "VideoEditorUtils.h"
#include "VideoEditorDebugUtils.h"
#include "mtimelabelnaviobserver.h"

// CONSTANTS
_LIT(KDefaultLabel,""); // empty label text

enum TVeiTimeLabelLayout
    {
    EArrayItem = 0,
    ESpeakerItem,
    EPausedItem
    };

// ================= MEMBER FUNCTIONS =======================

// ---------------------------------------------------------
// CTimeLabelNavi::~CTimeLabelNavi()
// Destructor
// ---------------------------------------------------------
//
EXPORT_C CVeiTimeLabelNavi::~CVeiTimeLabelNavi()
	{
	DeleteBitmaps();
	}

void CVeiTimeLabelNavi::DeleteBitmaps()
	{
	delete iArrowBitmap;
	iArrowBitmap = NULL;
	
    delete iArrowBitmapMask;
    iArrowBitmapMask = NULL;	

	delete iVolumeBitmap;
	iVolumeBitmap = NULL;

	delete iVolumeBitmapMask;
	iVolumeBitmapMask = NULL;

	delete iMutedBitmap;
	iMutedBitmap = NULL;

	delete iMutedBitmapMask;
	iMutedBitmapMask = NULL;

	delete iPausedBitmap;
	iPausedBitmap = NULL;

	delete iPausedBitmapMask;
	iPausedBitmapMask = NULL;
	}

// ---------------------------------------------------------
// CTimeLabelNavi::CTimeLabelNavi()
// Constructor
// ---------------------------------------------------------
//
CVeiTimeLabelNavi::CVeiTimeLabelNavi():
iArrowVisible(ETrue),
iVolumeIconVisible(ETrue),
iPauseIconVisible(EFalse)
	{
    iLabel = KDefaultLabel;	
	}

// ---------------------------------------------------------
// CTimeLabelNavi::ConstructL()
// Constructor
// ---------------------------------------------------------
//
void CVeiTimeLabelNavi::ConstructL()
	{
	LoadBitmapsL();
	}

void CVeiTimeLabelNavi::LoadBitmapsL()
	{
	LOG(KVideoEditorLogFile, "CVeiTimeLabelNavi::LoadBitmapsL: in");

	TFileName bitmapfile( VideoEditorUtils::IconFileNameAndPath(
	        KVideoEditorUiComponentsIconFileId) );

	//Loads a specific bitmap from a multi-bitmap file.
	//const bitmapfile = the filename of the multi-bitmap (.mbm) file. 
	MAknsSkinInstance* skinInstance = AknsUtils::SkinInstance();

/* muted bitmap */
	AknsUtils::CreateColorIconL(
            skinInstance, KAknsIIDQgnIndiSpeakerMuted,KAknsIIDQsnIconColors,
			EAknsCIQsnIconColorsCG6,
            iMutedBitmap, iMutedBitmapMask,
            AknIconUtils::AvkonIconFileName(),
            EMbmAvkonQgn_indi_speaker_muted, 
            EMbmAvkonQgn_indi_speaker_muted_mask,KRgbBlack);
// Arrow bitmap
	AknsUtils::CreateColorIconL(
	            skinInstance, KAknsIIDNone,KAknsIIDQsnIconColors,
	            EAknsCIQsnIconColorsCG6,
	            iArrowBitmap, iArrowBitmapMask,
	            bitmapfile,
	            EMbmVideoeditoruicomponentsQgn_indi_vded_volume_up_down, 
	            EMbmVideoeditoruicomponentsQgn_indi_vded_volume_up_down_mask,
	            KRgbBlack);
	
/* Speaker bitmap */
	AknsUtils::CreateColorIconL(
            skinInstance, KAknsIIDQgnIndiSpeaker,KAknsIIDQsnIconColors,
			EAknsCIQsnIconColorsCG6,
            iVolumeBitmap, iVolumeBitmapMask,
            AknIconUtils::AvkonIconFileName(),
            EMbmAvkonQgn_indi_speaker, EMbmAvkonQgn_indi_speaker_mask,
            KRgbBlack);

/* Pause bitmap */	
// Pause bitmap in not used anywhere at the moment. There is not proper
// icon to be used for it anyway in the platform. If needed in the future,
// a new icon graphic need to be requested.
/*    
    AknsUtils::CreateColorIconL(
            skinInstance, KAknsIIDNone,KAknsIIDQsnIconColors,
			EAknsCIQsnIconColorsCG6,
            iPausedBitmap, iPausedBitmapMask,
            bitmapfile,
            EMbmVideoeditoruicomponentsQgn_prop_ve_pause, 
            EMbmVideoeditoruicomponentsQgn_prop_ve_pause_mask,KRgbBlack);
*/

#ifdef RD_TACTILE_FEEDBACK 
    iTouchFeedBack = MTouchFeedback::Instance();    
#endif /* RD_TACTILE_FEEDBACK  */     

	LOG(KVideoEditorLogFile, "CVeiTimeLabelNavi::LoadBitmapsL: out");
	}


// ---------------------------------------------------------
// CTimeLabelNavi::NewL()
// Symbian OS two-phase contruction
// ---------------------------------------------------------
//
EXPORT_C CVeiTimeLabelNavi* CVeiTimeLabelNavi::NewL()
	{
	LOG(KVideoEditorLogFile, "CVeiTimeLabelNavi::NewL: in");

	CVeiTimeLabelNavi* self = CVeiTimeLabelNavi::NewLC();
	CleanupStack::Pop( self );

	LOG(KVideoEditorLogFile, "CVeiTimeLabelNavi::NewL: out");
	return self;
	}

EXPORT_C CVeiTimeLabelNavi* CVeiTimeLabelNavi::NewLC()
	{
	LOG(KVideoEditorLogFile, "CVeiTimeLabelNavi::NewLC: in");

	CVeiTimeLabelNavi* self = new(ELeave) CVeiTimeLabelNavi();
	CleanupStack::PushL(self);
	self->ConstructL();

	LOG(KVideoEditorLogFile, "CVeiTimeLabelNavi::NewLC: out");
	return self;
	}


EXPORT_C void CVeiTimeLabelNavi::SetLabelL( const TDesC& aLabel )
	{
	#ifdef VERBOSE
	LOGFMT(KVideoEditorLogFile, "CVeiTimeLabelNavi::SetLabelL: %S", &aLabel);
	#endif

	if (aLabel.Length() <= iLabel.MaxLength())
		{
		iLabel = aLabel;
		}
	ReportEventL(MCoeControlObserver::EEventStateChanged);
	}

EXPORT_C void CVeiTimeLabelNavi::SetLeftArrowVisibilityL(TBool aVisible)
	{
	iArrowVisible = aVisible;
	ReportEventL(MCoeControlObserver::EEventStateChanged);	
	}

EXPORT_C void CVeiTimeLabelNavi::SetRightArrowVisibilityL(TBool aVisible)
	{
	iArrowVisible = aVisible;
	ReportEventL(MCoeControlObserver::EEventStateChanged);	
	}

EXPORT_C void CVeiTimeLabelNavi::SetVolumeIconVisibilityL(TBool aVisible)
	{
	iVolumeIconVisible = aVisible;
	ReportEventL(MCoeControlObserver::EEventStateChanged);	
	}

EXPORT_C void CVeiTimeLabelNavi::SetPauseIconVisibilityL(TBool aVisible)
	{
	iPauseIconVisible = aVisible;
	ReportEventL(MCoeControlObserver::EEventStateChanged);	
	}

void CVeiTimeLabelNavi::SizeChanged()
	{
    TRect parentRect(Rect());
	parentRect.iTl.iY+=2;
	/*
	const TRect &    aParent,  
	TInt    C,  
	TInt    l,  
	TInt    t,  
	TInt    r,  
	TInt    b,  
	TInt    W,  
	TInt    H 

	//C  colour index, 0..255  
	//l  left margin  
	//r  right margin  
	//B  Baseline from top of the parent rectangle  
	//W  text width in pixels  
	//J  justification. ELayoutAlignNone; ELayoutAlignCenter; ELayoutAlignLeft; ELayoutAlignRight  
*/

	const CFont* myFont = AknLayoutUtils::FontFromId( ELatinBold19/*EAknLogicalFontSecondaryFont*/ );
	TInt baseline = ( parentRect.Height() / 2 ) + ( myFont->AscentInPixels() / 2 );
	TInt iconHeightWidth = parentRect.Height();
		
	TSize iconSize = TSize(STATIC_CAST(TInt,0.0649*parentRect.Width()), 
		STATIC_CAST(TInt,0.5625*parentRect.Height() )); //14,18
	
	AknIconUtils::SetSize( 
	    iArrowBitmap,  
	    iconSize,
	    EAspectRatioNotPreserved );
	    
	AknIconUtils::SetSize( 
	    iPausedBitmap, 
	    iconSize,
	    EAspectRatioNotPreserved );
	    
	TInt arrowTop = ( parentRect.iBr.iY/2 - iconSize.iHeight/2 );

	iBitmapLayout[EArrayItem].LayoutRect(parentRect, ELayoutEmpty, STATIC_CAST(TInt, 0.0926*parentRect.Width()), arrowTop, ELayoutEmpty, ELayoutEmpty,iconHeightWidth,iconSize.iHeight);
	iBitmapLayout[ESpeakerItem].LayoutRect(parentRect, ELayoutEmpty, STATIC_CAST(TInt, 0.1625*parentRect.Width()), 0, ELayoutEmpty, ELayoutEmpty, iconHeightWidth, iconHeightWidth);
	iBitmapLayout[EPausedItem].LayoutRect(parentRect, ELayoutEmpty, 0, 0, ELayoutEmpty, ELayoutEmpty, 17, 16);

	TInt textLeftMargin = STATIC_CAST( TInt, 0.6045*parentRect.Width() );
	TInt textRightMargin = STATIC_CAST( TInt, 0.9546*parentRect.Width() );

	if( parentRect.iBr.iX != 108 )
		{
		iTextLayout.LayoutText(parentRect, ELatinBold19, 0, textLeftMargin, 0, 
			baseline, textRightMargin-textLeftMargin, ELayoutAlignLeft);

		}
	else
		{
		arrowTop = STATIC_CAST( TInt, parentRect.iBr.iY/2 - 9/2 );
		iBitmapLayout[EArrayItem].LayoutRect(parentRect, ELayoutEmpty, 14, arrowTop, ELayoutEmpty, ELayoutEmpty,iconHeightWidth,9);
		iBitmapLayout[ESpeakerItem].LayoutRect(parentRect, ELayoutEmpty, 20, 0,		ELayoutEmpty, ELayoutEmpty,iconHeightWidth,iconHeightWidth);
		iBitmapLayout[EPausedItem].LayoutRect(parentRect, ELayoutEmpty, 0,  0,		ELayoutEmpty, ELayoutEmpty,17,			   16);
		
		
		textLeftMargin = STATIC_CAST( TInt, 0.7273*parentRect.Width()/2 +20);	
		textRightMargin = STATIC_CAST( TInt, 0.9546*parentRect.Width()/2 +20);

		iTextLayout.LayoutText(parentRect, ELatinBold19, 0, textLeftMargin, 0, 
			baseline, textRightMargin-textLeftMargin, ELayoutAlignLeft);	
		}


	AknIconUtils::SetSize( iVolumeBitmap, TSize( iconHeightWidth, iconHeightWidth) );

	AknIconUtils::SetSize( iMutedBitmap, TSize( iconHeightWidth, iconHeightWidth) );
	}

void CVeiTimeLabelNavi::Draw(const TRect& /*aRect*/) const
	{
	CWindowGc& gc=SystemGc();

	if ( iVolumeIconVisible )
		{
		iBitmapLayout[ESpeakerItem].DrawImage( gc, iVolumeBitmap, iVolumeBitmapMask );

		if ( iArrowVisible && !AknLayoutUtils::PenEnabled() )
			{
			iBitmapLayout[EArrayItem].DrawImage( gc, iArrowBitmap, iArrowBitmapMask );
			}
		}
	else
		{
		iBitmapLayout[ESpeakerItem].DrawImage( gc, iMutedBitmap, iMutedBitmapMask );
		}

	if ( iPauseIconVisible )
		{
		// not in use at the moment, pause icon is drawed in main pane instead
		//iBitmapLayout[EPausedItem].DrawImage( gc, iPausedBitmap, NULL );
		}

	TBuf<32> labelWithConvNumbers;
	labelWithConvNumbers.Append( iLabel );
	AknTextUtils::DisplayTextLanguageSpecificNumberConversion( labelWithConvNumbers );

	MAknsSkinInstance* skinInstance = AknsUtils::SkinInstance();
	//AknsDrawUtils::DrawCachedImage(skinInstance,gc,TRect(0,0,24,24),KAknsIIDQgnIndiSpeaker);

	// Get navi pane text color from skin
	TRgb textColor( KRgbBlack );
	// Note: we are using the navi icon color for the text. There should
	// be separate color definition for the text, but I could not find
	// out what it is. Apparently KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG2
	// is NOT the correct color. Someone should find out which color is used 
	// for the label in CAknNavigationDecorator.
	//AknsUtils::GetCachedColor(skinInstance, textColor, KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG2 );
	AknsUtils::GetCachedColor(skinInstance, textColor, KAknsIIDQsnIconColors, EAknsCIQsnIconColorsCG6 );

    gc.SetBrushStyle( CGraphicsContext::ENullBrush );
	iTextLayout.DrawText(gc, labelWithConvNumbers, ETrue, textColor);
	}

void CVeiTimeLabelNavi::HandleResourceChange(TInt aType)
	{
	LOGFMT(KVideoEditorLogFile, "CVeiTimeLabelNavi::HandleResourceChange() In, aType:%d", aType);

	if (KAknsMessageSkinChange == aType)
		{
		// Reload the icon bitmaps with the current skin color
		DeleteBitmaps();
		TRAP_IGNORE( LoadBitmapsL() );
		}
	CCoeControl::HandleResourceChange(aType);

	LOG(KVideoEditorLogFile, "CVeiTimeLabelNavi::HandleResourceChange() Out");
    }

void CVeiTimeLabelNavi::HandlePointerEventL(const TPointerEvent& aPointerEvent)
    {
    if( iObserver && 
        iBitmapLayout[ESpeakerItem].Rect().Contains( aPointerEvent.iPosition ) )
        {
#ifdef RD_TACTILE_FEEDBACK 
		if ( iTouchFeedBack )
        	{
            iTouchFeedBack->InstantFeedback( ETouchFeedbackBasic );
        	}
#endif /* RD_TACTILE_FEEDBACK  */			        	        

        iObserver->HandleNaviEventL();
        }
    }

// End of File