diff -r 61bc0f252b2b -r bac7acad7cb3 camerauis/cameraapp/generic/src/CamBurstThumbnailView.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/camerauis/cameraapp/generic/src/CamBurstThumbnailView.cpp Wed Sep 01 12:30:54 2010 +0100 @@ -0,0 +1,1172 @@ +/* +* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: View class to display a thumbnail grid after burst capture* +*/ + + +// INCLUDE FILES + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // AknLayoutScalable_Apps +//#include +#include // CAknInformationNote +#include // CAknToolbar +#include +#include // EikSoftkeyPostingTransparency + +#include "CamAppUi.h" +#include "CamUtility.h" +//#include "camproductvariant.h" +#include "CamBurstThumbnailView.h" +#include "CamAppUiBase.h" +#include "CamBurstThumbnailContainer.h" +#include "Cam.hrh" +#include "CamBurstThumbnailGridModel.h" +#include "CamBurstThumbnailGrid.h" +#include "CamBurstCaptureArray.h" +#include "camoneclickuploadutility.h" +#include "CameraUiConfigManager.h" +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "CamBurstThumbnailViewTraces.h" +#endif + + + +//CONSTANTS +_LIT( KCamImageMimeType, "image/jpeg" ); + +// ========================= MEMBER FUNCTIONS ================================ + +// --------------------------------------------------------------------------- +// CCamBurstThumbnailView::NewLC +// Symbian OS two-phased constructor +// --------------------------------------------------------------------------- +// +CCamBurstThumbnailView* CCamBurstThumbnailView::NewLC( CCamAppController& aController ) + { + CCamBurstThumbnailView* self = + new( ELeave ) CCamBurstThumbnailView( aController ); + + CleanupStack::PushL( self ); + self->ConstructL(); + + return self; + } + +// --------------------------------------------------------------------------- +// CCamBurstThumbnailView destructor +// +// --------------------------------------------------------------------------- +// +CCamBurstThumbnailView::~CCamBurstThumbnailView() + { + PRINT( _L("Camera => ~CCamBurstThumbnailView") ); + // Free some space by deleting the model + delete iGridModel; + + // NOTE: iAiwServiceHandler owned and deleted by base class + PRINT( _L("Camera <= ~CCamBurstThumbnailView") ); + } + +// --------------------------------------------------------------------------- +// CCamBurstThumbnailView::Id +// Returns UID of view +// --------------------------------------------------------------------------- +// +TUid CCamBurstThumbnailView::Id() const + { + return TUid::Uid( ECamViewIdBurstThumbnail ); + } + + +// --------------------------------------------------------------------------- +// CCamBurstThumbnailView::DynInitMenuPaneL +// Changes MenuPane dynamically +// --------------------------------------------------------------------------- +// +void CCamBurstThumbnailView::DynInitMenuPaneL( TInt aResourceId, CEikMenuPane* aMenuPane ) + { + PRINT( _L("Camera => CCamBurstThumbnailView::DynInitMenuPaneL")) + + // initializes the aiw service parameters for aiw commands + DynInitAiwMenuPaneL( aResourceId, aMenuPane ); + + if ( iAiwServiceHandler ) + { + // handle any AIW menu cascades + if ( iAiwServiceHandler->HandleSubmenuL( *aMenuPane ) ) + { + return; + } + } + + if ( aResourceId == R_CAM_BURST_THUMBNAIL_MENU ) + { + // If there are >1 images marked remove the + // open image item. + if ( iGridModel->NoOfMarkedImages() > 1 ) + { + aMenuPane->SetItemDimmed( ECamCmdOpenPhoto, ETrue ); + TInt itemPos = 0; + if( aMenuPane->MenuItemExists( KAiwCmdUpload, itemPos ) ) + { + PRINT( _L("Camera => CCamBurstThumbnailView::DynInitMenuPaneL SetItemDimmed: KAiwCmdUpload")) + aMenuPane->SetItemDimmed( + KAiwCmdUpload, ETrue ); + } + if( aMenuPane->MenuItemExists( ECamCmdShareOnOvi, itemPos ) ) + { + PRINT( _L("Camera => CCamBurstThumbnailView::DynInitMenuPaneL SetItemDimmed: ECamCmdShareOnOvi")) + aMenuPane->SetItemDimmed( + ECamCmdShareOnOvi, ETrue ); + } + } + + // In touch ui the delete option is available on the fixed toolbar + // there is no need to display it in the options menu + if ( iController.IsTouchScreenSupported() ) + { + TInt itemPos = 0; + if ( aMenuPane->MenuItemExists( ECamCmdDelete, itemPos ) ) + { + aMenuPane->SetItemDimmed( ECamCmdDelete, ETrue ); + } + } + } // ends: if ( aResourceId == R_CAM_BURST_THUMBNAIL_MENU ) + + + // ------------------------------------------------------------------ + if ( aResourceId == R_CAM_BURST_THUMBNAIL_MENU || + aResourceId == R_CAM_BURST_THUMBNAIL_OK_MENU ) + { + TBool showSend = ETrue; + TBool showSendToCaller = EFalse; + +/*#ifndef __WINS__ + if ( iSFIUtils->IsCLIValidL() ) + { + showSend = EFalse; + showSendToCaller = ETrue; + + if ( iGridModel->NoOfMarkedImages() > 1 ) + { + // Send to caller is disabled if multiple images + // have been marked. + showSendToCaller = EFalse; + } + } +#endif*/ + + if ( iController.IsTouchScreenSupported() && + !iOneClickUploadUtility->OneClickUploadSupported() && + aResourceId == R_CAM_BURST_THUMBNAIL_MENU ) + { + // In touch UI, when one click upload is not supported, + // there will be a Send button in the fixed toolbar. Options + // menu items are not needed. Send is kept in the context menu. + showSend = EFalse; + showSendToCaller = EFalse; + } + + TInt itemPos = 0; + if( aMenuPane->MenuItemExists( ECamCmdSendToCallerMultimedia, itemPos ) ) + { + aMenuPane->SetItemDimmed( + ECamCmdSendToCallerMultimedia, !showSendToCaller ); + } + + if( aMenuPane->MenuItemExists( ECamCmdSend, itemPos ) ) + { + aMenuPane->SetItemDimmed( + ECamCmdSend, !showSend ); + } + } + + if ( aResourceId == R_AVKON_MENUPANE_MARKABLE_LIST_IMPLEMENTATION ) + { + if ( iGridModel->IsMarkedL( iGridModel->HighlightedGridIndex() ) ) + { + // If marked, hide the MARK option + aMenuPane->SetItemDimmed( EAknCmdMark, ETrue ); + } + else + { + // If unmarked, hide the UNMARK option + aMenuPane->SetItemDimmed( EAknCmdUnmark, ETrue ); + } + + if ( iGridModel->NoOfMarkedImages() == 0 ) + { + // If NO marked cells, hide the UNMARK ALL option + aMenuPane->SetItemDimmed( EAknUnmarkAll, ETrue ); + } + + if ( iGridModel->NoOfMarkedImages() == iGridModel->NoOfValidCells() ) + { + // If ALL cells are marked, hide the MARKALL option + aMenuPane->SetItemDimmed( EAknMarkAll, ETrue ); + } + } + + PRINT( _L("Camera <= CCamBurstThumbnailView::DynInitMenuPaneL")) + } + +// ----------------------------------------------------------------------------- +// CCamBurstThumbnailView::HandleCommandL +// Handle commands +// ----------------------------------------------------------------------------- +// +void CCamBurstThumbnailView::HandleCommandL( TInt aCommand ) + { + + PRINT1( _L("Camera => CCamBurstThumbnailView::HandleCommandL (aCommand: %d)"), aCommand ) + + // sometimes commands come even after DoDeactivate() has been called. + // this makes sure that those are ignored. + if ( iGridModel == NULL ) + { + return; + } + + switch ( aCommand ) + { + case ECamCmdOneClickUpload: + { + TInt markedItems = iGridModel->NoOfMarkedImages(); + // If there are no images marked use the highlighted image + // set it now for safety just in case no marked images are found + iController.SetAsCurrentImage( + iGridModel->HighlightedBurstIndex() ); + + if ( markedItems > 0 ) + { + // Upload marked images + + CDesC16ArrayFlat* fileNames = + new ( ELeave ) CDesC16ArrayFlat( markedItems ); + CleanupStack::PushL( fileNames ); + + for ( TInt i = 0; i < iGridModel->NoOfImages(); i++ ) + { + if ( iGridModel->IsMarkedL( i ) ) + { + fileNames->AppendL( iGridModel->ImageFileName( i ) ); + } + } + iOneClickUploadUtility->UploadL( + *fileNames ); + CleanupStack::PopAndDestroy( fileNames ); + } + else + { + // Upload highlighted image + iOneClickUploadUtility->UploadL( + iController.CurrentFullFileName() ); + } + break; + } + case ECamCmdRenameImage: + { + iController.SetAsCurrentImage( + iGridModel->ConvertFromValidToGlobalIndex ( + SingleSelectionGridIndexL() ) ); + QueryRenameL( ECamControllerImage ); + break; + } + + case ECamCmdDelete: + { + if ( DisplayDeleteNoteL() ) + { + DoDeleteL(); + } + + break; + } + + case ECamCmdNewPhoto: + { + // the thumbnail scaling needs to be stopped in + // preparation for the app ui switching the view + iGridModel->CancelThumbnails(); + CCamViewBase::HandleCommandL( aCommand ); // Pass on to AppUi + break; + } + + case ECamCmdToolbarMarkUnmark: + { + TBool mark = iGridModel->IsMarkedL( iGridModel->HighlightedGridIndex() ); + iGridModel->SetCurrentMark( !mark ); + // UpdateOneClickUploadButton(); + break; + } + + case EAknCmdMark: + { + iGridModel->SetCurrentMark( ETrue ); + // UpdateOneClickUploadButton(); + break; + } + + case EAknCmdUnmark: + { + iGridModel->SetCurrentMark( EFalse ); + // UpdateOneClickUploadButton(); + break; + } + + case EAknMarkAll: + { + iGridModel->MarkAll( ETrue ); + // UpdateOneClickUploadButton(); + break; + } + + case EAknUnmarkAll: + { + iGridModel->MarkAll( EFalse ); + // UpdateOneClickUploadButton(); + break; + } + + case EAknSoftkeyBack: + { + // the thumbnail scaling needs to be stopped in + // preparation for the app ui switching the view + iGridModel->CancelThumbnails(); + // About to be closed by user, so will want to delete the model + // on deactivation + if ( IsForeground() ) + { + iResetModelOnDeactivate = ETrue; + } + CCamViewBase::HandleCommandL( aCommand ); // Pass on to AppUi + break; + } + case ECamMSKCmdAppChange: + case EAknSoftkeySelect: + { + if ( iGridModel->NoOfMarkedImages() == 0 ) + { + // select the focused item and open it to still postcapture + iResetModelOnDeactivate = EFalse; + + // This selects the highlighted image + iController.SetAsCurrentImage( iGridModel->HighlightedGridIndex() ); + // ConvertFromValidToGlobalIndex used so that appropriate images are displayed + iController.SetAsCurrentImage( iGridModel->ConvertFromValidToGlobalIndex( iGridModel->HighlightedGridIndex() ) ); + CCamViewBase::HandleCommandL( ECamCmdOpenPhoto ); + } + else + { + // If at least one image is marked, open context sensitive menu + CEikMenuBar* menuBar = MenuBar(); + if ( menuBar ) + { + menuBar->SetMenuTitleResourceId( R_CAM_BURST_THUMBNAIL_OK_MENUBAR); + menuBar->SetMenuType( CEikMenuBar::EMenuContext ); + menuBar->TryDisplayMenuBarL(); + // Here we again set back the type of menu to "Options" when pressed LSK + menuBar->SetMenuType( CEikMenuBar::EMenuOptions ); + menuBar->SetMenuTitleResourceId( R_CAM_BURST_THUMBNAIL_MENUBAR); + } + } + break; + } + + case EAknSoftkeyOptions: + { + // do nothing - handled by the framework + break; + } + + case EAknSoftkeyCancel: + { + // do nothing - handled by framework + break; + } + + case ECamCmdSend: + { + CCamPostCaptureViewBase::HandleCommandL( aCommand ); + break; + } + + case ECamCmdSendToCallerMultimedia: + { +/*#ifndef __WINS__ + DoInCallSendL(); +#endif*/ + } + break; + + case ECamCmdQuickSend: + { +/*#ifndef __WINS__ + if( iSFIUtils->IsCLIValidL() ) + { + // only do send to caller if no images are marked + // or one image is marked + if ( iGridModel->NoOfMarkedImages() < 2 ) + { + DoInCallSendL(); + } + } + else +#endif // __WINS__*/ + //{ + DoSendAsL(); + //} + } + break; + + case ECamCmdExitStandby: + { + PRINT( _L("Camera :: CCamBurstThumbnailView::HandleCommandL ECamCmdExitStandby in") ) + CCamViewBase::ExitStandbyModeL(); + PRINT( _L("Camera :: CCamBurstThumbnailView::HandleCommandL ECamCmdExitStandby out") ) + break; + } + + case ECamCmdOpenPhoto: + { + iResetModelOnDeactivate = EFalse; + TInt markedItems = iGridModel->NoOfMarkedImages(); + // If there are no images marked use the highlighted image + // set it now for safety just in case no marked images are found + iController.SetAsCurrentImage( iGridModel->HighlightedBurstIndex() ); + + if ( markedItems != 0 ) // this command should never be available if there is >1 marked item + { + TInt totalItems = iGridModel->NoOfImages(); + TInt index = 0; + TBool found = EFalse; + while ( index < totalItems && !found ) + { + if ( iGridModel->IsMarkedL( index ) ) + { + found = ETrue; + iController.SetAsCurrentImage( index ); + } + index++; + } + } + } + //lint -fallthrough + default: + { + // Handle AIW commands + TInt aiwServiceCmd = iAiwServiceHandler->ServiceCmdByMenuCmd( aCommand ); + if ( aiwServiceCmd != KAiwCmdNone ) + { + CAiwGenericParamList& inParams = iAiwServiceHandler->InParamListL(); + CAiwGenericParamList& outParams = iAiwServiceHandler->OutParamListL(); + // Add file path/s to AIW parameters + TInt markedItems = iGridModel->NoOfMarkedImages(); + // If there are no images marked use the highlighted image + if ( markedItems == 0 ) + { + TAiwVariant variant( iGridModel->ImageFileName( + iGridModel->HighlightedBurstIndex() ) ); + TAiwGenericParam param( EGenericParamFile, variant ); + inParams.AppendL( param ); + + // Set as contact call iamge needs image MIME type as AIW param + // Set as wall paper requires MIME type also. + TAiwVariant variant2( KCamImageMimeType ); + TAiwGenericParam param2( EGenericParamMIMEType, variant2 ); + inParams.AppendL( param2 ); + + } + else // there are marked items, add them to the list + { + TInt totalItems = iGridModel->NoOfImages(); + TInt index = 0; + TInt found = 0; + while ( index < totalItems && found < markedItems ) + { + if ( iGridModel->IsMarkedL( index ) ) + { + found++; + TAiwVariant variant( iGridModel->ImageFileName( index ) ); + TAiwGenericParam param( EGenericParamFile, variant ); + inParams.AppendL( param ); + + // Set as contact call iamge needs image MIME type as AIW param + // Set as wall paper requires MIME type also. + TAiwVariant variant2( KCamImageMimeType ); + TAiwGenericParam param2( EGenericParamMIMEType, variant2 ); + inParams.AppendL( param2 ); + } + index++; + } + } + + iAiwServiceHandler->ExecuteMenuCmdL( aCommand, inParams, outParams, 0, this ); + } + else + { + CCamViewBase::HandleCommandL( aCommand ); + } + break; + } + } + + PRINT1( _L("Camera <= CCamBurstThumbnailView::HandleCommandL (aCommand: %d)"), aCommand ) + } + + +// --------------------------------------------------------------------------- +// CCamBurstThumbnailView::HandleNotifyL +// Handles any notification caused by asynchronous ExecuteCommandL +// or event. +// --------------------------------------------------------------------------- +// +TInt CCamBurstThumbnailView::HandleNotifyL( + TInt /*aCmdId*/, + TInt aEventId, + CAiwGenericParamList& /*aEventParamList*/, + const CAiwGenericParamList& /*aInParamList*/ ) + { + //AIW fails to assign. eg. the contact is locked for being used now. + if ( aEventId == KAiwEventError && iController.IsAppUiAvailable() ) + { + CCamAppUi* appUi = static_cast( AppUi() ); + TRAP_IGNORE( appUi->HandleCameraErrorL( KErrInUse ) ); + } + + return 0; + } + +// ----------------------------------------------------------------------------- +// CCamBurstThumbnailView::DisplayDeleteNoteL() +// Display confirmation note for deletion of images +// ----------------------------------------------------------------------------- +// +TBool CCamBurstThumbnailView::DisplayDeleteNoteL() + { + // Display the delete confirmation note + HBufC* confirmationText; + + // Find the number of images marked, to work out which note to display. + TInt noteText = 0; + TInt noteDlg = 0; + TInt noOfMarkedImages = iGridModel->NoOfMarkedImages(); + + // Check if no of marked images is zero (if we are to delete the current + // highlighted object) or one (if we are to delete a single marked item). + if ( noOfMarkedImages <= 1) + { + noteText = R_CAM_STILL_POST_CAPTURE_DELETE_NOTE_TEXT; + noteDlg = R_CAM_STILL_POST_CAPTURE_DELETE_NOTE; + confirmationText = StringLoader::LoadLC( noteText ); + } + else // noOfMarkedImages > 1 + { + noteText = R_CAM_BURST_DELETE_MULTIPLE_NOTE_TEXT; + noteDlg = R_CAM_BURST_DELETE_MULTIPLE_NOTE; + confirmationText = StringLoader::LoadLC( noteText, noOfMarkedImages ); + } + + // Create the dialog with the text, and show it to the user + CAknQueryDialog* confirmationDialog = new( ELeave )CAknQueryDialog( *confirmationText ); + CleanupStack::PopAndDestroy( confirmationText ); + + return confirmationDialog->ExecuteLD( noteDlg ); + } + +// ----------------------------------------------------------------------------- +// CCamBurstThumbnailView::DoDeleteL +// Marks the required files for deletion +// ----------------------------------------------------------------------------- +// +void CCamBurstThumbnailView::DoDeleteL() + { + if ( iGridModel->NoOfMarkedImages() > 0 ) + { + // Confirmation; mark the files for deletion. + iGridModel->DeleteMarkedL(); + } + else + { + // Confirmation; mark the highlighted item + iGridModel->DeleteHighlightL(); + } + // UpdateOneClickUploadButton(); + } + + + +// ----------------------------------------------------------------------------- +// CCamBurstThumbnailView::HandleForegroundEventL +// Handle foreground event +// ----------------------------------------------------------------------------- +// +void CCamBurstThumbnailView::HandleForegroundEventL( TBool aForeground ) + { + PRINT( _L("Camera => CCamBurstThumbnailView::HandleForegroundEventL") ); + + if ( aForeground ) + { + CCamAppUiBase* appui = static_cast( AppUi() ); + if ( !appui->IsInPretendExit() ) + { + IncrementCameraUsers(); + iController.DeepSleepTimerStart(); + } + } + else + { + // Only decrements if we have incremented. + DecrementCameraUsers(); + } + + PRINT( _L("Camera <= CCamBurstThumbnailView::HandleForegroundEventL") ); + } + + +// --------------------------------------------------------------------------- +// CCamBurstThumbnailView::DoActivateL +// Activate this view +// --------------------------------------------------------------------------- +// +void CCamBurstThumbnailView::DoActivateL( const TVwsViewId& aPrevViewId, TUid aCustomMessageId, + const TDesC8& aCustomMessage ) + { + OstTrace0( CAMERAAPP_PERFORMANCE_DETAIL, CCAMBURSTTHUMBNAILVIEW_DOACTIVATEL, "e_CCamBurstThumbnailView_DoActivateL 1" ); + PRINT( _L( "Camera => CCamBurstThumbnailView::DoActivateL" ) ); + PERF_EVENT_START_L2( EPerfEventBurstThumbnailViewActivation ); + if ( aPrevViewId.iViewUid.iUid == ECamViewIdStillPreCapture || !iGridModel ) + { + iResetModelOnDeactivate = EFalse; + + // Precautionary tidyup, though should never happen. + if ( iGridModel ) + { + delete iGridModel; + iGridModel = NULL; + } + + // If we've come from Pre-Capture view, we shouldn't have an active model. + // Create a new one and register with it. + iGridModel = CCamBurstThumbnailGridModel::NewL(); + iGridModel->AddModelObserverL( this, + CCamBurstThumbnailGridModel::EModelEventDeleted | + CCamBurstThumbnailGridModel::EModelEventHighlight ); + + // Guaranteed to only be called right after a burst capture + iGridModel->SetBurstArrayL( iController.BurstCaptureArray() ); + } + else + { + // We still need to re-register for model events, else if we return to + // grid view from post-capture, we won't receive delete/highlight events + // any more. + iGridModel->AddModelObserverL( this, + CCamBurstThumbnailGridModel::EModelEventDeleted | + CCamBurstThumbnailGridModel::EModelEventHighlight ); + + iGridModel->RefreshL(); + } + + if ( iController.IsTouchScreenSupported() ) + { + // set toolbar + if ( iOneClickUploadUtility->OneClickUploadSupported() ) + { + CreateAndSetToolbarL( R_CAM_BURST_POSTCAPTURE_TOOLBAR_UPLOAD ); + UpdateToolbarIconsL(); + } + CAknToolbar* fixedToolbar = Toolbar(); + if ( fixedToolbar ) + { + fixedToolbar->SetToolbarObserver( this ); + fixedToolbar->SetToolbarVisibility( ETrue ); + } + } + + + + CCamPostCaptureViewBase::DoActivateL( aPrevViewId, aCustomMessageId, aCustomMessage ); + + iAiwServiceHandler->Reset(); + + // initialise AIW services for touch menu + iAiwServiceHandler->AttachMenuL( R_CAM_BURST_THUMBNAIL_MENU, + R_CAM_MOVE_TO_STILL_IMAGE_SEQUENCE_INTEREST ); + + if ( iController.IntegerSettingValue(ECamSettingItemPhotoEditorSupport) != ECamNoEditorSupport ) + { + iAiwServiceHandler->AttachMenuL( R_CAM_BURST_THUMBNAIL_MENU, + R_CAM_SET_AS_CALL_IMAGE_INTEREST_EDITOR ); + } + else + { + iAiwServiceHandler->AttachMenuL( R_CAM_BURST_THUMBNAIL_MENU, + R_CAM_SET_AS_CALL_IMAGE_INTEREST ); + } + + iAiwServiceHandler->AttachMenuL( R_CAM_BURST_THUMBNAIL_MENU, + R_CAM_SHARE_ON_OVI_INTEREST ); + // SHARE_AIW + iAiwServiceHandler->AttachMenuL( R_CAM_BURST_THUMBNAIL_MENU, + R_CAM_AIW_VIEW_INTEREST ); + + static_cast( AppUi() )->PushDefaultNaviPaneL(); + PERF_EVENT_END_L2( EPerfEventBurstThumbnailViewActivation ); + PRINT( _L( "Camera <= CCamBurstThumbnailView::DoActivateL" ) ); + OstTrace0( CAMERAAPP_PERFORMANCE_DETAIL, DUP1_CCAMBURSTTHUMBNAILVIEW_DOACTIVATEL, "e_CCamBurstThumbnailView_DoActivateL 0" ); + } + +// --------------------------------------------------------------------------- +// CCamBurstThumbnailView::DoDeactivate +// Deactivate this view +// --------------------------------------------------------------------------- +// +void CCamBurstThumbnailView::DoDeactivate() + { + PRINT( _L( "Camera => CCamBurstThumbnailView::DoDeactivateL" ) ); + iGridModel->RemoveModelObserver( this, CCamBurstThumbnailGridModel::EModelEventDeleted | + CCamBurstThumbnailGridModel::EModelEventHighlight ); + + CCamPostCaptureViewBase::DoDeactivate(); + + // Must delete this last (after everything had a chance to de-register) + // also delete model if all images have been deleted + if ( iResetModelOnDeactivate || iController.BurstCaptureArray()->ImagesRemaining() == 0 ) + { + PRINT( _L( "Camera: CCamBurstThumbnailView::DoDeactivateL resetting model on deactivate" ) ); + delete iGridModel; + iGridModel = NULL; + } + PRINT( _L( "Camera <= CCamBurstThumbnailView::DoDeactivateL" ) ); + } + + +// --------------------------------------------------------------------------- +// CCamBurstThumbnailView::HighlightChanged +// Called when the highlighted item in the grid view changes +// --------------------------------------------------------------------------- +// +void CCamBurstThumbnailView::HighlightChanged() + { + // Check title is correct as highlight may have changed + TRAPD( ignore, SetTitlePaneTextL() ); + if ( ignore ) + { + // Do nothing ( removes build warning ) + } + } + + +// --------------------------------------------------------------------------- +// CCamBurstThumbnailView::ImagesDeleted +// Called when images have been deleted from the grid view +// --------------------------------------------------------------------------- +// +void CCamBurstThumbnailView::ImagesDeleted() + { + CCamAppUi* appUi = static_cast( iEikonEnv->AppUi() ); + + // inform the media gallery + TRAPD( ignore, appUi->HandleControllerEventL( ECamEventMediaFileChanged, KErrNone ) ); + // Check there is still at least one image + if ( iGridModel->NoOfValidCells() == 0 ) + { + iResetModelOnDeactivate = ETrue; + + CAknToolbar* toolbar = Toolbar(); + if (toolbar) + { + toolbar->SetToolbarVisibility( EFalse ); + } + // Close thumbnail view, go back to Burst PreCapture + TRAP( ignore, HandleCommandL( EAknSoftkeyBack ) ); + } + else + { + iGridModel->UpdateViewableGrid( EFalse ); + } + } + +// --------------------------------------------------------------------------- +// CCamViewBase::IsNewNameValidL +// Check if renaming to the given name is valid. +// --------------------------------------------------------------------------- +// +TBool +CCamBurstThumbnailView::IsNewNameValidL( const TDesC& aFilename ) + { + TInt currentIndex = iGridModel->HighlightedGridIndex(); + + TInt i = 0; + TInt burstItemsCount = iGridModel->NoOfValidCells(); + for ( i = 0; i < burstItemsCount; ++i ) + { + TPtrC imageName = iGridModel->ImageName( i ); + + if ( i != currentIndex ) + { + if ( CamUtility::CompareIgnoreCase( aFilename, + imageName ) ) + { + // New name already exists on grid + return EFalse; + } + } + + } + return ETrue; + } + + +// --------------------------------------------------------------------------- +// CCamBurstThumbnailView::CCamBurstThumbnailView +// C++ constructor +// --------------------------------------------------------------------------- +// +CCamBurstThumbnailView::CCamBurstThumbnailView( CCamAppController& aController ) + : CCamPostCaptureViewBase( aController ) + { + } + +// --------------------------------------------------------------------------- +// CCamBurstThumbnailView::ConstructL +// Symbian OS 2nd phase constructor +// --------------------------------------------------------------------------- +// +void CCamBurstThumbnailView::ConstructL() + { + PRINT( _L("Camera => CCamBurstThumbnailView::ConstructL") ); + + BaseConstructL( R_CAM_BURST_THUMBNAIL_VIEW ); + CCamPostCaptureViewBase::ConstructL(); + + PRINT( _L("Camera <= CCamBurstThumbnailView::ConstructL") ); + } + +// --------------------------------------------------------------------------- +// CCamBurstThumbnailView::CreateContainerL +// Create container control +// --------------------------------------------------------------------------- +// +void CCamBurstThumbnailView::CreateContainerL() + { + PRINT( _L("Camera => CCamBurstThumbnailView::CreateContainerL") ); + CCamBurstThumbnailContainer* cont = new (ELeave) CCamBurstThumbnailContainer( + iController, + *this, + *iGridModel ); + CleanupStack::PushL( cont ); + cont->SetMopParent( this ); + TRect screen; + AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EScreen, screen ); + cont->ConstructL( screen ); + CleanupStack::Pop( cont ); + iContainer = cont; + PRINT( _L("Camera <= CCamBurstThumbnailView::CreateContainerL") ); + } + +// --------------------------------------------------------------------------- +// CCamBurstThumbnailView::SetTitlePaneTextL +// Set the view's title text +// --------------------------------------------------------------------------- +// +void CCamBurstThumbnailView::SetTitlePaneTextL() + { + PRINT( _L("Camera => CCamBurstThumbnailView::SetTitlePaneTextL") ); + // Do not want to set the title to the filename if it's shown in the application pane + _LIT(KSpaces, " "); + static_cast( iEikonEnv->AppUi() )->SetTitleL( KSpaces ); + PRINT( _L("Camera <= CCamBurstThumbnailView::SetTitlePaneTextL") ); + } + +// --------------------------------------------------------------------------- +// CCamBurstThumbnailView::DoSendAsL +// Use SendUI to create a message containing burst thumbnails +// --------------------------------------------------------------------------- +// +void CCamBurstThumbnailView::DoSendAsL() const + { + PRINT( _L("Camera => CCamBurstThumbnailView::DoSendAsL") ); + CCamAppUiBase* appUi = static_cast( AppUi() ); + + if ( !appUi->SendAsInProgress() ) + { + appUi->SetSendAsInProgressL( ETrue ); + CMessageData* messageData = CMessageData::NewLC(); + + TInt totalItems = iGridModel->NoOfImages(); + TInt markedItems = iGridModel->NoOfMarkedImages(); + + if ( markedItems == 0 ) + { + // if no images are marked use the highlighted item instead + messageData->AppendAttachmentL( iGridModel->ImageFileName( + iGridModel->HighlightedBurstIndex() ) ); + } + else + { + // attach all marked items + TInt index = 0; + TInt found = 0; + while ( index < totalItems && found < markedItems ) + { + if ( iGridModel->IsMarkedL( index ) ) + { + found++; + messageData->AppendAttachmentL( iGridModel->ImageFileName( index ) ); + } + index++; + } + } + + TRAP_IGNORE( iSendAppUi->ShowQueryAndSendL( messageData, iSendingCapabilities ) ) + + appUi->SetSendAsInProgressL( EFalse ); + CleanupStack::PopAndDestroy( messageData ); + } + + + PRINT( _L("Camera <= CCamBurstThumbnailView::DoSendAsL") ); + } + +// --------------------------------------------------------------------------- +// CCamBurstThumbnailView::SingleSelectionGridIndexL() +// Returns the array index of the first marked item, +// or highlighted item if none marked. +// --------------------------------------------------------------------------- +// +TInt CCamBurstThumbnailView::SingleSelectionGridIndexL() const + { + TInt ret = KErrNotFound; + + if( iGridModel->NoOfMarkedImages() == 0 ) + { + ret = iGridModel->HighlightedGridIndex(); + } + else + { + TInt totalItems = iGridModel->NoOfImages(); + for( TInt index = 0; index < totalItems; index++ ) + { + if ( iGridModel->IsMarkedL( index ) ) + { + ret = index; + break; + } + } + } + + return ret; + } + +// --------------------------------------------------------------------------- +// CCamViewBase::IsBurstPostCapture +// Returns whether the view is a burst mode postcapture view +// --------------------------------------------------------------------------- +// +TBool CCamBurstThumbnailView::IsBurstPostCapture() + { + return ETrue; + } + +// --------------------------------------------------------------------------- +// CCamViewBase::ImageFilesDeleted +// Notifies view that images files have been deleted outside of camera +// --------------------------------------------------------------------------- +// +void CCamBurstThumbnailView::ImageFilesDeleted() + { + PRINT( _L("Camera => CCamBurstThumbnailView::ImageFilesDeleted") ) + if ( iGridModel ) + { + iGridModel->ImageFilesDeleted(); + } + PRINT( _L("Camera <= CCamBurstThumbnailView::ImageFilesDeleted") ) + } + + +/*#ifndef __WINS__ +// --------------------------------------------------------------------------- +// CCamBurstThumbnailView::DoInCallSendL +// Handle send to caller functionality +// --------------------------------------------------------------------------- +// +void CCamBurstThumbnailView::DoInCallSendL() const + { + // Ignore if more than one item marked + if( iGridModel->NoOfMarkedImages() < 2 ) + { + TInt index = SingleSelectionGridIndexL(); + if ( iSFIUtils && iSFIUtils->IsCLIValidL() && index >=0 ) + { + iSFIUtils->SendMediaFileL( iGridModel->ImageFileName( index ) ); + } + } + } +#endif // __WINS__*/ + +// --------------------------------------------------------------------------- +// CCamBurstThumbnailView::CalculateThumbnailSize +// Calculates the size of a single thumbnail based on the infromation +// how many images are alltogether shown on the burst grid +// --------------------------------------------------------------------------- +// +TSize CCamBurstThumbnailView::CalculateThumbnailSize( TInt aNumberOfBurstImages ) + { + TSize thumb; + TAknLayoutRect gridLayout; + TAknLayoutRect cellLayout; + TAknLayoutRect thumbLayout; + + thumb.iHeight = 0; + thumb.iWidth = 0; + + if ( aNumberOfBurstImages <= KBurstGridDefaultThumbnails ) + { + gridLayout.LayoutRect( ClientRect(), AknLayoutScalable_Apps::grid_cam4_burst_pane( 1 ) ); + cellLayout.LayoutRect( gridLayout.Rect(), AknLayoutScalable_Apps::cell_cam4_burst_pane( 1, 0, 0 ) ); + thumbLayout.LayoutRect( cellLayout.Rect(), AknLayoutScalable_Apps::cell_cam4_burst_pane_g1( 0, 0, 0 ) ); + } + else if ( aNumberOfBurstImages <= KBurstGridMaxVisibleThumbnails ) + { + gridLayout.LayoutRect( ClientRect(), AknLayoutScalable_Apps::grid_cam4_burst_pane( 3 ) ); + cellLayout.LayoutRect( gridLayout.Rect(), AknLayoutScalable_Apps::cell_cam4_burst_pane( 3, 0, 0 ) ); + thumbLayout.LayoutRect( cellLayout.Rect(), AknLayoutScalable_Apps::cell_cam4_burst_pane_g1( 1, 0, 0 ) ); + } + else + { + gridLayout.LayoutRect( ClientRect(), AknLayoutScalable_Apps::grid_cam4_burst_pane( 5 ) ); + cellLayout.LayoutRect( gridLayout.Rect(), AknLayoutScalable_Apps::cell_cam4_burst_pane( 5, 0, 0 ) ); + thumbLayout.LayoutRect( cellLayout.Rect(), AknLayoutScalable_Apps::cell_cam4_burst_pane_g1( 2, 0, 0 ) ); + } + + thumb.iHeight = thumbLayout.Rect().Height(); + thumb.iWidth = thumbLayout.Rect().Width(); + + return thumb; + } + + +void CCamBurstThumbnailView::DynInitAiwMenuPaneL( TInt aResourceId, CEikMenuPane* aMenuPane ) + { + + if ( aResourceId == R_CAM_BURST_THUMBNAIL_MENU ) + { + if ( iAiwServiceHandler && iAiwServiceHandler->IsAiwMenu( aResourceId ) ) + { + + CAiwGenericParamList& paramList = iAiwServiceHandler->InParamListL(); + TInt markedItems = iGridModel->NoOfMarkedImages(); + // If there are no images marked use the highlighted image + + TCamOrientation orientation = static_cast( AppUi() )->CamOrientation(); + + if ( markedItems == 0 ) + { + TAiwVariant variant( iGridModel->ImageFileName( + iGridModel->HighlightedBurstIndex() ) ); + TAiwGenericParam param( EGenericParamFile, variant ); + paramList.AppendL( param ); + + // Set as contact call image needs image MIME type as AIW param + //if ( orientation == ECamOrientationCamcorder || orientation == ECamOrientationCamcorderLeft ) + { + TAiwVariant variant2( KCamImageMimeType ); + TAiwGenericParam param2( EGenericParamMIMEType, variant2 ); + paramList.AppendL( param2 ); + } + + } + else if ( markedItems == 1 ) + { + TInt totalItems = iGridModel->NoOfImages(); + TInt index = 0; + while ( index < totalItems ) + { + if ( iGridModel->IsMarkedL( index ) ) + { + + TAiwVariant variant( iGridModel->ImageFileName( index ) ); + TAiwGenericParam param( EGenericParamFile, variant ); + paramList.AppendL( param ); + + //if ( orientation == ECamOrientationCamcorder || orientation == ECamOrientationCamcorderLeft ) + { + TAiwVariant variant2( KCamImageMimeType ); + TAiwGenericParam param2( EGenericParamMIMEType, variant2 ); + paramList.AppendL( param2 ); + } + + break; + } + index++; + } + } + else // there are more than on marked item + { + // removing lint warning + } + + iAiwServiceHandler->InitializeMenuPaneL( + *aMenuPane, + aResourceId, + ECamCmdAIWCommands, + paramList ); + } + + } + + } + +// --------------------------------------------------------------------------- +// Dim 1-click upload button if more than one image is marked +// --------------------------------------------------------------------------- +// +void CCamBurstThumbnailView::UpdateOneClickUploadButton() + { + CAknToolbar* toolbar = Toolbar(); + if( toolbar && iGridModel ) + { + TBool shouldBeDimmed = ( iGridModel->NoOfMarkedImages() > 1 ); + + CAknButton* button = static_cast( + toolbar->ControlOrNull( ECamCmdOneClickUpload ) ); + + if ( button ) + { + TBool isDimmed = button->IsDimmed(); + if ( ( shouldBeDimmed && !isDimmed ) || + ( !shouldBeDimmed && isDimmed ) ) + { + button->SetDimmed( shouldBeDimmed ); + button->DrawDeferred(); + } + } + } + } + + +// End of File