textinput/peninputarc/src/peninputlayoutcontrol/peninputlayoutbasecontrol.cpp
branchRCL_3
changeset 11 c8fb4cf7b3ae
parent 9 e6a39382bb9c
child 12 5e18d8c489d6
--- a/textinput/peninputarc/src/peninputlayoutcontrol/peninputlayoutbasecontrol.cpp	Tue Apr 27 16:59:43 2010 +0300
+++ b/textinput/peninputarc/src/peninputlayoutcontrol/peninputlayoutbasecontrol.cpp	Tue May 11 16:31:42 2010 +0300
@@ -59,9 +59,9 @@
                         iOwnWndCtrl(ETrue),
                         iOrdinalPos(EOrderNomal)
     {
-#ifdef RD_TACTILE_FEEDBACK
-    iReservered1 = reinterpret_cast<TInt>(new CFepUiBaseCtrlExtension(ETouchFeedbackNone));
-#endif // RD_TACTILE_FEEDBACK    
+    //todo code refactoring needed, move to BaseConstructL
+    iExtension = new CFepUiBaseCtrlExtension();
+   
     iPenSize.SetSize(1,1);        
     iBorderSize.SetSize(KDefaultFrameWidth,KDefaultFrameWidth);
     iValidRegion.AddRect(iRect);
@@ -94,9 +94,9 @@
                     iUiLayout(aUiLayout),
                     iOwnWndCtrl(aOwnership)
     {
-#ifdef RD_TACTILE_FEEDBACK
-    iReservered1 = reinterpret_cast<TInt>(new CFepUiBaseCtrlExtension(ETouchFeedbackNone));
-#endif // RD_TACTILE_FEEDBACK
+    //todo code refactoring needed, move to BaseConstructL
+    iExtension = new CFepUiBaseCtrlExtension();
+    
     iRect = aControl->Rect();
     iControlId = aControl->UniqueHandle();
     iValidRegion.AddRect(iRect);
@@ -128,8 +128,9 @@
     //de-register the area for tactile feedback
     //if(aUiLayout) //there must be aUiLayout
     UiLayout()->DeRegisterFeedbackArea(reinterpret_cast<TInt>(this), Rect());   
-	delete reinterpret_cast<CFepUiBaseCtrlExtension*>(iReservered1);       
 #endif // RD_TACTILE_FEEDBACK 
+    
+    delete iExtension; 
     }
 
 // ---------------------------------------------------------------------------
@@ -184,7 +185,7 @@
 EXPORT_C void CFepUiBaseCtrl::SetTactileFeedbackType(TInt aTactileType)
 	{
 #ifdef RD_TACTILE_FEEDBACK
-	reinterpret_cast<CFepUiBaseCtrlExtension*>(iReservered1)->SetTactileFeedbackType(aTactileType);
+    iExtension->SetTactileFeedbackType(aTactileType);
 #endif // RD_TACTILE_FEEDBACK 
 	}
 
@@ -535,6 +536,11 @@
 //           
 EXPORT_C TBool CFepUiBaseCtrl::Contains(const TPoint& aPt)
     {
+    if( iExtension->iExtResponseAreaActive )
+        {
+        return iExtension->iExtResponseArea.Contains( aPt );
+        }
+   
     return iRect.Contains(aPt);
     //return iValidRegion.Contains(aPt);
     }
@@ -765,6 +771,11 @@
 //      
 EXPORT_C CFepUiBaseCtrl* CFepUiBaseCtrl::HandlePointerDownEventL(const TPoint& aPoint)
     {
+    if ( iExtension->iExtResponseAreaEnabled ) 
+        {
+        ActiveExtResponseArea();
+        }
+    
     iPointerDown = ETrue;
     if(iWndControl)
         {
@@ -789,6 +800,11 @@
 EXPORT_C CFepUiBaseCtrl* CFepUiBaseCtrl::HandlePointerUpEventL(
                                                          const TPoint& aPoint)
     {
+    if ( iExtension->iExtResponseAreaActive )
+        {
+        CancelExtResponseArea();
+        }
+    
     iPointerDown = EFalse;
     if(iWndControl)
         {
@@ -843,6 +859,11 @@
 //    
 EXPORT_C void CFepUiBaseCtrl::CancelPointerDownL()
     {
+    if ( iExtension->iExtResponseAreaActive )
+        {
+        CancelExtResponseArea();
+        }
+    
     if (PointerDown())
         {
         iPointerDown = EFalse;
@@ -986,6 +1007,11 @@
 //           
 EXPORT_C void CFepUiBaseCtrl::HandlePointerLeave(const TPoint& /*aPt*/)
     {
+    if ( iExtension->iExtResponseAreaActive )
+        {
+        CancelExtResponseArea();
+        }
+    
     iPointerDown = EFalse;
     iPointerLeft = ETrue;
     //report event
@@ -1000,6 +1026,11 @@
 //           
 EXPORT_C void CFepUiBaseCtrl::HandlePointerEnter(const TPoint& aPt)
     {
+    if ( iExtension->iExtResponseAreaEnabled ) 
+        {
+        ActiveExtResponseArea();
+        }
+    
     iPointerDown = ETrue;
     iPointerLeft = EFalse;
     TRAP_IGNORE(HandlePointerMoveEventL(aPt));
@@ -1334,7 +1365,73 @@
     return order;    
     }
 
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::EnableExtResponseArea
+// Enable/disable extra response area support
+// ---------------------------------------------------------------------------
+//  
+EXPORT_C void CFepUiBaseCtrl::EnableExtResponseArea( TBool aEnable, 
+                                                     const TRect& aExtMargin )
+    {
+    iExtension->iExtResponseAreaEnabled = aEnable;
+    iExtension->iExtResponseAreaMargin = aExtMargin;
+    }
 
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::EnableExtResponseArea
+// Active extra response area
+// ---------------------------------------------------------------------------
+//  
+EXPORT_C void CFepUiBaseCtrl::ActiveExtResponseArea()
+    {
+    if ( iExtension->iExtResponseAreaEnabled )
+        {
+        TRect response = Rect();
+        response.iTl -= iExtension->iExtResponseAreaMargin.iTl;
+        response.iBr += iExtension->iExtResponseAreaMargin.Size();
+        
+        UpdateExtResponseArea( response );
+        }    
+    }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::EnableExtResponseArea
+// Cancel extra response area
+// ---------------------------------------------------------------------------
+//  
+EXPORT_C void CFepUiBaseCtrl::CancelExtResponseArea()
+    {
+    iExtension->iExtResponseAreaActive = EFalse;
+    
+    CFepUiBaseCtrl* parent = ParentCtrl();
+    if( parent && parent->IsKindOfControl(ECtrlControlGroup) )
+        {
+        parent->CancelExtResponseArea();
+        }    
+    }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::EnableExtResponseArea
+// Update extra response area
+// ---------------------------------------------------------------------------
+//
+void CFepUiBaseCtrl::UpdateExtResponseArea( const TRect& aRect )
+    {
+    if ( aRect.iTl.iX < Rect().iTl.iX || aRect.iTl.iY < Rect().iTl.iY ||
+         aRect.iBr.iX > Rect().iBr.iX || aRect.iBr.iY > Rect().iBr.iY )
+        {
+        iExtension->iExtResponseAreaActive = ETrue;
+        iExtension->iExtResponseArea = Rect();
+        iExtension->iExtResponseArea.BoundingRect( aRect );
+
+        //update parent
+        CFepUiBaseCtrl* parent = ParentCtrl();
+        if ( parent && parent->IsKindOfControl( ECtrlControlGroup ) )
+            {
+            parent->UpdateExtResponseArea( iExtension->iExtResponseArea );
+            }
+        }
+    }
 
 // ---------------------------------------------------------------------------
 // CFepUiBaseCtrl::CFepUiBaseCtrlExtension
@@ -1342,11 +1439,17 @@
 // ---------------------------------------------------------------------------
 //
 
-CFepUiBaseCtrl::CFepUiBaseCtrlExtension::CFepUiBaseCtrlExtension(TInt aTactileType)
+CFepUiBaseCtrl::CFepUiBaseCtrlExtension::CFepUiBaseCtrlExtension()
 	{
 #ifdef RD_TACTILE_FEEDBACK
-	iTactileType = aTactileType;
+	iTactileType = ETouchFeedbackNone;
 #endif // RD_TACTILE_FEEDBACK 
+	
+	//temp code, can be removed after refactoring of CFepUiBaseCtrl::iExtension
+    iExtResponseAreaActive = EFalse;
+    iExtResponseArea.SetRect( TPoint(0,0), TSize(0,0) );
+    iExtResponseAreaEnabled = EFalse;
+    iExtResponseAreaMargin.SetRect( TPoint(0,0), TSize(0,0) );
 	}
 
 void CFepUiBaseCtrl::CFepUiBaseCtrlExtension::SetTactileFeedbackType(TInt aTactileType)