idlehomescreen/xmluirendering/uiengine/src/xnscrollablecontroladapter.cpp
changeset 1 5315654608de
parent 0 f72a12da539e
--- a/idlehomescreen/xmluirendering/uiengine/src/xnscrollablecontroladapter.cpp	Thu Dec 17 08:40:49 2009 +0200
+++ b/idlehomescreen/xmluirendering/uiengine/src/xnscrollablecontroladapter.cpp	Thu Jan 07 12:39:41 2010 +0200
@@ -36,6 +36,11 @@
 _LIT8(KViewportWidth, "viewport-width");
 _LIT8(KViewportTop, "viewport-top");
 _LIT8(KViewportLeft, "viewport-left");
+_LIT8(KScrollDirection, "scroll-direction");                         
+_LIT8(KHorizontal, "horizontal");
+
+const TInt EVertical( 0 );
+const TInt EHorizontal( 1 );
 
 // ============================ MEMBER FUNCTIONS ===============================
 
@@ -90,6 +95,16 @@
     iUiEngine = iNode.Node().UiEngine();
     
     iNode.Node().SetScrollableControl( this );
+    
+    // Default
+    iDirection = EVertical;
+    
+    CXnProperty* prop( iNode.GetPropertyL( KScrollDirection ) );
+    
+    if ( prop && prop->StringValue() == KHorizontal )
+        {
+        iDirection = EHorizontal;
+        }    
     }
 
 // -----------------------------------------------------------------------------
@@ -104,7 +119,9 @@
         {
         return;
         }
-    TPoint stylusPos = aPointerEvent.iPosition;   
+    
+    TPoint stylusPos( aPointerEvent.iPosition );
+    
     switch( aPointerEvent.iType )
         {
         case TPointerEvent::EButton1Down:
@@ -118,17 +135,20 @@
             }
             break;            
         case TPointerEvent::EButton1Up:
-            {
-            TInt distance = iStartPosition.iY - stylusPos.iY;
-            TPoint drag( 0, distance );
-            iPhysics->StartPhysics( drag, iStartTime );
+            {                                                        
+            TInt distanceY( iStartPosition.iY - stylusPos.iY );                                              
+            TInt distanceX( iStartPosition.iX - stylusPos.iX );
+            
+            TPoint drag( distanceX, distanceY );
+            iPhysics->StartPhysics( drag, iStartTime );                                
             }
             break; 
         case TPointerEvent::EDrag:        
             {
             TPoint distanceFromStart( iStartPosition - stylusPos );
 
-            if( Abs( distanceFromStart.iY ) > KOffset )                 
+            if( ( Abs( distanceFromStart.iY ) > KOffset && iDirection == EVertical ) || 
+                ( Abs( distanceFromStart.iX ) > KOffset && iDirection == EHorizontal ) )                 
                 {
                 CXnNode* focused( iUiEngine->FocusedNode() );
                 
@@ -142,8 +162,12 @@
                 }
             
             TInt deltaY( iStylusPosition.iY - stylusPos.iY );
+            TInt deltaX( iStylusPosition.iX - stylusPos.iX );
+            
             iStylusPosition = stylusPos;
-            TPoint deltaPoint( 0, deltaY );
+            
+            TPoint deltaPoint( deltaX, deltaY );
+            
             iPhysics->RegisterPanningPosition( deltaPoint );
             }
             break;
@@ -161,7 +185,7 @@
 //    
 void CXnScrollableControlAdapter::Draw( const TRect& aRect ) const
     {
-    CXnControlAdapter::Draw( aRect );    
+    CXnControlAdapter::Draw( aRect );           
     }
 
 // -----------------------------------------------------------------------------
@@ -248,20 +272,44 @@
 // -----------------------------------------------------------------------------
 void CXnScrollableControlAdapter::ShowItem( CXnNode& aNode )
     {
-    TRect rect = aNode.MarginRect();
+    TRect rect( aNode.MarginRect() );
+    
     if( !iViewPort.Contains( rect.iTl ) || !iViewPort.Contains( rect.iBr ) )
         {
-        TInt delta( 0 );
-        if( rect.iTl.iY < iViewPort.iTl.iY )
-            {
-            delta = rect.iTl.iY - iViewPort.iTl.iY;
+        if ( iDirection == EVertical )
+            {                            
+            TInt delta( 0 );
+
+            if( rect.iTl.iY < iViewPort.iTl.iY )
+                {
+                delta = rect.iTl.iY - iViewPort.iTl.iY;
+                }
+            else if( rect.iBr.iY > iViewPort.iBr.iY )
+                {
+                delta = rect.iBr.iY - iViewPort.iBr.iY;
+                }
+            
+            TPoint newPosition( iPreviousPosition + TPoint( 0, delta ) );
+            
+            ViewPositionChanged( newPosition, ETrue, 0 );
             }
-        else if( rect.iBr.iY > iViewPort.iBr.iY )
+        else
             {
-            delta = rect.iBr.iY - iViewPort.iBr.iY;
+            TInt delta( 0 );
+            
+            if( rect.iTl.iX < iViewPort.iTl.iX )
+                {
+                delta = rect.iTl.iX - iViewPort.iTl.iX;
+                }
+            else if( rect.iBr.iX > iViewPort.iBr.iX )
+                {
+                delta = rect.iBr.iX - iViewPort.iBr.iX;
+                }
+            
+            TPoint newPosition( iPreviousPosition + TPoint( delta, 0 ) );
+            
+            ViewPositionChanged( newPosition, ETrue, 0 );            
             }
-        TPoint newPosition = iPreviousPosition + TPoint( 0, delta );
-        ViewPositionChanged( newPosition, ETrue, 0 );
         }
     }
 
@@ -286,7 +334,17 @@
 void CXnScrollableControlAdapter::ViewPositionChanged( 
     const TPoint& aNewPosition, TBool aDrawNow, TUint /*aFlags*/ )
     {
-    TPoint diff = TPoint( 0, aNewPosition.iY - iPreviousPosition.iY );
+    TPoint diff;
+    
+    if ( iDirection == EVertical )
+        {
+        diff = TPoint( 0, aNewPosition.iY - iPreviousPosition.iY );
+        }
+    else
+        {
+        diff = TPoint( aNewPosition.iX - iPreviousPosition.iX, 0 );
+        }
+    
     iPreviousPosition = aNewPosition;
     iCurrentPosition += diff;
     TPoint tmpPos = iNode.Control()->Position();
@@ -341,9 +399,21 @@
         return;
         }
     TSize viewPortSize = iViewPort.Size();
-    TSize totalSize( iNode.MarginRect().Size() );
-    iPhysics->InitPhysicsL( totalSize, viewPortSize, EFalse );
-    iCurrentPosition = TPoint( 0, viewPortSize.iHeight / 2 );  
+    TSize totalSize( iNode.Rect().Size() );
+    
+    if ( iDirection == EVertical )
+        {
+        iPhysics->InitPhysicsL( totalSize, viewPortSize, EFalse );
+        }
+    else
+        {
+        iPhysics->InitPhysicsL( totalSize, viewPortSize, ETrue );
+        }
+    
+    
+    iCurrentPosition = 
+        TPoint( viewPortSize.iWidth / 2, viewPortSize.iHeight / 2 ); 
+                  
     iPreviousPosition = iStartViewPosition =  iCurrentPosition;
     }
 
@@ -358,16 +428,18 @@
     TInt top( 0 );
     TInt left( 0 );
 
+    CXnNode& node( iNode.Node() );
+    
     // Width
     CXnProperty* prop = iNode.GetPropertyL( KViewportWidth );
     if( prop )
         {
         width = iUiEngine->HorizontalPixelValueL(
-            prop, iNode.MarginRect().Width() );
+            prop, iNode.Rect().Width() );
         }
     if( width == 0 )
         {
-        width = iNode.MarginRect().Width();
+        width = node.Parent()->Rect().Width();
         }
 
     // Height
@@ -375,11 +447,11 @@
     if( prop )
         {
         height = iUiEngine->VerticalPixelValueL(
-            prop, iNode.MarginRect().Height() );
+            prop, iNode.Rect().Height() );
         }
     if( height == 0 )
         {
-        height = iNode.MarginRect().Height();
+        height = node.Parent()->Rect().Height();
         }
 
     // Top
@@ -387,7 +459,7 @@
     if( prop )
         {
         top = iUiEngine->VerticalPixelValueL(
-            prop, iNode.MarginRect().Height() );
+            prop, iNode.Rect().Height() );
         }
 
     // Left
@@ -395,10 +467,10 @@
     if( prop )
         {
         left = iUiEngine->HorizontalPixelValueL(
-            prop, iNode.MarginRect().Width() );
+            prop, iNode.Rect().Width() );
         }
 
-    iViewPort = TRect( iNode.MarginRect().iTl, TSize( width, height ) );
+    iViewPort = TRect( iNode.Rect().iTl, TSize( width, height ) );
     iViewPort.Move( left, top );
     }