summaryrefslogtreecommitdiff
path: root/sw
diff options
context:
space:
mode:
authorColomban Wendling <cwendling@hypra.fr>2020-04-30 10:49:37 +0200
committerStephan Bergmann <sbergman@redhat.com>2020-05-07 12:11:33 +0200
commitb46a0a7f9f88a0213b0a5ca2712b6eb93b74d088 (patch)
treeaf83d20d3c08508268c465a7c6983db294f64559 /sw
parente420b89a698f50b174422b962a24e2a21672a178 (diff)
tdf#118418 implement scrollSubstringTo() for gtk
Define & use new accessibility scroll type compatible with IAccessible2 and extend the XAccessibleText interface to require scrollSubstringTo(). Co-authored-by: Martin Pieuchot <mpi@grenadille.net> Change-Id: Id3b2e8616892d7dcbfb41a14b72a8a457fd1dbf6 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/89851 Tested-by: Jenkins Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
Diffstat (limited to 'sw')
-rw-r--r--sw/source/core/access/accnotextframe.cxx1
-rw-r--r--sw/source/core/access/accnotextframe.hxx2
-rw-r--r--sw/source/core/access/accpara.cxx67
-rw-r--r--sw/source/core/access/accpara.hxx2
4 files changed, 72 insertions, 0 deletions
diff --git a/sw/source/core/access/accnotextframe.cxx b/sw/source/core/access/accnotextframe.cxx
index 7aa34cffe2bf..acc4f0ce31a5 100644
--- a/sw/source/core/access/accnotextframe.cxx
+++ b/sw/source/core/access/accnotextframe.cxx
@@ -259,6 +259,7 @@ css::accessibility::TextSegment SAL_CALL SwAccessibleNoTextFrame::getTextBehindI
}
sal_Bool SAL_CALL SwAccessibleNoTextFrame::copyText( sal_Int32, sal_Int32 ){return true;}
+sal_Bool SAL_CALL SwAccessibleNoTextFrame::scrollSubstringTo( sal_Int32, sal_Int32, AccessibleScrollType ){return false;}
// XAccessibleHyperText
diff --git a/sw/source/core/access/accnotextframe.hxx b/sw/source/core/access/accnotextframe.hxx
index 38fdd480cc97..21d3bcbe0968 100644
--- a/sw/source/core/access/accnotextframe.hxx
+++ b/sw/source/core/access/accnotextframe.hxx
@@ -21,6 +21,7 @@
#define INCLUDED_SW_SOURCE_CORE_ACCESS_ACCNOTEXTFRAME_HXX
#include "accframebase.hxx"
+#include <com/sun/star/accessibility/AccessibleScrollType.hpp>
#include <com/sun/star/accessibility/XAccessibleImage.hpp>
#include <com/sun/star/accessibility/XAccessibleHypertext.hpp>
@@ -104,6 +105,7 @@ public:
virtual css::accessibility::TextSegment SAL_CALL getTextBeforeIndex( sal_Int32 nIndex, sal_Int16 aTextType ) override;
virtual css::accessibility::TextSegment SAL_CALL getTextBehindIndex( sal_Int32 nIndex, sal_Int16 aTextType ) override;
virtual sal_Bool SAL_CALL copyText( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) override;
+ virtual sal_Bool SAL_CALL scrollSubstringTo( sal_Int32 nStartIndex, sal_Int32 nEndIndex, css::accessibility::AccessibleScrollType aScrollType) override;
// XAccessibleHypertext
virtual sal_Int32 SAL_CALL getHyperLinkCount() override;
diff --git a/sw/source/core/access/accpara.cxx b/sw/source/core/access/accpara.cxx
index b2e2e56634c9..4119275a75bc 100644
--- a/sw/source/core/access/accpara.cxx
+++ b/sw/source/core/access/accpara.cxx
@@ -21,6 +21,7 @@
#include <numeric>
#include <txtfrm.hxx>
#include <flyfrm.hxx>
+#include <mdiexp.hxx>
#include <ndtxt.hxx>
#include <pam.hxx>
#include <unotextrange.hxx>
@@ -34,6 +35,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,6 +2494,71 @@ sal_Bool SwAccessibleParagraph::copyText( sal_Int32 nStartIndex, sal_Int32 nEndI
return true;
}
+sal_Bool SwAccessibleParagraph::scrollSubstringTo( sal_Int32 nStartIndex,
+ sal_Int32 nEndIndex, AccessibleScrollType aScrollType )
+{
+ SolarMutexGuard aGuard;
+
+ ThrowIfDisposed();
+
+ // parameter checking
+ sal_Int32 nLength = GetString().getLength();
+ if ( ! IsValidRange( nStartIndex, nEndIndex, nLength ) )
+ throw lang::IndexOutOfBoundsException();
+
+ vcl::Window *pWin = GetWindow();
+ if ( ! pWin )
+ throw uno::RuntimeException("no Window", static_cast<cppu::OWeakObject*>(this));
+
+ /* Start and end character bounds, in pixels, relative to the paragraph */
+ awt::Rectangle startR, endR;
+ startR = getCharacterBounds(nStartIndex);
+ endR = getCharacterBounds(nEndIndex);
+
+ /* Adjust points to fit the bounding box of both bounds. */
+ Point sP(std::min(startR.X, endR.X), startR.Y);
+ Point eP(std::max(startR.X + startR.Width, endR.X + endR.Width), endR.Y + endR.Height);
+
+ /* Offset the values relative to the view shell frame */
+ SwRect aFrameLogBounds( GetBounds( *(GetMap()) ) ); // twip rel to doc root
+ Point aFramePixPos( GetMap()->CoreToPixel( aFrameLogBounds.SVRect() ).TopLeft() );
+ sP += aFramePixPos;
+ eP += aFramePixPos;
+
+ Point startPoint(GetMap()->PixelToCore(sP));
+ Point endPoint(GetMap()->PixelToCore(eP));
+
+ switch (aScrollType)
+ {
+#ifdef notyet
+ 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;
+#endif
+ case AccessibleScrollType_SCROLL_ANYWHERE:
+ break;
+ default:
+ return false;
+ }
+
+ const SwRect aRect(startPoint, endPoint);
+ SwViewShell* pViewShell = GetMap()->GetShell();
+ OSL_ENSURE( pViewShell != nullptr, "View shell expected!" );
+
+ ScrollMDI(pViewShell, aRect, USHRT_MAX, USHRT_MAX);
+
+ return true;
+}
+
// XAccessibleEditableText
sal_Bool SwAccessibleParagraph::cutText( sal_Int32 nStartIndex, sal_Int32 nEndIndex )
diff --git a/sw/source/core/access/accpara.hxx b/sw/source/core/access/accpara.hxx
index 5e6fed4a5705..6b6f481637d5 100644
--- a/sw/source/core/access/accpara.hxx
+++ b/sw/source/core/access/accpara.hxx
@@ -20,6 +20,7 @@
#define INCLUDED_SW_SOURCE_CORE_ACCESS_ACCPARA_HXX
#include "acccontext.hxx"
+#include <com/sun/star/accessibility/AccessibleScrollType.hpp>
#include <com/sun/star/accessibility/XAccessibleEditableText.hpp>
#include <com/sun/star/accessibility/XAccessibleSelection.hpp>
#include <com/sun/star/accessibility/XAccessibleHypertext.hpp>
@@ -313,6 +314,7 @@ public:
virtual css::accessibility::TextSegment SAL_CALL getTextBeforeIndex( sal_Int32 nIndex, sal_Int16 aTextType ) override;
virtual css::accessibility::TextSegment SAL_CALL getTextBehindIndex( sal_Int32 nIndex, sal_Int16 aTextType ) override;
virtual sal_Bool SAL_CALL copyText( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) override;
+ virtual sal_Bool SAL_CALL scrollSubstringTo( sal_Int32 nStartIndex, sal_Int32 nEndIndex, css::accessibility::AccessibleScrollType aScrollType) override;
// XAccessibleEditableText
virtual sal_Bool SAL_CALL cutText( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) override;