diff -r 61bc0f252b2b -r bac7acad7cb3 camerauis/cameraapp/generic/src/CamBurstThumbnailContainer.cpp --- /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 +#include +#include +#include +#include +#include +#include // 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( + 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