camerauis/cameraapp/generic/src/CamBurstThumbnailView.cpp
branchRCL_3
changeset 24 bac7acad7cb3
--- /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 <eikmenub.h>
+#include <StringLoader.h>       
+#include <AknQueryDialog.h>
+#include <TSendingCapabilities.h>
+#include <cameraapp.rsg>
+#include <vgacamsettings.rsg>
+#include <sendnorm.rsg>
+#include <sendui.h>
+#include <SenduiMtmUids.h>
+#include <CMessageData.h>
+#include <aknlayoutscalable_apps.cdl.h> // AknLayoutScalable_Apps
+//#include <SFIUtilsAppInterface.h>
+#include <aknnotewrappers.h>  // CAknInformationNote
+#include <akntoolbar.h> // CAknToolbar
+#include <aknbutton.h>
+#include <eiksoftkeypostingtransparency.h> // 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<CCamAppUi*>( 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<CCamAppUiBase*>( 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<CCamAppUiBase*>( 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<CCamAppUi*>( 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<CCamAppUi*>( 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<CCamAppUiBase*>( 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<CCamAppUiBase*>( 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<CAknButton*>(
+                toolbar->ControlOrNull( ECamCmdOneClickUpload ) );
+		
+		if ( button )
+            {
+            TBool isDimmed = button->IsDimmed();
+            if ( ( shouldBeDimmed && !isDimmed ) ||
+                 ( !shouldBeDimmed && isDimmed ) )
+                 {
+                 button->SetDimmed( shouldBeDimmed );
+                 button->DrawDeferred();
+                 }
+             }
+        }
+    }
+
+
+//  End of File