vcl/inc/window.h | 5 +++ vcl/source/window/accessibility.cxx | 46 +++++++++++++++++++++++++++++++++++ vcl/unx/gtk/gtksalframe.cxx | 47 ------------------------------------ vcl/unx/gtk3/gtk3gtkframe.cxx | 47 ------------------------------------ 4 files changed, 53 insertions(+), 92 deletions(-)
New commits: commit ffd98521de175057e47d53f80685a70215959384 Author: Jan-Marek Glogowski <glo...@fbihome.de> AuthorDate: Wed May 15 13:39:38 2019 +0000 Commit: Jan-Marek Glogowski <glo...@fbihome.de> CommitDate: Wed May 15 19:07:52 2019 +0200 Move FindFocusedEditableText from gtk* into vcl Now that it will be used by four VCL plugins, move its code into the common VCL library. The none-XAccessibility, none-UNO version used on Windows needs much more work to function with various widgets (including some API refactoring IMHO). (see ImplHandleSalSurroundingTextRequest and friends). Change-Id: I0fdf72336a66fc578b18b1edc8f8627d5dfdc57f Reviewed-on: https://gerrit.libreoffice.org/72364 Tested-by: Jenkins Reviewed-by: Jan-Marek Glogowski <glo...@fbihome.de> diff --git a/vcl/inc/window.h b/vcl/inc/window.h index 8e0e53b88202..bdd64c1de5db 100644 --- a/vcl/inc/window.h +++ b/vcl/inc/window.h @@ -58,6 +58,8 @@ namespace com { namespace sun { namespace star { namespace accessibility { class XAccessible; + class XAccessibleContext; + class XAccessibleEditableText; } namespace rendering { @@ -424,6 +426,9 @@ void ImplHandleResize( vcl::Window* pWindow, long nNewWidth, long nNewHeight ); VCL_DLLPUBLIC void ImplWindowStateFromStr(WindowStateData& rData, const OString& rStr); VCL_DLLPUBLIC OString ImplWindowStateToStr(const WindowStateData& rData); +VCL_DLLPUBLIC css::uno::Reference<css::accessibility::XAccessibleEditableText> +FindFocusedEditableText(css::uno::Reference<css::accessibility::XAccessibleContext> const&); + #endif // INCLUDED_VCL_INC_WINDOW_H /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/window/accessibility.cxx b/vcl/source/window/accessibility.cxx index a4e800373347..1b858386eb06 100644 --- a/vcl/source/window/accessibility.cxx +++ b/vcl/source/window/accessibility.cxx @@ -73,6 +73,8 @@ #include <com/sun/star/accessibility/XAccessible.hpp> #include <com/sun/star/accessibility/AccessibleRole.hpp> +#include <com/sun/star/accessibility/AccessibleStateType.hpp> +#include <com/sun/star/accessibility/XAccessibleEditableText.hpp> #include <com/sun/star/datatransfer/dnd/XDragSource.hpp> #include <com/sun/star/datatransfer/dnd/XDropTarget.hpp> #include <com/sun/star/datatransfer/clipboard/XClipboard.hpp> @@ -638,4 +640,48 @@ void Window::SetAccessibilityEventsSuppressed(bool bSuppressed) } /* namespace vcl */ +uno::Reference<accessibility::XAccessibleEditableText> +FindFocusedEditableText(uno::Reference<accessibility::XAccessibleContext> const& xContext) +{ + if (!xContext.is()) + return uno::Reference<accessibility::XAccessibleEditableText>(); + + uno::Reference<accessibility::XAccessibleStateSet> xState = xContext->getAccessibleStateSet(); + if (xState.is()) + { + if (xState->contains(accessibility::AccessibleStateType::FOCUSED)) + { + uno::Reference<accessibility::XAccessibleEditableText> xText + = uno::Reference<accessibility::XAccessibleEditableText>(xContext, uno::UNO_QUERY); + if (xText.is()) + return xText; + if (xState->contains(accessibility::AccessibleStateType::MANAGES_DESCENDANTS)) + return uno::Reference<accessibility::XAccessibleEditableText>(); + } + } + + bool bSafeToIterate = true; + sal_Int32 nCount = xContext->getAccessibleChildCount(); + if (nCount < 0 || nCount > SAL_MAX_UINT16 /* slow enough for anyone */) + bSafeToIterate = false; + if (!bSafeToIterate) + return uno::Reference<accessibility::XAccessibleEditableText>(); + + for (sal_Int32 i = 0; i < xContext->getAccessibleChildCount(); ++i) + { + uno::Reference<accessibility::XAccessible> xChild = xContext->getAccessibleChild(i); + if (!xChild.is()) + continue; + uno::Reference<accessibility::XAccessibleContext> xChildContext + = xChild->getAccessibleContext(); + if (!xChildContext.is()) + continue; + uno::Reference<accessibility::XAccessibleEditableText> xText + = FindFocusedEditableText(xChildContext); + if (xText.is()) + return xText; + } + return uno::Reference<accessibility::XAccessibleEditableText>(); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/unx/gtk/gtksalframe.cxx b/vcl/unx/gtk/gtksalframe.cxx index abad3d42a241..75be17dcddc9 100644 --- a/vcl/unx/gtk/gtksalframe.cxx +++ b/vcl/unx/gtk/gtksalframe.cxx @@ -69,9 +69,6 @@ #endif #include <com/sun/star/accessibility/XAccessibleContext.hpp> -#include <com/sun/star/accessibility/AccessibleRole.hpp> -#include <com/sun/star/accessibility/XAccessibleStateSet.hpp> -#include <com/sun/star/accessibility/AccessibleStateType.hpp> #include <com/sun/star/accessibility/XAccessibleEditableText.hpp> #include <config_folders.h> @@ -3485,48 +3482,6 @@ void GtkSalFrame::IMHandler::signalIMPreeditEnd( GtkIMContext*, gpointer im_hand pThis->updateIMSpotLocation(); } -static uno::Reference<accessibility::XAccessibleEditableText> - FindFocus(const uno::Reference< accessibility::XAccessibleContext >& xContext) -{ - if (!xContext.is()) - return uno::Reference< accessibility::XAccessibleEditableText >(); - - uno::Reference<accessibility::XAccessibleStateSet> xState = xContext->getAccessibleStateSet(); - if (xState.is()) - { - if (xState->contains(accessibility::AccessibleStateType::FOCUSED)) - { - uno::Reference< accessibility::XAccessibleEditableText > xText = - uno::Reference<accessibility::XAccessibleEditableText>(xContext, uno::UNO_QUERY); - if (xText.is()) - return xText; - if (xState->contains(accessibility::AccessibleStateType::MANAGES_DESCENDANTS)) - return uno::Reference< accessibility::XAccessibleEditableText >(); - } - } - - bool bSafeToIterate = true; - sal_Int32 nCount = xContext->getAccessibleChildCount(); - if (nCount < 0 || nCount > SAL_MAX_UINT16 /* slow enough for anyone */) - bSafeToIterate = false; - if (!bSafeToIterate) - return uno::Reference< accessibility::XAccessibleEditableText >(); - - for (sal_Int32 i = 0; i < xContext->getAccessibleChildCount(); ++i) - { - uno::Reference< accessibility::XAccessible > xChild = xContext->getAccessibleChild(i); - if (!xChild.is()) - continue; - uno::Reference< accessibility::XAccessibleContext > xChildContext = xChild->getAccessibleContext(); - if (!xChildContext.is()) - continue; - uno::Reference< accessibility::XAccessibleEditableText > xText = FindFocus(xChildContext); - if (xText.is()) - return xText; - } - return uno::Reference< accessibility::XAccessibleEditableText >(); -} - static uno::Reference<accessibility::XAccessibleEditableText> lcl_GetxText(vcl::Window *pFocusWin) { uno::Reference<accessibility::XAccessibleEditableText> xText; @@ -3534,7 +3489,7 @@ static uno::Reference<accessibility::XAccessibleEditableText> lcl_GetxText(vcl:: { uno::Reference< accessibility::XAccessible > xAccessible( pFocusWin->GetAccessible() ); if (xAccessible.is()) - xText = FindFocus(xAccessible->getAccessibleContext()); + xText = FindFocusedEditableText(xAccessible->getAccessibleContext()); } catch(const uno::Exception& e) { diff --git a/vcl/unx/gtk3/gtk3gtkframe.cxx b/vcl/unx/gtk3/gtk3gtkframe.cxx index 802359a38807..d16db67057e5 100644 --- a/vcl/unx/gtk3/gtk3gtkframe.cxx +++ b/vcl/unx/gtk3/gtk3gtkframe.cxx @@ -75,9 +75,6 @@ #include <cmath> #include <com/sun/star/accessibility/XAccessibleContext.hpp> -#include <com/sun/star/accessibility/AccessibleRole.hpp> -#include <com/sun/star/accessibility/XAccessibleStateSet.hpp> -#include <com/sun/star/accessibility/AccessibleStateType.hpp> #include <com/sun/star/accessibility/XAccessibleEditableText.hpp> #include <com/sun/star/awt/MouseButton.hpp> #include <com/sun/star/datatransfer/dnd/DNDConstants.hpp> @@ -4051,48 +4048,6 @@ void GtkSalFrame::IMHandler::signalIMPreeditEnd( GtkIMContext*, gpointer im_hand pThis->updateIMSpotLocation(); } -static uno::Reference<accessibility::XAccessibleEditableText> - FindFocus(uno::Reference< accessibility::XAccessibleContext > const & xContext) -{ - if (!xContext.is()) - return uno::Reference< accessibility::XAccessibleEditableText >(); - - uno::Reference<accessibility::XAccessibleStateSet> xState = xContext->getAccessibleStateSet(); - if (xState.is()) - { - if (xState->contains(accessibility::AccessibleStateType::FOCUSED)) - { - uno::Reference< accessibility::XAccessibleEditableText > xText = - uno::Reference<accessibility::XAccessibleEditableText>(xContext, uno::UNO_QUERY); - if (xText.is()) - return xText; - if (xState->contains(accessibility::AccessibleStateType::MANAGES_DESCENDANTS)) - return uno::Reference< accessibility::XAccessibleEditableText >(); - } - } - - bool bSafeToIterate = true; - sal_Int32 nCount = xContext->getAccessibleChildCount(); - if (nCount < 0 || nCount > SAL_MAX_UINT16 /* slow enough for anyone */) - bSafeToIterate = false; - if (!bSafeToIterate) - return uno::Reference< accessibility::XAccessibleEditableText >(); - - for (sal_Int32 i = 0; i < xContext->getAccessibleChildCount(); ++i) - { - uno::Reference< accessibility::XAccessible > xChild = xContext->getAccessibleChild(i); - if (!xChild.is()) - continue; - uno::Reference< accessibility::XAccessibleContext > xChildContext = xChild->getAccessibleContext(); - if (!xChildContext.is()) - continue; - uno::Reference< accessibility::XAccessibleEditableText > xText = FindFocus(xChildContext); - if (xText.is()) - return xText; - } - return uno::Reference< accessibility::XAccessibleEditableText >(); -} - static uno::Reference<accessibility::XAccessibleEditableText> lcl_GetxText(vcl::Window *pFocusWin) { uno::Reference<accessibility::XAccessibleEditableText> xText; @@ -4100,7 +4055,7 @@ static uno::Reference<accessibility::XAccessibleEditableText> lcl_GetxText(vcl:: { uno::Reference< accessibility::XAccessible > xAccessible( pFocusWin->GetAccessible() ); if (xAccessible.is()) - xText = FindFocus(xAccessible->getAccessibleContext()); + xText = FindFocusedEditableText(xAccessible->getAccessibleContext()); } catch(const uno::Exception& e) { _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits