]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/scrlwing.cpp
compile fix for Mac
[wxWidgets.git] / src / generic / scrlwing.cpp
index 69c534470d66f62a03d8b6e492b6c79f99471e32..ad1b3813991b1eb3b57938510db1395a662b95f4 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        src/generic/scrolwin.cpp
+// Name:        src/generic/scrlwing.cpp
 // Purpose:     wxScrolledWindow implementation
 // Author:      Julian Smart
 // Modified by: Vadim Zeitlin on 31.08.00: wxScrollHelper allows to implement.
 
 #ifndef WX_PRECOMP
     #include "wx/utils.h"
+    #include "wx/panel.h"
+    #include "wx/dcclient.h"
+    #if wxUSE_TIMER
+        #include "wx/timer.h"
+    #endif
+    #include "wx/sizer.h"
 #endif
 
-#include "wx/dcclient.h"
-
-#include "wx/panel.h"
-#if wxUSE_TIMER
-#include "wx/timer.h"
-#endif
-#include "wx/sizer.h"
 #include "wx/recguard.h"
 
 #ifdef __WXMSW__
@@ -937,7 +936,33 @@ void wxScrollHelper::GetViewStart (int *x, int *y) const
 void wxScrollHelper::DoCalcScrolledPosition(int x, int y, int *xx, int *yy) const
 {
     if ( xx )
-        *xx = x - m_xScrollPosition * m_xScrollPixelsPerLine;
+    {
+        if ((m_xScrollLines == 0) || (m_xScrollPixelsPerLine == 0))
+        {
+            // nothing to do
+            *xx = x;
+        }
+        else
+        {
+#ifdef __WXGTK__
+            if (m_win->GetLayoutDirection() == wxLayout_RightToLeft)
+            {
+                int w = 0, h = 0;
+                GetTargetSize(&w, &h);
+
+                // Calculate page size i.e. number of scroll units you get on the
+                // current client window
+                int noPagePositions = w/m_xScrollPixelsPerLine;
+                if (noPagePositions < 1) noPagePositions = 1;
+                *xx = x - ((m_xScrollLines - noPagePositions - m_xScrollPosition) * m_xScrollPixelsPerLine);
+            }
+            else
+#endif
+            {
+                *xx = x - m_xScrollPosition * m_xScrollPixelsPerLine;
+            }
+        }
+    }
     if ( yy )
         *yy = y - m_yScrollPosition * m_yScrollPixelsPerLine;
 }
@@ -945,7 +970,33 @@ void wxScrollHelper::DoCalcScrolledPosition(int x, int y, int *xx, int *yy) cons
 void wxScrollHelper::DoCalcUnscrolledPosition(int x, int y, int *xx, int *yy) const
 {
     if ( xx )
-        *xx = x + m_xScrollPosition * m_xScrollPixelsPerLine;
+    {
+        if ((m_xScrollLines == 0) || (m_xScrollPixelsPerLine == 0))
+        {
+            // nothing to do
+            *xx = x;
+        }
+        else
+        {
+#ifdef __WXGTK__
+            if (m_win->GetLayoutDirection() == wxLayout_RightToLeft)
+            {
+                int w = 0, h = 0;
+                GetTargetSize(&w, &h);
+
+                // Calculate page size i.e. number of scroll units you get on the
+                // current client window
+                int noPagePositions = w/m_xScrollPixelsPerLine;
+                if (noPagePositions < 1) noPagePositions = 1;
+                *xx = x + ((m_xScrollLines - noPagePositions - m_xScrollPosition) * m_xScrollPixelsPerLine);
+            }
+            else
+#endif
+            {
+                *xx = x + m_xScrollPosition * m_xScrollPixelsPerLine;
+            }
+        }
+    }
     if ( yy )
         *yy = y + m_yScrollPosition * m_yScrollPixelsPerLine;
 }