camerauis/cameraapp/generic/src/CamBurstThumbnailContainer.cpp
branchRCL_3
changeset 24 bac7acad7cb3
child 25 2c87b2808fd7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/camerauis/cameraapp/generic/src/CamBurstThumbnailContainer.cpp	Wed Sep 01 12:30:54 2010 +0100
@@ -0,0 +1,339 @@
+/*
+* 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:  Container class for burst thumbnail view*
+*/
+
+// INCLUDE FILES
+#include <aknview.h> 
+#include <cameraapp.rsg>
+#include <vgacamsettings.rsg>
+#include <AknsUtils.h>
+#include <AknsDrawUtils.h>
+#include <touchfeedback.h>
+#include <aknlayoutscalable_apps.cdl.h> // AknLayoutScalable_Apps
+
+ 
+#include "CamBurstThumbnailContainer.h"
+#include "CamBurstThumbnailGrid.h"
+#include "camlogging.h"
+#include "CamUtility.h"
+
+
+
+// CONSTANTS
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------------------------
+// CCamBurstThumbnailContainer::NewL
+// Symbian OS two-phased constructor
+// ---------------------------------------------------------------------------
+//
+CCamBurstThumbnailContainer* CCamBurstThumbnailContainer::NewL(
+        CCamAppController& aController,
+        CAknView& aView,
+        const TRect& aRect,
+        CCamBurstThumbnailGridModel& aGridModel )
+    {
+    CCamBurstThumbnailContainer* self = new( ELeave ) 
+        CCamBurstThumbnailContainer( aController, aView, aGridModel );
+    CleanupStack::PushL( self );
+    self->ConstructL( aRect );
+    CleanupStack::Pop( );
+    // return newly created CCamBurstThumbnailContainer instance
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CCamBurstThumbnailContainer
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CCamBurstThumbnailContainer::~CCamBurstThumbnailContainer()
+    {
+    delete iGridControl;
+    }
+  
+// ---------------------------------------------------------
+// CCamBurstThumbnailContainer::ConstructL
+// Symbian OS 2nd phase constructor
+// ---------------------------------------------------------
+//
+void CCamBurstThumbnailContainer::ConstructL( const TRect& aRect )
+    {
+
+    PRINT( _L("Camera => CCamBurstThumbnailContainer::ConstructL") );
+    CCamContainerBase::BaseConstructL( aRect );
+    
+    iGridControl = CCamBurstThumbnailGrid::NewL( this , iGridModel );
+  
+    TRect mainPaneRect;
+    AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane,
+            mainPaneRect );
+    TRect statusPaneRect;
+    AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EStatusPane,
+            statusPaneRect );
+
+    // layout area rectangle contains the area, where components need to be 
+    // drawn to. the container size is the whole screen, but the layouts are 
+    // for the client area. aRect is the container size that might include or
+    // might not include statuspane area. calculating area self will
+    // go around the problem
+    TRect layoutAreaRect;
+    layoutAreaRect = mainPaneRect;
+    layoutAreaRect.BoundingRect( statusPaneRect );
+    
+
+    TAknLayoutRect burstPaneRect;           
+    if ( CamUtility::IsNhdDevice() )
+        {
+        // use layoutAreaRect for nhd (contains the statuspane)
+        burstPaneRect.LayoutRect( layoutAreaRect, AknLayoutScalable_Apps::main_cam4_burst_pane() );
+        // SetRect( layoutAreaRect );
+        }
+    else
+        {
+        // use mainpane for vga
+        burstPaneRect.LayoutRect( mainPaneRect,  AknLayoutScalable_Apps::main_cam4_burst_pane() );
+
+        }
+
+    
+    // layout grid
+    TInt gridSize = iGridModel.NoOfValidCells();   
+    
+    if ( gridSize <= KBurstGridDefaultThumbnails)
+    	{
+	    AknLayoutUtils::LayoutControl( iGridControl, /*aRect*/
+	            burstPaneRect.Rect(), 
+	            AknLayoutScalable_Apps::grid_cam4_burst_pane(1) );
+	    }
+	else if ( gridSize <= KBurstGridMaxVisibleThumbnails )
+	    {
+	    AknLayoutUtils::LayoutControl( iGridControl, //aRect,
+	            burstPaneRect.Rect(), 
+	            AknLayoutScalable_Apps::grid_cam4_burst_pane(3) );
+	    }
+	else // gridSize > KBurstGridMaxVisibleThumbnails
+		{
+		AknLayoutUtils::LayoutControl( iGridControl, //aRect
+		        burstPaneRect.Rect(), 
+		        AknLayoutScalable_Apps::grid_cam4_burst_pane(5) );
+		}
+    
+    // scroll bar
+    if ( gridSize > KBurstGridMaxVisibleThumbnails )       
+        {
+        // Will create the scrollbar if it is needed        
+        iGridControl->SetMopParent( this );
+        iGridControl->CreateScrollBarL();
+        iGridControl->SetupScrollbarL( );        
+        }        
+       
+    
+    iFeedback = MTouchFeedback::Instance(); 
+    
+    // make sure that softkeys are shown
+    DrawableWindow()->SetOrdinalPosition( KCamPostCaptureWindowOrdinalPos );
+    
+    PRINT( _L("Camera <= CCamBurstThumbnailContainer::ConstructL") );
+    }
+    
+// ---------------------------------------------------------------------------
+// CCamBurstThumbnailContainer::CCamBurstThumbnailContainer
+// C++ constructor
+// ---------------------------------------------------------------------------
+//
+CCamBurstThumbnailContainer::CCamBurstThumbnailContainer( 
+                            CCamAppController& aController,
+                            CAknView& aView,
+                            CCamBurstThumbnailGridModel& aGridModel )
+: CCamContainerBase( aController, aView ), iGridModel( aGridModel )
+    {
+    }
+
+// ---------------------------------------------------------
+// CCamBurstThumbnailContainer::CountComponentControls 
+// Returns the number of controls owned
+// ---------------------------------------------------------
+//
+TInt CCamBurstThumbnailContainer::CountComponentControls() const
+    {    
+    return CCamContainerBase::CountComponentControls() + 1;   // Return the number of controls inside this container
+    }
+
+// ---------------------------------------------------------
+// CCamBurstThumbnailContainer::ComponentControl
+// Return pointer to a contained control
+// ---------------------------------------------------------
+//
+CCoeControl* CCamBurstThumbnailContainer::ComponentControl( TInt aIndex ) const
+    {
+    CCoeControl* control = NULL;
+    control = CCamContainerBase::ComponentControl( aIndex );
+    if( control != NULL )
+        return control;
+    switch ( aIndex )
+        {
+        case 1:
+            {
+            control = iGridControl;
+            }
+            break;
+        default: 
+            break;                   
+        }
+    
+    return control;
+    }
+
+
+// ---------------------------------------------------------
+// CCamBurstThumbnailContainer::Draw
+// Draw control
+// ---------------------------------------------------------
+//
+void CCamBurstThumbnailContainer::Draw( const TRect& aRect ) const
+    {
+    
+    CWindowGc& gc = SystemGc();
+        
+    // Draw skin background for the 
+    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+    MAknsControlContext* cc = AknsDrawUtils::ControlContext( this );
+    AknsDrawUtils::Background( skin, cc, gc, aRect );
+    
+    //gc.Clear( Rect() );
+    
+    }
+
+// ----------------------------------------------------
+// CCamBurstThumbnailContainer::OfferKeyEventL
+// Handles this application view's command keys. Forwards other
+// keys to child control(s).
+// ----------------------------------------------------
+//
+TKeyResponse 
+CCamBurstThumbnailContainer::OfferKeyEventL( const TKeyEvent& aKeyEvent,
+                                                   TEventCode aType )
+    {
+    PRINT( _L("Camera => CCamBurstThumbnailContainer::OfferKeyEventL") );
+    TKeyResponse response( EKeyWasNotConsumed );
+    TBool captureKey = IsCaptureKeyL( aKeyEvent, aType );
+
+    TBool embedded = static_cast<CCamAppUiBase*>( 
+            CEikonEnv::Static()->AppUi() )->IsEmbedded();
+
+    // If the back softkey is pressed
+    if ( aKeyEvent.iScanCode == EStdKeyDevice1 )
+        {
+        response = EKeyWasNotConsumed; // indicate key press was not processed
+        }
+    else if ( aKeyEvent.iScanCode == EStdKeyDevice3 )   // Select key
+        {
+        // Will pass it on to the view
+        response = CCamContainerBase::OfferKeyEventL( aKeyEvent, aType );
+        }
+    //make sure to unset DemandKeyRelease
+    else if( aType == EEventKeyUp && !embedded )
+        {
+        iController.SetDemandKeyRelease( EFalse ); 
+        }    
+    else if ( captureKey // && aKeyEvent.iScanCode == EProductKeyCapture )
+            || IsShutterKeyL( aKeyEvent, aType )
+            )
+        {
+        if ( aType == EEventKeyDown ) 
+            // check needed, since EEventFocusLost produces EEventKeyUp for shutterkey
+            {
+            if ( !embedded )
+                {
+                    iGridModel.CancelThumbnails();
+    
+                    iView.HandleCommandL( ECamCmdNewPhoto );
+                    // Demand to relese capture key in pre capture view
+                    iController.SetDemandKeyRelease( ETrue ); 
+                    response = EKeyWasConsumed;
+                }
+        
+            }
+        }
+    else if ( aType == EEventKey && 
+            aKeyEvent.iScanCode == EStdKeyBackspace )  // Handle 'C' key
+        {
+        iView.HandleCommandL( ECamCmdDelete );
+        response = EKeyWasConsumed;
+        }
+    else if ( aKeyEvent.iScanCode == EStdKeyYes 
+            && aType == EEventKey && !AknLayoutUtils::PenEnabled() ) 
+        {
+        iView.HandleCommandL( ECamCmdQuickSend );
+        response = EKeyWasConsumed; 
+        }        
+    else 
+        {
+        PRINT( _L("Camera <> CCamBurstThumbnailContainer: offer key to grid control..") );
+        response = iGridControl->OfferKeyEventL( aKeyEvent, aType );        
+        }
+
+    PRINT1( _L("Camera <= CCamBurstThumbnailContainer::OfferKeyEventL, return %d"), response );
+    return response;
+  }
+
+void CCamBurstThumbnailContainer::HandlePointerEventL( const TPointerEvent& aPointerEvent ) 
+	{
+	//CCoeControl::HandlePointerEventL( aPointerEvent );  
+	
+	PRINT3( _L("Camera => CCamBurstThumbnailContainer::HandlePointerEventL iType=%d iPosition=(%d, %d)"),
+	        aPointerEvent.iType,
+	        aPointerEvent.iPosition.iX,
+	        aPointerEvent.iPosition.iY );
+	    
+	
+	if ( aPointerEvent.iType == TPointerEvent::EButton1Up)
+		{
+		// check if the pointer event should be handled as grid selection
+		if ( iGridControl && iGridControl->Rect().Contains( aPointerEvent.iPosition ) )
+			{
+			TInt gridItem = iGridControl->HitTestGridItems( aPointerEvent.iPosition );
+			
+			if ( gridItem >= 0 )
+				{
+				
+				if ( iFeedback )
+				    {
+				    iFeedback->InstantFeedback( ETouchFeedbackBasic );        
+				    }
+				// inform model about the new higlighted item
+				if ( iGridModel.SetHighlight( gridItem ) )
+					{
+					// highlight changed -> redraw
+					DrawDeferred();
+					}	
+				else 
+					{
+					// highlight item did not change -> open item in postcapture view
+					iView.HandleCommandL( EAknSoftkeySelect );
+					}
+				}
+			}       
+	
+		}
+	        
+	
+	PRINT( _L("Camera <= CCamBurstThumbnailContainer::HandlePointerEventL"));
+	
+	}
+
+// End of File