diff -r 73a1feb507fb -r bc78a40cd63c mmsharing/mmshui/src/musuinavimediadecorator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmsharing/mmshui/src/musuinavimediadecorator.cpp Wed Sep 01 12:31:01 2010 +0100 @@ -0,0 +1,546 @@ +/* +* 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 "musuinavimediadecorator.h" +#include "musuinavimediaanimator.h" +#include "musuidefinitions.h" +#include "muslogger.h" // debug logging +#include +//#include +//#include +#include +#include "musresourcefinderutil.h" + +#include // KDC_APP_BITMAP_DIR +#include +#include // CAknNavigationControlContainer +#include // CEikStatusPaneBase +#include +#include // scalable UI +#include // SetSize for the icons +#include +#include +#include +#include +#include + +using namespace AppLayout; + + +const TInt KMusDecoratorStability = 0; +const TInt KIconArraySize = 15; + +_LIT( KMyBitmapRomFile, "Z:\\resource\\apps\\musuiicons.mif" ); +_LIT( KMyBitmapRamFile, "C:\\resource\\apps\\musuiicons.mif" ); + + +#ifndef __MIN +#define __MIN(A, B) ((A) < (B) ? (A): (B)) +#endif +//macro +//_LIT( KMyMbmFileName, "z:Camcorder.mbm"); + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +CMusUiNaviMediaDecorator* CMusUiNaviMediaDecorator::NewL() + { + CMusUiNaviMediaDecorator* self = new( ELeave ) CMusUiNaviMediaDecorator(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +CMusUiNaviMediaDecorator::~CMusUiNaviMediaDecorator() + { + MUS_LOG( "mus: [MUSUI ] -> CMusUiNaviMediaDecorator::~CMusUiNaviMediaDecorator" ); + delete iLeftLabel; + delete iRightLabel; + delete iIconArray; + delete iAnimation; + + MUS_LOG( "mus: [MUSUI ] <- CMusUiNaviMediaDecorator::~CMusUiNaviMediaDecorator" ); + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +CMusUiNaviMediaDecorator::CMusUiNaviMediaDecorator() + { + iMiddle = 0; + iLeftTextSize = TSize( 0, 0 ); + iRightTextSize = TSize( 0, 0 ); + iIcon = NULL; + iIconLeft = 50; // Only defaylt valut, it's overrided right away + iImageSize = TSize( 18, 18 ); // Only default value, it's overrided right avay + } + + +// ----------------------------------------------------------------------------- +// +// +// ----------------------------------------------------------------------------- +// +void CMusUiNaviMediaDecorator::ConstructL() + { + MUS_LOG( "mus: [MUSUI ] -> CMusUiNaviMediaDecorator::ConstructL" ); + iLeftLabel = HBufC16::NewL(0); + iRightLabel = HBufC16::NewL(0); + + + iIconLayout.LayoutRect( Rect(), R_MUS_NAVI_MEDIA_ICON_LAYOUT_SIZE ); + iImageSize.iWidth = iIconLayout.Rect().Width(); + iImageSize.iHeight = iIconLayout.Rect().Height(); + + MUS_LOG1( "mus: [MUSUI ] -> CMusUiNaviMediaDecorator::ConstructL(): iImageSize.iWidth %d", + iImageSize.iWidth ) + MUS_LOG1( "mus: [MUSUI ] -> CMusUiNaviMediaDecorator::ConstructL(): iImageSize.iHeight %d", + iImageSize.iHeight ) + iLeftTextLayout.LayoutText( Rect(), + R_MUS_NAVI_MEDIA_TEXT_LEFT_LAYOUT ); + iRightTextLayout.LayoutText( Rect(), + R_MUS_NAVI_MEDIA_TEXT_RIGHT_LAYOUT ); + + + if( MusResourceFinderUtil::IsExistL( KMyBitmapRomFile ) ) + { + iResourceRam = EFalse; + } + else if( MusResourceFinderUtil::IsExistL( KMyBitmapRamFile ) ) + { + iResourceRam = ETrue; + } + else + { + MUS_LOG( "mus: [MUSUI ] Icon File Not Found " ); + User::Leave(KErrNotFound); + } + + LoadImagesL(); + + MUS_LOG( "mus: [MUSUI ] <- CMusUiNaviMediaDecorator::ConstructL" ); + } + + +// ----------------------------------------------------------------------------- +// +// +// ----------------------------------------------------------------------------- +// +void CMusUiNaviMediaDecorator::SetLeftLabelL( const TDesC& aLabel ) + { + MUS_LOG( "mus: [MUSUI ] -> CMusUiNaviMediaDecorator::SetLabelL" ); + HBufC* newLabel = aLabel.AllocL(); + delete iLeftLabel; // after the AllocL succeeds + iLeftLabel = NULL; + iLeftLabel = newLabel; + TPtr ptr( iLeftLabel->Des() ); + AknTextUtils::LanguageSpecificNumberConversion( ptr ); + DoLayoutText(); + MUS_LOG( "mus: [MUSUI ] <- CMusUiNaviMediaDecorator::SetLabelL" ); + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMusUiNaviMediaDecorator::SetRightLabelL( const TDesC& aLabel ) + { + MUS_LOG( "mus: [MUSUI ] -> CMusUiNaviMediaDecorator::SetLabelL" ); + HBufC* newLabel = aLabel.AllocL(); + delete iRightLabel; // after the AllocL succeeds + iRightLabel = NULL; + iRightLabel = newLabel; + TPtr ptr( iRightLabel->Des() ); + AknTextUtils::LanguageSpecificNumberConversion( ptr ); + DoLayoutText(); + MUS_LOG( "mus: [MUSUI ] <- CMusUiNaviMediaDecorator::SetLabelL" ); + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMusUiNaviMediaDecorator::ShowIcon( TMusUiNaviMediaDecorator aIcon ) + { + MUS_LOG1( "mus: [MUSUI ] -> CMusUiNaviMediaDecorator::ShowIcon( \ + TMusMediaNaviIcons aIcon ) #%d", aIcon ); + + delete iAnimation; + iAnimation = NULL; + + if( aIcon == EMusUiNaviIconNone ) + { + iIcon = NULL; + return; + } + else if( aIcon == EMusUiNaviIconWaitAnim ) + { + iIcon = NULL; + iIconLayout.LayoutRect( Rect(), R_MUS_NAVI_MEDIA_ICON_LAYOUT_SIZE ); + iImageSize.iWidth = iIconLayout.Rect().Width(); + iImageSize.iHeight = iIconLayout.Rect().Height(); + TRAPD( err, iAnimation = CMusUiNaviMediaAnimator::NewL( *this, iImageSize ); ) + if( err == KErrNone ) + { + //iAnimation->SetInterval( 50000 ); + } + } + else if( iIconArray->Count() > aIcon ) + { + iIcon = static_cast< CGulIcon* > ( iIconArray->At( aIcon) ); + } + else + { + iIcon = NULL; + } + if( !iAnimation ) + { + DrawNow(); + } + + MUS_LOG( "mus: [MUSUI ] <- CMusUiNaviMediaDecorator::ShowIcon( \ + TMusMediaNaviIcons aIcon )" ); + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMusUiNaviMediaDecorator::SetIcon( CGulIcon* aIcon ) + { + iIcon = aIcon; + DrawNow(); + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMusUiNaviMediaDecorator::SizeChanged() + { + AknsUtils::RegisterControlPosition( this ); + DoLayoutText(); + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMusUiNaviMediaDecorator::Draw( const TRect& aRect ) const + { + MUS_LOG( "mus: [MUSUI ] -> CMusUiNaviMediaDecorator::Draw" ); + + CWindowGc& gc = SystemGc(); + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + // Get skinned bitmap + CFbsBitmap* skinBitmap = + AknsUtils::GetCachedBitmap( skin, KAknsIIDQsnIconColors ); + if( iIcon ) + { + MAknsControlContext* cc = AknsDrawUtils::ControlContext( this ); + AknsDrawUtils::Background( skin, cc,this, gc , aRect , KAknsDrawParamDefault ); + gc.BitBltMasked( TPoint( iIconLeft,1), + iIcon->Bitmap(), + iIconLayout.Rect(), + iIcon->Mask(), + EFalse ); + } + // draw time indicator + + //TRgb color = iLeftTextLayout.Color(); + + TRgb color; + + AknsUtils::GetCachedColor( skin, color, KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG2 ); + + gc.SetPenColor( color ); + gc.UseFont( iLeftTextLayout.Font() ); + + + TInt flTop = ( ( aRect.Height() >> 1 ) + - ( iLeftTextLayout.Font()->AscentInPixels() >> 1 ) ) + + aRect.iTl.iY - 1; // -1 because some rounding things + + gc.DrawText( *iLeftLabel, + TRect( aRect.iTl.iX+1, flTop, aRect.iBr.iX, aRect.iBr.iY ), + iLeftTextLayout.Font()->AscentInPixels() + 1, + iLeftTextLayout.Align() ); + + TInt frTop = ( ( aRect.Height() >> 1 ) + - ( iRightTextLayout.Font()->AscentInPixels() >> 1 ) ) + + aRect.iTl.iY - 1; // -1 because some rounding things + + TInt frLeft; + TInt frRight; + + if ( AknLayoutUtils::LayoutMirrored() ) + { + frLeft = aRect.iTl.iX; + frRight = iRightTextSize.iWidth + 1; + } + else + { + frLeft = aRect.iBr.iX - iRightTextSize.iWidth - 1; + frRight = aRect.iBr.iX; + } + + gc.DrawText( *iRightLabel, + TRect( frLeft, frTop, frRight, aRect.iBr.iY ), + iRightTextLayout.Font()->AscentInPixels() + 1, + iRightTextLayout.Align() ); + + + MUS_LOG( "mus: [MUSUI ] <- CMusUiNaviMediaDecorator::Draw " ); + } + + +// ----------------------------------------------------------------------------- +// Layouts the text depending on current icon situation. +// ----------------------------------------------------------------------------- +// +void CMusUiNaviMediaDecorator::DoLayoutText() + { + MUS_LOG( "mus: [MUSUI ] -> CMusUiNaviMediaDecorator::DoLayoutText" ); + TRect parent( Rect() ); + if ( parent.IsEmpty() ) + { + MUS_LOG( "mus: [MUSUI ] <- CMusUiNaviMediaDecorator::DoLayoutText: return" ); + return; + } + + TInt minsize = __MIN( parent.Width(), parent.Height() ); + iImageSize = TSize( minsize-2, minsize-2 ); + + + // Reassign text sizes + TAknTextLineLayout txtLayout = AppLayout::Navipanetexts_Line_2(); + const TInt spaceBetweenIconsAndText = 1; + txtLayout.il = spaceBetweenIconsAndText; + + iLeftTextLayout.LayoutText( parent, txtLayout ); + iRightTextLayout.LayoutText( parent, txtLayout ); + + TSize parentSize = TSize( parent.iBr.iX - parent.iTl.iX, + parent.iBr.iY - parent.iTl.iY ); + + //TInt clientWidth = parent.iBr.iX - parent.iTl.iX; + + iLeftTextSize.iWidth = + iLeftTextLayout.Font()->TextWidthInPixels( iLeftLabel->Des() ); + iRightTextSize.iWidth = + iRightTextLayout.Font()->TextWidthInPixels( iRightLabel->Des() ); + + // First testing elements total width + if( iLeftTextSize.iWidth + iRightTextSize.iWidth + iIconLayout.Rect().iBr.iX + > parentSize.iWidth ) + { + // Whole stuff is too large + _LIT( KMusStringThreeDots, "..."); + TRAP_IGNORE( SetRightLabelL( KMusStringThreeDots ) ); + } + + // Middle point of Icon box in current text parameters + TInt middle = parent.iTl.iX + ( parentSize.iWidth >> 1 ); + + // If there collision, calculates middle of the text fields + iIconLeft = middle - parent.iTl.iX - ( iIconLayout.Rect().iBr.iX >> 1 ); + TInt iconRight = + middle - parent.iTl.iX + ( iIconLayout.Rect().iBr.iX >> 1 ); + + if( iLeftTextSize.iWidth > iIconLeft || + ( parentSize.iWidth - iRightTextSize.iWidth ) < iconRight ) + { + middle = (( parentSize.iWidth + - ( iLeftTextSize.iWidth + iRightTextSize.iWidth )) >> 1 ) + + parent.iTl.iX + iLeftTextSize.iWidth; + } + + + // Move only if middle place moves enough eq. ignoring jumping + if( middle < ( iMiddle - KMusDecoratorStability ) + || middle > ( iMiddle + KMusDecoratorStability ) ) + { + iMiddle = middle; + } + + iLeftTextSize.iHeight = iLeftTextLayout.Font()->HeightInPixels(); + iRightTextSize.iHeight = iRightTextLayout.Font()->HeightInPixels(); + + MUS_LOG( "mus: [MUSUI ] <- CMusUiNaviMediaDecorator::DoLayoutText" ); + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMusUiNaviMediaDecorator::LoadImagesL() + { + + delete iIconArray; + iIconArray = NULL; + iIconArray = new ( ELeave ) CAknIconArray( KIconArraySize ); + + TParse parse; + if( iResourceRam ) + { + parse.Set( KMyBitmapRamFile, &KDC_APP_RESOURCE_DIR, NULL ); + } + else + { + parse.Set( KMyBitmapRomFile, &KDC_APP_RESOURCE_DIR, NULL ); + } + + + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + + TAknsItemID item; + item.Set( 0xFFCC, 0xC ); // It's a kind a magic + + + ConstructImageL( skin, + item, + EMbmMusuiiconsQgn_indi_video_forw, + EMbmMusuiiconsQgn_indi_video_forw_mask, + parse, + EFalse ); + + ConstructImageL( skin, + item, + EMbmMusuiiconsQgn_indi_video_pause, + EMbmMusuiiconsQgn_indi_video_pause_mask, + parse, + EFalse ); + + ConstructImageL( skin, + item, + EMbmMusuiiconsQgn_indi_video_play, + EMbmMusuiiconsQgn_indi_video_play_mask, + parse, + ETrue ); + + ConstructImageL( skin, + item, + EMbmMusuiiconsQgn_indi_video_record, + EMbmMusuiiconsQgn_indi_video_record_mask, + parse, + ETrue ); + + ConstructImageL( skin, + item, + EMbmMusuiiconsQgn_indi_video_record_not, + EMbmMusuiiconsQgn_indi_video_record_not_mask, + parse, + ETrue ); + + ConstructImageL( skin, + item, + EMbmMusuiiconsQgn_indi_video_rew, + EMbmMusuiiconsQgn_indi_video_rew_mask, + parse, + EFalse ); + + ConstructImageL( skin, + item, + EMbmMusuiiconsQgn_indi_video_stop, + EMbmMusuiiconsQgn_indi_video_stop_mask, + parse, + EFalse ); + + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMusUiNaviMediaDecorator::ConstructImageL( MAknsSkinInstance* aSkin, + const TAknsItemID& aId, + TInt aBitmapId, + TInt aMaskId, + TParse parse, + TBool aIconHasOwnColor ) + + { + MUS_LOG( "mus: [MUSUI ] -> CMusUiNaviMediaDecorator::ConstructImageL()" ); + + CFbsBitmap* bitmap = NULL; + CFbsBitmap* mask = NULL; + + if (aIconHasOwnColor) + { + AknsUtils::CreateIconL(aSkin, + aId, + bitmap, + mask, + parse.FullName(), + aBitmapId, + aMaskId); + + } + else + { + AknsUtils::CreateColorIconL(aSkin, + aId, + KAknsIIDQsnIconColors, + EAknsCIQsnIconColorsCG7, + bitmap, + mask, + parse.FullName(), + aBitmapId, + aMaskId, + KRgbBlack); + } + + AknIconUtils::SetSize( bitmap, iImageSize ); + AknIconUtils::SetSize( mask, iImageSize ); + MUS_LOG1( "mus: [MUSUI ] -> CMusUiNaviMediaDecorator::ConstructIconL(): iImageSize.iWidth %d", + iImageSize.iWidth ) + MUS_LOG1( "mus: [MUSUI ] -> CMusUiNaviMediaDecorator::ConstructIconL(): iImageSize.iHeight %d", + iImageSize.iHeight ) + + + CGulIcon* icon = CGulIcon::NewL(); + icon->SetBitmap( bitmap ); + icon->SetMask( mask ); + + CleanupStack::PushL( icon ); + iIconArray->AppendL( icon ); + CleanupStack::Pop( icon ); + + MUS_LOG( "mus: [MUSUI ] <- CMusUiNaviMediaDecorator::ConstructIconL()" ); + + } + +// end of file