mulwidgets/gesturehelper/src/pointercapturer.cpp
branchRCL_3
changeset 20 0e9bb658ef58
parent 0 e83bab7cf002
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mulwidgets/gesturehelper/src/pointercapturer.cpp	Wed Sep 01 12:23:18 2010 +0100
@@ -0,0 +1,169 @@
+/*
+* Copyright (c) 2008 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:  Alf control group and control for capturing pointer events
+*
+*/
+
+#include "pointercapturer.h"
+
+#include <alf/alfcontrol.h>
+#include <alf/alfcontrolgroup.h>
+#include <alf/alfdisplay.h>
+#include <alf/alfenv.h>
+#include <alf/alfevent.h>
+#include <alf/alfroster.h>
+
+#include "gesturehelperimpl.h"
+
+namespace GestureHelper
+{
+
+/**
+ * CPointerCaptureControl
+ * Gesture control own a gesture helper, and captures any pointer events that 
+ * no other control captures. After it captures pointer down event, it will 
+ * capture all pointer events until pointer up. It does this by bringing its
+ * control group to the top upon pointer down, and lowering the control group
+ * to the botton upon pointer up.
+ */
+NONSHARABLE_CLASS( CPointerCaptureControl ) : public CAlfControl
+    {
+public: 
+    /** Two-phased constructor */
+    static CPointerCaptureControl* NewLC( CGestureHelperImpl& aHelper, 
+            CAlfEnv& aEnv, CAlfDisplay& aDisplay )
+        {
+        CPointerCaptureControl* self = new ( ELeave ) CPointerCaptureControl( aHelper );
+        CleanupStack::PushL( self );
+        self->ConstructL( aEnv ); // construct base class
+        self->BindDisplay( aDisplay );
+        self->AppendVisualL( EAlfVisualTypeVisual );       
+        return self;
+        }
+    
+    void StartCaptureL()
+        {
+        User::LeaveIfError( Display()->Roster().SetPointerEventObservers( 
+            EAlfPointerEventReportDrag | EAlfPointerEventReportUnhandled, 
+                *this ) );
+        Display()->Roster().ShowL( *ControlGroup(), KAlfRosterShowAtTop );
+        }
+    
+    void StopCapture()
+        {
+        ( void ) Display()->Roster().SetPointerEventObservers( 0, *this );
+        TRAP_IGNORE( Display()->Roster().ShowL( *ControlGroup(), KAlfRosterShowAtBottom ) );
+        }
+    
+private:
+    /** Constructor */
+    CPointerCaptureControl( CGestureHelperImpl& aHelper )
+            : iHelper( aHelper )
+        {
+        }
+    
+    // From CAlfControl
+    TBool OfferEventL( const TAlfEvent& aEvent )
+        {
+        TBool consumed = EFalse;
+        if ( aEvent.IsPointerEvent() )
+            {
+            // pointer down for first pointer should never come here if everything is 
+			// working properly. if pointer event comes here, stop capturing and allow the 
+			// event to fall to the controls below
+            if ( iHelper.StrayEvent(aEvent.PointerEvent() ))
+                {
+                StopCapture();
+                }
+            else 
+                {
+                consumed = iHelper.HandlePointerEventL( aEvent.PointerEvent() );
+                }
+            }
+        return consumed;
+        }
+    
+private:    
+    /// gesture helper that analyses pointer sequences. own.
+    CGestureHelperImpl& iHelper;
+    
+    };
+    
+} // namespace GestureHelper
+
+using namespace GestureHelper;
+    
+// ----------------------------------------------------------------------------
+// Two phase constructor
+// ----------------------------------------------------------------------------
+//
+CPointerCapturer* CPointerCapturer::NewL()
+    {
+    return new ( ELeave ) CPointerCapturer();
+    }
+
+// ----------------------------------------------------------------------------
+// Two phase constructor
+// ----------------------------------------------------------------------------
+//
+CPointerCapturer::~CPointerCapturer()
+    {
+    if ( iCaptureControl )
+        {
+        // deleting the control group will also delete the control
+        iCaptureControl->Env().DeleteControlGroup( iControlGroupId );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// InitForAlfredL
+// ----------------------------------------------------------------------------
+//
+void CPointerCapturer::InitForAlfredL( CGestureHelperImpl& aHelper, 
+        CAlfEnv& aEnv, CAlfDisplay& aDisplay, TInt aControlGroupId )
+    {
+    CAlfControlGroup& group = aEnv.NewControlGroupL( aControlGroupId );
+    CPointerCaptureControl* control = CPointerCaptureControl::NewLC( aHelper, 
+        aEnv, aDisplay );
+    group.AppendL( control );
+    CleanupStack::Pop( control );    
+   
+    // store control only after it has been successfully added to group
+    iCaptureControl = control;
+    iControlGroupId = aControlGroupId;
+    }
+
+// ----------------------------------------------------------------------------
+// StartCaptureL
+// ----------------------------------------------------------------------------
+//
+void CPointerCapturer::StartL()
+    {
+    if ( iCaptureControl )
+        {
+        iCaptureControl->StartCaptureL();
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// StopCapture
+// ----------------------------------------------------------------------------
+//
+void CPointerCapturer::Stop()
+    {
+    if ( iCaptureControl )
+        {
+        iCaptureControl->StopCapture();
+        }
+    }