videditor/ManualVideoEditor/src/VeiTrimForMmsContainer.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 <AknIconUtils.h>   // AknIconUtils
#include <eikenv.h>     // iEikonEnv
#include <manualvideoeditor.rsg>    // Video Editor resources
#include <StringLoader.h>   // StringLoader

#include <aknbiditextutils.h>
#include <gulfont.h>

#include <aknsdrawutils.h> 
#include <aknsdatacontext.h> 
#include <aknsbasicbackgroundcontrolcontext.h>

#include <AknProgressDialog.h> 
#include <eikprogi.h>
#include <AknWaitDialog.h>


// User includes
#include "VeiTrimForMmsContainer.h"
#include "VeiVideoDisplay.h"
#include "VideoEditorCommon.h"
#include "VideoEditorHelp.hlp.hrh"  // Topic contexts (literals)
#include "veiframetaker.h"
#include "VeiTrimForMmsView.h"
#include "VeiCutterBar.h"
#include "VeiVideoEditorSettings.h"
#include "VideoEditorUtils.h"
#include "VideoEditorDebugUtils.h"

void CVeiTrimForMmsContainer::DialogDismissedL( TInt /*aButtonId*/ )
    {
    iProgressInfo = NULL;
    }


CVeiTrimForMmsContainer* CVeiTrimForMmsContainer::NewL( const TRect& aRect, 
                                                        CVedMovie& aMovie, 
                                                        CVeiTrimForMmsView& aView )
    {
    CVeiTrimForMmsContainer* self = CVeiTrimForMmsContainer::NewLC( aRect, aMovie, aView );
    CleanupStack::Pop( self );

    return self;
    }

CVeiTrimForMmsContainer* CVeiTrimForMmsContainer::NewLC( const TRect& aRect, 
                                                         CVedMovie& aMovie, 
                                                         CVeiTrimForMmsView& aView )
    {
    CVeiTrimForMmsContainer* self = new( ELeave )CVeiTrimForMmsContainer( aMovie, aView );

    CleanupStack::PushL( self );
    self->ConstructL( aRect );

    return self;
    }


CVeiTrimForMmsContainer::CVeiTrimForMmsContainer( CVedMovie& aMovie, CVeiTrimForMmsView& aView ): 
                            iLastKeyLeftOrRight( EFalse ), iMovie( aMovie ), iView( aView )

{}


void CVeiTrimForMmsContainer::ConstructL( const TRect& aRect )
    {
    LOG( KVideoEditorLogFile, "CVeiTrimForMmsContainer::ConstructL: in" );

    // Make this compound control window-owning.
    CreateWindowL();

    iMovie.RegisterMovieObserverL( this );

    // Read the texts shown above the thumbnails from resources
    iStartText = StringLoader::LoadL( R_VED_THUMBNAIL_START_TEXT, iEikonEnv );
    iEndText = StringLoader::LoadL( R_VED_THUMBNAIL_END_TEXT, iEikonEnv );

    iSeekPos = TTimeIntervalMicroSeconds( 0 );

    iVideoDisplayStart = CVeiVideoDisplay::NewL( iVideoDisplayStartRect, this, *this );

    iVideoDisplayEnd = CVeiVideoDisplay::NewL( iVideoDisplayEndRect, this, * this );

    iCutterBar = CVeiCutterBar::NewL( this );
    iCutterBar->SetPlayHeadVisible( EFalse );
    iVideoDisplay = CVeiVideoDisplay::NewL( aRect, this, * this );

    iFrameTaker = CVeiFrameTaker::NewL( *this );

    /* Timer to keep back light on when user is not giving key events */
    iScreenLight = CVeiDisplayLighter::NewL();
    CVeiVideoEditorSettings::GetMaxMmsSizeL( iMaxMmsSize );
    /* SharedData returns maxmmssize in kbytes. Change it to bytes(1000) and
    add some margin to final value.*/
    iMaxMmsSize = STATIC_CAST( TInt, iMaxMmsSize* 0.98 );
    iBlack = EFalse;

    // Set this control extent.
    SetRect( aRect );
    iBgContext = CAknsBasicBackgroundControlContext::NewL( KAknsIIDQsnBgAreaMain, Rect(), EFalse );

    ActivateL();

    iKeyEnable = EFalse;
    LOG( KVideoEditorLogFile, "CVeiTrimForMmsContainer::ConstructL: out" );
    }



CVeiTrimForMmsContainer::~CVeiTrimForMmsContainer()
    {
    iMovie.UnregisterMovieObserver( this );

    delete iEndText;
    delete iStartText;
    delete iScreenLight;

    delete iCutterBar;

    delete iVideoDisplayStart;
    delete iVideoDisplayEnd;
    if ( iVideoDisplay )
        {
        delete iVideoDisplay;
        iVideoDisplay = NULL;
        }

    if ( iFrameTaker )
        {
        delete iFrameTaker;
        iFrameTaker = NULL;
        }

    if ( iProgressNote )
        {
        delete iProgressNote;
        iProgressNote = NULL;
        }
    iProgressInfo = NULL;

    delete iBgContext;
    }

void CVeiTrimForMmsContainer::SetMaxMmsSize( TInt aMaxSizeInBytes )
    {
    iMaxMmsSize = aMaxSizeInBytes;
    }

const TTimeIntervalMicroSeconds& CVeiTrimForMmsContainer::CutInTime()const
    {
    return iSeekPos;
    }


const TTimeIntervalMicroSeconds& CVeiTrimForMmsContainer::CutOutTime()const
    {
    return iSeekEndPos;
    }


// ----------------------------------------------------------------------------
// CVeiTrimForMmsContainer::ComponentControl(...) const
//
// Gets the specified component of a compound control. 
// ----------------------------------------------------------------------------
//
CCoeControl* CVeiTrimForMmsContainer::ComponentControl( TInt aIndex )const
    {
    LOG( KVideoEditorLogFile, "CVeiTrimForMmsContainer::ComponentControl()" );

    switch ( aIndex )
        {
        //
        // iCutterDisplay
        //
        case ECutFrame:
                {
                return iCutterBar;
                }
            //
            // iVideoDisplayStart
            //
        case EVideoDisplayStart:
                {
                return iVideoDisplayStart;
                }
            //
            // iVideoDisplayEnd
            //
        case EVideoDisplayEnd:
                {
                return iVideoDisplayEnd;
                }
            //
            // iVideoDisplay
            //
        case EVideoPreview:
                {
                return iVideoDisplay;
                }
            //
            // Default
            //
        default:
                {
                return NULL;
                }
        }

    }


// ----------------------------------------------------------------------------
// CVeiTrimForMmsContainer::CountComponentControls() const
//
// Gets the number of controls contained in a compound control.
// ----------------------------------------------------------------------------
//
TInt CVeiTrimForMmsContainer::CountComponentControls()const
    {
    return ENumberOfControls;
    }


void CVeiTrimForMmsContainer::Draw( const TRect& aRect )const
    {
    LOG( KVideoEditorLogFile, "CVeiTrimForMmsContainer::Draw(): In" );

    CWindowGc& gc = SystemGc();
    gc.Clear( aRect );

    // Black backbround for the preview
    if ( iBlack )
        {
        iVideoDisplay->MakeVisible( EFalse );
        gc.SetPenStyle( CWindowGc::ENullPen );
        gc.SetBrushColor( KRgbBlack );
        gc.SetBrushStyle( CGraphicsContext::ESolidBrush );
        gc.DrawRect( aRect );
        gc.SetPenStyle( CWindowGc::ESolidPen );
        gc.DrawRoundRect( aRect, TSize( 4, 4 ));
        return ;
        }
    else
        {
        // Draw skin background
        MAknsSkinInstance* skin = AknsUtils::SkinInstance();
        MAknsControlContext* cc = AknsDrawUtils::ControlContext( this );
        AknsDrawUtils::Background( skin, cc, this, gc, aRect );

        // Get text color from skin
        TRgb textColor( KRgbBlack );
        AknsUtils::GetCachedColor( skin, textColor, KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG6 );
        gc.SetPenColor( textColor );

        const CFont* font = AknLayoutUtils::FontFromId( EAknLogicalFontSecondaryFont );
        TBuf < 95 > startVisualText;
        TPoint startTextPoint;
        TBuf < 95 > endVisualText;
        TPoint endTextPoint;

        startTextPoint.iY = iStartTextBox.iTl.iY + font->HeightInPixels();
        endTextPoint.iY = iEndTextBox.iTl.iY + font->HeightInPixels();

        gc.UseFont( font );

        TBidiText::TDirectionality textDirectionality;

        textDirectionality = AknTextUtils::CurrentScriptDirectionality();

        TInt maxWidthNonClippingStart = iStartTextBox.Width();

        AknBidiTextUtils::ConvertToVisualAndClip( *iStartText, 
                                                  startVisualText, 
                                                  *font, 
                                                  maxWidthNonClippingStart, 
                                                  maxWidthNonClippingStart );
        /** check text alignment */
        if ( textDirectionality == TBidiText::ELeftToRight )
            {
            startTextPoint.iX = iVideoDisplayStartRect.iTl.iX;
            }
        else
            {
            startTextPoint.iX = iVideoDisplayStartRect.iBr.iX - font->TextWidthInPixels( startVisualText );
            }

        gc.DrawText( startVisualText, startTextPoint );


        TInt maxWidthNonClippingEnd = iEndTextBox.Width();

        AknBidiTextUtils::ConvertToVisualAndClip( *iEndText, 
                                                  endVisualText, 
                                                  *font, 
                                                  maxWidthNonClippingEnd, 
                                                  maxWidthNonClippingEnd );
        /** check text alignment */
        if ( textDirectionality == TBidiText::ELeftToRight )
            {
            endTextPoint.iX = iVideoDisplayEndRect.iTl.iX;
            }
        else
            {
            endTextPoint.iX = iVideoDisplayEndRect.iBr.iX - font->TextWidthInPixels( endVisualText );
            }

        gc.DrawText( endVisualText, endTextPoint );

        gc.DiscardFont();

        // Draw Start/End displays
        iVideoDisplayStart->SetRect( iVideoDisplayStartRect );
        iVideoDisplayEnd->SetRect( iVideoDisplayEndRect );

        if ( iPreviewState == EPlaying )
            {
            iVideoDisplay->MakeVisible( ETrue );
            }
        else
            {
            iVideoDisplay->MakeVisible( EFalse );
            }

        }

    LOG( KVideoEditorLogFile, "CVeiTrimForMmsContainer::Draw(): Out" );
    }


// ----------------------------------------------------------------------------
// CVeiTrimForMmsContainer::GetHelpContext(...) const
//
// Gets the control's help context. Associates the control with a particular
// Help file and topic in a context sensitive application.
// ----------------------------------------------------------------------------
//
void CVeiTrimForMmsContainer::GetHelpContext( TCoeHelpContext& aContext )const
    {
    LOG( KVideoEditorLogFile, "CVeiTrimForMmsContainer::GetHelpContext(): In" );

    // Set UID of the CS Help file (same as application UID).
    aContext.iMajor = KUidVideoEditor;

    // Set the context/topic.
    aContext.iContext = KVED_HLP_TRIM_FOR_MMS_VIEW;

    LOG( KVideoEditorLogFile, "CVeiTrimForMmsContainer::GetHelpContext(): Out" );
    }

// ----------------------------------------------------------------------------
// CVeiTrimForMmsContainer::SizeChanged()
//
// The function is called whenever SetExtent(), SetSize(), SetRect(),
// SetCornerAndSize(), or SetExtentToWholeScreen() are called on the control.
// ----------------------------------------------------------------------------
//
void CVeiTrimForMmsContainer::SizeChanged()
    {
    LOG( KVideoEditorLogFile, "CVeiTrimForMmsContainer::SizeChanged(): In" );

    TRect rect = Rect();
    if ( iBgContext )
        {
        iBgContext->SetRect( rect );
        }

    if ( VideoEditorUtils::IsLandscapeScreenOrientation())
    //Landscape
        {
        //  Start Text rect
        TInt startTextTlX = STATIC_CAST( TInt, rect.iBr.iX* 0.00962 );
        TInt startTextTlY = STATIC_CAST( TInt, rect.iBr.iY* 0.01389 );
        TInt startTextBrX = STATIC_CAST( TInt, rect.iBr.iX* 0.49512 );
        TInt startTextBrY = STATIC_CAST( TInt, rect.iBr.iY* 0.09375 );

        iStartTextBox = TRect( startTextTlX, startTextTlY, startTextBrX, startTextBrY );
        //  End Text rect
        TInt endTextTlX = STATIC_CAST( TInt, rect.iBr.iX* 0.50481 );
        TInt endTextTlY = STATIC_CAST( TInt, rect.iBr.iY* 0.01389 );
        TInt endTextBrX = STATIC_CAST( TInt, rect.iBr.iX* 0.99039 );
        TInt endTextBrY = STATIC_CAST( TInt, rect.iBr.iY* 0.09375 );

        iEndTextBox = TRect( endTextTlX, endTextTlY, endTextBrX, endTextBrY );

        // Start Video rect
        TInt startVideoTlX = STATIC_CAST( TInt, rect.iBr.iX* 0.00962 );
        TInt startVideoTlY = STATIC_CAST( TInt, rect.iBr.iY* 0.10764 );
        TInt startVideoBrX = STATIC_CAST( TInt, rect.iBr.iX* 0.49512 );
        TInt startVideoBrY = STATIC_CAST( TInt, rect.iBr.iY* 0.68056 );

        iVideoDisplayStartRect = TRect( startVideoTlX, startVideoTlY, startVideoBrX, startVideoBrY );
        //  End Video rect
        TInt endVideoTlX = STATIC_CAST( TInt, rect.iBr.iX* 0.50481 );
        TInt endVideoTlY = STATIC_CAST( TInt, rect.iBr.iY* 0.10764 );
        TInt endVideoBrX = STATIC_CAST( TInt, rect.iBr.iX* 0.99039 );
        TInt endVideoBrY = STATIC_CAST( TInt, rect.iBr.iY* 0.68056 );

        iVideoDisplayEndRect = TRect( endVideoTlX, endVideoTlY, endVideoBrX, endVideoBrY );

        // Timeline rect
        TInt timeLineTlX = STATIC_CAST( TInt, rect.iBr.iX* 0.0114 );
        TInt timeLineTlY = STATIC_CAST( TInt, rect.iBr.iY* 0.80208 );

        TSize cutBarSize = TSize( STATIC_CAST( TInt, rect.iBr.iX* 0.9773 ), STATIC_CAST( TInt, rect.iBr.iY* 0.0973 ));

        iTimelineRect = TRect( TPoint( timeLineTlX, timeLineTlY ), cutBarSize );
        }
    else
    // Portrait
        {
        //  Start Text rect
        TInt startTextTlX = STATIC_CAST( TInt, rect.iBr.iX* 0.01136 );
        TInt startTextTlY = STATIC_CAST( TInt, rect.iBr.iY* 0.01389 );
        TInt startTextBrX = STATIC_CAST( TInt, rect.iBr.iX* 0.49432 );
        TInt startTextBrY = STATIC_CAST( TInt, rect.iBr.iY* 0.10417 );

        iStartTextBox = TRect( startTextTlX, startTextTlY, startTextBrX, startTextBrY );

        //  End Text rect
        TInt endTextTlX = STATIC_CAST( TInt, rect.iBr.iX* 0.50568 );
        TInt endTextTlY = STATIC_CAST( TInt, rect.iBr.iY* 0.01389 );
        TInt endTextBrX = STATIC_CAST( TInt, rect.iBr.iX* 0.98864 );
        TInt endTextBrY = STATIC_CAST( TInt, rect.iBr.iY* 0.10417 );

        iEndTextBox = TRect( endTextTlX, endTextTlY, endTextBrX, endTextBrY );

        // Start Video rect
        TInt startVideoTlX = STATIC_CAST( TInt, rect.iBr.iX* 0.01136 );
        TInt startVideoTlY = STATIC_CAST( TInt, rect.iBr.iY* 0.11806 );
        TInt startVideoBrX = STATIC_CAST( TInt, rect.iBr.iX* 0.49432 );
        TInt startVideoBrY = STATIC_CAST( TInt, rect.iBr.iY* 0.60069 );

        iVideoDisplayStartRect = TRect( startVideoTlX, startVideoTlY, startVideoBrX, startVideoBrY );

        //  End Video rect
        TInt endVideoTlX = STATIC_CAST( TInt, rect.iBr.iX* 0.50568 );
        TInt endVideoTlY = STATIC_CAST( TInt, rect.iBr.iY* 0.11806 );
        TInt endVideoBrX = STATIC_CAST( TInt, rect.iBr.iX* 0.98864 );
        TInt endVideoBrY = STATIC_CAST( TInt, rect.iBr.iY* 0.60069 );

        iVideoDisplayEndRect = TRect( endVideoTlX, endVideoTlY, endVideoBrX, endVideoBrY );

        // Timeline rect
        TInt timeLineTlX = STATIC_CAST( TInt, rect.iBr.iX* 0.0114 );
        TInt timeLineTlY = STATIC_CAST( TInt, rect.iBr.iY* 0.767361 );


        TSize cutBarSize = TSize( STATIC_CAST( TInt, rect.iBr.iX* 0.9773 ), STATIC_CAST( TInt, rect.iBr.iY* 0.0973 ));

        iTimelineRect = TRect( TPoint( timeLineTlX, timeLineTlY ), cutBarSize );
        }

    iCutterBar->SetRect( iTimelineRect );

    LOG( KVideoEditorLogFile, "CVeiTrimForMmsContainer::SizeChanged(): Out" );
    }

TKeyResponse CVeiTrimForMmsContainer::OfferKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType )
    {
    if ( iKeyEnable )
        {
        switch ( aType )
            {
            //
            // Key down event
            //
            case EEventKeyDown:
                    {
                    iKeyRepeatCount = 0;
                    if ( iPreviewState == EPlaying )
                        {
                        //					iView.SetTrimStateL( CVeiTrimForMmsView::ESeek );
                        //					Stop( ETrue );
                        return EKeyWasConsumed;
                        }
                    else
                        {
                        //iMovie.VideoClipSetCutInTime( 0,TTimeIntervalMicroSeconds(0) );
                        //iMovie.VideoClipSetCutOutTime( 0, iDuration );
                        return EKeyWasConsumed;
                        }
                    }
                //
                // The key event
                //
            case EEventKey:
                    {
                    if ( iPreviewState == EPlaying )
                        {
                        return EKeyWasConsumed;
                        }
                    switch ( aKeyEvent.iCode )
                        {
                        //
                        // Navi-key right
                        //
                    case EKeyRightArrow:
                            {

                            if ( 0 == iKeyRepeatCount )
                                {
                                iMovie.VideoClipSetCutInTime( 0, TTimeIntervalMicroSeconds( 0 ));
                                iMovie.VideoClipSetCutOutTime( 0, iDuration );
                                }

                            if ( iSeekEndPos != iDuration )
                                {
                                iSeekEvent = ETrue;
                                iLastKeyLeftOrRight = ETrue;
                                if ( iKeyRepeatCount < 18 )
                                    {
                                    iKeyRepeatCount++;
                                    }

                                TInt adjustment = TimeIncrement( iKeyRepeatCount );
                                TInt64 newPos = iSeekPos.Int64() + adjustment;

                                TTimeIntervalMicroSeconds endTime( 0 );
                                iMovie.GetDurationEstimateL( iMaxMmsSize, newPos, endTime );

                                // what is the reasoning behid this?
                                // should args be checked before call to GetDurationEstimateL(), like in 
                                // EKeyLeftArrow?
                                if ( endTime.Int64() >= iDuration.Int64() - adjustment )
                                    {
                                    iKeyRepeatCount -= 3;
                                    adjustment = TimeIncrement( iKeyRepeatCount );
                                    endTime = iDuration;
                                    newPos += adjustment;
                                    }

                                iSeekPos = TTimeIntervalMicroSeconds( newPos );
                                iSeekEndPos = endTime;
                                iCutterBar->SetInPoint( iSeekPos );
                                iCutterBar->SetOutPoint( endTime );
                                }

                            return EKeyWasConsumed;
                            }
                        //
                        // Navi-key left
                        //
                    case EKeyLeftArrow:
                            {

                            if ( 0 == iKeyRepeatCount )
                                {
                                iMovie.VideoClipSetCutInTime( 0, TTimeIntervalMicroSeconds( 0 ));
                                iMovie.VideoClipSetCutOutTime( 0, iDuration );
                                }

                            if ( iSeekPos.Int64() > 0 )
                                {
                                iSeekEvent = ETrue;
                                iLastKeyLeftOrRight = ETrue;
                                // Process the command only when repeat count is zero.
                                iKeyRepeatCount++;


                                TInt adjustment = TimeIncrement( iKeyRepeatCount );

                                TInt64 newPos = iSeekPos.Int64() - adjustment;
                                if ( newPos < 0 )
                                    {
                                    newPos = 0;
                                    }
                                iSeekPos = TTimeIntervalMicroSeconds( newPos );

                                TTimeIntervalMicroSeconds endTime( 0 );
                                iMovie.GetDurationEstimateL( iMaxMmsSize, newPos, endTime );

                                iSeekEndPos = endTime;

                                iCutterBar->SetInPoint( iSeekPos );
                                iCutterBar->SetOutPoint( endTime );
                                }
                            return EKeyWasConsumed;
                            }
                        //
                        // Default
                        //
                    default:
                            {
                            return EKeyWasNotConsumed;
                            }
                        }
                    }
                //
                // Key up event
                //

            case EEventKeyUp:
                    {
                    iKeyRepeatCount = 0;
                    if ( iPreviewState == EPlaying )
                        {
                        iView.SetTrimStateL( CVeiTrimForMmsView::ESeek );

                        Stop( ETrue );
                        return EKeyWasConsumed;
                        }
                    else
                        {
                        if ( iLastKeyLeftOrRight )
                            {
                            iView.ProcessNeeded( ETrue );
                            iMovie.VideoClipSetCutInTime( 0, iSeekPos );
                            iMovie.VideoClipSetCutOutTime( 0, iSeekEndPos );
                            iView.UpdateNaviPaneL( iMovie.GetSizeEstimateL() / 1024, iMovie.Duration());
                            iLastKeyLeftOrRight = EFalse;
                            if ( iSeekEvent )
                                {
                                StartFrameTakerL( iClipIndex );
                                iSeekEvent = EFalse;
                                }
                            return EKeyWasConsumed;
                            }
                        }
                    break;
                    }
                //
                // Default
                //
            default:
                return EKeyWasNotConsumed;
            }
    } //iKeyEnable
    return EKeyWasNotConsumed;
    }


TInt CVeiTrimForMmsContainer::TimeIncrement( TInt aKeyCount )const
    {
    if ( aKeyCount < 3 )
        {
        return 100000;
        }
    else if ( aKeyCount < 6 )
    // 4
        {
        return 300000;
        }
    else if ( aKeyCount < 9 )
    // 5
        {
        return 500000;
        }
    else if ( aKeyCount < 12 )
    // 10
        {
        return 1000000;
        }
    else if ( aKeyCount < 15 )
    // 13
        {
        return 2000000;
        }
    else if ( aKeyCount < 18 )
    // 15
        {
        return 3000000;
        }
    else
        {
        return 5000000;
        }
    }


void CVeiTrimForMmsContainer::NotifyVideoDisplayEvent( const TPlayerEvent aEvent, const TInt& aInfo )
    {
    switch ( aEvent )
        {
        case MVeiVideoDisplayObserver::EOpenComplete: 
            {
            iVideoDisplay->SetRect( iPreviewRect );
            if ( !VideoEditorUtils::IsLandscapeScreenOrientation())
            //Portrait
                {
                iVideoDisplay->SetRotationL( EVideoRotationClockwise90 );
                }
            iPreviewState = ELoading;

            iVideoDisplay->SetPositionL( CutInTime());
            iVideoDisplay->PlayL( iMovie.VideoClipInfo( iClipIndex )->FileName(), CutInTime(), CutOutTime());

            break;
            }

        case MVeiVideoDisplayObserver::ELoadingComplete: 
            {

            iVideoDisplay->MakeVisible( ETrue );
            iPreviewState = EPlaying;
            break;
            }

        case MVeiVideoDisplayObserver::EStop: 
            {
            iPreviewState = EIdle;
            iView.SetTrimStateL( CVeiTrimForMmsView::ESeek );

            iVideoDisplay->MakeVisible( EFalse );

            DrawDeferred();
            break;
            }
        case MVeiVideoDisplayObserver::EPlayComplete: 
            {
            iView.SetTrimStateL( CVeiTrimForMmsView::ESeek );
            Stop( ETrue );
            if ( KErrNoMemory == aInfo )
                {
                iView.ShowGlobalErrorNoteL( KErrNoMemory );
                }
            break;
            }
        default:
                {
                break;
                }
        }
    }


/**
 * Called to notify that a new video clip has been successfully
 * added to the movie. Note that the indices and the start and end times
 * of the video clips after the new clip have also changed as a result.
 * Note that the transitions may also have changed. 
 *
 * @param aMovie  movie
 * @param aIndex  index of video clip in movie
 */
void CVeiTrimForMmsContainer::NotifyVideoClipAdded( CVedMovie& aMovie, TInt aIndex )
    {
    LOG( KVideoEditorLogFile, "CVeiTrimForMmsContainer::NotifyVideoClipAdded: in" );

    iSeekPos = TTimeIntervalMicroSeconds( 0 );

    aMovie.GetDurationEstimateL( iMaxMmsSize, iSeekPos, iSeekEndPos );
    LOGFMT3( KVideoEditorLogFile, "CVeiTrimForMmsContainer::NotifyVideoClipAdded: 1, iMaxMmsSize:%d, iSeekPos:%Ld, iSeekEndPos:%Ld", iMaxMmsSize, iSeekPos.Int64(), iSeekEndPos.Int64());

    iCutterBar->SetInPoint( iSeekPos );
    iCutterBar->SetOutPoint( iSeekEndPos );
    iCutterBar->SetTotalDuration( aMovie.Duration());
    iDuration = aMovie.Duration();

    iClipIndex = aIndex;

    aMovie.VideoClipSetCutInTime( 0, iSeekPos );
    aMovie.VideoClipSetCutOutTime( 0, iSeekEndPos );

    TInt movieSizeLimit = static_cast < TInt > ( iMaxMmsSize* 0.9 );
    aMovie.SetMovieSizeLimit( movieSizeLimit );

    LOGFMT( KVideoEditorLogFile, "CVeiTrimForMmsContainer::NotifyVideoClipAdded(): 2, movie size set to:%d", movieSizeLimit );

    StartFrameTakerL( iClipIndex );

    iSeekEvent = EFalse;


    iView.UpdateNaviPaneL( iMovie.GetSizeEstimateL() / 1024, iMovie.Duration());

    iKeyEnable = ETrue;

    LOG( KVideoEditorLogFile, "CVeiTrimForMmsContainer::NotifyVideoClipAdded: out" );
    }


void CVeiTrimForMmsContainer::NotifyVideoClipAddingFailed( CVedMovie& /*aMovie*/, TInt /*aError*/ ){}

void CVeiTrimForMmsContainer::NotifyVideoClipRemoved( CVedMovie& /*aMovie*/, TInt /*aIndex*/ ){}

void CVeiTrimForMmsContainer::NotifyVideoClipIndicesChanged( CVedMovie& /*aMovie*/, TInt /*aOldIndex*/, TInt /*aNewIndex*/ ){}

void CVeiTrimForMmsContainer::NotifyVideoClipTimingsChanged( CVedMovie& /*aMovie*/, TInt /*aIndex*/ ){}

void CVeiTrimForMmsContainer::NotifyVideoClipColorEffectChanged( CVedMovie& /*aMovie*/, TInt /*aIndex*/ ){}

void CVeiTrimForMmsContainer::NotifyVideoClipAudioSettingsChanged( CVedMovie& /*aMovie*/, TInt /*aIndex*/ ){}

void CVeiTrimForMmsContainer::NotifyVideoClipGeneratorSettingsChanged( CVedMovie& /*aMovie*/, TInt /*aIndex*/ ){}

void CVeiTrimForMmsContainer::NotifyVideoClipDescriptiveNameChanged( CVedMovie& /*aMovie*/, TInt /*aIndex*/ ){}

void CVeiTrimForMmsContainer::NotifyStartTransitionEffectChanged( CVedMovie& /*aMovie*/ ){}


void CVeiTrimForMmsContainer::NotifyMiddleTransitionEffectChanged( CVedMovie& /*aMovie*/, TInt /*aIndex*/ ){}

void CVeiTrimForMmsContainer::NotifyEndTransitionEffectChanged( CVedMovie& /*aMovie*/ ){}

void CVeiTrimForMmsContainer::NotifyAudioClipAdded( CVedMovie& /*aMovie*/, TInt /*aIndex*/ ){}

void CVeiTrimForMmsContainer::NotifyAudioClipAddingFailed( CVedMovie& /*aMovie*/, TInt /*aError*/ ){}

void CVeiTrimForMmsContainer::NotifyAudioClipRemoved( CVedMovie& /*aMovie*/, TInt /*aIndex*/ ){}

void CVeiTrimForMmsContainer::NotifyAudioClipIndicesChanged( CVedMovie& /*aMovie*/, TInt /*aOldIndex*/, TInt /*aNewIndex*/ ){}

void CVeiTrimForMmsContainer::NotifyAudioClipTimingsChanged( CVedMovie& /*aMovie*/, TInt /*aIndex*/ ){}

void CVeiTrimForMmsContainer::NotifyMovieQualityChanged( CVedMovie& /*aMovie*/
 ){}


void CVeiTrimForMmsContainer::NotifyMovieReseted( CVedMovie& /*aMovie*/ ){}

void CVeiTrimForMmsContainer::NotifyMovieOutputParametersChanged( CVedMovie& /*aMovie*/ ){}

void CVeiTrimForMmsContainer::NotifyAudioClipDynamicLevelMarkInserted( CVedMovie& /*aMovie*/, TInt /*aClipIndex*/, TInt /*aMarkIndex*/ ){}

void CVeiTrimForMmsContainer::NotifyAudioClipDynamicLevelMarkRemoved( CVedMovie& /*aMovie*/, TInt /*aClipIndex*/, TInt /*aMarkIndex*/ ){}

void CVeiTrimForMmsContainer::NotifyVideoClipDynamicLevelMarkInserted( CVedMovie& /*aMovie*/, TInt /*aClipIndex*/, TInt /*aMarkIndex*/ ){}

void CVeiTrimForMmsContainer::NotifyVideoClipDynamicLevelMarkRemoved( CVedMovie& /*aMovie*/, TInt /*aClipIndex*/, TInt /*aMarkIndex*/ ){}

void CVeiTrimForMmsContainer::PlayL( const TDesC& aFilename, const TRect& aRect )
    {
    iCutterBar->MakeVisible( EFalse );
    iVideoDisplayStart->MakeVisible( EFalse );
    iVideoDisplayEnd->MakeVisible( EFalse );
    iVideoDisplay->MakeVisible( EFalse );

    iVideoDisplay->ShowBlackScreen();

    iPreviewRect = aRect;
    iBlack = ETrue;
    if ( !iScreenLight->IsActive())
        {
        iScreenLight->Start();
        }


    iPreviewState = EOpeningFile;
    iVideoDisplay->OpenFileL( aFilename );
    }

void CVeiTrimForMmsContainer::Stop( TBool aCloseStream )
    {
    iCutterBar->MakeVisible( ETrue );
    iVideoDisplayStart->MakeVisible( ETrue );
    iVideoDisplayEnd->MakeVisible( ETrue );
    iBlack = EFalse;
    iScreenLight->Stop();
    iVideoDisplay->Stop( aCloseStream );
    DrawNow();
    }

void CVeiTrimForMmsContainer::PauseL()
    {
    iPreviewState = EPause;
    iVideoDisplay->PauseL();
    iVideoDisplay->MakeVisible( EFalse );
    DrawNow();
    }

TInt CVeiTrimForMmsContainer::PreviewState()const
    {
    return iPreviewState;
    }

void CVeiTrimForMmsContainer::NotifyFramesCompleted( CFbsBitmap* aFirstFrame, 
                                                     CFbsBitmap* aLastFrame, 
                                                     CFbsBitmap*  /*aTimelineFrame*/, 
                                                     TInt aError )
    {
    if ( aError == KErrNone )
        {
        iVideoDisplayStart->ShowPictureL( *aFirstFrame );
        iVideoDisplayEnd->ShowPictureL( *aLastFrame );
        }

    if ( iProgressNote )
        {
        iProgressInfo->SetAndDraw( 100 );
        iProgressNote->ProcessFinishedL();
        }
    }

void CVeiTrimForMmsContainer::StartFrameTakerL( TInt aIndex )
    {
    iProgressNote = new( ELeave )CAknProgressDialog( REINTERPRET_CAST( CEikDialog** , &iProgressNote ), ETrue );
    iProgressNote->SetCallback( this );
    iProgressNote->ExecuteDlgLD( R_VEI_PROGRESS_NOTE );

    HBufC* stringholder;
    stringholder = StringLoader::LoadL( R_VEI_PROGRESS_NOTE_PROCESSING, iEikonEnv );
    CleanupStack::PushL( stringholder );
    iProgressNote->SetTextL( *stringholder );
    CleanupStack::PopAndDestroy( stringholder );

    iProgressInfo = iProgressNote->GetProgressInfoL();
    iProgressInfo->SetFinalValue( 100 );
    iProgressInfo->SetAndDraw( 50 );

    // First frame is shown in main display so it is bigger.. Last frame is always
    // on transition display and one frame for the video timeline.
    TSize firstThumbResolution = iVideoDisplayStart->GetScreenSize();
    TSize lastThumbResolution = iVideoDisplayEnd->GetScreenSize();
    TSize timelineThumbResolution = TSize( 34, 28 );

    TInt frameCount = iMovie.VideoClipInfo( aIndex )->VideoFrameCount();

    TInt firstThumbNailIndex = iMovie.VideoClipInfo( aIndex )->GetVideoFrameIndexL( CutInTime());
    TInt lastThumbNailIndex = iMovie.VideoClipInfo( aIndex )->GetVideoFrameIndexL( CutOutTime());
    if ( lastThumbNailIndex >= frameCount )
        {
        lastThumbNailIndex = frameCount - 1;
        }


    iFrameTaker->GetFramesL( *iMovie.VideoClipInfo( aIndex ), 
                             firstThumbNailIndex, 
                             &firstThumbResolution, 
                             lastThumbNailIndex, 
                             &lastThumbResolution, 
                             firstThumbNailIndex, 
                             &timelineThumbResolution, 
                             EPriorityLow );
    }

TTypeUid::Ptr CVeiTrimForMmsContainer::MopSupplyObject( TTypeUid aId )
    {
    if ( aId.iUid == MAknsControlContext::ETypeId && iBgContext )
        {
        return MAknsControlContext::SupplyMopObject( aId, iBgContext );
        }
    return CCoeControl::MopSupplyObject( aId );
    }

// End of File