diff -r 000000000000 -r ff3acec5bc43 mpxplugins/viewplugins/views/commonplaybackview/src/mpxplaybackviewinfolabel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mpxplugins/viewplugins/views/commonplaybackview/src/mpxplaybackviewinfolabel.cpp Thu Dec 17 08:45:05 2009 +0200 @@ -0,0 +1,282 @@ +/* +* 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: Text label for Playback view +* +*/ + + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include + +#include "mpxplaybackviewinfolabel.h" + +// CONSTANTS +#ifdef _DEBUG +_LIT( KPanicCat, "CMPXPlaybackViewInfoLabel" ); +#endif + +// MODULE DATA STRUCTURES +enum TPanicCode + { + ENoPanic = 0, + EAlreadyScrolling, + ENoTextSet, + EFontNotSet + }; + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// C++ default constructor can NOT contain any code, that +// might leave. +// --------------------------------------------------------------------------- +// +CMPXPlaybackViewInfoLabel::CMPXPlaybackViewInfoLabel() + { + // do nothing + } + +// --------------------------------------------------------------------------- +// Symbian 2nd phase constructor can leave. +// --------------------------------------------------------------------------- +// +void CMPXPlaybackViewInfoLabel::ConstructL(TBool aEnableMarqueeSupport) + { + if ( aEnableMarqueeSupport ) + { + iMarquee = CAknMarqueeControl::NewL(); + TCallBack callback( RedrawCallback, this ); + iMarquee->SetRedrawCallBack( callback ); + iMarquee->SetLoops( 1 ); + iMarquee->SetContainerWindowL( *this ); + } + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CMPXPlaybackViewInfoLabel::~CMPXPlaybackViewInfoLabel() + { + delete iFullText; + delete iMarquee; + iBackground = NULL; + } + +// --------------------------------------------------------------------------- +// Set background bitmap +// --------------------------------------------------------------------------- +// +void CMPXPlaybackViewInfoLabel::SetBackground( + MAknsControlContext* aBackground ) + { + iBackground = aBackground; + } + +// --------------------------------------------------------------------------- +// Redraw rectangle +// --------------------------------------------------------------------------- +// +void CMPXPlaybackViewInfoLabel::RedrawRect( const TRect& aRect ) const + { + if ( aRect.Intersects( Rect() ) ) + { + CWindowGc& gc = SystemGc(); + if ( iBackground ) + { + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + AknsDrawUtils::Background( skin, iBackground, gc, Rect() ); + } + + CGraphicsContext::TTextAlign align=iAlignment.TextAlign(); + + // Get baseline for current font + TInt baselineOffset = 0; + if ( iMarquee ) + { + const CAknLayoutFont* layoutFont = + CAknLayoutFont::AsCAknLayoutFontOrNull( Font() ); + if ( layoutFont ) + { + baselineOffset= layoutFont->TextPaneTopToBaseline(); + } + } + + gc.UseFont( Font() ); + gc.SetPenColor( iEikonEnv->ControlColor( EColorLabelText,*this ) ); + + // Draw marquee, if supported and necessary + if ( !iMarquee || !iMarquee->IsMarqueeOn() || iMarquee->DrawText( + gc, // aGc + Rect(), // aTextRect + FullText(), // aText + baselineOffset, // aBaselineOffset + align, // aAlign + *Font() ) ) // aFont + { + // Marquee is not enabled or all the loops have been executed + // -> the text needs to be drawn here + CEikLabel::Draw( aRect ); + } + } + } + +// --------------------------------------------------------------------------- +// Start marquee scrolling if supported and needed. +// --------------------------------------------------------------------------- +// +void CMPXPlaybackViewInfoLabel::StartMarquee() + { + if ( iMarquee ) + { + TBool need = NeedToScroll(); + if ( need && !iMarquee->IsMarqueeOn() ) + { + iMarquee->Reset(); + } + iMarquee->EnableMarquee( need ); + if ( need ) + { + iMarquee->Start(); + } + } + } + +// --------------------------------------------------------------------------- +// Stop marquee scrolling. +// --------------------------------------------------------------------------- +// +void CMPXPlaybackViewInfoLabel::StopMarquee() + { + if ( iMarquee ) + { + iMarquee->EnableMarquee( EFalse ); + iMarquee->Stop(); + } + } + +// --------------------------------------------------------------------------- +// Get the full unclipped text for the label +// --------------------------------------------------------------------------- +// +const TDesC& CMPXPlaybackViewInfoLabel::FullText() const + { + if ( iFullText ) + { + return *iFullText; + } + else + { + return *Text(); + } + } + +// --------------------------------------------------------------------------- +// Set label text and clip if necessary. +// --------------------------------------------------------------------------- +// +void CMPXPlaybackViewInfoLabel::SetLabelTextL( const TDesC& aText ) + { + if ( iMarquee ) + { + delete iFullText; + iFullText = NULL; + iFullText = aText.AllocL(); + } + + // magic: allocate 3 chars more (make sure "..." fits). + HBufC* buf = HBufC::NewLC( aText.Length() + 3 ); + *buf = aText; + TPtr ptr( buf->Des() ); + AknTextUtils::ClipToFit( ptr, + *Font(), + Rect().Width() ); + SetTextL( *buf ); + CleanupStack::PopAndDestroy( buf ); + } + +// --------------------------------------------------------------------------- +// Check if scrolling is needed. +// --------------------------------------------------------------------------- +// +TBool CMPXPlaybackViewInfoLabel::NeedToScroll() const + { + __ASSERT_DEBUG( iFont, User::Panic( KPanicCat, EFontNotSet ) ); + + TBool need( EFalse ); + if ( iFullText && iFont->TextWidthInPixels( *iFullText ) > Size().iWidth ) + { + need = ETrue; + } + return need; + } + +// --------------------------------------------------------------------------- +// Redraw callback for marquee control +// --------------------------------------------------------------------------- +// +TInt CMPXPlaybackViewInfoLabel::RedrawCallback( TAny* aPtr ) + { + CMPXPlaybackViewInfoLabel* self = + static_cast( aPtr ); + CWindowGc& gc = self->SystemGc(); + gc.Activate( *self->DrawableWindow() ); + self->Draw( self->Rect() ); + gc.Deactivate(); + + return static_cast( ETrue ); // True -> draw again + } + +// --------------------------------------------------------------------------- +// Draws the control. +// --------------------------------------------------------------------------- +// +void CMPXPlaybackViewInfoLabel::Draw( const TRect& aRect ) const + { + RedrawRect( aRect ); + } + +// --------------------------------------------------------------------------- +// Gets the number of controls contained in a compound control. +// --------------------------------------------------------------------------- +// +TInt CMPXPlaybackViewInfoLabel::CountComponentControls() const + { + TInt childCount = 0; + if ( iMarquee ) + { + childCount++; + } + return childCount; + } + +// --------------------------------------------------------------------------- +// Gets an indexed component of a compound control. +// --------------------------------------------------------------------------- +// +CCoeControl* CMPXPlaybackViewInfoLabel::ComponentControl( + TInt aIndex ) const + { + ASSERT( aIndex == 0 ); // only 1 control + return iMarquee; + } + +// End of File