videditor/ManualVideoEditor/src/VeiCutVideoView.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 <aknviewappui.h>
#include <avkon.hrh>
#include <manualvideoeditor.rsg>
#include <akntitle.h> 
#include <barsread.h>
#include <stringloader.h> 
#include <aknnotewrappers.h>
#include <aknquerydialog.h>
#include <aknlists.h>
#include <aknPopup.h>
#include <AknProgressDialog.h>
#include <aknnavide.h>
#include <eikbtgpc.h>
#include <eikmenub.h>
#include <eikmenup.h>
#include <eikprogi.h>
#include <CAknMemorySelectionDialog.h>
#include <CAknFileNamePromptDialog.h>
#include <apparc.h>
#include <aknselectionlist.h>
#include <sysutil.h>

// User includes
#include "VeiAppUi.h"
#include "VeiCutVideoView.h"
#include "VeiCutVideoContainer.h" 
#include "manualvideoeditor.hrh"
#include "veitempmaker.h"
#include "VeiTimeLabelNavi.h"
#include "VeiEditVideoView.h"
#include "VideoEditorCommon.h"
#include "VeiErrorUi.h"

void CVeiCutVideoView::ConstructL()
    {
    LOG(KVideoEditorLogFile, "CVeiCutVideoView::ConstructL: in");

    BaseConstructL( R_VEI_CUT_VIDEO_VIEW );

    CEikStatusPane* sp = StatusPane();

    iNaviPane = (CAknNavigationControlContainer*) sp->ControlL(
            TUid::Uid(EEikStatusPaneUidNavi));

    iTimeNavi = CreateTimeLabelNaviL();

    iVolumeNavi = iNaviPane->CreateVolumeIndicatorL(
            R_AVKON_NAVI_PANE_VOLUME_INDICATOR );

    iErrorUI = CVeiErrorUI::NewL( *iCoeEnv );   
    
    iTimeUpdater = CPeriodic::NewL( CActive::EPriorityLow );
    iVolumeHider = CPeriodic::NewL( CActive::EPriorityLow );

    LOG(KVideoEditorLogFile, "CVeiCutVideoView::ConstructL: out");
    }

// ---------------------------------------------------------
// CVeiCutVideoView::~CVeiCutVideoView()
// ?implementation_description
// ---------------------------------------------------------
//
CVeiCutVideoView::~CVeiCutVideoView()
    {
    if ( iProgressNote )
        {
        delete iProgressNote;
        iProgressNote = NULL;
        }
    if ( iContainer )
        {
        AppUi()->RemoveFromViewStack( *this, iContainer );
        delete iContainer;
        iContainer = 0;
        }
    if ( iTempMovie )
        {
        iTempMovie->Reset();
        delete iTempMovie;
        iTempMovie = NULL;
        }
    if ( iTimeUpdater )
        {
        iTimeUpdater->Cancel();
        delete iTimeUpdater;
        }
    if ( iVolumeHider )
        {
        iVolumeHider->Cancel();
        delete iVolumeHider;
        }

    if ( iErrorUI )
        {
        delete iErrorUI;
        }

    delete iVolumeNavi;

    delete iTimeNavi;

    delete iProcessedTempFile;
    }

TUid CVeiCutVideoView::Id() const
     {
     return TUid::Uid( EVeiCutVideoView );
     }

void CVeiCutVideoView::DialogDismissedL( TInt aButtonId )
    {
    if ( aButtonId != EAknSoftkeyDone )
        {   
        iTempMovie->CancelProcessing();
        }
    else
        {
        if ( iErrorNmb == KErrNone )
            {       
            iContainer->SetInTime( iMovie->VideoClipCutInTime( iIndex ) );
            iContainer->SetOutTime( iMovie->VideoClipCutOutTime( iIndex ) );

            iContainer->GetThumbL( *iProcessedTempFile ); 
            }
        else
            {
            if ( iProcessedTempFile )       // delete temp
                {
                iEikonEnv->FsSession().Delete( *iProcessedTempFile );
                delete iProcessedTempFile;
                iProcessedTempFile = NULL;
                }       

            iErrorUI->ShowGlobalErrorNote( iErrorNmb );
            iErrorNmb = 0;
            HandleCommandL( EVeiCmdCutVideoViewBack );
            }
        }
    }

void CVeiCutVideoView::DynInitMenuPaneL( TInt aResourceId,CEikMenuPane* aMenuPane )
    {
    TInt state = iContainer->State();

    if (aResourceId == R_VEI_CUT_VIDEO_VIEW_MENU_CLEAR_MARKS)
        {
        // delete in, out, in & out as necessary.

        if (iMovie->VideoClipCutInTime(iIndex) <= TTimeIntervalMicroSeconds(0)) 
            {
            aMenuPane->SetItemDimmed(EVeiCmdCutVideoViewClearMarksIn, ETrue);
            }
        if (iMovie->VideoClipCutOutTime(iIndex) >= iMovie->VideoClipInfo(iIndex)->Duration()) 
            {
            aMenuPane->SetItemDimmed(EVeiCmdCutVideoViewClearMarksOut, ETrue);
            }

        if (!((iMovie->VideoClipCutOutTime(iIndex) < iMovie->VideoClipInfo(iIndex)->Duration())
            && (iMovie->VideoClipCutInTime(iIndex) > TTimeIntervalMicroSeconds(0))))
            {
            aMenuPane->SetItemDimmed(EVeiCmdCutVideoViewClearMarksInOut, ETrue);
            }
        }

    if ( aResourceId == R_VEI_CUT_VIDEO_VIEW_MENU )
        {
        if ( iPopupMenuOpened != EFalse )
            {
            aMenuPane->SetItemDimmed( EVeiCmdCutVideoViewClearMarks, ETrue );
            aMenuPane->SetItemDimmed( EVeiCmdCutVideoTakeSnapshot, ETrue );
            aMenuPane->SetItemDimmed( EVeiCmdCutVideoViewHelp, ETrue );
            }
        }
    if ( !(( aResourceId == R_VEI_CUT_VIDEO_VIEW_MENU ) ||
            ( aResourceId == R_VEI_CUT_VIDEO_VIEW_MENU ) ) )
        return;

    if ( iContainer->PlaybackPositionL() >= iContainer->TotalLength() )
        {
        aMenuPane->SetItemDimmed( EVeiCmdCutVideoViewPlay, ETrue );

        }
    if ( ( state == CVeiCutVideoContainer::EStatePaused ) ||
            ( state == CVeiCutVideoContainer::EStateInitializing ) )
        {
        aMenuPane->SetItemDimmed( EVeiCmdCutVideoViewPlay, ETrue  );
        }

    if ( ( state != CVeiCutVideoContainer::EStateStopped ) && 
        ( state != CVeiCutVideoContainer::EStateStoppedInitial ) &&
        ( state != CVeiCutVideoContainer::EStatePaused ) )
        {
        aMenuPane->SetItemDimmed( EVeiCmdCutVideoViewPlay, ETrue  );
        aMenuPane->SetItemDimmed( EVeiCmdCutVideoViewMarkIn, ETrue  );
        aMenuPane->SetItemDimmed( EVeiCmdCutVideoViewMarkOut, ETrue  ); 
        }
    else
        {
        TTimeIntervalMicroSeconds pos = iContainer->PlaybackPositionL(); 
        CVedVideoClipInfo* info = iMovie->VideoClipInfo( iIndex );
        
        TInt cutInFrameIndex = info->GetVideoFrameIndexL( iMovie->VideoClipCutInTime( iIndex ));
        TInt cutOutFrameIndex = info->GetVideoFrameIndexL( iMovie->VideoClipCutOutTime( iIndex ));
        TInt videoFrameCount = info->VideoFrameCount();
        
        // if we are in the existing start/end mark position the start/end mark is removed from the menu
        if (info->GetVideoFrameIndexL(pos) == cutInFrameIndex)
            {
            aMenuPane->DeleteMenuItem( EVeiCmdCutVideoViewMarkIn ); 
            }       
        else if (info->GetVideoFrameIndexL(pos) == cutOutFrameIndex)
            {
            aMenuPane->DeleteMenuItem( EVeiCmdCutVideoViewMarkOut );    
            }
        
        if( cutInFrameIndex < (videoFrameCount-1 ) )
            {
            cutInFrameIndex++;
            }

        if( cutOutFrameIndex > 0 )
            {
            cutOutFrameIndex--;
            }

        TTimeIntervalMicroSeconds nextFramePosCutIn = info->VideoFrameStartTimeL( cutInFrameIndex );
        TTimeIntervalMicroSeconds previousFramePosCutOut = info->VideoFrameStartTimeL( cutOutFrameIndex );

        if ( pos < nextFramePosCutIn )
            {
            aMenuPane->DeleteMenuItem( EVeiCmdCutVideoViewMarkOut );    
            }
        else 
            {
            if ( pos > previousFramePosCutOut )
                {
                aMenuPane->DeleteMenuItem( EVeiCmdCutVideoViewMarkIn );
                }
            }
        // something crashes somewhere outside VED UI if end mark is put to near to begin               
        TInt ind = -1;  
        if (aMenuPane->MenuItemExists(EVeiCmdCutVideoViewMarkOut, ind) && pos.Int64() < KMinCutVideoLength) 
            {
            aMenuPane->DeleteMenuItem( EVeiCmdCutVideoViewMarkOut );    
            }   
        }
    if ( ( iMovie->VideoClipCutInTime( iIndex ) == TTimeIntervalMicroSeconds( 0 ) && 
        iMovie->VideoClipCutOutTime( iIndex ) == iMovie->VideoClipInfo( iIndex )->Duration() ) )
        {
        aMenuPane->DeleteMenuItem( EVeiCmdCutVideoViewPlayMarked );
        }
    if ( state != CVeiCutVideoContainer::EStatePlayingMenuOpen && 
            state != CVeiCutVideoContainer::EStatePaused )
        {
        aMenuPane->DeleteMenuItem( EVeiCmdCutVideoViewContinue );
        }
    if ( ( state == CVeiCutVideoContainer::EStateStopped ) ||
         ( state == CVeiCutVideoContainer::EStateStoppedInitial ) ||
         ( state == CVeiCutVideoContainer::EStateOpening ) ||
         ( state == CVeiCutVideoContainer::EStateBuffering ) )
        {
        aMenuPane->DeleteMenuItem( EVeiCmdCutVideoViewStop );
        }       

    if ( ( iMovie->VideoClipCutOutTime( iIndex ) >= iMovie->VideoClipInfo( iIndex )->Duration() ) &&
        ( iMovie->VideoClipCutInTime( iIndex ) <= TTimeIntervalMicroSeconds( 0 ) ) ) 
        {
        aMenuPane->SetItemDimmed( EVeiCmdCutVideoViewClearMarks, ETrue );
        }
    }

void CVeiCutVideoView::HandleCommandL(TInt aCommand)
    {   
    switch ( aCommand )
        {
        case EAknSoftkeyOk:
            {
            iPopupMenuOpened = ETrue;
            if (iContainer->State() == CVeiCutVideoContainer::EStatePlaying) 
                {
                PausePreviewL();
                iContainer->SetStateL(CVeiCutVideoContainer::EStatePlayingMenuOpen);
                }

            MenuBar()->TryDisplayMenuBarL();
            if (iContainer->State() == CVeiCutVideoContainer::EStatePlayingMenuOpen) 
                {
                iContainer->SetStateL(CVeiCutVideoContainer::EStatePaused);
                }
            iPopupMenuOpened = EFalse;
            break;
            }       
        case EVeiCmdCutVideoViewDone:
        case EVeiCmdCutVideoViewBack:
        case EAknSoftkeyBack:
            {
            StopNaviPaneUpdateL();

            iContainer->StopL();
            iContainer->CloseStreamL();

            // Activate Edit Video view
            AppUi()->ActivateLocalViewL( TUid::Uid(EVeiEditVideoView) );
            break;
            }

        case EVeiCmdCutVideoViewMarkIn:
            {
            STATIC_CAST( CVeiTimeLabelNavi*, iTimeNavi->DecoratedControl() )->
                SetPauseIconVisibilityL( ETrue );
            MarkInL();
            break;
            }
        case EVeiCmdCutVideoViewMarkOut:
            {
            STATIC_CAST( CVeiTimeLabelNavi*, iTimeNavi->DecoratedControl() )->
                SetPauseIconVisibilityL( ETrue );
            MarkOutL();
            break;
            }
        case EVeiCmdCutVideoViewClearMarksInOut:
            {
            ClearInOutL( ETrue, ETrue );
            break;
            }
        case EVeiCmdCutVideoViewClearMarksIn:
            {
            ClearInOutL( ETrue, EFalse );
            break;
            }
        case EVeiCmdCutVideoViewClearMarksOut:
            {
            ClearInOutL( EFalse, ETrue );
            break;
            }
        case EVeiCmdCutVideoViewPlayMarked:
            {
            STATIC_CAST( CVeiTimeLabelNavi*, iTimeNavi->DecoratedControl() )->
            SetPauseIconVisibilityL( EFalse );
            PlayMarkedL();
            break;
            }
        case EVeiCmdCutVideoViewPlay:
            {
            STATIC_CAST( CVeiTimeLabelNavi*, iTimeNavi->DecoratedControl() )->
            SetPauseIconVisibilityL( EFalse );
            iNaviPane->PushL( *iTimeNavi );
            
            PlayPreviewL();
            break;
            }
        case EVeiCmdCutVideoViewStop:
            {
            STATIC_CAST( CVeiTimeLabelNavi*, iTimeNavi->DecoratedControl() )->
                SetPauseIconVisibilityL( EFalse );
            iNaviPane->PushL( *iTimeNavi );
            StopNaviPaneUpdateL();
            iContainer->StopL();
            break;
            }
        case EVeiCmdCutVideoViewContinue:
            {
            STATIC_CAST( CVeiTimeLabelNavi*, iTimeNavi->DecoratedControl() )->
            SetPauseIconVisibilityL( EFalse );
            iNaviPane->PushL( *iTimeNavi );
            PlayPreviewL();
            break;
            }
        case EVeiCmdCutVideoTakeSnapshot:
            {
            if( IsEnoughFreeSpaceToSaveL() )
                {
                iContainer->TakeSnapshotL();
                }
            break;
            }
        //
        // Options->Help
        //
        case EVeiCmdCutVideoViewHelp:
            {
            // CS Help launching is handled in Video Editor's AppUi.
            AppUi()->HandleCommandL( EVeiCmdCutVideoViewHelp );
            break;
            }
        default:
            {
            AppUi()->HandleCommandL( aCommand );
            break;
            }
        }
    }

void CVeiCutVideoView::NotifyMovieProcessingStartedL( CVedMovie& /*aMovie*/ )
    {
    LOG(KVideoEditorLogFile, "CVeiCutVideoView::NotifyMovieProcessingStartedL: In");
    iProgressNote = 
        new (ELeave) CAknProgressDialog(REINTERPRET_CAST(CEikDialog**, 
        &iProgressNote), ETrue);
    iProgressNote->SetCallback(this);
    iProgressNote->ExecuteDlgLD( R_VEI_PROGRESS_NOTE_WITH_CANCEL );

    HBufC* stringholder;

    stringholder = StringLoader::LoadL( R_VEI_PROGRESS_NOTE_CUT, iEikonEnv );
    CleanupStack::PushL( stringholder );

    iProgressNote->SetTextL( *stringholder );
    CleanupStack::PopAndDestroy( stringholder );  

    iProgressInfo = iProgressNote->GetProgressInfoL();
    iProgressInfo->SetFinalValue(100);
    LOG(KVideoEditorLogFile, "CVeiCutVideoView::NotifyMovieProcessingStartedL: Out");
    }

void CVeiCutVideoView::NotifyMovieProcessingProgressed( CVedMovie& /*aMovie*/, TInt aPercentage )
    {
    iProgressInfo->SetAndDraw( aPercentage );
    }

void CVeiCutVideoView::NotifyMovieProcessingCompleted( CVedMovie& /*aMovie*/, TInt aError )
    {
    LOGFMT(KVideoEditorLogFile, "CVeiCutVideoView::NotifyMovieProcessingCompleted: In, aError:%d", aError);
    if ( iTempMovie )   //Effected clip is ready, Delete tempmovie
        {
        iTempMovie->Reset();
        delete iTempMovie;
        iTempMovie = NULL;
        }

    if ( aError == KErrCancel )
        {
        HandleCommandL( EVeiCmdCutVideoViewBack );
        }
    else
        {
        iProgressInfo->SetAndDraw(100);
        iErrorNmb = aError;
        iProgressNote->ProcessFinishedL();
        }
    LOG(KVideoEditorLogFile, "CVeiCutVideoView::NotifyMovieProcessingCompleted: Out");
    }

void CVeiCutVideoView::NotifyVideoClipAdded( CVedMovie& /*aMovie*/, TInt /*aIndex*/ )
    {
    LOG(KVideoEditorLogFile, "CVeiCutVideoView::NotifyVideoClipAdded: In");

    iTempMovie->UnregisterMovieObserver( this );
    iTempMovie->VideoClipSetColorEffect( 0, iMovie->VideoClipColorEffect( iIndex ) );
    iTempMovie->VideoClipSetColorTone( 0, iMovie->VideoClipColorTone( iIndex ) );       
    iTempMovie->SetVideoClipVolumeGainL( 0, iMovie->GetVideoClipVolumeGainL( iIndex ) );

    iProcessedTempFile = HBufC::NewL( KMaxFileName );

    TRAPD( err, 
        CVeiTempMaker* maker = CVeiTempMaker::NewL();
        maker->GenerateTempFileName( *iProcessedTempFile, iMemoryInUse, iMovie->Format() );
        delete maker;
        );

    if ( err == KErrNone )
        {
        TRAP( err, iTempMovie->ProcessL( *iProcessedTempFile, *this ) );
        }

    if ( err != KErrNone )
        {
        iErrorUI->ShowGlobalErrorNote( err );

        if ( iProcessedTempFile )       // delete temp
            {
            iEikonEnv->FsSession().Delete( *iProcessedTempFile );
            delete iProcessedTempFile;
            iProcessedTempFile = NULL;
            }       
        }
    LOG(KVideoEditorLogFile, "CVeiCutVideoView::NotifyVideoClipAdded: Out");
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

void CVeiCutVideoView::DoActivateL(
   const TVwsViewId& /*aPrevViewId*/,TUid /*aCustomMessageId*/,
   const TDesC8& /*aCustomMessage*/)
    {

    if (!iContainer)
        {
        iContainer = CVeiCutVideoContainer::NewL( AppUi()->ClientRect(), *this, *iErrorUI );
        iContainer->SetMopParent( this );
        AppUi()->AddToStackL( *this, iContainer );
        }

    CEikStatusPane *statusPane = ( ( CAknAppUi* )iEikonEnv->EikAppUi() )->StatusPane(); 

    CAknTitlePane* titlePane = (CAknTitlePane*) statusPane->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) );
    TResourceReader reader1;
    iCoeEnv->CreateResourceReaderLC( reader1, R_VEI_CUTVIDEO_VIEW_TITLE_NAME );
    titlePane->SetFromResourceL( reader1 );
    CleanupStack::PopAndDestroy(); //reader1

    UpdateCBAL( CVeiCutVideoContainer::EStateInitializing );
    iNaviPane->PushL( *iTimeNavi );

    iAudioMuted = !( iMovie->VideoClipEditedHasAudio( iIndex ) );

    STATIC_CAST( CVeiTimeLabelNavi*, iTimeNavi->DecoratedControl() )->
            SetPauseIconVisibilityL( EFalse );

    if ( iAudioMuted  )
        {
        STATIC_CAST( CVeiTimeLabelNavi*, iTimeNavi->DecoratedControl())->
            SetVolumeIconVisibilityL( EFalse );
        VolumeMuteL();
        }
    else
        {
        STATIC_CAST( CVeiTimeLabelNavi*, iTimeNavi->DecoratedControl())->
            SetVolumeIconVisibilityL( ETrue );
        }
    iErrorNmb = 0;

    iContainer->SetInTime( iMovie->VideoClipCutInTime( iIndex ) );
    iContainer->SetOutTime( iMovie->VideoClipCutOutTime( iIndex ) );

    CVedVideoClipInfo* clipinfo = iMovie->VideoClipInfo( iIndex );

/**
* First try to open video clip in videoplayerutility. If it leaves with error code 
* KErrNotSupported(-5), then GenerateEffectedClipL() is called. 
*/  if (EVedColorEffectBlackAndWhite == iMovie->VideoClipColorEffect( iIndex ) ||
        EVedColorEffectToning == iMovie->VideoClipColorEffect( iIndex ))
        {
        GenerateEffectedClipL();
        }
    else if (iMovie->VideoClipInfo(iIndex)->HasAudio() && iMovie->GetVideoClipVolumeGainL(iIndex))
        {       
        GenerateEffectedClipL();
        } 
    else
        {
        iContainer->GetThumbL( clipinfo->FileName() );
        }
    }

void CVeiCutVideoView::GenerateEffectedClipL()
    {
    TEntry fileinfo;
// check if there is enough space to create temp file
    RFs&    fs = iEikonEnv->FsSession();

    CVedVideoClipInfo* videoclipinfo = iMovie->VideoClipInfo( iIndex );

    fs.Entry( videoclipinfo->FileName(), fileinfo );

    TBool spaceBelowCriticalLevel( EFalse );

    TVeiSettings movieSaveSettings;

   
    STATIC_CAST( CVeiAppUi*, iEikonEnv->AppUi() )->ReadSettingsL( movieSaveSettings );  

    CAknMemorySelectionDialog::TMemory memoryInUse( movieSaveSettings.MemoryInUse() );


    if ( memoryInUse == CAknMemorySelectionDialog::EPhoneMemory )
        {   
        spaceBelowCriticalLevel = SysUtil::DiskSpaceBelowCriticalLevelL( 
                                        &fs, fileinfo.iSize, EDriveC );
        }
    else
        {
        spaceBelowCriticalLevel = SysUtil::MMCSpaceBelowCriticalLevelL( 
                                        &fs, fileinfo.iSize );
        }   
    
    if ( !spaceBelowCriticalLevel )
        {
        iTempMovie = CVedMovie::NewL( NULL );
        iTempMovie->RegisterMovieObserverL( this );
        CVedVideoClipInfo* clipinfo = iMovie->VideoClipInfo( iIndex );
        iTempMovie->InsertVideoClipL( clipinfo->FileName(), 0 );
        }
    else 
        {
        HBufC* stringholder;

        stringholder = StringLoader::LoadLC( R_VEI_NOT_ENOUGH_SPACE, iEikonEnv );

        CAknErrorNote* dlg = new ( ELeave ) CAknErrorNote( ETrue );
        dlg->ExecuteLD( *stringholder );

        CleanupStack::PopAndDestroy( stringholder);

        HandleCommandL( EVeiCmdCutVideoViewBack );
        }

    }

// ---------------------------------------------------------
// CVeiCutVideoView::HandleCommandL(TInt aCommand)
// ?implementation_description
// ---------------------------------------------------------
//
void CVeiCutVideoView::DoDeactivate()
    {  
    iNaviPane->Pop( iVolumeNavi );

    if ( iTimeUpdater )
        {
        iTimeUpdater->Cancel();
        }
    if ( iVolumeHider )
        {
        iVolumeHider->Cancel();
        }
    if ( iContainer )
        {
        iNaviPane->Pop( iTimeNavi );
        AppUi()->RemoveFromViewStack( *this, iContainer );

        delete iContainer;
        iContainer = NULL;
        }

    if ( iProcessedTempFile )
        {
        iEikonEnv->FsSession().Delete( *iProcessedTempFile );
        delete iProcessedTempFile;
        iProcessedTempFile = NULL;
        }

    }

void CVeiCutVideoView::SetVideoClipAndIndex( CVedMovie& aVideoClip, TInt aIndex )
    {
    iMovie = &aVideoClip;
    iIndex = aIndex;
    }

void CVeiCutVideoView::PlayPreviewL()
    {
    StartNaviPaneUpdateL();
    iContainer->PlayL( iMovie->VideoClipInfo( iIndex )->FileName() );
    }

void CVeiCutVideoView::PausePreviewL()
    {
    STATIC_CAST( CVeiTimeLabelNavi*, iTimeNavi->DecoratedControl() )->
            SetPauseIconVisibilityL( ETrue );
    StopNaviPaneUpdateL();

    iContainer->PauseL();
    }

void CVeiCutVideoView::UpdateCBAL(TInt aState)
    {
    switch (aState)
        {
        case CVeiCutVideoContainer::EStateInitializing:
        case CVeiCutVideoContainer::EStateOpening:
        case CVeiCutVideoContainer::EStateBuffering:        
            {
            Cba()->SetCommandSetL(R_AVKON_SOFTKEYS_EMPTY); 
            break;
            }
        case CVeiCutVideoContainer::EStateStoppedInitial:       
            {
            if ( ( iMovie->VideoClipCutInTime( iIndex ) == TTimeIntervalMicroSeconds( 0 ) ) &&
                 ( iMovie->VideoClipCutOutTime( iIndex ) == iMovie->VideoClipInfo(iIndex)->Duration() ) )
                {       
                Cba()->SetCommandSetL(R_AVKON_SOFTKEYS_OPTIONS_BACK);   
                }
            else
                {                                                               
                Cba()->SetCommandSetL(R_VEI_SOFTKEYS_OPTIONS_DONE);             
                }
            break;
            }
        case CVeiCutVideoContainer::EStatePaused:
        case CVeiCutVideoContainer::EStateStopped:
            {
            if ( ( iMovie->VideoClipCutInTime( iIndex ) == TTimeIntervalMicroSeconds( 0 ) ) &&
                 ( iMovie->VideoClipCutOutTime( iIndex ) == iMovie->VideoClipInfo(iIndex)->Duration() ) )
                {           
                Cba()->SetCommandSetL(R_AVKON_SOFTKEYS_OPTIONS_BACK);   
                }
            else
                {                                                               
                Cba()->SetCommandSetL(R_VEI_SOFTKEYS_OPTIONS_DONE);             
                }
            break;
            }
        case CVeiCutVideoContainer::EStatePlaying:
            {
            if ( iContainer->PlaybackPositionL() < iMovie->VideoClipCutInTime( iIndex ) )
                {
                Cba()->SetCommandSetL( R_VEI_SOFTKEYS_IN_EMPTY ); 
                iMarkState = EMarkStateIn;
                }
            else if ( iContainer->PlaybackPositionL() < iMovie->VideoClipCutOutTime( iIndex ) )
                {
                Cba()->SetCommandSetL( R_VEI_SOFTKEYS_IN_OUT ); 
                iMarkState = EMarkStateInOut;
                }
            else
                {
                Cba()->SetCommandSetL( R_VEI_SOFTKEYS_EMPTY_OUT ); 
                iMarkState = EMarkStateOut;
                }
            break;
            }
        default:
            {
            break;  
            }
        }
    Cba()->DrawDeferred();
    }

void CVeiCutVideoView::PlayMarkedL()
    {
    LOGFMT3(KVideoEditorLogFile, "CVeiCutVideoView::PlayMarkedL: In: iIndex:%d, iMovie->VideoClipCutInTime():%Ld, iMovie->VideoClipCutOutTime():%Ld", iIndex, iMovie->VideoClipCutInTime( iIndex ).Int64(), iMovie->VideoClipCutOutTime( iIndex ).Int64());

    StartNaviPaneUpdateL(); 
    iContainer->PlayMarkedL( iMovie->VideoClipInfo( iIndex )->FileName(),
        iMovie->VideoClipCutInTime( iIndex ), iMovie->VideoClipCutOutTime( iIndex ) );      
    
    LOG(KVideoEditorLogFile, "CVeiCutVideoView::PlayMarkedL: Out");
    }

void CVeiCutVideoView::ClearInOutL( TBool aClearIn, TBool aClearOut )
    {
    if ( aClearIn ) 
        {
        iMovie->VideoClipSetCutInTime( iIndex, TTimeIntervalMicroSeconds( 0 ) );
        iContainer->SetInTime( iMovie->VideoClipCutInTime( iIndex ) );
        }
    if ( aClearOut ) 
        {
        iMovie->VideoClipSetCutOutTime( iIndex, iMovie->VideoClipInfo( iIndex )->Duration() );
        iContainer->SetOutTime( iMovie->VideoClipInfo( iIndex )->Duration() );
        }
    TTimeIntervalMicroSeconds cutin = iMovie->VideoClipCutInTime( iIndex );
    TTimeIntervalMicroSeconds cutout = iMovie->VideoClipCutOutTime( iIndex );
    
    if ( ( cutin == TTimeIntervalMicroSeconds( 0 ) ) &&
         ( cutout == iMovie->VideoClipInfo(iIndex)->Duration() ) )
        {       
        Cba()->SetCommandSetL(R_AVKON_SOFTKEYS_OPTIONS_BACK);   
        Cba()->DrawDeferred();
        }   
    }

void CVeiCutVideoView::MarkInL()
    {
    LOG(KVideoEditorLogFile, "CVeiCutVideoView::MarkInL, In");
    TTimeIntervalMicroSeconds pos = iContainer->PlaybackPositionL();
    
//  TTimeIntervalMicroSeconds clipDuration = iMovie->VideoClipInfo( iIndex )->Duration();
//  CVedVideoClipInfo* info = iMovie->VideoClipInfo( iIndex );
//  TTimeIntervalMicroSeconds intraPos = info->VideoFrameStartTimeL( 
//          info->GetVideoFrameIndexL( pos ) );

    if (iMovie->VideoClipCutOutTime(iIndex) > pos)
        {
        StopNaviPaneUpdateL();      
        LOGFMT2(KVideoEditorLogFile, "CVeiCutVideoView::MarkInL, 2, iIndex:%d, pos:%Ld", iIndex, pos.Int64());
        iMovie->VideoClipSetCutInTime( iIndex, pos );
        iContainer->MarkedInL();    
        }
    
    LOG(KVideoEditorLogFile, "CVeiCutVideoView::MarkInL, Out");
    }

void CVeiCutVideoView::MarkOutL()
    {
    LOG(KVideoEditorLogFile, "CVeiCutVideoView::MarkOutL, In");
    TTimeIntervalMicroSeconds pos = iContainer->PlaybackPositionL();
//  CVedVideoClipInfo* info = iMovie->VideoClipInfo( iIndex );
//  TTimeIntervalMicroSeconds intraPos = info->VideoFrameStartTimeL( 
//          info->GetVideoFrameIndexL( pos ) );

    if (iMovie->VideoClipCutInTime(iIndex) < pos)
        {           
        StopNaviPaneUpdateL();
        iMovie->VideoClipSetCutOutTime( iIndex, pos );
        LOGFMT2(KVideoEditorLogFile, "CVeiCutVideoView::MarkOutL, 2, iIndex:%d, pos:%Ld", iIndex, pos.Int64() );        
        iContainer->MarkedOutL();
        }
    LOG(KVideoEditorLogFile, "CVeiCutVideoView::MarkOutL, Out");
    }

void CVeiCutVideoView::MoveStartOrEndMarkL( TTimeIntervalMicroSeconds aPosition, CVeiCutVideoContainer::TCutMark aMarkType )
	{
	LOG( KVideoEditorLogFile, "CVeiCutVideoView::MoveStartOrEndMarkL, In" );
	
	StopNaviPaneUpdateL();
	
	LOG( KVideoEditorLogFile, "CVeiCutVideoView::MoveStartOrEndMarkL, 2" );
	
	if ( aMarkType == CVeiCutVideoContainer::EStartMark )
		{
		iMovie->VideoClipSetCutInTime( iIndex, aPosition );
		}
	else if ( aMarkType == CVeiCutVideoContainer::EEndMark )
		{
		iMovie->VideoClipSetCutOutTime( iIndex, aPosition );
		}		
	LOG( KVideoEditorLogFile, "CVeiCutVideoView::MoveStartOrEndMarkL, Out" );
	}


TUint CVeiCutVideoView::InPointTime()
    {
    if ( !iMovie )
        {
        return 0;
        }
    else
        {
        return static_cast<TInt32>((iMovie->VideoClipCutInTime(iIndex).Int64() / 1000));
        }
    }

TUint CVeiCutVideoView::OutPointTime()
    {
    if ( !iMovie )
        {
        return 0;
        }
    else
        {
        return static_cast<TInt32>(iMovie->VideoClipCutOutTime(iIndex).Int64() / 1000);
        }
    }

CAknNavigationDecorator* CVeiCutVideoView::CreateTimeLabelNaviL()
    {
    LOG(KVideoEditorLogFile, "CVeiCutVideoView::CreateTimeLabelNaviL: in");
    CVeiTimeLabelNavi* timelabelnavi = CVeiTimeLabelNavi::NewLC();
    CAknNavigationDecorator* decoratedFolder =
        CAknNavigationDecorator::NewL(iNaviPane, timelabelnavi, CAknNavigationDecorator::ENotSpecified);
    CleanupStack::Pop(timelabelnavi);
    
    CleanupStack::PushL(decoratedFolder);
    decoratedFolder->SetContainerWindowL(*iNaviPane);
    CleanupStack::Pop(decoratedFolder);
    decoratedFolder->MakeScrollButtonVisible(EFalse);
    LOG(KVideoEditorLogFile, "CVeiCutVideoView::CreateTimeLabelNaviL: out");
    return decoratedFolder;
    }

TInt CVeiCutVideoView::UpdateTimeCallbackL(TAny* aPtr)
    {
    CVeiCutVideoView* view = (CVeiCutVideoView*)aPtr;

    view->UpdateTimeL();

    return 1;
    }


void CVeiCutVideoView::UpdateTimeL()
    {
    DrawTimeNaviL();

    if (iMarkState == EMarkStateIn) 
        {
        if (iContainer->PlaybackPositionL() > iMovie->VideoClipCutInTime( iIndex )) 
            {
            UpdateCBAL(iContainer->State());
            }
        }
    else if (iMarkState == EMarkStateOut) 
        {
        if (iContainer->PlaybackPositionL() < iMovie->VideoClipCutOutTime( iIndex )) 
            {
            UpdateCBAL(iContainer->State());
            }
        }
    else 
        {
        if ((iContainer->PlaybackPositionL() < iMovie->VideoClipCutInTime( iIndex )) ||
            (iContainer->PlaybackPositionL() > iMovie->VideoClipCutOutTime( iIndex ))) 
            {
            UpdateCBAL(iContainer->State());
            }
        }
    }

void CVeiCutVideoView::DrawTimeNaviL()
    {
    TTime elapsed( iContainer->PlaybackPositionL().Int64() );
    TTime total( iContainer->TotalLength().Int64() );

    TBuf<16> elapsedBuf;
    TBuf<16> totalBuf;

    HBufC* dateFormatString;
    HBufC* stringholder;

    if ( ( total.Int64() / 1000 ) < 3600000 )   // check if time is over 99:59
        {
        dateFormatString = iEikonEnv->AllocReadResourceLC( R_QTN_TIME_DURAT_MIN_SEC );
    
        elapsed.FormatL(elapsedBuf, *dateFormatString);
        total.FormatL(totalBuf, *dateFormatString);
        CleanupStack::PopAndDestroy(dateFormatString);
           
        CDesCArrayFlat* strings = new (ELeave) CDesCArrayFlat(2);
        CleanupStack::PushL(strings);
        strings->AppendL(elapsedBuf);
        strings->AppendL(totalBuf);
        stringholder = StringLoader::LoadL(R_VEI_NAVI_TIME, *strings, iEikonEnv);
        CleanupStack::PopAndDestroy(strings);

        
        CleanupStack::PushL(stringholder);  

        STATIC_CAST(CVeiTimeLabelNavi*, iTimeNavi->DecoratedControl())->SetLabelL(stringholder->Des());

        CleanupStack::PopAndDestroy(stringholder);
        }
    else
        {
        TBuf<25> layoutTime;
        TBuf<15> minsec;   
        TTimeIntervalMinutes minutes; 
        TTimeIntervalMicroSeconds32 seconds; 
        
        TInt64 duration = ( iContainer->PlaybackPositionL().Int64() / 1000 ); 
        TChar timeSeparator = TLocale().TimeSeparator(2);
        //over 1 minute
        if( duration >= 60000 ) 
            { 
            minutes = TTimeIntervalMinutes(static_cast<TInt32>( duration) / 60000 ); 
            minsec.AppendNum( minutes.Int() ); 
            minsec.Append( timeSeparator ); 

            duration = duration - minutes.Int() * 60000; 
            }
        else
            {
            minsec.Append( _L( "00" ) ); 
            minsec.Append( timeSeparator ); 
            }   
        if( duration >= 1000 ) 
            { 
            seconds = TTimeIntervalMicroSeconds32( static_cast<TInt32>(duration) / 1000 ); 

            if( seconds.Int() >= 60 ) 
                { 
                minsec.AppendNum( seconds.Int() - 60 ); 
                } 
            else 
                { 
                if ( seconds.Int() < 10 ) 
                    { 
                    minsec.Append( _L("0") ); 
                    } 
                minsec.AppendNum( seconds.Int() ); 
                } 
            }
        else 
            { 
            minsec.Append( _L("00") ); 
            } 
        layoutTime.Append( minsec );
        AknTextUtils::DisplayTextLanguageSpecificNumberConversion( layoutTime );

        STATIC_CAST(CVeiTimeLabelNavi*, iTimeNavi->DecoratedControl())->SetLabelL(layoutTime);
        }


    /* Prevent the screen light dimming. */
    if (elapsed.DateTime().Second() == 0 || elapsed.DateTime().Second() == 15 || elapsed.DateTime().Second() == 30 || elapsed.DateTime().Second() == 45)
        {
        User::ResetInactivityTime();
        }
    }


void CVeiCutVideoView::StartNaviPaneUpdateL()
    {
    DrawTimeNaviL();
    if (iTimeUpdater && !iTimeUpdater->IsActive())
        {
        iTimeUpdater->Start(200000, 1000000/10, TCallBack(CVeiCutVideoView::UpdateTimeCallbackL, this));
        }
    }

void CVeiCutVideoView::StopNaviPaneUpdateL()
    {
    if (iContainer)
        {
        DrawTimeNaviL();
        }
    if (iTimeUpdater && iTimeUpdater->IsActive())
        {
        iTimeUpdater->Cancel();
        }
    }

TInt CVeiCutVideoView::HideVolumeCallbackL(TAny* aPtr)
    {
    CVeiCutVideoView* view = (CVeiCutVideoView*)aPtr;
    view->HideVolume();
    return 0;
    }

void CVeiCutVideoView::HideVolume()
    {
    iNaviPane->Pop(iVolumeNavi);
    }

void CVeiCutVideoView::VolumeMuteL()
    {
    iContainer->MuteL();
    }



void CVeiCutVideoView::ShowVolumeLabelL( TInt aVolume )
    {
    STATIC_CAST( CVeiTimeLabelNavi*, iTimeNavi->DecoratedControl())->
            SetVolumeIconVisibilityL( ETrue );

    if (iVolumeHider->IsActive())
        {
        iVolumeHider->Cancel();
        }
    if (aVolume == 0) 
        {
        STATIC_CAST( CVeiTimeLabelNavi*, iTimeNavi->DecoratedControl())->
            SetVolumeIconVisibilityL( EFalse );
        HideVolume();
        return;
        }

    iNaviPane->PushL(*iVolumeNavi);
    iVolumeHider->Start(1000000, 1000000, TCallBack(CVeiCutVideoView::HideVolumeCallbackL, this));

    STATIC_CAST(CAknVolumeControl*, iVolumeNavi->DecoratedControl())->SetValue(aVolume);
    
    if (aVolume > iContainer->MinVolume() + 1 )
        {
        STATIC_CAST(CVeiTimeLabelNavi*, iTimeNavi->DecoratedControl())->SetLeftArrowVisibilityL(ETrue);
        }
    else
        {
        STATIC_CAST(CVeiTimeLabelNavi*, iTimeNavi->DecoratedControl())->SetLeftArrowVisibilityL(EFalse);
        }

    if (aVolume < iContainer->MaxVolume())
        {
        STATIC_CAST(CVeiTimeLabelNavi*, iTimeNavi->DecoratedControl())->SetRightArrowVisibilityL(ETrue);
        }
    else
        {
        STATIC_CAST(CVeiTimeLabelNavi*, iTimeNavi->DecoratedControl())->SetRightArrowVisibilityL(EFalse);
        }
    
    }

void CVeiCutVideoView::HandleForegroundEventL  ( TBool aForeground )
    {
    if ( !aForeground )
        {
        // If the application is closing down, calling PauseL could result in 
        // a callback from the MMF player after the container is already deleted,
        // causing KERN-EXEC 3
        if ( static_cast<CVeiAppUi*>( AppUi() )->AppIsOnTheWayToDestruction() )
            {
            iContainer->PrepareForTerminationL();
            }
        else
            {
            iContainer->PauseL( EFalse );
            }
        iNaviPane->Pop( iTimeNavi );
        }
    else
        {
        UpdateCBAL( iContainer->State() );
        iNaviPane->PushL( *iTimeNavi );
        }
    }

// ---------------------------------------------------------
// CVeiCutVideoView::HandleStatusPaneSizeChange()
// ---------------------------------------------------------
//
void CVeiCutVideoView::HandleStatusPaneSizeChange()
    {
    if ( iContainer )
        {
        iContainer->SetRect( AppUi()->ClientRect() );
        }
    }

TBool CVeiCutVideoView::IsEnoughFreeSpaceToSaveL()// const
    {

    STATIC_CAST( CVeiAppUi*, AppUi() )->ReadSettingsL( iMovieSaveSettings );
    iMemoryInUse = iMovieSaveSettings.MemoryInUse();

    RFs&    fs = iEikonEnv->FsSession();
    TBool spaceBelowCriticalLevel( EFalse );

    /* seek position of clip */
    TTimeIntervalMicroSeconds frame;
    frame = iContainer->PlaybackPositionL();

    /* frame index of position */
    TInt frameIndex;
    frameIndex = iMovie->VideoClipInfo( iIndex )->GetVideoFrameIndexL( frame );

    /* frame size */
    TInt sizeEstimate; 
    sizeEstimate = iMovie->VideoClipInfo( iIndex )->VideoFrameSizeL( frameIndex );

    if ( iMemoryInUse == CAknMemorySelectionDialog::EPhoneMemory )
        {   
        spaceBelowCriticalLevel = SysUtil::DiskSpaceBelowCriticalLevelL( &fs, sizeEstimate, EDriveC );
        }
    else
        {
        spaceBelowCriticalLevel = SysUtil::MMCSpaceBelowCriticalLevelL( &fs, sizeEstimate );
        }   


    if ( !spaceBelowCriticalLevel )
        {
        return ETrue;
        }
    else 
        {
        HBufC* stringholder;
        stringholder = StringLoader::LoadLC( R_VEI_MEMORY_RUNNING_OUT, iEikonEnv );
        CAknErrorNote* dlg = new ( ELeave ) CAknErrorNote( ETrue );
        dlg->ExecuteLD( *stringholder );
        CleanupStack::PopAndDestroy( stringholder );  

        return EFalse;
        }
    }

TTimeIntervalMicroSeconds CVeiCutVideoView::GetVideoClipCutInTime()
    {
    TTimeIntervalMicroSeconds cutInTime(0);
    if ( iMovie )
        {
        cutInTime = iMovie->VideoClipCutInTime( iIndex );
        }
    return cutInTime;
    }

TTimeIntervalMicroSeconds CVeiCutVideoView::GetVideoClipCutOutTime()
    {
    TTimeIntervalMicroSeconds cutOutTime(0);
    if ( iMovie )
        {
        cutOutTime = iMovie->VideoClipCutOutTime( iIndex );
        }
    return cutOutTime;
    }

void CVeiCutVideoView::HandleResourceChange(TInt aType)
    {
    LOGFMT(KVideoEditorLogFile, "CVeiEditVideoView::HandleResourceChange() In, aType:%d", aType);
    
    if (KAknsMessageSkinChange == aType)
        {
        // Handle skin change in the navi label controls - they do not receive 
        // it automatically since they are not in the control stack
        iTimeNavi->DecoratedControl()->HandleResourceChange( aType );
        iVolumeNavi->DecoratedControl()->HandleResourceChange( aType );
        }
    
    LOG(KVideoEditorLogFile, "CVeiEditVideoView::HandleResourceChange() Out");
    }
 
// End of File