videditor/SimpleCutVideo/src/VeiSimpleCutVideoContainer.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 <VedSimpleCutVideo.rsg>
#include <videoeditoruicomponents.mbg>
#include <eikbtgpc.h>
#include <vedvideoclipinfo.h>
#include <coemain.h>
#include <eikenv.h>
//#include <CMGXFileManager.h>
//#include <MGXFileManagerFactory.h>
#include <aknsbasicbackgroundcontrolcontext.h> 
#include <aknsdrawutils.h> 
#include <aknsdatacontext.h> 
#include <stringloader.h>
#include <aknnotewrappers.h> 
#include <pathinfo.h> 
#include <eikprogi.h>
#include <aknlayoutscalable_avkon.cdl.h>
#include <aknlayoutscalable_apps.cdl.h>
#include <CAknMemorySelectionDialog.h> 
#include <CAknFileNamePromptDialog.h> 
#include <AknCommonDialogsDynMem.h> 
#include <CAknMemorySelectionDialogMultiDrive.h> 
#include <apgcli.h>
#include <csxhelp/vided.hlp.hrh>

#ifdef RD_TACTILE_FEEDBACK 
#include <touchfeedback.h>
#endif /* RD_TACTILE_FEEDBACK  */

// User includes
#include "VeiSimpleCutVideoAppUi.h"
#include "VeiCutterBar.h"
#include "VeiSimpleCutVideoContainer.h"
#include "VeiSimpleCutVideoView.h"
#include "veitextdisplay.h"
#include "VideoEditorCommon.h"
#include "VideoEditorUtils.h"
#include "VeiErrorUi.h"
#include "VedSimpleCutVideo.hrh"

#define KMediaGalleryUID3           0x101F8599 

// ================= MEMBER FUNCTIONS =======================
void CleanupRarray( TAny* object )
	{
	(( RImageTypeDescriptionArray*)object)->ResetAndDestroy();
	}

CVeiSimpleCutVideoContainer* CVeiSimpleCutVideoContainer::NewL( const TRect& aRect, CVeiSimpleCutVideoView& aView, CVeiErrorUI& aErrorUI )
    {
    CVeiSimpleCutVideoContainer* self = CVeiSimpleCutVideoContainer::NewLC( aRect, aView, aErrorUI );
    CleanupStack::Pop( self );
    return self;
    }

CVeiSimpleCutVideoContainer* CVeiSimpleCutVideoContainer::NewLC( const TRect& aRect, CVeiSimpleCutVideoView& aView, CVeiErrorUI& aErrorUI )
    {
    CVeiSimpleCutVideoContainer* self = new (ELeave) CVeiSimpleCutVideoContainer( aRect, aView, aErrorUI );
    CleanupStack::PushL( self );
    self->ConstructL( aRect, aView, aErrorUI );
    return self;
    }

void CVeiSimpleCutVideoContainer::ConstructL( const TRect& aRect, CVeiSimpleCutVideoView& /*aView*/, CVeiErrorUI& /*aErrorUI*/ )
    {
	LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::ConstructL: in");
	CreateWindowL();

	iState = EStateInitializing;
	iFrameReady = EFalse;
	iPlayOrPlayMarked = EFalse;

	iSeekPos = TTimeIntervalMicroSeconds( 0 );
	iSeeking = EFalse;
	iCutVideoBar = CVeiCutterBar::NewL( this );

	iConverter = CVeiImageConverter::NewL( this );
	iTakeSnapshot = EFalse;
	iVideoDisplay = CVeiVideoDisplay::NewL( iDisplayRect, this, *this );

	TFileName mbmPath( VideoEditorUtils::IconFileNameAndPath(KVideoEditorUiComponentsIconFileId) );	

	if( !AknLayoutUtils::PenEnabled() )
		{
		iCutTimeDisplay = CVeiTextDisplay::NewL( iCutTimeDisplayRect, this );
               
		// A new icon. Temporarely same bitmap is used for non touch pause as in touch devices
		// A new icon has been requested and it should be changed here as soon as it's in the build
		AknIconUtils::CreateIconL( iPauseBitmap, iPauseBitmapMask,
				mbmPath, EMbmVideoeditoruicomponentsQgn_indi_vded_pause, 
				EMbmVideoeditoruicomponentsQgn_indi_vded_pause_mask );
		}
	else
		{
		AknIconUtils::CreateIconL( iPlayBitmap, iPlayBitmapMask,
				mbmPath, EMbmVideoeditoruicomponentsQgn_indi_vded2_play, 
				EMbmVideoeditoruicomponentsQgn_indi_vded2_play_mask );
				
		AknIconUtils::CreateIconL( iPauseBitmap, iPauseBitmapMask,
				mbmPath, EMbmVideoeditoruicomponentsQgn_indi_vded2_pause, 
				EMbmVideoeditoruicomponentsQgn_indi_vded2_pause_mask );
		}

    SetRect( aRect );

	iBgContext = CAknsBasicBackgroundControlContext::NewL( KAknsIIDQsnBgAreaMain, Rect(), EFalse );
	iVideoBarTimer = CPeriodic::NewL( CActive::EPriorityLow );

#ifdef RD_TACTILE_FEEDBACK 
    iTouchFeedBack = MTouchFeedback::Instance();    
#endif /* RD_TACTILE_FEEDBACK  */     

	iRemConTarget = CVeiRemConTarget::NewL( *this );

	EnableDragEvents();

    ActivateL();

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

CVeiSimpleCutVideoContainer::CVeiSimpleCutVideoContainer( 
    const TRect& /*aRect*/, CVeiSimpleCutVideoView& aView, 
    CVeiErrorUI& aErrorUI ) : iView( aView ), iErrorUI( aErrorUI )
	{
	}

CVeiSimpleCutVideoContainer::~CVeiSimpleCutVideoContainer()
    {
	if ( iCutVideoBar )
		{
		delete iCutVideoBar;
		}
	if ( iBgContext )
		{
		delete iBgContext;
		}
	if ( iVideoDisplay )
		{
		delete iVideoDisplay;
		}
	if ( iCutTimeDisplay )
		{
		delete iCutTimeDisplay;
		}
	if ( iVideoClipInfo )
		{
		delete iVideoClipInfo;
		iVideoClipInfo = NULL;
		}
	if ( iConverter )
		{
		iConverter->Cancel();
		delete iConverter;
		}
	if ( iVideoBarTimer )
		{
		iVideoBarTimer->Cancel();
		delete iVideoBarTimer;
		}

	if ( iProgressDialog )
		{
		delete iProgressDialog;
		iProgressDialog = NULL;
		}
	if ( iSaveToFileName )
		{
		delete iSaveToFileName;
		iSaveToFileName = NULL;
		}

	delete iCallBackSaveSnapshot;
	delete iCallBackTakeSnapshot;

	if ( iPlayBitmap )
		{
		delete iPlayBitmap;
		}
	if ( iPlayBitmapMask )
		{
		delete iPlayBitmapMask;
		}
	delete iPauseBitmap;
	delete iPauseBitmapMask;

	delete iRemConTarget;
    }

void CVeiSimpleCutVideoContainer::DialogDismissedL( TInt aButtonId )
	{
	if ( aButtonId == -1 )
        { // when pressing cancel button.
		CancelSnapshotSave();
        }
	iTakeSnapshot = EFalse;
	}

void CVeiSimpleCutVideoContainer::SizeChanged()
    {
	LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::SizeChanged(): In");
	TSize videoScreenSize;
    TRect rect( Rect() ); 
	if ( iBgContext )
		{
		iBgContext->SetRect( rect );
		}
	LOGFMT2(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::SizeChanged(): Rect(): %d,%d", rect.iBr.iX, rect.iBr.iY);

	TInt variety = 0;
	if (VideoEditorUtils::IsLandscapeScreenOrientation())
		{
		variety = 1;
		}

	if( !AknLayoutUtils::PenEnabled() )
		{
		// Progress bar
		TAknLayoutRect progressBarLayout; 
		progressBarLayout.LayoutRect(Rect(),AknLayoutScalable_Apps::vded_slider_pane());
		iCutVideoBar->SetComponentRect(CVeiCutterBar::EProgressBar, progressBarLayout.Rect());

	    TAknLayoutRect sliderLeftEndLayout;
	    TAknLayoutRect sliderRightEndLayout;
	    if ( AknLayoutUtils::LayoutMirrored () )
	        {
	        // left end of the slider when that part is unselected
	    	sliderLeftEndLayout.LayoutRect( progressBarLayout.Rect(),AknLayoutScalable_Apps::vded_slider_pane_g4() );
	    	iCutVideoBar->SetComponentRect( CVeiCutterBar::ESliderLeftEndIcon, sliderLeftEndLayout.Rect() );
	    	
	    	// right end of the slider when that part is unselected
	    	sliderRightEndLayout.LayoutRect(progressBarLayout.Rect(),AknLayoutScalable_Apps::vded_slider_pane_g3());
	    	iCutVideoBar->SetComponentRect( CVeiCutterBar::ESliderRightEndIcon, sliderRightEndLayout.Rect() );	
	        }
	    else
	        {
	        // left end of the slider when that part is unselected
	    	sliderLeftEndLayout.LayoutRect( progressBarLayout.Rect(),AknLayoutScalable_Apps::vded_slider_pane_g3() );
	    	iCutVideoBar->SetComponentRect( CVeiCutterBar::ESliderLeftEndIcon, sliderLeftEndLayout.Rect() );
	    	
	    	// right end of the slider when that part is unselected
	    	sliderRightEndLayout.LayoutRect(progressBarLayout.Rect(),AknLayoutScalable_Apps::vded_slider_pane_g4());
	    	iCutVideoBar->SetComponentRect( CVeiCutterBar::ESliderRightEndIcon, sliderRightEndLayout.Rect() );	
	        }

		// middle part of the slider when that part is unselected	
		TAknLayoutRect sliderMiddleLayout;
		sliderMiddleLayout.LayoutRect(progressBarLayout.Rect(),AknLayoutScalable_Apps::vded_slider_pane_g5());
		iCutVideoBar->SetComponentRect( CVeiCutterBar::ESliderMiddleIcon, sliderMiddleLayout.Rect() );		
	    				
		// left end of the cut selection slider 
		TAknLayoutRect sliderSelectedLeftEndLayout;
		sliderSelectedLeftEndLayout.LayoutRect(progressBarLayout.Rect(),AknLayoutScalable_Apps::vded_slider_pane_g3());
		iCutVideoBar->SetComponentRect( CVeiCutterBar::ESliderSelectedLeftEndIcon, sliderSelectedLeftEndLayout.Rect() );
			
		// middle part of the cut selection slider 
		TAknLayoutRect sliderSelectedMiddleLayout;
		sliderSelectedMiddleLayout.LayoutRect(progressBarLayout.Rect(),AknLayoutScalable_Apps::vded_slider_pane_g5());
		iCutVideoBar->SetComponentRect( CVeiCutterBar::ESliderSelectedMiddleIcon, sliderSelectedMiddleLayout.Rect() );		
		
		// right end of the cut selection slider 
		TAknLayoutRect sliderSelectedRightEndLayout;
		sliderSelectedRightEndLayout.LayoutRect(progressBarLayout.Rect(),AknLayoutScalable_Apps::vded_slider_pane_g4());
		iCutVideoBar->SetComponentRect( CVeiCutterBar::ESliderSelectedRightEndIcon, sliderSelectedRightEndLayout.Rect() ); 

	    // playhead
	    TAknLayoutRect playheadLayout;
		playheadLayout.LayoutRect(progressBarLayout.Rect(),AknLayoutScalable_Apps::vded_slider_pane_g1());
		iCutVideoBar->SetComponentRect( CVeiCutterBar::EPlayheadIcon, playheadLayout.Rect() ); 

	    // left/right border of cut selection slider
	    TAknLayoutRect cutAreaBorderLayout;
		cutAreaBorderLayout.LayoutRect(progressBarLayout.Rect(),AknLayoutScalable_Apps::vded_slider_pane_g2());
		iCutVideoBar->SetComponentRect( CVeiCutterBar::ECutAreaBorderIcon, cutAreaBorderLayout.Rect() ); 
			
		TAknLayoutText startTimeTextLayout;
		TAknLayoutText endTimeTextLayout;
		TAknLayoutRect startTimeIconLayout;
		TAknLayoutRect endTimeIconLayout;

		// Video Display	
		TAknLayoutRect videoDisplayLayout;
		videoDisplayLayout.LayoutRect(Rect(),AknLayoutScalable_Apps::vded_video_pane());
		iVideoDisplay->SetRect(videoDisplayLayout.Rect());
		
		iDisplayRect = videoDisplayLayout.Rect();	
		iIconDisplayRect = videoDisplayLayout.Rect();
		LOGFMT2(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::SizeChanged(): iDisplayRect: %d,%d", iDisplayRect.iBr.iX, iDisplayRect.iBr.iY);

		//CVeiCutterBar	    
	    TRect cutBarRect( sliderLeftEndLayout.Rect().iTl, sliderRightEndLayout.Rect().iBr );
	    iCutVideoBar->SetRect( cutBarRect );
			
		TInt iconWidth = STATIC_CAST( TInt, rect.iBr.iX * 0.07954545455 );
		AknIconUtils::SetSize( iPauseBitmap, TSize(iconWidth,iconWidth), EAspectRatioNotPreserved );
		}
	else
		{
		// Progress bar
		TAknLayoutRect progressBarLayout; 
		progressBarLayout.LayoutRect(Rect(),AknLayoutScalable_Apps::vded2_slider_pane(variety));

		TAknLayoutRect progressBGLayout; 
		progressBGLayout.LayoutRect(progressBarLayout.Rect(),AknLayoutScalable_Apps::vded2_slider_bg_pane());
		iCutVideoBar->SetComponentRect(CVeiCutterBar::EProgressBar, progressBGLayout.Rect());

	    TAknLayoutRect sliderLeftEndLayout;
	    TAknLayoutRect sliderRightEndLayout;
	    if ( AknLayoutUtils::LayoutMirrored () )
	        {
	        // left end of the slider when that part is unselected
	    	sliderLeftEndLayout.LayoutRect( progressBGLayout.Rect(),AknLayoutScalable_Apps::vded2_slider_bg_pane_g2());
	    	iCutVideoBar->SetComponentRect( CVeiCutterBar::ESliderLeftEndIcon, sliderLeftEndLayout.Rect() );
	    	
	    	// right end of the slider when that part is unselected
	    	sliderRightEndLayout.LayoutRect(progressBGLayout.Rect(),AknLayoutScalable_Apps::vded2_slider_bg_pane_g1());
	    	iCutVideoBar->SetComponentRect( CVeiCutterBar::ESliderRightEndIcon, sliderRightEndLayout.Rect() );	

	        }
	    else
	        {
	        // left end of the slider when that part is unselected
	    	sliderLeftEndLayout.LayoutRect( progressBGLayout.Rect(),AknLayoutScalable_Apps::vded2_slider_bg_pane_g1());
	    	iCutVideoBar->SetComponentRect( CVeiCutterBar::ESliderLeftEndIcon, sliderLeftEndLayout.Rect() );
	    	
	    	// right end of the slider when that part is unselected
	    	sliderRightEndLayout.LayoutRect(progressBGLayout.Rect(),AknLayoutScalable_Apps::vded2_slider_bg_pane_g2());
	    	iCutVideoBar->SetComponentRect( CVeiCutterBar::ESliderRightEndIcon, sliderRightEndLayout.Rect() );	
	        }

		// middle part of the slider when that part is unselected	
		TAknLayoutRect sliderMiddleLayout;
		sliderMiddleLayout.LayoutRect(progressBGLayout.Rect(),AknLayoutScalable_Apps::vded2_slider_bg_pane_g3());
		iCutVideoBar->SetComponentRect( CVeiCutterBar::ESliderMiddleIcon, sliderMiddleLayout.Rect() );		
	    				
		// middle part of the cut selection slider 
		TAknLayoutRect sliderSelectedMiddleLayout;
		sliderSelectedMiddleLayout.LayoutRect(progressBGLayout.Rect(),AknLayoutScalable_Apps::vded2_slider_bg_pane_g3());
		iCutVideoBar->SetComponentRect( CVeiCutterBar::ESliderSelectedMiddleIcon, sliderSelectedMiddleLayout.Rect() );		

	    // playhead
	    TAknLayoutRect playheadLayout;
		playheadLayout.LayoutRect(progressBarLayout.Rect(),AknLayoutScalable_Apps::vded2_slider_pane_g3());
		iCutVideoBar->SetComponentRect( CVeiCutterBar::EPlayheadIcon, playheadLayout.Rect() ); 

	    // left/right border of cut selection slider
	    TAknLayoutRect cutAreaBorderLayout;
		cutAreaBorderLayout.LayoutRect(progressBarLayout.Rect(),AknLayoutScalable_Apps::vded2_slider_pane_g1());
		iCutVideoBar->SetComponentRect( CVeiCutterBar::EStartMarkIcon, cutAreaBorderLayout.Rect() ); 
		cutAreaBorderLayout.LayoutRect(progressBarLayout.Rect(),AknLayoutScalable_Apps::vded2_slider_pane_g2());
		iCutVideoBar->SetComponentRect( CVeiCutterBar::EEndMarkIcon, cutAreaBorderLayout.Rect() ); 

		// Video Display	
		TAknLayoutRect videoDisplayLayout;
		videoDisplayLayout.LayoutRect(Rect(),AknLayoutScalable_Apps::vded_video_pane());
		iVideoDisplay->SetRect(videoDisplayLayout.Rect());
		
		iDisplayRect = videoDisplayLayout.Rect();	
		iIconDisplayRect = videoDisplayLayout.Rect();
		LOGFMT2(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::SizeChanged(): iDisplayRect: %d,%d", iDisplayRect.iBr.iX, iDisplayRect.iBr.iY);

		// CVeiCutterBar	    
	    TRect cutBarRect( progressBarLayout.Rect().iTl, progressBarLayout.Rect().iBr );
	    iCutVideoBar->SetRect( cutBarRect );

		// pause icon		
		TAknLayoutRect iconLayout;
		iconLayout.LayoutRect(Rect(),AknLayoutScalable_Apps::main_vded2_pane_g2(variety));
		iIconDisplayRect = iconLayout.Rect();
		AknIconUtils::SetSize( iPlayBitmap, iIconDisplayRect.Size(), EAspectRatioNotPreserved );
		AknIconUtils::SetSize( iPauseBitmap, iIconDisplayRect.Size(), EAspectRatioNotPreserved );

		// cut bar touch areas
	    TAknLayoutRect touchAreaLayout;
		touchAreaLayout.LayoutRect(progressBarLayout.Rect(),AknLayoutScalable_Apps::aid_size_touch_vded2_playhead());
		iCutVideoBar->SetComponentRect( CVeiCutterBar::EPlayheadTouch, touchAreaLayout.Rect() ); 
		touchAreaLayout.LayoutRect(progressBarLayout.Rect(),AknLayoutScalable_Apps::aid_size_touch_vded2_start());
		iCutVideoBar->SetComponentRect( CVeiCutterBar::EStartMarkTouch, touchAreaLayout.Rect() ); 
		touchAreaLayout.LayoutRect(progressBarLayout.Rect(),AknLayoutScalable_Apps::aid_size_touch_vded2_end());
		iCutVideoBar->SetComponentRect( CVeiCutterBar::EEndMarkTouch, touchAreaLayout.Rect() ); 
		}

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

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

TInt CVeiSimpleCutVideoContainer::CountComponentControls() const
    {
	if( !AknLayoutUtils::PenEnabled() )
		{
	    return 3; 
		}
	else
		{
	    return 2; 
		}
    }

CCoeControl* CVeiSimpleCutVideoContainer::ComponentControl( TInt aIndex ) const
    {
    switch ( aIndex )
        {
        case 0:
			return iCutVideoBar;
		case 1:
			return iVideoDisplay;
		case 2:
			return iCutTimeDisplay;
        default:
            return NULL;
        }
    }

void CVeiSimpleCutVideoContainer::Draw( const TRect& aRect ) const
    {
    CWindowGc& gc = SystemGc();
	// draw skin background
	MAknsSkinInstance* skin = AknsUtils::SkinInstance();
	MAknsControlContext* cc = AknsDrawUtils::ControlContext( this );	
	AknsDrawUtils::Background( skin, cc, this, gc, aRect );

    if ( EStatePlaying != iState && EStatePlayingMenuOpen != iState
         && AknLayoutUtils::PenEnabled() )
		{
		gc.BitBltMasked( iIconDisplayRect.iTl, iPlayBitmap, 
			TRect(iIconDisplayRect.Size()), 
			iPlayBitmapMask, EFalse );
		}
	else if ( ( EStatePlaying == iState || EStatePlayingMenuOpen == iState )
	          && AknLayoutUtils::PenEnabled() )
		{		
		gc.BitBltMasked( iIconDisplayRect.iTl, iPauseBitmap, 
			TRect(iIconDisplayRect.Size()), 
			iPauseBitmapMask, EFalse );
		}

	if ( EStatePaused == iState && !AknLayoutUtils::PenEnabled() )
		{		
 		TPoint pauseIconTl = TPoint( iIconDisplayRect.iTl.iX - STATIC_CAST( TInt, Rect().iBr.iX*0.105),
			iIconDisplayRect.iTl.iY + STATIC_CAST( TInt, Rect().iBr.iY*0.178 ));
		gc.BitBltMasked( pauseIconTl, iPauseBitmap, 
			TRect( TPoint(0,0), iPauseBitmap->SizeInPixels() ), 
			iPauseBitmapMask, EFalse );
		}
	}

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

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

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

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


void CVeiSimpleCutVideoContainer::HandleControlEventL(
    CCoeControl* /*aControl*/,TCoeEvent /*aEventType*/)
    {
    }

// ----------------------------------------------------------------------------
// CVeiSimpleCutVideoContainer::HandlePointerEventL
// From CCoeControl
// ----------------------------------------------------------------------------
//		
void CVeiSimpleCutVideoContainer::HandlePointerEventL(const TPointerEvent& aPointerEvent )
	{
	LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::HandlePointerEventL(): In");
	if( AknLayoutUtils::PenEnabled() && iCutVideoBar )
		{
		CCoeControl::HandlePointerEventL( aPointerEvent );

		switch( aPointerEvent.iType )
			{
			case TPointerEvent::EButton1Down:
				{
				iButtonDownPoint = aPointerEvent.iPosition;
				iIsMarkDrag = EFalse;
				iIsMarkTapped = EFalse;
				iIsIconOrDisplayTapped = EFalse;
				TRect startMarkRect = iCutVideoBar->StartMarkRect();
				TRect endMarkRect = iCutVideoBar->EndMarkRect();				
				TRect playheadRect = iCutVideoBar->PlayHeadRect();
				// check if the pen goes down inside the start mark
				if (startMarkRect.Contains(aPointerEvent.iPosition)) 
					{
					iIsMarkTapped = ETrue;
					iTappedMark = EStartMark;		
					iCutVideoBar->SetPressedComponent( CVeiCutterBar::EPressedStartMarkTouch );					
					}
				// check if the pen goes down inside the end mark	
				else if (endMarkRect.Contains(aPointerEvent.iPosition))
					{
					iIsMarkTapped = ETrue;
					iTappedMark = EEndMark;
					iCutVideoBar->SetPressedComponent( CVeiCutterBar::EPressedEndMarkTouch );
					}					
				// check if the pen goes down inside the playhead	
				else if (playheadRect.Contains(aPointerEvent.iPosition))
					{
					iIsMarkTapped = ETrue;
					iTappedMark = EPlayHead;
					iCutVideoBar->SetPressedComponent( CVeiCutterBar::EPressedPlayheadTouch );					
					}					
                else if ( iDisplayRect.Contains( iButtonDownPoint ) ||
                          iIconDisplayRect.Contains( iButtonDownPoint ) )
                    {
                    iIsIconOrDisplayTapped = ETrue;
                    }
                    
                if ( iIsMarkTapped )
                	{
    	            DrawDeferred();	    	            
                	}    	        	       

#ifdef RD_TACTILE_FEEDBACK 
					if ( iTouchFeedBack && ( iIsMarkTapped || iIsIconOrDisplayTapped ))
	                	{
			            iTouchFeedBack->InstantFeedback( ETouchFeedbackBasic );
	                	}
#endif /* RD_TACTILE_FEEDBACK  */	
				
//				TRect progressBarRect(iCutVideoBar->ProgressBarRect());	
				// check if the pen goes down inside the progress bar				
//				if( progressBarRect.Contains( aPointerEvent.iPosition ) )
//					{
//					iIsMarkDrag = EFalse;					
//					}
				break;
				}
			case TPointerEvent::EDrag:
				{
				if (iIsMarkTapped)
					{
					TRect touchRect(iCutVideoBar->ProgressBarRect());
					TRect smallRect(iCutVideoBar->EndMarkRect());
					TInt pressPoint = aPointerEvent.iPosition.iX;
					TBool dragMarks = ETrue;
					if (iTappedMark == EStartMark)
						{
							pressPoint += iCutVideoBar->StartMarkRect().Width()/2;
						}
					if (iTappedMark == EEndMark)
						{
							pressPoint -= iCutVideoBar->StartMarkRect().Width()/2;
						}
					if (iTappedMark == EPlayHead)
						{
							smallRect = iCutVideoBar->PlayHeadRect();
							dragMarks = EFalse;
						}
					touchRect.iTl.iY = smallRect.iTl.iY;
					touchRect.iBr.iY = smallRect.iBr.iY;
					HandleProgressBarTouchL( touchRect, 
											 pressPoint,
											 dragMarks,
											 iTappedMark );
					iIsMarkDrag = ETrue;
					}
				break;		
				}
			case TPointerEvent::EButton1Up:
				{
				// pen up event is handled if it wasn't dragged
//				if (!iIsMarkDrag)
				if (0)
					{
					TRect progressBarRect(iCutVideoBar->ProgressBarRect());					
					// Check if pressed position is in progress bar's rect
					if( progressBarRect.Contains( aPointerEvent.iPosition ) )
						{
						HandleProgressBarTouchL( progressBarRect, 
											 aPointerEvent.iPosition.iX,
											 EFalse);
						}
					}
				
				if ((iDisplayRect.Contains(aPointerEvent.iPosition) && 
				    iDisplayRect.Contains(iButtonDownPoint)) ||
					(iIconDisplayRect.Contains(aPointerEvent.iPosition) && 
				    iIconDisplayRect.Contains(iButtonDownPoint)))
				    {			        	        
				    HandleVideoClickedL();
				    }
				    iCutVideoBar->SetPressedComponent( CVeiCutterBar::ENoPressedIcon );
				    DrawDeferred();
				break;
				}		
			default:
				{
				break;	
				}	
			}
		}	
	LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::HandlePointerEventL(): Out");		
	}


// ----------------------------------------------------------------------------
// CVeiSimpleCutVideoContainer::HandleProgressBarTouchL
// 
// ----------------------------------------------------------------------------
//	
void CVeiSimpleCutVideoContainer::HandleProgressBarTouchL( TRect aPBRect, 
												 TInt aPressedPoint,
												 TBool aDragMarks,
												 CVeiSimpleCutVideoContainer::TCutMark aCutMark )
	{
	if ( (AknLayoutUtils::PenEnabled()) && ( iState!=EStateInitializing ))
		{	
		LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::HandleProgressBarTouchL(): In");

		if (iState == EStatePlaying)		
			{
			PauseL();	
			}
		
		// Progress Bar start and end points, and length
		TInt pbEndPoint( aPBRect.iBr.iX );
		TInt pbStartPoint = ( aPBRect.iTl.iX );		
		TInt totalPBLength( pbEndPoint - pbStartPoint );
				
		// calculate the time position from the tapped progress bar coordinates 
		TTimeIntervalMicroSeconds newPosition( 
										( ( aPressedPoint - pbStartPoint ) * 
							  			iVideoClipInfo->Duration().Int64() ) / 
							  			totalPBLength );
		if (newPosition >= iVideoClipInfo->Duration())
			{
			newPosition = TTimeIntervalMicroSeconds( iVideoClipInfo->Duration().Int64() - 1 );
			}
		if (newPosition <= 0)
			{
			newPosition = 0;
			}

		TBool movePlayhead = ETrue;
		
		// move cut marks
		if (aDragMarks)
			{
			movePlayhead = EFalse;
			//one sec buffer:
			const TUint markBuffer = ((KMinCutVideoLength *  totalPBLength) / iVideoClipInfo->Duration().Int64());
			// check that the start mark doesn't go past the end mark - 1 sec buffer
			// and not to the beginning	
			if ((aCutMark == EStartMark) && 
			    (newPosition.Int64() >= 0) &&
				(aPressedPoint < (iCutVideoBar->EndMarkPoint() - markBuffer ) /*- 2*iCutVideoBar->EndMarkRect().Width()*/))
				{				
				iView.MoveStartOrEndMarkL(newPosition, EStartMark);				
				iCutVideoBar->SetInPoint( newPosition );
				movePlayhead = ETrue;
				}
			// check that the end mark doesn't go before the start mark - +1 sec buffer
			// and not too close to the beginning			
			else if ((aCutMark == EEndMark) && 
				(newPosition.Int64() >= KMinCutVideoLength) &&			
				(aPressedPoint > (iCutVideoBar->StartMarkPoint() + markBuffer)/* + 2*iCutVideoBar->StartMarkRect().Width()*/))                
				{				
				iView.MoveStartOrEndMarkL(newPosition, EEndMark);				
				iCutVideoBar->SetOutPoint( newPosition );
				movePlayhead = ETrue;
				}
			}
				
		// move playhead
//		else if (( newPosition != iLastPosition ) && !aDragMarks)
		if (( newPosition != iLastPosition ) && movePlayhead)
			{
			iLastPosition = newPosition;

			iSeekPos = TTimeIntervalMicroSeconds( newPosition );

			iCutVideoBar->SetCurrentPoint( (static_cast<TInt32>(iSeekPos.Int64() / 1000)));
			iVideoDisplay->SetPositionL( iSeekPos );
			GetThumbAtL( iSeekPos );
					
			iView.UpdateTimeL();
			}	
		
		iView.UpdateCBAL(iState);
		LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::HandleProgressBarTouchL(): Out");
			
		}// PenEnabled
		
	}


void CVeiSimpleCutVideoContainer::PlayL( const TDesC& aFilename )
	{
	LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::PlayL: in");
	iVideoDisplay->SetPositionL( iSeekPos );
	
	if (iVideoClipInfo && !iFrameReady)
		{								
		iVideoClipInfo->CancelFrame();
		}
	iVideoDisplay->PlayL( aFilename );
	LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::PlayL: out");
	}

void CVeiSimpleCutVideoContainer::PlayMarkedL( const TDesC& aFilename,
									const TTimeIntervalMicroSeconds& aStartTime, 
									const TTimeIntervalMicroSeconds& aEndTime )
	{
	LOGFMT3(KVideoEditorLogFile, "CVeisimpleCutVideoContainer::PlayMarkedL, In, aStartTime:%Ld, aEndTime:%Ld, aFilename:%S", aStartTime.Int64(), aEndTime.Int64(), &aFilename);
	iPlayOrPlayMarked = ETrue;

	if (iVideoClipInfo && !iFrameReady)
		{								
		iVideoClipInfo->CancelFrame();
		}
	iVideoDisplay->PlayL( aFilename, aStartTime, aEndTime );
	LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::PlayMarkedL, Out");
	}

void CVeiSimpleCutVideoContainer::StopL()
	{
	LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::StopL, in");
	iVideoDisplay->Stop( EFalse );

	iSeekPos = TTimeIntervalMicroSeconds( 0 );
	
	// When adding a new video clip after saving, PlaybackPositionL() 
	// returns a value > 0 eventhough the playhead is in the beginning
	// so iLastPosition has to be set to the beginning.
	iLastPosition = TTimeIntervalMicroSeconds( 0 ); 
    
	SetStateL( EStateStopped );
	PlaybackPositionL();
	
	if (iVideoBarTimer)
		{		
		iVideoBarTimer->Cancel();
		}
	
	iCutVideoBar->SetFinishedStatus( ETrue );
	LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::StopL, in");
	}


void CVeiSimpleCutVideoContainer::TakeSnapshotL()
	{
	LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::TakeSnapshotL in");
	
	if( !iVideoClipInfo || !iFrameReady )
		{
		LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::TakeSnapshotL: 1");
		if (!iFrameReady)
			{
			iTakeSnapshotWaiting = ETrue;	
			}		
		return;
		}
		
	iTakeSnapshotWaiting = EFalse;	
	iTakeSnapshot = ETrue;
	const TTimeIntervalMicroSeconds& pos = PlaybackPositionL();

	GetThumbAtL( pos );
	LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::TakeSnapshotL out");
	}

void CVeiSimpleCutVideoContainer::PauseL( TBool aUpdateCBA )
	{
	LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::PauseL: In");

	if (EStatePlaying == iState)
		{		
		iLastPosition = iVideoDisplay->PositionL();					
		iSeekPos = iLastPosition;
		// to set next start point
		iVideoDisplay->SetPositionL(iSeekPos);
		}

	iVideoDisplay->PauseL();
	if (iVideoBarTimer)
		{		
		iVideoBarTimer->Cancel();
		}

	#ifdef GET_PAUSE_THUMBNAIL
	GetThumbAtL( iLastPosition );
	#endif

	if (EStateStoppedInitial == iState || EStateStopped == iState) 
		{
		// just to trigger cba-update
		SetStateL( iState, aUpdateCBA );
		}	
	else if (EStateInitializing != iState) 
		{
		SetStateL( EStatePaused, aUpdateCBA );
		}
	else
		{
		SetStateL( EStateStoppedInitial );
		}
			
	LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::PauseL: Out");
	}

void CVeiSimpleCutVideoContainer::SaveSnapshotL()
	{
	LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::SaveSnapshotL: In");	

    if (LaunchSavingDialogsL())
        {		
        //first we have to encode bitmap
        // get encoder types 
        RImageTypeDescriptionArray imageTypes; 
        iConverter->GetEncoderImageTypesL( imageTypes );	

        CleanupStack::PushL( TCleanupItem( CleanupRarray, &imageTypes ) );

        TInt selectedIdx = 0;

        for( TInt i=0; i<imageTypes.Count(); i++ ) 
        	{
        	if ( imageTypes[i]->Description() == KEncoderType )
        		{
        		selectedIdx = i;
        		}
        	}

        //for cancellation
        if ( iSaveToFileName )
        	{
        	delete iSaveToFileName;
        	iSaveToFileName = NULL;
        	}
        iSaveToFileName = HBufC::NewL( iSnapshotFileName.Length() );
        *iSaveToFileName = iSnapshotFileName;

        // request the actuall save/encode
        // asynchronous, the result is reported via callback NotifyCompletion
        LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::SaveSnapshotL: 1, calling iConverter->StartToEncodeL");	
        iConverter->StartToEncodeL( iSnapshotFileName, 
        	imageTypes[selectedIdx]->ImageType(), imageTypes[selectedIdx]->SubType());

        CleanupStack::PopAndDestroy( &imageTypes );
        LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::SaveSnapshotL: Out");	

        ShowProgressNoteL();		            
        }
	}


TBool CVeiSimpleCutVideoContainer::LaunchSavingDialogsL()
    {
   	TBool ret = EFalse;	
	RFs	fs = CCoeEnv::Static()->FsSession();
	
	iSnapshotFileName.Zero();
	iSnapshotFileName.Append( iView.Settings().DefaultSnapshotName() );
    iSnapshotFileName.Append( _L(".JPEG") );	
    
    // Multiple drive support
#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 ))
		{
		driveAndPath.Append( PathInfo::ImagesPath() );
			        
        iSnapshotFileName.Insert(0,driveAndPath);

		// Generate a default name for the new file
		CApaApplication::GenerateFileName( fs, iSnapshotFileName );	
				
		// launch file name prompt dialog
		if (CAknFileNamePromptDialog::RunDlgLD(iSnapshotFileName, driveAndPath, KNullDesC))
			{
			driveAndPath.Append(iSnapshotFileName);
			iSnapshotFileName = driveAndPath;
            ret = ETrue;
            }
		else
			{
			iTakeSnapshot = EFalse;
			iTakeSnapshotWaiting = EFalse;
			}
		}
	else
		{
		iTakeSnapshot = EFalse;
		iTakeSnapshotWaiting = EFalse;
		}
	CleanupStack::PopAndDestroy( multiDriveDlg ); 
#else // no multiple drive support
	CAknMemorySelectionDialog::TMemory selectedMemory(CAknMemorySelectionDialog::EPhoneMemory);		
	// launch "Select memory" query
	if (CAknMemorySelectionDialog::RunDlgLD(selectedMemory))
		{
		// create path for the image	
		TFileName driveAndPath;        		
		if (selectedMemory == CAknMemorySelectionDialog::EPhoneMemory)
			{
			driveAndPath.Copy( PathInfo::PhoneMemoryRootPath() );
			driveAndPath.Append( PathInfo::ImagesPath() );							
			}
		else if (selectedMemory == CAknMemorySelectionDialog::EMemoryCard)
			{	
			driveAndPath.Copy( PathInfo::MemoryCardRootPath() );
			driveAndPath.Append( PathInfo::ImagesPath() );							
			}        				 
        
        iSnapshotFileName.Insert(0,driveAndPath);

        // Generate a default name for the new file
        CApaApplication::GenerateFileName( fs, iSnapshotFileName );					
        
		// launch file name prompt dialog
		if (CAknFileNamePromptDialog::RunDlgLD(iSnapshotFileName, driveAndPath, KNullDesC))
			{
			driveAndPath.Append(iSnapshotFileName);
			iSnapshotFileName = driveAndPath;
            ret = ETrue;
            }
		else
			{
			iTakeSnapshot = EFalse;
			iTakeSnapshotWaiting = EFalse;
			}
		}
	else
		{
		iTakeSnapshot = EFalse;
		iTakeSnapshotWaiting = EFalse;
		}
#endif
	return ret;
    }

void CVeiSimpleCutVideoContainer::CancelSnapshotSave()
	{
	LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::CancelSnapshotSave: in");
	if ( iConverter )
		{
		LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::CancelSnapshotSave: 1");
		iConverter->Cancel();
		iConverter->CancelEncoding(); //also close the file
		}
	if ( iSaveToFileName )
		{
		LOGFMT(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::CancelSnapshotSave: 2, iSaveToFileName:%S", iSaveToFileName);

		RFs&	fs = iEikonEnv->FsSession(); 
		/*TInt result =*/ fs.Delete( *iSaveToFileName ); 
		delete iSaveToFileName;
		iSaveToFileName = NULL;
		}
	LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::CancelSnapshotSave: out");	
	}

void CVeiSimpleCutVideoContainer::CloseStreamL()
	{
	LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::CloseStreamL, in");
	if( !iFrameReady && iVideoClipInfo )
		{
		iVideoClipInfo->CancelFrame();
		}
	PlaybackPositionL();
	iState = EStateStopped;
	iView.UpdateCBAL(iState);
	
	iVideoDisplay->Stop( ETrue );
	LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::CloseStreamL, out");
	}

void CVeiSimpleCutVideoContainer::SetInTime( const TTimeIntervalMicroSeconds& aTime )
	{
	if ( iCutTimeDisplay )
		{
		iCutTimeDisplay->SetCutIn( aTime );
		}
	if ( iCutVideoBar )
		{
		iCutVideoBar->SetInPoint( aTime );
		}
	}

void CVeiSimpleCutVideoContainer::SetOutTime( const TTimeIntervalMicroSeconds& aTime )
	{
	if ( iCutTimeDisplay )
		{
		iCutTimeDisplay->SetCutOut( aTime );
		}
	if ( iCutVideoBar )
		{
		iCutVideoBar->SetOutPoint( aTime );
		}
	}

TTimeIntervalMicroSeconds CVeiSimpleCutVideoContainer::PlaybackPositionL()
	{
	if ( ( iSeeking ) || ( EStateStopped == iState ) )
		{
		return iSeekPos;
		}
	if ( iState != EStatePlaying  )
		{
		return iLastPosition;
		}

	if ( iVideoClipInfo && (iVideoDisplay->PositionL() < iVideoClipInfo->Duration()) )
		{
		iLastPosition = iVideoDisplay->PositionL();
		}

	if ( ( iLastPosition == TTimeIntervalMicroSeconds( 0 ) ) &&
		 ( iSeekPos != TTimeIntervalMicroSeconds( 0 ) ) )
		{
		return iSeekPos;
		}

	return iLastPosition;
	}

TKeyResponse CVeiSimpleCutVideoContainer::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)
	{
	if ( aType == EEventKeyDown ) 
		{
		iKeyRepeatCount = 0;
		if(aKeyEvent.iScanCode == EStdKeyDevice7) //for camera key
			{
			PauseL(ETrue);
			}
		TBool shiftKeyPressed = (aKeyEvent.iModifiers & EModifierShift );
		if( shiftKeyPressed )
			{
			if( iView.IsEnoughFreeSpaceToSaveL() && (iTakeSnapshot == EFalse )) 
				{
				/*if (EStatePlaying == iState)
					{
					PauseL();	
					}
				*/	
				TakeSnapshotL();
				}
			return EKeyWasConsumed;
			}	

		return EKeyWasNotConsumed;
		}
	else if ( aType == EEventKeyUp ) 
		{
		if ( iSeeking == EFalse )
			{
			return EKeyWasNotConsumed;
			}
		iLastPosition = iSeekPos;
		iVideoDisplay->SetPositionL( iSeekPos );

		iSeeking = EFalse;

		if ( ( ( EStateStopped == iState ) || ( EStateStoppedInitial == iState )
			|| ( EStatePaused == iState )) && 
			 ( ( iLastKeyCode == EKeyLeftArrow ) || ( iLastKeyCode == EKeyRightArrow ) ) )
			{
			LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::OfferKeyEventL: 1, calling GetThumbAtL()");
			GetThumbAtL( iSeekPos );
			return EKeyWasConsumed;
			}
		else if ( EStatePlaying == iState )
			{
			if ( iVideoBarTimer->IsActive() )
				{
				iVideoBarTimer->Cancel();
				}

			if ( iVideoClipInfo &&  (iSeekPos >= iVideoClipInfo->Duration()) )
				{
				LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::OfferKeyEventL: 2, calling iVideoDisplay->Stop");
				iVideoDisplay->Stop( EFalse );
				}
			else
				{
				iVideoDisplay->SetPositionL( iSeekPos );
				iVideoDisplay->ShowBlackScreen();
				if (iVideoClipInfo && !iFrameReady)
					{								
					iVideoClipInfo->CancelFrame();
					}
				iVideoDisplay->Play();
				}
			return EKeyWasConsumed;
			}
		else
			{
			return EKeyWasConsumed;
			}
		}
	else if ( aType == EEventKey )
		{
		iLastKeyCode = aKeyEvent.iCode;

		switch (aKeyEvent.iCode)
			{
			case EKeyEnter:
				{
			    if ( EStateStoppedInitial == iState )
					{
			        iView.HandleCommandL( EVeiCmdCutVideoViewPlay );
					}
				else
					{
					if ( EStatePlaying == iState || EStatePlayingMenuOpen == iState )
						{		
						PauseL();	
						}
					iView.ProcessCommandL( EAknSoftkeyOptions );
					}
				return EKeyWasConsumed;
				}
			case EKeyOK:
				{
				iView.HandleCommandL( EAknSoftkeyOk );
				return EKeyWasConsumed;
				}
			case EKeyDownArrow:
			case EKeyUpArrow:
				{
				iVideoDisplay->OfferKeyEventL( aKeyEvent, aType );
				return EKeyWasConsumed;
				}
			case EKeyRightArrow:
				{
				iKeyRepeatCount++;

				if ( (iKeyRepeatCount > 2)	&& (iSeeking == EFalse) )
					{
					if ( EStatePlaying == iState )
						{
						iSeekPos = iVideoDisplay->PositionL();
						}
	
					iVideoDisplay->PauseL();
					iSeeking = ETrue;
					iKeyRepeatCount = 0;				
					}

				if ( iSeeking && ( iState!=EStateInitializing ) &&
					( iState!=EStatePlayingMenuOpen ) )
					{
					TInt adjustment = TimeIncrement( iKeyRepeatCount );

					TInt64 newPos = iSeekPos.Int64() + adjustment;
					if ( iVideoClipInfo && (newPos > iVideoClipInfo->Duration().Int64()) )
						{
						newPos = iVideoClipInfo->Duration().Int64();
						}
	
					iSeekPos = TTimeIntervalMicroSeconds( newPos );
					
					iCutVideoBar->SetCurrentPoint( (static_cast<TInt32>(iSeekPos.Int64() / 1000)));

					iView.UpdateTimeL();
					return EKeyWasConsumed;
					}
				return EKeyWasNotConsumed;
				}

			case EKeyLeftArrow:
				{
				iKeyRepeatCount++;

				if ( (iKeyRepeatCount > 2)	&& (iSeeking == EFalse) )
					{
					
					if ( EStatePlaying == iState )
						{
						iSeekPos = iVideoDisplay->PositionL();
						}

					iVideoDisplay->PauseL();
					iSeeking = ETrue;
					iKeyRepeatCount = 0;				
					}

				if ( iSeeking && ( iState!=EStateInitializing ) &&
					( iState!=EStatePlayingMenuOpen ) )
					{

					TInt adjustment = TimeIncrement( iKeyRepeatCount );

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

					iCutVideoBar->SetCurrentPoint( static_cast<TInt32>((iSeekPos.Int64() / 1000)) );

					iView.UpdateTimeL();

					return EKeyWasConsumed;
					}
				return EKeyWasNotConsumed;
		        }
			case EKeyBackspace:		//Clear 
				{
				if (EStatePlaying != iState)
					{
					iView.ClearInOutL( ETrue, ETrue );						
					}
				
				return EKeyWasConsumed;
				}
			default:
			    {
				return EKeyWasNotConsumed;
		        }
			}
		}
	else
		{
		return EKeyWasNotConsumed;
		}
	}

TInt CVeiSimpleCutVideoContainer::TimeIncrement(TInt aKeyCount) const
	{
	if ( aKeyCount < 3 )
		{
		return 100000;
		}
	else if ( aKeyCount < 4 )
		{
		return 300000;
		}
	else if ( aKeyCount < 5 )
		{
		return 500000;
		}
	else if ( aKeyCount < 10 )
		{
		return 1000000;
		}
	else if ( aKeyCount < 13 )
		{
		return 2000000;
		}
	else if ( aKeyCount < 15 )
		{
		return 3000000;
		}
	else
		{
		return 5000000;
		}	
	}

TInt CVeiSimpleCutVideoContainer::UpdateProgressNote()
    {
    TTime intervalTime;
    intervalTime.HomeTime();
    intervalTime += TTimeIntervalMicroSeconds( 50000 );
    TTime currentTime;
    currentTime.HomeTime();
    while ( intervalTime > currentTime )
        {
        currentTime.HomeTime();
        }

    iProgressDialog->GetProgressInfoL()->IncrementAndDraw( 1 );

    if ( KProgressbarFinalValue <= iProgressDialog->GetProgressInfoL()->CurrentValue() )
        {
        return 0;
        }
    return 1;
    }


void CVeiSimpleCutVideoContainer::GetThumbL( const TDesC& aFilename )
	{
	if ( iVideoClipInfo )
		{
		delete iVideoClipInfo;
		iVideoClipInfo = NULL;		
		}

	/*iVideoClipInfo = */CVedVideoClipInfo::NewL( aFilename, *this );
	}


void CVeiSimpleCutVideoContainer::GetThumbAtL( const TTimeIntervalMicroSeconds& aTime )
	{
	LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::GetThumbAtL: In");
	if( !iVideoClipInfo )
		{
		LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::GetThumbAtL: 1");
		return;
		}
	if ( !iFrameReady )
		{
		LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::GetThumbAtL: 1.5");
		iVideoClipInfo->CancelFrame();
		}

	TRect clipResolution = iVideoClipInfo->Resolution();
	TSize resolution( iVideoDisplay->Size() );

	TInt frameIndex;
	TInt totalFrameCount;

	frameIndex = iVideoClipInfo->GetVideoFrameIndexL( aTime );
	totalFrameCount = iVideoClipInfo->VideoFrameCount();

	if ( frameIndex > totalFrameCount )
		{
		frameIndex = totalFrameCount;
		}

	//Generates a thumbnail bitmap of the given frame from video clip
	if ( iTakeSnapshot )
		{
		LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::GetThumbAtL: 2");
		TDisplayMode displayMode = ENone;
		TBool enhance = EFalse;
		TSize resol( clipResolution.iBr.iX, clipResolution.iBr.iY ); 
    	/* :
	     check out on every phone before releasing whether videodisplay should be stopped before starting
	     asynchronous GetFrameL()
	     see how EStateGettingFrame is handled in SetPreviewState 
	     Stopping frees memory and it is needed in memory sensible devices 
	    */
		iVideoClipInfo->GetFrameL( *this, frameIndex, &resol ); //, displayMode, enhance );
		SetStateL( EStateGettingFrame );
		iFrameReady = EFalse;			
//		ShowProgressNoteL();		
		}
	else
		{
		LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::GetThumbAtL: 3");
		/* :
	     check out on every phone before releasing whether videodisplay should be stopped before starting
	     asynchronous GetFrameL()
	     see how EStateGettingFrame is handled in SetPreviewState 
	     Stopping frees memory and it is needed in memory sensible devices 
	    */
		TSize resol( clipResolution.iBr.iX, clipResolution.iBr.iY );
		iVideoClipInfo->GetFrameL( *this, frameIndex, &resol ); 
		SetStateL( EStateGettingFrame );
		iFrameReady = EFalse;		
		}
	LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::GetThumbAtL: out");	
	}

void CVeiSimpleCutVideoContainer::NotifyCompletion( TInt aErr ) 
	{
	LOGFMT(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::NotifyCompletion: In, aErr:%d", aErr);	

	if (EStateTerminating == iState)
		{
		LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::NotifyCompletion(): 1, app is closing...");
		return;
		}

    if ( KErrNone == aErr )
        {
        //Update notification to Media Gallery
        LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::NotifyCompletion: 2");

	    if (iProgressDialog)
		    {
		    TRAP_IGNORE(iProgressDialog->GetProgressInfoL()->SetAndDraw( KProgressbarFinalValue );
		    			iProgressDialog->ProcessFinishedL());
		    }
        }
    else
		{
		if (iProgressDialog)
			{
		    TRAP_IGNORE(iProgressDialog->GetProgressInfoL()->SetAndDraw( KProgressbarFinalValue );
		    			iProgressDialog->ProcessFinishedL());
		    }
		iErrorUI.ShowGlobalErrorNote( aErr );
		}

	//  to eliminate previous (wrong) output file from being deleted in CancelSnapshotSave()
	delete iSaveToFileName;
    iSaveToFileName = NULL;

	// to fix progress bar shadow
	DrawDeferred();

	LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::NotifyCompletion: Out");
	}

void CVeiSimpleCutVideoContainer::NotifyVideoClipInfoReady( CVedVideoClipInfo& aInfo, 
										  TInt aError )
	{
	LOGFMT(KVideoEditorLogFile, "CVeisimpleCutVideoContainer::NotifyVideoClipInfoReady, In, aError:%d", aError);
	if (KErrNone == aError)
		{
		if (iVideoClipInfo)		
			{
			delete iVideoClipInfo;
			iVideoClipInfo = NULL;	
			}
		iVideoClipInfo = &aInfo;	

		TRect clipResolution = iVideoClipInfo->Resolution();
		iDuration = iVideoClipInfo->Duration();
		iCutVideoBar->SetTotalDuration( iDuration );
		iView.DrawTimeNaviL();

		TSize resolution( clipResolution.iBr.iX, clipResolution.iBr.iY ); 
		iFrameReady = EFalse;
		iVideoClipInfo->GetFrameL( *this, 0, &resolution );
		}
	SetStateL( EStateStoppedInitial );			
	LOG(KVideoEditorLogFile, "CVeisimpleCutVideoContainer::NotifyVideoClipInfoReady, Out");
	}


void CVeiSimpleCutVideoContainer::NotifyVideoClipFrameCompleted(CVedVideoClipInfo& /*aInfo*/, 
											   TInt aError, 
							 				   CFbsBitmap* aFrame)
	{
	LOGFMT(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::NotifyVideoClipFrameCompleted, In, aError:%d", aError);
	iFrameReady = ETrue;
	
	if (EStateGettingFrame == iState)
		{
		SetStateL(iPreviousState);			
		}		
	
	if (KErrNone == aError && aFrame)
		{
		LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::NotifyVideoClipFrameCompleted 1");	

		if ( iTakeSnapshot )
			{
			LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::NotifyVideoClipFrameCompleted 2");			
			iConverter->SetBitmap( aFrame );
			if (! iCallBackSaveSnapshot)
				{		
				TCallBack cb (CVeiSimpleCutVideoContainer::AsyncSaveSnapshot, this);
				iCallBackSaveSnapshot = new (ELeave) CAsyncCallBack(cb, CActive::EPriorityStandard);
				}
			iCallBackSaveSnapshot->CallBack();
			LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::NotifyVideoClipFrameCompleted 3");
			}
		else
			{
			LOG(KVideoEditorLogFile, "CVeisimpleCutVideoContainer::NotifyVideoClipFrameCompleted 4");
			TRAP_IGNORE(iVideoDisplay->ShowPictureL( *aFrame ));
			delete aFrame;
			aFrame = NULL;
			
			if (iTakeSnapshotWaiting)
				{
				if (! iCallBackTakeSnapshot)
					{		
					TCallBack cb (CVeiSimpleCutVideoContainer::AsyncTakeSnapshot, this);
					iCallBackTakeSnapshot = new (ELeave) CAsyncCallBack(cb, CActive::EPriorityStandard);
					}
				iCallBackTakeSnapshot->CallBack();				
				}
			}
		}
	else
		{
		LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::NotifyVideoClipFrameCompleted 5");
		if (aFrame)	
			{
			delete aFrame;
			aFrame = NULL;	
			}
		
		if (iProgressDialog)
			{
			iProgressDialog->GetProgressInfoL()->SetAndDraw( KProgressbarFinalValue );
		    TRAP_IGNORE(iProgressDialog->ProcessFinishedL());
			}		
		}
	LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::NotifyVideoClipFrameCompleted, Out");	
	}

TInt CVeiSimpleCutVideoContainer::AsyncSaveSnapshot(TAny* aThis)
	{
    LOG( KVideoEditorLogFile, "CVeiSimpleCutVideoView::AsyncSaveSnapshot in");
	
    // 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.
	CVeiSimpleCutVideoContainer* container = static_cast<CVeiSimpleCutVideoContainer*>(aThis);
	TInt err = KErrNone;
	TRAP(err, container->SaveSnapshotL());
	LOGFMT( KVideoEditorLogFile, "CVeiEditVideoView::AsyncSaveSnapshot 2, err:%d", err);
	
	if (KErrNone != err)
		{
		container->StopProgressDialog();
		container->ShowGlobalErrorNote(err);
		}  
	LOG( KVideoEditorLogFile, "CVeiEditVideoView::AsyncSaveSnapshot 3, returning");
	return KErrNone;				
	}		
	
void CVeiSimpleCutVideoContainer::ShowGlobalErrorNote(const TInt aErr)
	{		
	iErrorUI.ShowGlobalErrorNote( aErr );
	}

void CVeiSimpleCutVideoContainer::StopProgressDialog()
	{
	if (iProgressDialog)
	    {
	    TRAP_IGNORE(iProgressDialog->GetProgressInfoL()->SetAndDraw( KProgressbarFinalValue );
	    			iProgressDialog->ProcessFinishedL());
	    }	
	}

void CVeiSimpleCutVideoContainer::NotifyVideoDisplayEvent( const TPlayerEvent aEvent, const TInt& aInfo )
	{
	LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::NotifyVideoDisplayEvent, In");
	
	if (EStateTerminating == iState)
		{
		LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::NotifyVideoDisplayEvent(): 1, app is closing...");
		return;
		}
	
	switch (aEvent)
		{
		case MVeiVideoDisplayObserver::ELoadingStarted:
			{	
			SetStateL(EStateOpening);
			LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::NotifyVideoDisplayEvent() MVeiVideoDisplayObserver::ELoadingStarted");
			break;
			}
		case MVeiVideoDisplayObserver::EOpenComplete:
			{
			LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::NotifyVideoDisplayEvent, MVeiVideoDisplayObserver::EOpenComplete 1");		
            iVideoDisplay->SetRotationL( EVideoRotationNone );
			TTimeIntervalMicroSeconds cutInTime = iView.GetVideoClipCutInTime();
			TTimeIntervalMicroSeconds cutOutTime = iView.GetVideoClipCutOutTime();

			if ( iView.IsForeground() )
				{				
				if (iVideoClipInfo && !iFrameReady)
					{								
					iVideoClipInfo->CancelFrame();
					}							
				if ( iPlayOrPlayMarked )
					{
					LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::NotifyVideoDisplayEvent, MVeiVideoDisplayObserver::EOpenComplete 2");					
					iVideoDisplay->PlayMarkedL( cutInTime, cutOutTime );
					}
				else
					{
					LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::NotifyVideoDisplayEvent, MVeiVideoDisplayObserver::EOpenComplete 3");	
					iVideoDisplay->Play();
					}
				iPlayOrPlayMarked = EFalse;				
				}
			else
				{
				LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::NotifyVideoDisplayEvent() MVeiVideoDisplayObserver::EOpenComplete 4");					
				PauseL();					
				}	
			break;
			}
		case MVeiVideoDisplayObserver::EBufferingStarted:
			{
			LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::NotifyVideoDisplayEvent() MVeiVideoDisplayObserver::EBufferingStarted");			
			SetStateL( EStateBuffering );
			if ( iVideoBarTimer )
                {
                iVideoBarTimer->Cancel();
                }
			break;
			}	
		case MVeiVideoDisplayObserver::ELoadingComplete:
			{
			LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::NotifyVideoDisplayEvent, MVeiVideoDisplayObserver::ELoadingComplete 1");
			// if VED is put to background in the middle of the buffering
			// iVideoDisplay->PauseL(); cannot be called during the buffering, so its called here
			if (EStatePaused == iState)
				{
				iVideoDisplay->PauseL();	
				}
			else
				{							
				SetStateL( EStatePlaying );						
				if (iVideoClipInfo && !iFrameReady)
					{								
					LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::NotifyVideoDisplayEvent, MVeiVideoDisplayObserver::ELoadingComplete 2");
					iVideoClipInfo->CancelFrame();
					}
				if ( !iVideoBarTimer->IsActive() )
					{
					LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::NotifyVideoDisplayEvent, MVeiVideoDisplayObserver::ELoadingComplete 3");				
					const TUint delay = 100000;
					iVideoBarTimer->Start( delay, delay, TCallBack( CVeiSimpleCutVideoContainer::DoAudioBarUpdate, this ) );
					}
				iVideoDisplay->ShowBlackScreen();			
				DrawDeferred();
				}
			break;
			}
		case MVeiVideoDisplayObserver::EPlayComplete:
			{
			LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::NotifyVideoDisplayEvent, MVeiVideoDisplayObserver::EPlayComplete");
			iVideoDisplay->SetBlackScreen( EFalse );			
			iSeekPos = TTimeIntervalMicroSeconds( 0 );

			iLastPosition = TotalLength();
			iView.StopNaviPaneUpdateL();
			iCutVideoBar->SetFinishedStatus( ETrue );
			
			if (iVideoBarTimer)
				{
				iVideoBarTimer->Cancel();	
				}			

			GetThumbAtL(0);
			iVideoDisplay->Stop( ETrue );
			SetStateL( EStateStopped );
			
			if (KErrNoMemory == aInfo || KErrSessionClosed == aInfo)
				{
				iErrorUI.ShowGlobalErrorNote( aInfo );					
				StopL();
				CloseStreamL();
				}

			DrawDeferred();
			break;
			}
		case MVeiVideoDisplayObserver::EStop:
			{
			LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::NotifyVideoDisplayEvent() MVeiVideoDisplayObserver::EStop");
			
			if (EStateGettingFrame == iState)
	            {
	            break;	
	            }	           
			
			if ( iVideoBarTimer )
                {                
                iVideoBarTimer->Cancel();
                }
			iSeekPos = TTimeIntervalMicroSeconds( 0 );

			GetThumbAtL(0);
			iLastPosition = TotalLength();
			iView.StopNaviPaneUpdateL();
			iCutVideoBar->SetFinishedStatus( ETrue );
			iVideoDisplay->Stop( ETrue );
			SetStateL( EStateStopped );
			DrawDeferred();
			break;
			}																
		case MVeiVideoDisplayObserver::EVolumeLevelChanged:
			{
			LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::NotifyVideoDisplayEvent, MVeiVideoDisplayObserver::EVolumeLevelChanged");
			TInt playerVolume = iVideoDisplay->Volume();
			iView.ShowVolumeLabelL( playerVolume );
			break;
			}
		case MVeiVideoDisplayObserver::EError:
			{
			LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::NotifyVideoDisplayEvent() MVeiVideoDisplayObserver::EError");
//			iErrorUI.ShowGlobalErrorNoteL( KErrGeneral );
			SetStateL( EStateStoppedInitial );
			break;
			}	
		default:
			{
			LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::NotifyVideoDisplayEvent, MVeiVideoDisplayObserver::default");
			break;
			};
		}
	LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::NotifyVideoDisplayEvent, Out");
	}


void CVeiSimpleCutVideoContainer::SetStateL(CVeiSimpleCutVideoContainer::TCutVideoState aState, TBool aUpdateCBA)
	{
	LOGFMT2(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::SetStateL: in, iState:%d, aState:%d", iState, aState);
	if (EStateGettingFrame == aState)
		{
		iPreviousState = iState;	
		}
		
	iState = aState;
	if (EStatePaused == iState)
		{
		DrawNow();	
		}

	// If the foreground is lost while an arrow key is down, we do not get
	// the key up -event, and iSeeking remains true. Reseting it here just in case.
	iSeeking = EFalse;

	if ( aUpdateCBA )
		{
		iView.UpdateCBAL( iState );
		}

	//#ifdef STOP_PLAYER_DURING_GETFRAME
	if (EStateGettingFrame == aState)
		{
		/* :
	     check out on every phone before releasing whether videodisplay should be stopped before starting
	     asynchronous GetFrameL()
	     see how EStateGettingFrame is handled in SetPreviewState 
	     Stopping frees memory and it is needed in memory sensible devices 
	    */	
		//iVideoDisplay->Stop(ETrue);		    		
		}
	//#endif	

	LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::SetStateL:: out");
	}


void CVeiSimpleCutVideoContainer::MarkedInL()
	{
	LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::MarkedInL, In");
	if ( EStateInitializing == iState )
		{
		return;
		}
	const TTimeIntervalMicroSeconds& position = PlaybackPositionL();
	iSeekPos = position;

	LOGFMT(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::MarkedInL, 2, setting cutINpoint:%Ld", position.Int64());
	iCutVideoBar->SetInPoint( position	);
	TInt tempPos = static_cast<TInt32>((position.Int64()/1000));
	iCutVideoBar->SetCurrentPoint( tempPos );

	if( !AknLayoutUtils::PenEnabled() )
		{
		iCutTimeDisplay->SetCutIn( position );
		}

	PauseL();
	LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::MarkedInL, Out");
	}

void CVeiSimpleCutVideoContainer::MarkedOutL()
	{
	LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::MarkedOutL, In");
	if ( EStateInitializing == iState )
		{
		return;
		}
	const TTimeIntervalMicroSeconds& position = PlaybackPositionL();
	iSeekPos = position;

	LOGFMT(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::MarkedOutL, 2, setting cutOUTpoint:%Ld", position.Int64());
	iCutVideoBar->SetOutPoint( position );
	TInt tempPos = static_cast<TInt32>((position.Int64()/1000));
	iCutVideoBar->SetCurrentPoint( tempPos );

	if( !AknLayoutUtils::PenEnabled() )
		{
		iCutTimeDisplay->SetCutOut( position );
		}

	PauseL();
	LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::MarkedOutL, Out");
	}

void CVeiSimpleCutVideoContainer::ShowInformationNoteL( const TDesC& aMessage ) const
	{
	CAknInformationNote* note = new ( ELeave ) CAknInformationNote( ETrue );
	note->ExecuteLD( aMessage );
	}

void CVeiSimpleCutVideoContainer::ShowProgressNoteL() 
	{
	LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::ShowProgressNoteL, in");
	iProgressDialog = new ( ELeave ) CAknProgressDialog( REINTERPRET_CAST( CEikDialog**, 
					&iProgressDialog ), ETrue);
    iProgressDialog->SetCallback( this );
    iProgressDialog->PrepareLC( R_VEI_PROGRESS_NOTE_WITH_CANCEL );

	HBufC* stringholder;
    TApaAppCaption caption;
    TRAPD( err, 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_SAVING_IMAGE, caption, iEikonEnv );
        }        

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

    iProgressDialog->GetProgressInfoL()->SetFinalValue( KProgressbarFinalValue );
    iProgressDialog->RunLD();

	iProgressDialog->GetProgressInfoL()->SetAndDraw( 50 );
	LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::ShowProgressNoteL, Out");
	}

//=============================================================================
void CVeiSimpleCutVideoContainer::ResolveCaptionNameL( TApaAppCaption& aCaption ) const
    {   
    RApaLsSession appArcSession;
    CleanupClosePushL( appArcSession );
    User::LeaveIfError( appArcSession.Connect() );       	    

    // Get Media Gallery caption
    TApaAppInfo appInfo;
    User::LeaveIfError( appArcSession.GetAppInfo( appInfo, TUid::Uid( KMediaGalleryUID3 ) ) );

    aCaption = appInfo.iCaption;

    CleanupStack::PopAndDestroy( &appArcSession );  
    }

TInt CVeiSimpleCutVideoContainer::DoAudioBarUpdate( TAny* aThis )
	{
	STATIC_CAST( CVeiSimpleCutVideoContainer*, aThis )->DoUpdate();
	return 42;
	}

void CVeiSimpleCutVideoContainer::DoUpdate()
	{
	TTimeIntervalMicroSeconds time;
	time = iVideoDisplay->PositionL();
	if ( iSeeking )
		{
		time = iSeekPos;
		LOGFMT(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::DoUpdate(): 1, time:%Ld", time.Int64());
		}
	else
		{			
		LOGFMT(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::DoUpdate(): 2, time:%Ld", time.Int64());
		}
	iCutVideoBar->SetCurrentPoint( static_cast<TInt32>((time.Int64() / 1000)));
	iCutVideoBar->DrawDeferred();
	}
void CVeiSimpleCutVideoContainer::MuteL()
	{
	iVideoDisplay->SetMuteL( ETrue );
	}

//=============================================================================
void CVeiSimpleCutVideoContainer::HandleVolumeUpL()
	{
	LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::HandleVolumeUpL: in");

	iVideoDisplay->AdjustVolumeL( 1 );

	LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::HandleVolumeUpL: out");
	}
	
	
void CVeiSimpleCutVideoContainer::SetVolumeLevelL( TInt aVolume )
    {
    iVideoDisplay->AdjustVolumeL( aVolume - iVideoDisplay->Volume() );
    }	

//=============================================================================
void CVeiSimpleCutVideoContainer::HandleVolumeDownL()
	{
	LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::HandleVolumeDownL: in");

	iVideoDisplay->AdjustVolumeL( -1 );

	LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::HandleVolumeDownL: out");
	}

//=============================================================================
void CVeiSimpleCutVideoContainer::PrepareForTerminationL()
	{
	LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::PrepareForTerminationL: in");

	SetStateL( EStateTerminating );

	if( !iFrameReady && iVideoClipInfo )
		{
		iVideoClipInfo->CancelFrame();
		}
	iState = EStateTerminating;
	iVideoDisplay->Stop( ETrue );

	LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::PrepareForTerminationL: out");
	}

TInt CVeiSimpleCutVideoContainer::AsyncTakeSnapshot(TAny* aThis)
	{
    LOG( KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::AsyncTakeSnapshot");
	
    // 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.
	CVeiSimpleCutVideoContainer* container = static_cast<CVeiSimpleCutVideoContainer*>(aThis);
	TInt err = KErrNone;
	TRAP(err, container->TakeSnapshotL());
	LOGFMT( KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::AsyncTakeSnapshot 1, err:%d", err);	
	User::LeaveIfError(err);		
	return KErrNone;				
	}

void CVeiSimpleCutVideoContainer::HandleVideoClickedL()
    {
    LOG(KVideoEditorLogFile, "CVeiSimpleCutVideoContainer::HandleVideoClickedL");

    if ( EStatePlaying != iState && EStatePlayingMenuOpen != iState )
		{
        iView.HandleCommandL( EVeiCmdCutVideoViewPlay );
		}
	else if ( EStatePlaying == iState || EStatePlayingMenuOpen == iState )
		{		
		PauseL();	
//        iView.HandleCommandL( EVeiCmdCutVideoViewStop );
		}
    }

void CVeiSimpleCutVideoContainer::FocusChanged( TDrawNow /*aDrawNow*/ )
	{
	if (IsFocused())
		{
		DrawDeferred();
		}
	}
// End of File