/*
* 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 <vedsimplecutvideo.rsg>
#include <akntitle.h>
#include <stringloader.h>
#include <aknnotewrappers.h>
#include <aknquerydialog.h>
#include <aknlists.h>
#include <aknPopup.h>
#include <AknProgressDialog.h>
#include <eikprogi.h>
#include <CAknMemorySelectionDialog.h>
#include <CAknFileNamePromptDialog.h>
#include <apparc.h>
#include <aknselectionlist.h>
#include <sysutil.h>
#include <aknwaitdialog.h>
#include <e32property.h>
#include <PathInfo.h>
#include <AknCommonDialogsDynMem.h>
#include <CAknMemorySelectionDialogMultiDrive.h>
// User includes
#include "VeiSimpleCutVideoAppUi.h"
#include "VeiSimpleCutVideoView.h"
#include "VeiSimpleCutVideoContainer.h"
#include "VedSimpleCutVideo.hrh"
#include "veitempmaker.h"
#include "VeiTimeLabelNavi.h"
#include "videoeditorcommon.h"
#include "VideoeditorUtils.h"
#include "VeiErrorUi.h"
#include "veinavipanecontrol.h"
void CVeiSimpleCutVideoView::ConstructL()
{
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::ConstructL: in");
BaseConstructL( R_VEI_CUT_VIDEO_VIEW );
iCVeiNaviPaneControl = CVeiNaviPaneControl::NewL( StatusPane() );
iErrorUI = CVeiErrorUI::NewL( *iCoeEnv );
iTimeUpdater = CPeriodic::NewL( CActive::EPriorityLow );
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::ConstructL: creating iMovie");
iMovie = CVedMovie::NewL( NULL );
iMovie->RegisterMovieObserverL( this );
iTempMaker = CVeiTempMaker::NewL();
iOverWriteFile = EFalse;
iPaused = EFalse;
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::ConstructL: out");
}
// ---------------------------------------------------------
TInt CVeiSimpleCutVideoView::AddClipL( const TDesC& aFilename, TBool /*aStartNow*/ )
{
LOGFMT(KVideoEditorLogFile, "CVeiSimpleCutVideoView::AddClipL: In: %S", &aFilename);
iMovie->InsertVideoClipL( aFilename, 0 );
iWaitDialog = new ( ELeave ) CAknWaitDialog(
REINTERPRET_CAST( CEikDialog**, &iWaitDialog ), ETrue);
iWaitDialog->PrepareLC(R_VEI_WAIT_NOTE_WITH_CANCEL);
iWaitDialog->SetCallback(this);
HBufC* stringholder = StringLoader::LoadLC( R_VEI_OPENING, iEikonEnv );
iWaitDialog->SetTextL( *stringholder );
CleanupStack::PopAndDestroy(stringholder);
iWaitDialog->RunLD();
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::AddClipL: Out");
return KErrNone;
}
// ---------------------------------------------------------
// CVeiSimpleCutVideoView::~CVeiSimpleCutVideoView()
// ?implementation_description
// ---------------------------------------------------------
//
CVeiSimpleCutVideoView::~CVeiSimpleCutVideoView()
{
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::~CVeiSimpleCutVideoView(): In");
if ( iProgressNote )
{
delete iProgressNote;
iProgressNote = NULL;
}
if ( iAnimatedProgressDialog )
{
delete iAnimatedProgressDialog;
iAnimatedProgressDialog = NULL;
}
if (iWaitDialog)
{
CloseWaitDialog();
iWaitDialog->MakeVisible( EFalse );
delete iWaitDialog;
iWaitDialog = NULL;
}
if ( iContainer )
{
AppUi()->RemoveFromViewStack( *this, iContainer );
delete iContainer;
iContainer = 0;
}
if ( iTimeUpdater )
{
iTimeUpdater->Cancel();
delete iTimeUpdater;
}
if ( iErrorUI )
{
delete iErrorUI;
}
if ( iMovie )
{
iMovie->Reset();
iMovie->UnregisterMovieObserver( this );
delete iMovie;
iMovie = NULL;
}
if ( iTempMaker )
{
delete iTempMaker;
iTempMaker = NULL;
}
if ( iSaveToFileName )
{
delete iSaveToFileName;
iSaveToFileName = NULL;
}
if ( iTempFile )
{
TInt err = iEikonEnv->FsSession().Delete( *iTempFile );
if ( err )
{
// what to do when error occurs in destructor???
}
delete iTempFile;
iTempFile = NULL;
}
delete iCallBack;
delete iCVeiNaviPaneControl;
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::~CVeiSimpleCutVideoView(): Out");
}
TUid CVeiSimpleCutVideoView::Id() const
{
return TUid::Uid( EVeiSimpleCutVideoView );
}
void CVeiSimpleCutVideoView::DialogDismissedL( TInt aButtonId )
{
LOGFMT(KVideoEditorLogFile, "CVeiSimpleCutVideoView::DialogDismissedL: In, abuttonId:%d", aButtonId);
if (iSaving)
{
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::DialogDismissedL: 2");
iSaving = EFalse;
if ( aButtonId != EAknSoftkeyDone )
{
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::DialogDismissedL: 3");
iMovie->CancelProcessing();
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::DialogDismissedL: 4");
}
else if (KErrNone == iErrorNmb)
{
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::DialogDismissedL: 5");
iErrorNmb = 0;
RFs& fs = iEikonEnv->FsSession();
CFileMan* fileman = CFileMan::NewL( fs );
CleanupStack::PushL( fileman );
TInt moveErr( KErrNone );
// the user selects to overwrite the existing file
if (iOverWriteFile)
{
// temp file located in the same drive as the target file
if ( iTempFile->Left(1) == iMovie->VideoClipInfo( iIndex )->FileName().Left(1) )
{
moveErr = fileman->Rename( *iTempFile, iMovie->VideoClipInfo( iIndex )->FileName(), CFileMan::EOverWrite );
}
else
{
moveErr = fileman->Move( *iTempFile, iMovie->VideoClipInfo( iIndex )->FileName(), CFileMan::EOverWrite );
}
if (!moveErr)
{
//AddClipL( iMovie->VideoClipInfo( iIndex )->FileName(), NULL );
ClearInOutL(ETrue, ETrue);
iContainer->StopL();
TTimeIntervalMicroSeconds pos = iContainer->PlaybackPositionL();
iContainer->GetThumbL( iMovie->VideoClipInfo( iIndex )->FileName() );
}
}
// the user selects to save with a new file name
else
{
// both files located in the same drive
if ( iTempFile->Left(1) == iSaveToFileName->Left(1) )
{
moveErr = fileman->Rename( *iTempFile, *iSaveToFileName );
}
else
{
moveErr = fileman->Move( *iTempFile, *iSaveToFileName );
}
if (!moveErr)
{
ClearInOutL(ETrue, ETrue);
iContainer->StopL();
iMovie->RemoveVideoClip(0);
AddClipL( *iSaveToFileName, NULL );
}
}
CleanupStack::PopAndDestroy( fileman );
delete iTempFile;
iTempFile = NULL;
if ( moveErr )
{
iErrorUI->ShowGlobalErrorNote( moveErr );
}
//if ( BaflUtils::FileExists(fs, *iSaveToFileName) )
// Checking for iSaveToFileName doesn't work when overwriting so moveErr has to be used.
else
{
// Video saved successfully!
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::DialogDismissedL: 6");
// The marks can be removed now that the video is saved
// ClearInOutL(ETrue, ETrue);
// iContainer->StopL();
//TTimeIntervalMicroSeconds pos = iContainer->PlaybackPositionL();
// Publish & Subscribe API used to make the saved file name available to AIW provider
LOG(KVideoEditorLogFile, "CVeiEditVideoView::UpdateMediaGalleryL(): Calling RProperty::Define(KUidVideoEditorProperties, VideoEditor::EPropertyFilename, RProperty::EText); ");
TInt err = RProperty::Define(KUidVideoEditorProperties, VideoEditor::EPropertyFilename, RProperty::EText);
if (err != KErrAlreadyExists)
{
User::LeaveIfError(err);
}
User::LeaveIfError(RProperty::Set(KUidVideoEditorProperties, VideoEditor::EPropertyFilename, iSaveToFileName->Des()));
// the user has selected "Cut" or "Exit"
if (!iSaveOnly)
{
//AppUi()->Exit();
if (! iCallBack)
{
TCallBack cb (CVeiSimpleCutVideoView::AsyncExit, this);
iCallBack = new (ELeave) CAsyncCallBack(cb, CActive::EPriorityStandard);
}
iCallBack->CallBack();
}
}
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::DialogDismissedL: 7");
}
else
{
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::DialogDismissedL: 8");
iErrorUI->ShowGlobalErrorNote( iErrorNmb );
iErrorNmb = 0;
}
}
else if (KErrCancel != aButtonId && iErrorNmb)
{
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::DialogDismissedL: 9");
if (KErrCorrupt == iErrorNmb || KErrTooShortVideoForCut == iErrorNmb)
{
HBufC* stringholder = StringLoader::LoadLC( R_VEI_VIDEO_FAILED, iEikonEnv );
CAknErrorNote* dlg = new ( ELeave ) CAknErrorNote( ETrue );
dlg->ExecuteLD( *stringholder );
CleanupStack::PopAndDestroy( stringholder );
}
else
{
iErrorUI->ShowGlobalErrorNote( iErrorNmb );
}
if (! iCallBack)
{
TCallBack cb (CVeiSimpleCutVideoView::AsyncExit, this);
iCallBack = new (ELeave) CAsyncCallBack(cb, CActive::EPriorityStandard);
}
iCallBack->CallBack();
iErrorNmb = 0;
}
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::DialogDismissedL: Out");
}
TInt CVeiSimpleCutVideoView::AsyncExit(TAny* aThis)
{
LOG( KVideoEditorLogFile, "CVeiSimpleCutVideoView::AsyncExit");
// In the asynchronous version, trap the rest of the functions
// to make sure that the caller's TRequestStatus is always
// completed, also in case of failures.
CVeiSimpleCutVideoView* view = static_cast<CVeiSimpleCutVideoView*>(aThis);
view->PrepareForTermination();
view->AppUi()->Exit();
return KErrNone;
}
void CVeiSimpleCutVideoView::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 ( !IsCutMarkSet() )
{
aMenuPane->SetItemDimmed( EVeiCmdCutVideoViewSave, ETrue );
}
}
if ( !(( aResourceId == R_VEI_CUT_VIDEO_VIEW_MENU ) ||
( aResourceId == R_VEI_CUT_VIDEO_VIEW_CONTEXT_MENU ) ) )
return;
if ( iContainer->PlaybackPositionL() >= iContainer->TotalLength() )
{
if (aResourceId == R_VEI_CUT_VIDEO_VIEW_MENU)
{
aMenuPane->SetItemDimmed( EVeiCmdCutVideoViewPlay, ETrue );
}
}
if ( ( state == CVeiSimpleCutVideoContainer::EStatePaused ) ||
( state == CVeiSimpleCutVideoContainer::EStateInitializing ) )
{
if (aResourceId == R_VEI_CUT_VIDEO_VIEW_MENU)
{
aMenuPane->SetItemDimmed( EVeiCmdCutVideoViewPlay, ETrue );
}
}
if ( ( state != CVeiSimpleCutVideoContainer::EStateStopped ) &&
( state != CVeiSimpleCutVideoContainer::EStateStoppedInitial ) &&
( state != CVeiSimpleCutVideoContainer::EStatePaused ) )
{
if (aResourceId == R_VEI_CUT_VIDEO_VIEW_MENU)
{
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 != CVeiSimpleCutVideoContainer::EStatePlayingMenuOpen &&
state != CVeiSimpleCutVideoContainer::EStatePaused )
{
aMenuPane->DeleteMenuItem( EVeiCmdCutVideoViewContinue );
}
if ( ( state == CVeiSimpleCutVideoContainer::EStateStopped ) ||
( state == CVeiSimpleCutVideoContainer::EStateStoppedInitial ) ||
( state == CVeiSimpleCutVideoContainer::EStateOpening ) ||
( state == CVeiSimpleCutVideoContainer::EStateBuffering ) )
{
aMenuPane->DeleteMenuItem( EVeiCmdCutVideoViewStop );
}
if ( ( iMovie->VideoClipCutOutTime( iIndex ) >= iMovie->VideoClipInfo( iIndex )->Duration() ) &&
( iMovie->VideoClipCutInTime( iIndex ) <= TTimeIntervalMicroSeconds( 0 ) ) )
{
if (aResourceId == R_VEI_CUT_VIDEO_VIEW_MENU)
{
aMenuPane->SetItemDimmed( EVeiCmdCutVideoViewClearMarks, ETrue );
}
}
}
void CVeiSimpleCutVideoView::HandleCommandL(TInt aCommand)
{
LOGFMT(KVideoEditorLogFile, "CVeiSimpleCutVideoView::HandleCommandL( %d ): In", aCommand);
switch ( aCommand )
{
case EAknSoftkeyOk:
{
iPopupMenuOpened = ETrue;
if (iContainer->State() == CVeiSimpleCutVideoContainer::EStatePlaying)
{
PausePreviewL();
iContainer->SetStateL(CVeiSimpleCutVideoContainer::EStatePlayingMenuOpen);
}
MenuBar()->TryDisplayMenuBarL();
if (iContainer->State() == CVeiSimpleCutVideoContainer::EStatePlayingMenuOpen)
{
iContainer->SetStateL(CVeiSimpleCutVideoContainer::EStatePaused);
}
iPopupMenuOpened = EFalse;
break;
}
case EVeiCmdCutVideoViewBack:
case EAknSoftkeyBack:
{
PrepareForTermination();
AppUi()->Exit();
break;
}
case EVeiCmdCutVideoViewExit:
{
iSaveOnly = EFalse;
StopNaviPaneUpdateL();
iContainer->StopL();
iContainer->CloseStreamL();
if ( ( iMovie->VideoClipCutInTime( 0 ) > TTimeIntervalMicroSeconds( 0 ) ) ||
( iMovie->VideoClipCutOutTime( 0 ) < iMovie->VideoClipInfo(0)->Duration() ) )
{
if (VideoEditorUtils::LaunchSaveChangesQueryL())
{
QueryAndSaveL();
}
else
{
PrepareForTermination();
AppUi()->Exit();
}
}
else
{
PrepareForTermination();
AppUi()->Exit();
}
}
break;
case EVeiCmdCutVideoViewCut:
{
iSaveOnly = EFalse;
StopNaviPaneUpdateL();
iContainer->StopL();
iContainer->CloseStreamL();
if ( ( iMovie->VideoClipCutInTime( 0 ) > TTimeIntervalMicroSeconds( 0 ) ) ||
( iMovie->VideoClipCutOutTime( 0 ) < iMovie->VideoClipInfo(0)->Duration() ) )
{
QueryAndSaveL();
}
break;
}
case EVeiCmdCutVideoViewSave:
{
iSaveOnly = ETrue;
StopNaviPaneUpdateL();
iContainer->StopL();
iContainer->CloseStreamL();
QueryAndSaveL();
break;
}
case EVeiCmdCutVideoViewMarkIn:
{
iCVeiNaviPaneControl->SetPauseIconVisibilityL( ETrue );
MarkInL();
break;
}
case EVeiCmdCutVideoViewMarkOut:
{
iCVeiNaviPaneControl->SetPauseIconVisibilityL( ETrue );
MarkOutL();
break;
}
case EVeiCmdCutVideoViewClearMarksInOut:
{
ClearInOutL( ETrue, ETrue );
break;
}
case EVeiCmdCutVideoViewClearMarksIn:
{
ClearInOutL( ETrue, EFalse );
break;
}
case EVeiCmdCutVideoViewClearMarksOut:
{
ClearInOutL( EFalse, ETrue );
break;
}
case EVeiCmdCutVideoViewPlayMarked:
{
iCVeiNaviPaneControl->SetPauseIconVisibilityL( EFalse );
PlayMarkedL();
break;
}
case EVeiCmdCutVideoViewPlay:
{
iCVeiNaviPaneControl->SetPauseIconVisibilityL( EFalse );
PlayPreviewL();
break;
}
case EVeiCmdCutVideoViewStop:
{
iCVeiNaviPaneControl->SetPauseIconVisibilityL( EFalse );
StopNaviPaneUpdateL();
iContainer->StopL();
break;
}
case EVeiCmdCutVideoViewContinue:
{
iCVeiNaviPaneControl->SetPauseIconVisibilityL( EFalse );
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;
}
}
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::HandleCommandL: out");
}
void CVeiSimpleCutVideoView::NotifyMovieProcessingStartedL( CVedMovie& /*aMovie*/ )
{
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::NotifyMovieProcessingStartedL: In");
iProcessed = 0;
// @ : r_ved_cutting_note_animation
//StartAnimatedProgressNote();
StartProgressNoteL();
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::NotifyMovieProcessingStartedL: Out");
}
void CVeiSimpleCutVideoView::NotifyMovieProcessingProgressed( CVedMovie& /*aMovie*/, TInt aPercentage )
{
//Not allow screensaver, when processing image.
User::ResetInactivityTime();
iProcessed = aPercentage;
if (iAnimatedProgressDialog)
{
iAnimatedProgressDialog->GetProgressInfoL()->SetAndDraw( aPercentage );
}
else if (iProgressNote)
{
iProgressNote->GetProgressInfoL()->SetAndDraw( aPercentage );
}
}
void CVeiSimpleCutVideoView::NotifyMovieProcessingCompleted( CVedMovie& /*aMovie*/, TInt aError )
{
LOGFMT(KVideoEditorLogFile, "CVeiSimpleCutVideoView::NotifyMovieProcessingCompleted: In, aError:%d", aError);
iErrorNmb = aError;
if (iAnimatedProgressDialog)
{
iAnimatedProgressDialog->GetProgressInfoL()->SetAndDraw( 100 );
delete iAnimatedProgressDialog;
iAnimatedProgressDialog = NULL;
DialogDismissedL(EAknSoftkeyDone);
//TRAP_IGNORE( iAnimatedProgressDialog->ProcessFinishedL() );
}
else if (iProgressNote)
{
iProgressNote->GetProgressInfoL()->SetAndDraw(100);
iProgressNote->ProcessFinishedL();
}
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::NotifyMovieProcessingCompleted: Out");
}
void CVeiSimpleCutVideoView::NotifyVideoClipAdded( CVedMovie& /*aMovie*/, TInt aIndex)
{
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::NotifyVideoClipAdded: In");
iErrorNmb = 0;
TTimeIntervalMicroSeconds duration = iMovie->Duration();
LOGFMT(KVideoEditorLogFile, "CVeiCutVideCVeiSimpleCutVideoView::NotifyVideoClipAdded, 2, duration:%Ld", duration.Int64());
// if (duration.Int64() < KMinCutVideoLength)
// {
// LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::NotifyVideoClipAdded: 3");
// iErrorNmb = KErrTooShortVideoForCut;
// iClosing = ETrue;
// }
// else
{
iAudioMuted = !( iMovie->VideoClipEditedHasAudio( aIndex ) );
iCVeiNaviPaneControl->SetPauseIconVisibilityL( EFalse );
if ( iAudioMuted )
{
iCVeiNaviPaneControl->SetVolumeIconVisibilityL( EFalse );
VolumeMuteL();
}
else
{
iCVeiNaviPaneControl->SetVolumeIconVisibilityL( ETrue );
}
// iContainer->SetInTime( iMovie->VideoClipCutInTime( aIndex ) );
// iContainer->SetOutTime( iMovie->VideoClipCutOutTime( aIndex ) );
iContainer->GetThumbL( iMovie->VideoClipInfo( iIndex )->FileName() );
}
if (iWaitDialog)
{
delete iWaitDialog;
iWaitDialog = NULL;
}
// CloseWaitDialog();
iContainer->DrawDeferred();
// video clip has to be added before setting the title pane text
// : handle leave
SetTitlePaneTextL();
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::NotifyVideoClipAdded: Out");
}
void CVeiSimpleCutVideoView::NotifyVideoClipAddingFailed( CVedMovie& /*aMovie*/, TInt aError )
{
LOGFMT(KVideoEditorLogFile, "CVeiSimpleCutVideoView::NotifyVideoClipAddingFailed: In, aError:%d", aError);
iErrorNmb = aError;
iClosing = ETrue;
CloseWaitDialog();
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::NotifyVideoClipAddingFailed: Out");
}
void CVeiSimpleCutVideoView::NotifyVideoClipRemoved( CVedMovie& /*aMovie*/, TInt /*aIndex*/ )
{
}
void CVeiSimpleCutVideoView::NotifyVideoClipIndicesChanged( CVedMovie& /*aMovie*/, TInt /*aOldIndex*/,
TInt /*aNewIndex*/ )
{
}
void CVeiSimpleCutVideoView::NotifyVideoClipTimingsChanged( CVedMovie& /*aMovie*/, TInt /*aIndex*/ )
{
}
void CVeiSimpleCutVideoView::NotifyVideoClipColorEffectChanged( CVedMovie& /*aMovie*/, TInt /*aIndex*/ )
{
}
void CVeiSimpleCutVideoView::NotifyVideoClipAudioSettingsChanged( CVedMovie& /*aMovie*/,
TInt /*aIndex*/ )
{
}
void CVeiSimpleCutVideoView::NotifyStartTransitionEffectChanged( CVedMovie& /*aMovie*/ )
{
}
void CVeiSimpleCutVideoView::NotifyMiddleTransitionEffectChanged( CVedMovie& /*aMovie*/,
TInt /*aIndex*/ )
{
}
void CVeiSimpleCutVideoView::NotifyEndTransitionEffectChanged( CVedMovie& /*aMovie*/ )
{
}
void CVeiSimpleCutVideoView::NotifyAudioClipAdded( CVedMovie& /*aMovie*/, TInt /*aIndex*/ )
{
}
void CVeiSimpleCutVideoView::NotifyAudioClipAddingFailed( CVedMovie& /*aMovie*/, TInt /*aError*/ )
{
}
void CVeiSimpleCutVideoView::NotifyAudioClipRemoved( CVedMovie& /*aMovie*/, TInt /*aIndex*/ )
{
}
void CVeiSimpleCutVideoView::NotifyAudioClipIndicesChanged( CVedMovie& /*aMovie*/, TInt /*aOldIndex*/,
TInt /*aNewIndex*/ )
{
}
void CVeiSimpleCutVideoView::NotifyAudioClipTimingsChanged( CVedMovie& /*aMovie*/,
TInt /*aIndex*/ )
{
}
void CVeiSimpleCutVideoView::NotifyMovieReseted( CVedMovie& /*aMovie*/ )
{
}
void CVeiSimpleCutVideoView::NotifyVideoClipGeneratorSettingsChanged(CVedMovie& /*aMovie*/,
TInt /*aIndex*/)
{
}
void CVeiSimpleCutVideoView::NotifyVideoClipDescriptiveNameChanged(CVedMovie& /*aMovie*/, TInt /*aIndex*/)
{
}
void CVeiSimpleCutVideoView::NotifyMovieQualityChanged(CVedMovie& /*aMovie*/)
{
}
void CVeiSimpleCutVideoView::NotifyMovieOutputParametersChanged(CVedMovie& /*aMovie*/)
{
}
void CVeiSimpleCutVideoView::NotifyAudioClipDynamicLevelMarkInserted(CVedMovie& /*aMovie*/,
TInt /*aClipIndex*/,
TInt /*aMarkIndex*/)
{
}
void CVeiSimpleCutVideoView::NotifyAudioClipDynamicLevelMarkRemoved(CVedMovie& /*aMovie*/,
TInt /*aClipIndex*/,
TInt /*aMarkIndex*/)
{
}
void CVeiSimpleCutVideoView::NotifyVideoClipDynamicLevelMarkInserted(CVedMovie& /*aMovie*/,
TInt /*aClipIndex*/,
TInt /*aMarkIndex*/)
{
}
void CVeiSimpleCutVideoView::NotifyVideoClipDynamicLevelMarkRemoved(CVedMovie& /*aMovie*/,
TInt /*aClipIndex*/,
TInt /*aMarkIndex*/)
{
}
void CVeiSimpleCutVideoView::CloseWaitDialog()
{
if ( iWaitDialog )
{
TRAP_IGNORE( iWaitDialog->ProcessFinishedL() );
}
}
void CVeiSimpleCutVideoView::DoActivateL(
const TVwsViewId& /*aPrevViewId*/,TUid /*aCustomMessageId*/,
const TDesC8& /*aCustomMessage*/)
{
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::DoActivateL, In");
iPaused = EFalse;
if (!iContainer)
{
iContainer = CVeiSimpleCutVideoContainer::NewL( AppUi()->ClientRect(), *this, *iErrorUI );
iContainer->SetMopParent( this );
AppUi()->AddToStackL( *this, iContainer );
iCVeiNaviPaneControl->SetObserver( iContainer );
}
UpdateCBAL( CVeiSimpleCutVideoContainer::EStateInitializing );
CheckMemoryCardAvailabilityL();
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::DoActivateL, out");
}
// ---------------------------------------------------------
// CVeiSimpleCutVideoView::HandleCommandL(TInt aCommand)
// ?implementation_description
// ---------------------------------------------------------
//
void CVeiSimpleCutVideoView::DoDeactivate()
{
if ( iTimeUpdater )
{
iTimeUpdater->Cancel();
}
if ( iContainer )
{
AppUi()->RemoveFromViewStack( *this, iContainer );
delete iContainer;
iContainer = NULL;
}
}
void CVeiSimpleCutVideoView::PlayPreviewL()
{
iPaused = EFalse;
StartNaviPaneUpdateL();
iContainer->PlayL( iMovie->VideoClipInfo( iIndex )->FileName() );
}
void CVeiSimpleCutVideoView::PausePreviewL()
{
iCVeiNaviPaneControl->SetPauseIconVisibilityL( ETrue );
StopNaviPaneUpdateL();
iContainer->PauseL();
}
void CVeiSimpleCutVideoView::UpdateCBAL(TInt aState)
{
MenuBar()->SetContextMenuTitleResourceId( R_VEI_MENUBAR_CUT_VIDEO_VIEW_CONTEXT );
switch (aState)
{
case CVeiSimpleCutVideoContainer::EStateInitializing:
case CVeiSimpleCutVideoContainer::EStateOpening:
case CVeiSimpleCutVideoContainer::EStateBuffering:
{
if (! iClosing)
{
Cba()->SetCommandSetL(R_AVKON_SOFTKEYS_EMPTY);
}
break;
}
case CVeiSimpleCutVideoContainer::EStateStoppedInitial:
{
if (! iClosing)
{
// no marks set
if ( ( iMovie->VideoClipCutInTime( 0 ) == TTimeIntervalMicroSeconds( 0 ) ) &&
( iMovie->VideoClipCutOutTime( 0 ) == iMovie->VideoClipInfo(0)->Duration() ) )
{
// playhead in the beginning
if ( iContainer->PlaybackPositionL() == 0 || AknLayoutUtils::PenEnabled() )
{
Cba()->SetCommandSetL(R_VEI_SOFTKEYS_OPTIONS_BACK__PLAY);
}
// playhead not in the beginning
else
{
Cba()->SetCommandSetL(R_VEI_SOFTKEYS_IN_OUT__MENU);
}
}
//start or end mark has been set
else
{
// start mark has been set, end mark has not been set
// and the the playhead is on the right hand side of the start mark
if (( iMovie->VideoClipCutInTime( 0 ) != TTimeIntervalMicroSeconds( 0 ) ) &&
( iMovie->VideoClipCutOutTime( 0 ) == iMovie->VideoClipInfo(0)->Duration() ) &&
( iContainer->PlaybackPositionL() > iMovie->VideoClipCutInTime( 0 ))
&& !AknLayoutUtils::PenEnabled() )
{
Cba()->SetCommandSetL( R_VEI_SOFTKEYS_OPTIONS_OUT__MENU );
}
else
{
Cba()->SetCommandSetL(R_VEI_SOFTKEYS_OPTIONS_CUT__MENU);
}
}
}
break;
}
case CVeiSimpleCutVideoContainer::EStatePaused:
case CVeiSimpleCutVideoContainer::EStateStopped:
{
// no marks set
if ( ( iMovie->VideoClipCutInTime( 0 ) == TTimeIntervalMicroSeconds( 0 ) ) &&
( iMovie->VideoClipCutOutTime( 0 ) == iMovie->VideoClipInfo(0)->Duration() ) )
{
// playhead in the beginning
if (iContainer->PlaybackPositionL() == 0 || AknLayoutUtils::PenEnabled() )
{
Cba()->SetCommandSetL(R_VEI_SOFTKEYS_OPTIONS_BACK__PLAY);
}
else
{
Cba()->SetCommandSetL(R_VEI_SOFTKEYS_IN_OUT__MENU);
}
}
// start or end mark has been set
else
{
// start mark has been set, end mark has not been set
// and the the playhead is on the right hand side of the start mark
if (( iMovie->VideoClipCutInTime( 0 ) != TTimeIntervalMicroSeconds( 0 ) ) &&
( iMovie->VideoClipCutOutTime( 0 ) == iMovie->VideoClipInfo(0)->Duration() ) &&
( iContainer->PlaybackPositionL() > iMovie->VideoClipCutInTime( 0 ))
&& !AknLayoutUtils::PenEnabled() )
{
Cba()->SetCommandSetL( R_VEI_SOFTKEYS_OPTIONS_OUT__MENU );
}
else
{
Cba()->SetCommandSetL(R_VEI_SOFTKEYS_OPTIONS_CUT__MENU);
}
}
break;
}
case CVeiSimpleCutVideoContainer::EStatePlaying:
{
// playhead outside cut area
if ( iContainer->PlaybackPositionL() < iMovie->VideoClipCutInTime( iIndex ) )
{
if ( AknLayoutUtils::PenEnabled() )
{
Cba()->SetCommandSetL( R_VEI_SOFTKEYS_IN_NONE__MENU );
}
else
{
Cba()->SetCommandSetL( R_VEI_SOFTKEYS_IN_STOP__MENU );
}
iMarkState = EMarkStateIn;
}
// playdhead inside cut area
else if ( iContainer->PlaybackPositionL() < iMovie->VideoClipCutOutTime( iIndex ) )
{
Cba()->SetCommandSetL( R_VEI_SOFTKEYS_IN_OUT__MENU );
iMarkState = EMarkStateInOut;
}
// playhead outside cut area
else
{
if ( AknLayoutUtils::PenEnabled() )
{
Cba()->SetCommandSetL( R_VEI_SOFTKEYS_NONE_OUT__MENU );
}
else
{
Cba()->SetCommandSetL( R_VEI_SOFTKEYS_STOP_OUT__MENU );
}
iMarkState = EMarkStateOut;
}
break;
}
case CVeiSimpleCutVideoContainer::EStateTerminating:
{
return;
}
default:
{
break;
}
}
Cba()->DrawDeferred();
}
void CVeiSimpleCutVideoView::PlayMarkedL()
{
LOGFMT3(KVideoEditorLogFile, "CVeiSimpleCutVideoView::PlayMarkedL: In: iIndex:%d, iMovie->VideoClipCutInTime():%Ld, iMovie->VideoClipCutOutTime():%Ld", iIndex, iMovie->VideoClipCutInTime( iIndex ).Int64(), iMovie->VideoClipCutOutTime( iIndex ).Int64());
iPaused = EFalse;
StartNaviPaneUpdateL();
iContainer->PlayMarkedL( iMovie->VideoClipInfo( iIndex )->FileName(),
iMovie->VideoClipCutInTime( iIndex ), iMovie->VideoClipCutOutTime( iIndex ) );
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::PlayMarkedL: Out");
}
void CVeiSimpleCutVideoView::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( 0 );
TTimeIntervalMicroSeconds cutout = iMovie->VideoClipCutOutTime( 0 );
if ( ( cutin == TTimeIntervalMicroSeconds( 0 ) ) &&
( cutout == iMovie->VideoClipInfo(0)->Duration() ) )
{
Cba()->SetCommandSetL(R_VEI_SOFTKEYS_OPTIONS_BACK__MENU);
Cba()->DrawDeferred();
}
}
void CVeiSimpleCutVideoView::MarkInL()
{
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::MarkInL, In");
TTimeIntervalMicroSeconds pos = iContainer->PlaybackPositionL();
// the start mark can't be put right to the beginning
// because start mark is at position 0 when it is not set
if (pos == 0)
{
pos = 1;
}
// 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, "CVeiSimpleCutVideoView::MarkInL, 2, iIndex:%d, pos:%Ld", iIndex, pos.Int64());
iMovie->VideoClipSetCutInTime( iIndex, pos );
iContainer->MarkedInL();
}
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::MarkInL, Out");
}
void CVeiSimpleCutVideoView::MarkOutL()
{
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::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, "CVeiSimpleCutVideoView::MarkOutL, 2, iIndex:%d, pos:%Ld", iIndex, pos.Int64() );
iContainer->MarkedOutL();
}
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::MarkOutL, Out");
}
void CVeiSimpleCutVideoView::MoveStartOrEndMarkL(TTimeIntervalMicroSeconds aPosition, CVeiSimpleCutVideoContainer::TCutMark aMarkType)
{
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::MoveStartOrEndMarkL, In");
StopNaviPaneUpdateL();
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::MoveStartOrEndMarkL, 2");
if (aMarkType == CVeiSimpleCutVideoContainer::EStartMark)
{
iMovie->VideoClipSetCutInTime( iIndex, aPosition);
}
else if (aMarkType == CVeiSimpleCutVideoContainer::EEndMark)
{
iMovie->VideoClipSetCutOutTime( iIndex, aPosition);
}
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::MoveStartOrEndMarkL, Out");
}
TUint CVeiSimpleCutVideoView::InPointTime()
{
if ( !iMovie )
{
return 0;
}
else
{
return static_cast<TInt32>((iMovie->VideoClipCutInTime(iIndex).Int64() / 1000));
}
}
TUint CVeiSimpleCutVideoView::OutPointTime()
{
if ( !iMovie )
{
return 0;
}
else
{
return static_cast<TInt32>(iMovie->VideoClipCutOutTime(iIndex).Int64() / 1000);
}
}
TInt CVeiSimpleCutVideoView::UpdateTimeCallbackL(TAny* aPtr)
{
CVeiSimpleCutVideoView* view = (CVeiSimpleCutVideoView*)aPtr;
view->UpdateTimeL();
return 1;
}
void CVeiSimpleCutVideoView::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 CVeiSimpleCutVideoView::DrawTimeNaviL()
{
TTime elapsed( iContainer->PlaybackPositionL().Int64() );
TTime total( iContainer->TotalLength().Int64() );
iCVeiNaviPaneControl->DrawTimeNaviL( elapsed, total );
}
void CVeiSimpleCutVideoView::StartNaviPaneUpdateL()
{
DrawTimeNaviL();
if (iTimeUpdater && !iTimeUpdater->IsActive())
{
iTimeUpdater->Start(200000, 1000000/10, TCallBack(CVeiSimpleCutVideoView::UpdateTimeCallbackL, this));
}
}
void CVeiSimpleCutVideoView::StopNaviPaneUpdateL()
{
if (iContainer)
{
DrawTimeNaviL();
}
if (iTimeUpdater)
{
iTimeUpdater->Cancel();
}
}
void CVeiSimpleCutVideoView::VolumeMuteL()
{
iContainer->MuteL();
}
void CVeiSimpleCutVideoView::ShowVolumeLabelL( TInt aVolume )
{
iCVeiNaviPaneControl->ShowVolumeLabelL( aVolume );
}
void CVeiSimpleCutVideoView::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 ( iOnTheWayToDestruction ||
static_cast<CVeiSimpleCutVideoAppUi*>( AppUi() )->AppIsOnTheWayToDestruction() )
{
iContainer->PrepareForTerminationL();
return;
}
else
{
if( iContainer->State() == CVeiSimpleCutVideoContainer::EStatePlaying ||
iContainer->State() == CVeiSimpleCutVideoContainer::EStatePlayingMenuOpen )
{
iPaused = ETrue;
iContainer->PauseL( EFalse );
}
}
}
else
{
UpdateCBAL( iContainer->State() );
if( 0 )
// if( iPaused )
{
iPaused = EFalse;
PlayPreviewL();
}
}
}
// ---------------------------------------------------------
// CVeiSimpleCutVideoView::HandleStatusPaneSizeChange()
// ---------------------------------------------------------
//
void CVeiSimpleCutVideoView::HandleStatusPaneSizeChange()
{
if ( iContainer )
{
iContainer->SetRect( AppUi()->ClientRect() );
}
}
TBool CVeiSimpleCutVideoView::IsEnoughFreeSpaceToSaveL()// const
{
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 );
// In this case, we decide the target drive automatically when starting
// to save the video. Thus it is enough to know that there is free space
// on either drive at this stage.
spaceBelowCriticalLevel = SysUtil::DiskSpaceBelowCriticalLevelL( &fs, sizeEstimate, EDriveC );
if( spaceBelowCriticalLevel )
{
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 CVeiSimpleCutVideoView::GetVideoClipCutInTime()
{
TTimeIntervalMicroSeconds cutInTime(0);
if ( iMovie )
{
cutInTime = iMovie->VideoClipCutInTime( iIndex );
}
return cutInTime;
}
TTimeIntervalMicroSeconds CVeiSimpleCutVideoView::GetVideoClipCutOutTime()
{
TTimeIntervalMicroSeconds cutOutTime(0);
if ( iMovie )
{
cutOutTime = iMovie->VideoClipCutOutTime( iIndex );
}
return cutOutTime;
}
void CVeiSimpleCutVideoView::HandleResourceChange(TInt aType)
{
LOGFMT(KVideoEditorLogFile, "CVeiSimpleCutVideoView::HandleResourceChange() In, aType:%d", aType);
if ( iContainer )
{
if ( aType == KEikMessageFadeAllWindows && (iContainer->State() == CVeiSimpleCutVideoContainer::EStatePlaying) )
{
this->PausePreviewL();
iSelectionKeyPopup = ETrue;
}
else if ( iSelectionKeyPopup && aType == KEikMessageUnfadeWindows && (iContainer->State() == CVeiSimpleCutVideoContainer::EStatePaused) )
{
this->PlayPreviewL();
iSelectionKeyPopup = EFalse;
}
}
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
iCVeiNaviPaneControl->HandleResourceChange( aType );
}
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::HandleResourceChange() Out");
}
//=======================================================================================================
const CVedMovie* CVeiSimpleCutVideoView::Movie() const
{
return iMovie;
}
//=======================================================================================================
TBool CVeiSimpleCutVideoView::SaveL()
{
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::SaveL: in");
TFileName outputFile;
TBool ret = EFalse;
TTimeIntervalMicroSeconds cutin;
TTimeIntervalMicroSeconds cutout;
cutin = iMovie->VideoClipCutInTime( 0 );
cutout = iMovie->VideoClipCutOutTime( 0 );
if ( ( cutin != TTimeIntervalMicroSeconds( 0 ) ) ||
( cutout!= iMovie->VideoClipInfo(0)->Duration() ) )
{
RFs& fs = iEikonEnv->FsSession();
// GenerateNewDocumentNameL also checks disk space
TInt err(KErrNone);
if(!iOverWriteFile)
{
err = VideoEditorUtils::GenerateNewDocumentNameL (
fs,
iMovie->VideoClipInfo( iIndex )->FileName(),
outputFile,
iMovie->Format(),
iMovie->GetSizeEstimateL() );
}
else
{
outputFile.Zero();
outputFile.Copy(iMovie->VideoClipInfo( iIndex )->FileName());
}
LOGFMT(KVideoEditorLogFile, "CVeiSimpleCutVideoView::SaveL: 1, err:%d", err);
if ( KErrNone == err )
{
if (iSaveToFileName)
{
delete iSaveToFileName;
iSaveToFileName = NULL;
}
iSaveToFileName = HBufC::NewL( outputFile.Length() );
*iSaveToFileName = outputFile;
// Start saviong the video.
// To be finished in DialogDismissedL...
iSaving = ETrue;
StartTempFileProcessingL();
ret = ETrue;
}
else
{
iErrorUI->ShowGlobalErrorNote( err );
ret = EFalse;
}
}
else
{
ret = EFalse;
}
LOGFMT(KVideoEditorLogFile, "CVeiSimpleCutVideoView::SaveL: out: %d", ret);
return ret;
}
//=============================================================================
TInt CVeiSimpleCutVideoView::QueryAndSaveL()
{
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::QueryAndSaveL: in");
TFileName outputFile;
TBool ret = EFalse;
TTimeIntervalMicroSeconds cutin;
TTimeIntervalMicroSeconds cutout;
cutin = iMovie->VideoClipCutInTime( 0 );
cutout = iMovie->VideoClipCutOutTime( 0 );
if ( ( cutin != TTimeIntervalMicroSeconds( 0 ) ) ||
( cutout!= iMovie->VideoClipInfo(0)->Duration() ) )
{
RFs fs = CCoeEnv::Static()->FsSession();
// launch query with choices "Replace original" and "Save with a new file name"
TInt userSelection = VideoEditorUtils::LaunchSaveVideoQueryL();
if(userSelection == 0)
// the user selects to save with a new file name
{
iOverWriteFile = EFalse;
// Multiple drive support enabled
#ifdef RD_MULTIPLE_DRIVE
TDriveNumber driveNumber;
TFileName driveAndPath;
CAknMemorySelectionDialogMultiDrive* multiDriveDlg = CAknMemorySelectionDialogMultiDrive::NewL(ECFDDialogTypeSave, EFalse );
CleanupStack::PushL( multiDriveDlg );
// launch "Select memory" query
if (multiDriveDlg->ExecuteL( driveNumber, &driveAndPath, NULL ))
{
outputFile.Zero();
// Generate a default name for the new file
TInt err = VideoEditorUtils::GenerateFileNameL (
fs,
iMovie->VideoClipInfo( iIndex )->FileName(),
outputFile,
iMovie->Format(),
iMovie->GetSizeEstimateL(),
driveAndPath);
driveAndPath.Append( PathInfo::VideosPath() );
if ( KErrNone == err )
{
if (iSaveToFileName)
{
delete iSaveToFileName;
iSaveToFileName = NULL;
}
// launch file name prompt dialog
if (CAknFileNamePromptDialog::RunDlgLD(outputFile, driveAndPath, KNullDesC))
{
driveAndPath.Append(outputFile);
outputFile.Copy(driveAndPath);
iSaveToFileName = HBufC::NewL( outputFile.Length() );
*iSaveToFileName = outputFile;
// Start saving the video.
// To be finished in DialogDismissedL...
iSaving = ETrue;
StartTempFileProcessingL();
ret = ETrue;
}
}
else // err != KErrNone
{
ret = EFalse;
}
}
CleanupStack::PopAndDestroy( multiDriveDlg );
#else // no multiple drive support
// launch "Select memory" query
CAknMemorySelectionDialog::TMemory selectedMemory(CAknMemorySelectionDialog::EPhoneMemory);
if (CAknMemorySelectionDialog::RunDlgLD(selectedMemory))
{
// create path for the image
TFileName driveAndPath;
VideoEditor::TMemory memorySelection = VideoEditor::EMemPhoneMemory;
if (selectedMemory == CAknMemorySelectionDialog::EPhoneMemory)
{
memorySelection = VideoEditor::EMemPhoneMemory;
driveAndPath.Copy( PathInfo::PhoneMemoryRootPath() );
driveAndPath.Append( PathInfo::VideosPath() );
}
else if (selectedMemory == CAknMemorySelectionDialog::EMemoryCard)
{
memorySelection = VideoEditor::EMemMemoryCard;
driveAndPath.Copy( PathInfo::MemoryCardRootPath() );
driveAndPath.Append( PathInfo::VideosPath() );
}
// GenerateNewDocumentNameL also checks disk space
TInt err = VideoEditorUtils::GenerateNewDocumentNameL (
fs,
iMovie->VideoClipInfo( iIndex )->FileName(),
outputFile,
iMovie->Format(),
iMovie->GetSizeEstimateL(),
memorySelection );
if ( KErrNone == err )
{
if (iSaveToFileName)
{
delete iSaveToFileName;
iSaveToFileName = NULL;
}
// launch file name prompt dialog
if (CAknFileNamePromptDialog::RunDlgLD(outputFile, driveAndPath, KNullDesC))
{
driveAndPath.Append(outputFile);
outputFile.Copy(driveAndPath);
iSaveToFileName = HBufC::NewL( outputFile.Length() );
*iSaveToFileName = outputFile;
// Start saving the video.
// To be finished in DialogDismissedL...
iSaving = ETrue;
StartTempFileProcessingL();
ret = ETrue;
}
}
else // err != KErrNone
{
ret = EFalse;
}
}
#endif
}
// user selects to overwrite
else if (userSelection == 1)
{
iOverWriteFile = ETrue;
ret = SaveL();
return ret;
}
else // user cancelled
{
ret = EFalse;
}
}
else
{
ret = EFalse;
}
LOGFMT(KVideoEditorLogFile, "CVeiSimpleCutVideoView::QueryAndSaveL: out: %d", ret);
return ret;
}
//=======================================================================================================
TBool CVeiSimpleCutVideoView::IsCutMarkSet()
{
ASSERT( iMovie ); // We always have iMovie
TTimeIntervalMicroSeconds cutIn( iMovie->VideoClipCutInTime( iIndex ) );
TTimeIntervalMicroSeconds cutOut( iMovie->VideoClipCutOutTime( iIndex ) );
TTimeIntervalMicroSeconds duration( iMovie->VideoClipInfo(iIndex)->Duration() );
// cutIn or cutOut mark is set
return (cutIn != TTimeIntervalMicroSeconds( 0 ) || cutOut != duration);
}
//=======================================================================================================
void CVeiSimpleCutVideoView::StartTempFileProcessingL()
{
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::StartTempFileProcessingL: in");
RFs& fs = iEikonEnv->FsSession();
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::StartTempFileProcessingL() -- NEW TEMP");
if (iTempFile)
{
delete iTempFile;
iTempFile = NULL;
}
iTempFile = HBufC::NewL(KMaxFileName);
iTempMaker->GenerateTempFileName( *iTempFile, iMovieSaveSettings.MemoryInUse(), iMovie->Format() );
LOGFMT(KVideoEditorLogFile, "CVeiSimpleCutVideoView::StartTempFileProcessingL: 1, iTempFile:%S", iTempFile);
if ( !IsEnoughFreeSpaceToSaveL() )
{
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::StartTempFileProcessingL: 2");
return;
}
iMovie->ProcessL( *iTempFile, *this );
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::StartTempFileProcessingL: out");
}
//=======================================================================================================
void CVeiSimpleCutVideoView::ShowErrorNoteL( const TInt aResourceId, TInt aError ) const
{
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::ShowErrorNoteL: in");
HBufC* stringholder;
if ( aError == 0 )
{
stringholder = StringLoader::LoadLC( aResourceId, iEikonEnv );
}
else
{
stringholder = StringLoader::LoadLC( aResourceId, aError, iEikonEnv );
}
CAknErrorNote* dlg = new ( ELeave ) CAknErrorNote( ETrue );
dlg->ExecuteLD( *stringholder );
CleanupStack::PopAndDestroy( stringholder );
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::ShowErrorNoteL: out");
}
//=======================================================================================================
void CVeiSimpleCutVideoView::StartProgressNoteL()
{
iProgressNote =
new (ELeave) CAknProgressDialog(REINTERPRET_CAST(CEikDialog**,
&iProgressNote), ETrue);
iProgressNote->SetCallback(this);
iProgressNote->ExecuteDlgLD( R_VEI_PROGRESS_NOTE_WITH_CANCEL );
HBufC* stringholder;
TApaAppCaption caption;
TRAPD( err, iContainer->ResolveCaptionNameL( caption ) );
// If something goes wrong, show basic "Saving" note
if ( err )
{
stringholder = iEikonEnv->AllocReadResourceLC( R_VEI_PROGRESS_NOTE_SAVING );
}
else
{
stringholder = StringLoader::LoadLC( R_VEI_PROGRESS_NOTE_CUTTING_VIDEO, caption, iEikonEnv );
}
iProgressNote->SetTextL( *stringholder );
CleanupStack::PopAndDestroy( stringholder );
iProgressNote->GetProgressInfoL()->SetFinalValue(100);
}
//=======================================================================================================
void CVeiSimpleCutVideoView::StartAnimatedProgressNoteL()
{
if (iAnimatedProgressDialog)
{
delete iAnimatedProgressDialog;
iAnimatedProgressDialog = NULL;
}
iAnimatedProgressDialog = new (ELeave) CExtProgressDialog( &iAnimatedProgressDialog);
iAnimatedProgressDialog->PrepareLC(R_WAIT_DIALOG);
iAnimatedProgressDialog->SetCallback( this );
HBufC* stringholder = StringLoader::LoadLC( R_VEI_PROGRESS_NOTE_CUTTING_VIDEO, iEikonEnv );
iAnimatedProgressDialog->SetTextL( *stringholder );
CleanupStack::PopAndDestroy(stringholder);
iAnimatedProgressDialog->SetAnimationResourceIdL( VideoEditor::EAnimationCut );
iAnimatedProgressDialog->GetProgressInfoL()->SetFinalValue( 100 );
iAnimatedProgressDialog->StartAnimationL();
iAnimatedProgressDialog->RunLD();
}
// ----------------------------------------------------------------------------
// CVeiSimpleCutVideoView::CheckMemoryCardAvailability()
//
// Checks the memory card availability if MMC is selected as save store in
// application settings. An information note is shown in following
// situations:
// - MMC not inserted
// - MMC corrupted (unformatted)
// [- MMC is read-only (not implemented)]
//
// If note is popped up, this function waits until it's dismissed.
// ----------------------------------------------------------------------------
//
void CVeiSimpleCutVideoView::CheckMemoryCardAvailabilityL()
{
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::CheckMemoryCardAvailability(): in");
// Read the video editor settings from ini file.
STATIC_CAST(CVeiSimpleCutVideoAppUi*,AppUi())->ReadSettingsL( iMovieSaveSettings );
CAknMemorySelectionDialog::TMemory memoryInUse( iMovieSaveSettings.MemoryInUse() );
// Check the MMC accessibility only if MMC is used as saving store.
if( memoryInUse == CAknMemorySelectionDialog::EMemoryCard )
{
RFs& fs = iEikonEnv->FsSession();
TDriveInfo driveInfo;
User::LeaveIfError( fs.Drive( driveInfo, KMmcDrive ) );
// Media is not present (MMC card not inserted).
if( EMediaNotPresent == driveInfo.iType )
{
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::CheckMemoryCardAvailability(): no media");
iMovieSaveSettings.MemoryInUse() = CAknMemorySelectionDialog::EPhoneMemory;
// do not overwrite because doing so permanently sets memory to phone memory
//STATIC_CAST( CVeiSimpleCutVideoAppUi*, AppUi() )->WriteSettingsL( settings );
}
// Media is present
else
{
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::CheckMemoryCardAvailability(): media present");
TVolumeInfo volumeInfo;
TInt volumeErr = fs.Volume( volumeInfo, KMmcDrive );
LOGFMT(KVideoEditorLogFile, "CEditVideoView::CheckMemoryCardAvailability() Volume(): %d", volumeErr);
// Show note if media is corrupted/unformatted.
if( KErrCorrupt == volumeErr )
{
HBufC* noteText = StringLoader::LoadLC( R_VED_MMC_NOT_INSERTED,
iEikonEnv );
CAknInformationNote* informationNote =
new(ELeave)CAknInformationNote( ETrue );
informationNote->ExecuteLD( *noteText );
CleanupStack::PopAndDestroy( noteText );
iMovieSaveSettings.MemoryInUse() = CAknMemorySelectionDialog::EPhoneMemory;
// do not overwrite because doing so permanently sets memory to phone memory
//STATIC_CAST( CVeiSimpleCutVideoAppUi*, AppUi() )->WriteSettingsL( settings );
}
}
}
LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoView::CheckMemoryCardAvailability(): out");
}
void CVeiSimpleCutVideoView::PrepareForTermination()
{
iOnTheWayToDestruction = ETrue;
}
void CVeiSimpleCutVideoView::SetTitlePaneTextL ()
{
TPtrC fileName = iMovie->VideoClipInfo( iIndex )->FileName();
HBufC * title_text = HBufC::NewLC( fileName.Length() );
TPtr title_text_ptr = title_text->Des();
title_text_ptr.Copy (fileName);
TParsePtr parser (title_text_ptr);
title_text_ptr = parser.Name();
// Set title pane text
CEikStatusPane *statusPane = ( ( CAknAppUi* )iEikonEnv->EikAppUi() )->StatusPane();
CAknTitlePane* titlePane = ( CAknTitlePane* ) statusPane->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) );
titlePane->SetTextL(title_text_ptr);
CleanupStack::PopAndDestroy( title_text );
}
// End of File