--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/camerauis/cameraapp/generic/src/CamBurstThumbnailContainer.cpp Thu Jan 07 16:18:56 2010 +0200
@@ -0,0 +1,335 @@
+/*
+* 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 1; // Return the number of controls inside this container
+ }
+
+// ---------------------------------------------------------
+// CCamBurstThumbnailContainer::ComponentControl
+// Return pointer to a contained control
+// ---------------------------------------------------------
+//
+CCoeControl* CCamBurstThumbnailContainer::ComponentControl( TInt aIndex ) const
+ {
+ switch ( aIndex )
+ {
+ case 0:
+ {
+ return iGridControl;
+ }
+ default:
+ break;
+ }
+
+ // Should never get here
+ return NULL;
+ }
+
+
+// ---------------------------------------------------------
+// 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