camerauis/cameraapp/generic/src/camcapturebuttoncontainer.cpp
branchRCL_3
changeset 54 bac7acad7cb3
child 62 f0c0788c4de2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/camerauis/cameraapp/generic/src/camcapturebuttoncontainer.cpp	Wed Sep 01 12:30:54 2010 +0100
@@ -0,0 +1,305 @@
+/*
+* Copyright (c) 2010 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 for custom camera capture button 
+*
+*/
+
+#include <AknIconUtils.h>
+#include <touchfeedback.h>
+
+#include "camcapturebuttoncontainer.h"
+#include "CamPreCaptureViewBase.h"
+#include "camlogging.h"
+#include "cameraapp.mbg"
+#include "CamAppUi.h"
+
+// CONSTANTS
+_LIT(KCamBitmapFile, "z:\\resource\\apps\\cameraapp.mif");
+const TSize KIconSize( 35, 35 );
+const TSize KAdditionalArea( 25, 11 );
+const TInt32 KCaptureIconDelta( 7 );
+const TUint32 KToolbarExtensionBgColor = 0x00000000;
+const TInt KToolBarExtensionBgAlpha = 0x7F;
+const TInt KCaptureButtonOrdinalPriority( 1 );
+const TSize KIconMargin( 7, 7 );
+
+// -----------------------------------------------------------------------------
+// CCamCaptureButtonContainer::CCamCaptureButtonContainer
+// -----------------------------------------------------------------------------
+//
+CCamCaptureButtonContainer::CCamCaptureButtonContainer( CCamAppController& aController,
+                                                        CAknView& aView,
+                                                        CCamPreCaptureContainerBase& aContainer,
+                                                        TCamCameraMode aCameraMode ) 
+    : iController( aController ), 
+      iView( aView ),
+      iParentContainer( aContainer ),
+      iCameraMode( aCameraMode )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CCamCaptureButtonContainer::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CCamCaptureButtonContainer::ConstructL( const TRect& aRect )
+    {
+    PRINT( _L("Camera => CCamCaptureButtonContainer::ConstructL") );
+    CreateWindowL();
+    SetRect( aRect );
+    Window().SetBackgroundColor( KRgbTransparent );
+
+    // Keep hidden until explicitly made visible
+    MakeVisible( EFalse );
+    CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
+
+    // Load capture icon
+    TInt bitmapId = EMbmCameraappQgn_indi_cam4_capture_image;
+    TInt maskId   = EMbmCameraappQgn_indi_cam4_capture_image_mask;
+    TInt bitmapPressedId = EMbmCameraappQgn_indi_cam4_capture_image_pressed;
+    TInt maskPressedId = EMbmCameraappQgn_indi_cam4_capture_image_pressed_mask;
+
+    if ( iCameraMode == ECamControllerVideo )
+        {
+        bitmapId = EMbmCameraappQgn_indi_cam4_capture_video;
+        maskId   = EMbmCameraappQgn_indi_cam4_capture_video_mask;
+        bitmapPressedId = EMbmCameraappQgn_indi_cam4_capture_video_pressed;
+        maskPressedId = EMbmCameraappQgn_indi_cam4_capture_video_pressed_mask;
+        }
+    
+    iCaptureRect = aRect;
+    iCaptureRect.Move(-iCaptureRect.iTl.iX, -iCaptureRect.iTl.iY );
+    iCaptureRect.Shrink( KIconMargin );
+    
+    AknIconUtils::CreateIconL(
+             iCaptureIcon,
+             iCaptureIconMask,
+             KCamBitmapFile(),
+             bitmapId,
+             maskId );
+    AknIconUtils::SetSize( iCaptureIcon, iCaptureRect.Size() );
+    AknIconUtils::SetSize( iCaptureIconMask, iCaptureRect.Size() );
+    
+    AknIconUtils::CreateIconL(
+                 iCaptureIconPressed,
+                 iCaptureIconPressedMask,
+                 KCamBitmapFile(),
+                 bitmapPressedId,
+                 maskPressedId );
+    AknIconUtils::SetSize( iCaptureIconPressed, iCaptureRect.Size() );
+    AknIconUtils::SetSize( iCaptureIconPressedMask, iCaptureRect.Size() );
+    
+    iFeedback = MTouchFeedback::Instance();
+    PRINT( _L("Camera <= CCamCaptureButtonContainer::ConstructL") );
+    }
+
+// -----------------------------------------------------------------------------
+// CCamCaptureButtonContainer::~CCamCaptureButtonContainer
+// -----------------------------------------------------------------------------
+//
+CCamCaptureButtonContainer::~CCamCaptureButtonContainer()
+    {
+    delete iCaptureIcon;
+    delete iCaptureIconMask;
+    delete iCaptureIconPressed;
+    delete iCaptureIconPressedMask;
+    }
+
+// -----------------------------------------------------------------------------
+// CCamCaptureButtonContainer::NewLC
+// -----------------------------------------------------------------------------
+//
+CCamCaptureButtonContainer* CCamCaptureButtonContainer::NewLC( CCamAppController& aController,
+                                                               CAknView& aView,
+                                                               CCamPreCaptureContainerBase& aContainer,
+                                                               const TRect& aRect,
+                                                               TCamCameraMode aCameraMode )
+    {
+    CCamCaptureButtonContainer* self = new (ELeave) CCamCaptureButtonContainer( aController, 
+                                                                                aView,
+                                                                                aContainer,
+                                                                                aCameraMode );
+    CleanupStack::PushL( self );
+    self->ConstructL( aRect );
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CCamCaptureButtonContainer::NewL
+// -----------------------------------------------------------------------------
+//
+CCamCaptureButtonContainer* CCamCaptureButtonContainer::NewL( CCamAppController& aController,
+                                                              CAknView& aView,
+                                                              CCamPreCaptureContainerBase& aContainer,
+                                                              const TRect& aRect, 
+                                                              TCamCameraMode aCameraMode )
+    {
+    CCamCaptureButtonContainer* self = CCamCaptureButtonContainer::NewLC( aController, 
+                                                                          aView,
+                                                                          aContainer,
+                                                                          aRect,
+                                                                          aCameraMode );
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// -------------------------------------------------------------
+// CCamCaptureButtonContainer::HandlePointerEventL
+// -------------------------------------------------------------
+//
+void CCamCaptureButtonContainer::HandlePointerEventL( const TPointerEvent& aPointerEvent )
+    {
+    PRINT3( _L("Camera => CCamCaptureButtonContainer::HandlePointerEventL type:%d position:%d,%d"), 
+                     aPointerEvent.iType, aPointerEvent.iPosition.iX, aPointerEvent.iPosition.iY );    
+
+    if( iCaptureButtonShown )
+        {
+        PRINT( _L("Camera <> Capture button shown") );
+        // Button down -> pressed (highlighted)
+        if ( aPointerEvent.iType == TPointerEvent::EButton1Down )
+            {
+            SetPointerCapture( ETrue );
+            ClaimPointerGrab( ETrue );
+            iCaptureButtonPressed = ETrue;
+            if ( !iFeedback )
+                {
+                iFeedback = MTouchFeedback::Instance();
+                }
+            // Feedback on button press
+            if ( iFeedback )
+                {
+                iFeedback->InstantFeedback( ETouchFeedbackBasicButton );        
+                }
+            DrawNow();
+            }
+        // Button up after button down (within button area) -> start capture
+        else if ( aPointerEvent.iType == TPointerEvent::EButton1Up
+                  && iCaptureButtonPressed && Rect().Contains(aPointerEvent.iPosition) )
+            {
+            PRINT( _L("Camera <> starting capture") );
+            ClaimPointerGrab( EFalse );
+            SetPointerCapture( EFalse );
+            iCaptureButtonPressed = EFalse;
+
+            // Give feedback on button release
+            if ( iFeedback )
+                {
+                iFeedback->InstantFeedback( ETouchFeedbackBasicButton );        
+                }
+
+            iParentContainer.PrepareForCapture();
+            if ( iCameraMode == ECamControllerVideo ) 
+                {
+                iView.HandleCommandL( ECamCmdRecord );
+                }
+            else
+                {
+                iController.SetTouchCapture( ETrue );
+                iView.HandleCommandL( ECamCmdCaptureImage );
+                }
+            }
+        // Drags can potentially start from inside button area
+        else if ( iCaptureButtonPressed && aPointerEvent.iType != TPointerEvent::EDrag )
+            {
+            PRINT( _L("Camera <> outside button region - button to not-pressed state") );
+            ClaimPointerGrab( EFalse );
+            SetPointerCapture( EFalse );
+            iCaptureButtonPressed = EFalse;
+            DrawNow();
+            }
+        else
+            {
+            PRINT( _L("Camera <> unhandled case") );
+            // Avoid compiler warning
+            }
+        }
+
+    PRINT( _L("Camera <= CCamCaptureButtonContainer::HandlePointerEventL") );
+    }
+
+// -------------------------------------------------------------
+// CCamCaptureButtonContainer::SetCaptureButtonShown
+// -------------------------------------------------------------
+//
+void CCamCaptureButtonContainer::SetCaptureButtonShown( TBool aShown )
+    {
+    PRINT1( _L("Camera => CCamCaptureButtonContainer::SetCaptureButtonShown shown:%d"), aShown );
+    iCaptureButtonShown = aShown;
+
+    if ( !aShown )
+        {
+        MakeVisible( EFalse );
+        }
+    else if ( !IsVisible() )
+        {
+        // Ensure button is in non-pressed state when making visible 
+        iCaptureButtonPressed = EFalse;
+
+        PRINT( _L("Camera <> Making the capture button visible") );
+        DrawableWindow()->SetOrdinalPosition( 0, KCaptureButtonOrdinalPriority );
+        MakeVisible( ETrue );
+        DrawDeferred();
+        }
+    else
+        {
+        PRINT( _L("Camera <> Already visible!") );
+        }
+
+    PRINT( _L("Camera <= CCamCaptureButtonContainer::SetCaptureButtonShown") );
+    }
+
+// -----------------------------------------------------------------------------
+// CCamCaptureButtonContainer::Draw
+// -----------------------------------------------------------------------------
+//
+void CCamCaptureButtonContainer::Draw( const TRect& aRect ) const
+    {
+    PRINT( _L("Camera => CCamCaptureButtonContainer::Draw") );
+
+    CWindowGc& gc = SystemGc();
+    if ( iCaptureButtonShown )
+        {
+        DrawCaptureButton( gc );
+        }
+    else
+        {
+        PRINT( _L("Camera <> button hidden") );
+        }
+
+    PRINT( _L("Camera <= CCamCaptureButtonContainer::Draw") );
+    }
+
+// -------------------------------------------------------------
+// CCamCaptureButtonContainer::DrawCaptureButton
+// -------------------------------------------------------------
+//
+void CCamCaptureButtonContainer::DrawCaptureButton( CBitmapContext& aGc ) const
+    {
+    PRINT( _L("Camera => CCamCaptureButtonContainer::DrawCaptureButton") );
+    TRect boundingRect( iCaptureRect );
+    boundingRect.Move( -boundingRect.iTl.iX, -boundingRect.iTl.iY );
+
+    if ( iCaptureButtonPressed )
+        {
+        aGc.BitBltMasked( iCaptureRect.iTl, iCaptureIconPressed, boundingRect, iCaptureIconPressedMask, EFalse );
+        }
+    else
+        {
+        aGc.BitBltMasked( iCaptureRect.iTl, iCaptureIcon, boundingRect, iCaptureIconMask, EFalse );
+
+        }
+
+    PRINT( _L("Camera <= CCamCaptureButtonContainer::DrawCaptureButton") );
+    }
+