mpxplugins/viewplugins/views/commonplaybackview/src/mpxplaybackviewinfolabel.cpp
changeset 0 ff3acec5bc43
child 1 8118492f1bdf
--- /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    <AknsSkinInstance.h>
+#include    <AknsDrawUtils.h>
+#include    <AknsUtils.h>
+#include    <AknMarqueeControl.h>
+#include    <AknUtils.h>
+#include    <AknLayoutFont.h>
+
+#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<CMPXPlaybackViewInfoLabel*>( aPtr );
+    CWindowGc& gc = self->SystemGc();
+    gc.Activate( *self->DrawableWindow() );
+    self->Draw( self->Rect() );
+    gc.Deactivate();
+
+    return static_cast<TBool>( 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