diff options
Diffstat (limited to 'include/test/a11y/eventposter.hxx')
-rw-r--r-- | include/test/a11y/eventposter.hxx | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/include/test/a11y/eventposter.hxx b/include/test/a11y/eventposter.hxx new file mode 100644 index 0000000000..d9bce5601f --- /dev/null +++ b/include/test/a11y/eventposter.hxx @@ -0,0 +1,131 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#include <test/testdllapi.hxx> + +#include <com/sun/star/accessibility/XAccessible.hpp> +#include <com/sun/star/uno/Reference.hxx> + +#include <LibreOfficeKit/LibreOfficeKitEnums.h> +#include <rtl/ustring.hxx> +#include <vcl/window.hxx> + +namespace test +{ +/** + * @brief Base helper class to send events to a window. + * + * Implementations of this helper will usually just wrap an implementation of post*Event*() calls. + * This class is mostly useful to encapsulate the calls when getting the target window is not + * trivial or is only relevant to sending events, and to have a generic event poster interface. + * + * Additionally, this class provides simplified helpers to send event pairs, like key down/up, or + * text+commit, to make it easier on the common case for callers. + */ +class OOO_DLLPUBLIC_TEST EventPosterHelperBase +{ +public: + virtual ~EventPosterHelperBase(){}; + + /** @see SfxLokHelper::postKeyEventAsync */ + virtual void postKeyEventAsync(int nType, int nCharCode, int nKeyCode) const = 0; + + /** Posts a full key down/up cycle */ + void postKeyEventAsync(int nCharCode, int nKeyCode) const + { + postKeyEventAsync(LOK_KEYEVENT_KEYINPUT, nCharCode, nKeyCode); + postKeyEventAsync(LOK_KEYEVENT_KEYUP, nCharCode, nKeyCode); + } + + /** @see SfxLokHelper::postExtTextEventAsync */ + virtual void postExtTextEventAsync(int nType, const OUString& rText) const = 0; + + /** Posts a full text input + commit sequence */ + void postExtTextEventAsync(const OUString& rText) const + { + postExtTextEventAsync(LOK_EXT_TEXTINPUT, rText); + postExtTextEventAsync(LOK_EXT_TEXTINPUT_END, rText); + } +}; + +/** + * @brief Helper to send events to a window. + * + * This helper basically just wraps SfxLokHelper::post*EventAsync() calls to hold the target window + * reference in the class. + */ +class OOO_DLLPUBLIC_TEST EventPosterHelper : public EventPosterHelperBase +{ +protected: + VclPtr<vcl::Window> mxWindow; + +public: + EventPosterHelper(void) + : mxWindow(nullptr) + { + } + EventPosterHelper(VclPtr<vcl::Window> xWindow) + : mxWindow(xWindow) + { + } + EventPosterHelper(vcl::Window* pWindow) + : mxWindow(pWindow) + { + } + + vcl::Window* getWindow() const { return mxWindow; } + + void setWindow(VclPtr<vcl::Window> xWindow) { mxWindow = xWindow; } + void setWindow(vcl::Window* pWindow) { mxWindow = pWindow; } + + explicit operator bool() const { return mxWindow && !mxWindow->isDisposed(); } + bool operator!() const { return !bool(*this); } + + using EventPosterHelperBase::postKeyEventAsync; + using EventPosterHelperBase::postExtTextEventAsync; + + /** @see SfxLokHelper::postKeyEventAsync */ + virtual void postKeyEventAsync(int nType, int nCharCode, int nKeyCode) const override; + /** @see SfxLokHelper::postExtTextEventAsync */ + virtual void postExtTextEventAsync(int nType, const OUString& rText) const override; +}; + +/** + * @brief Accessibility-specialized helper to send events to a window. + * + * This augments @c test::EventPosterHelper to simplify usage in accessibility tests. + */ +class OOO_DLLPUBLIC_TEST AccessibleEventPosterHelper : public EventPosterHelper +{ +public: + AccessibleEventPosterHelper(void) + : EventPosterHelper() + { + } + AccessibleEventPosterHelper(const css::uno::Reference<css::accessibility::XAccessible> xAcc) + { + setWindow(xAcc); + } + + /** + * @brief Sets the window on which post events based on an accessible object inside it. + * @param xAcc An accessible object inside a toplevel. + * + * This method tries and find the top level window containing @p xAcc to use it to post events. + * + * This currently relies on a toplevel accessible being a @c VCLXWindow, and requires that + * window's output device to be set (@see VCLXWindow::GetWindow()). + */ + void setWindow(css::uno::Reference<css::accessibility::XAccessible> xAcc); +}; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ |