Bug 118418 - Scrolling API?

Martin Pieuchot mpi at grenadille.net
Mon Dec 16 12:10:19 UTC 2019


I'm looking for help/explanation about the coordinate system and
scrolling API to use in `SwAccessibleParagraph'.

I'm currently working on bug #118418 [1], trying to implement
scrollSubstringTo() and scrollSubstringToPoint() like I did for
gtk [2] and evince [3].

The diff below clearly shows that I don't know how to translate a
character index to coordinates that can be feed to Window's Scroll().

So here are my questions:

- Is calling getWindow()'s Scroll() the correct way to realize the
  scrolling.  If so, the code below doesn't correctly refresh all the
  text, so what am I missing?

- What API should I use to convert the coordinates?

Thanks in advance,
Martin

[1] https://bugs.documentfoundation.org/show_bug.cgi?id=118418
[2] https://gitlab.gnome.org/GNOME/gtk/merge_requests/1120
[3] https://gitlab.gnome.org/GNOME/evince/merge_requests/193

diff --git sw/source/core/access/accpara.cxx sw/source/core/access/accpara.cxx
index 1b4b7fd5af62..250463929fcf 100644
--- sw/source/core/access/accpara.cxx
+++ sw/source/core/access/accpara.cxx
@@ -34,6 +34,7 @@
 #include <vcl/window.hxx>
 #include <sal/log.hxx>
 #include <com/sun/star/accessibility/AccessibleRole.hpp>
+#include <com/sun/star/accessibility/AccessibleScrollType.hpp>
 #include <com/sun/star/accessibility/AccessibleStateType.hpp>
 #include <com/sun/star/accessibility/AccessibleTextType.hpp>
 #include <com/sun/star/accessibility/AccessibleEventId.hpp>
@@ -2492,8 +2493,81 @@ sal_Bool SwAccessibleParagraph::copyText( sal_Int32 nStartIndex, sal_Int32 nEndI
 sal_Bool SwAccessibleParagraph::scrollSubstringTo( sal_Int32 nStartIndex,
     sal_Int32 nEndIndex, sal_Int16 aScrollType )
 {
-    fprintf(stderr, "%s: AccPara start=%u, end=%u, type=%d\n", __func__, nStartIndex, nEndIndex, aScrollType);
-    return false;
+    SolarMutexGuard aGuard;
+
+    ThrowIfDisposed();
+
+    // parameter checking
+    sal_Int32 nLength = GetString().getLength();
+    if ( ! IsValidRange( nStartIndex, nEndIndex, nLength ) )
+        throw lang::IndexOutOfBoundsException();
+
+    fprintf(stderr, "%s: start=%u, end=%u, length=%d\n", __func__, nStartIndex, nEndIndex, nLength);
+
+    vcl::Window *pWin = GetWindow();
+    if ( ! pWin )
+        throw uno::RuntimeException("no Window", static_cast<cppu::OWeakObject*>(this));
+
+    // WTF
+    MapMode aMap =  pWin->GetMapMode();
+    Point aOrg =  aMap.GetOrigin();
+    fprintf(stderr, "%s: orgX=%ld, orgY=%ld\n", __func__, aOrg.X(), aOrg.Y());
+
+
+    // TEST 2
+    SwRect aLogBounds( GetBounds( *(GetMap()), GetFrame() ) );
+    Point aPoint( GetMap()->CoreToPixel( aLogBounds.SVRect() ).TopLeft() );
+    Point aCorePoint( GetMap()->PixelToCore( aPoint ) );
+    fprintf(stderr, "%s: point=%ld,%ld core=%ld,%ld\n", __func__, aPoint.getX(),
+        aPoint.getY(), aCorePoint.getX(), aCorePoint.getY());
+
+
+    // getCharacterBounds()
+    awt::Rectangle startR, endR;
+    startR = getCharacterBounds(nStartIndex);
+    endR = getCharacterBounds(nEndIndex);
+    fprintf(stderr, "%s: start=%d,%d end=%d,%d\n", __func__, startR.X, startR.Y,
+        endR.X, endR.Y);
+
+    Point startPoint = GetMap()->PixelToCore( Point( startR.X, startR.Y ) );
+    Point endPoint = GetMap()->PixelToCore( Point( endR.X, endR.Y ) );
+    fprintf(stderr, "%s: sP=%d,%d eP=%d,%d\n", __func__, startPoint.getX(),
+        startPoint.getY(), endPoint.getX(), endPoint.getY());
+
+    switch (aScrollType)
+    {
+        case AccessibleScrollType::SCROLL_TOP_LEFT:
+            break;
+        case AccessibleScrollType::SCROLL_BOTTOM_RIGHT:
+            break;
+        case AccessibleScrollType::SCROLL_TOP_EDGE:
+            break;
+        case AccessibleScrollType::SCROLL_BOTTOM_EDGE:
+            break;
+        case AccessibleScrollType::SCROLL_LEFT_EDGE:
+            break;
+        case AccessibleScrollType::SCROLL_RIGHT_EDGE:
+            break;
+        case AccessibleScrollType::SCROLL_ANYWHERE:
+            break;
+        default:
+            return false;
+    }
+    fprintf(stderr, "%s: type=%d\n", __func__, aScrollType);
+
+    long nX, nY;
+    nX = startPoint.getX();
+    nY = startPoint.getY();
+
+    pWin->Update(); // Needed?
+
+    // TOP LEFT
+    pWin->Scroll( -nX, -nY, ScrollFlags::Children );
+    aMap.SetOrigin( Point( -nX, -nY ) );
+    pWin->SetMapMode( aMap );
+    pWin->Update();
+
+    return true;
 }
 
 sal_Bool SwAccessibleParagraph::scrollSubstringToPoint( sal_Int32 nStartIndex,


More information about the LibreOffice mailing list