diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-15 05:54:39 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-15 05:54:39 +0000 |
commit | 267c6f2ac71f92999e969232431ba04678e7437e (patch) | |
tree | 358c9467650e1d0a1d7227a21dac2e3d08b622b2 /include/toolkit/helper | |
parent | Initial commit. (diff) | |
download | libreoffice-267c6f2ac71f92999e969232431ba04678e7437e.tar.xz libreoffice-267c6f2ac71f92999e969232431ba04678e7437e.zip |
Adding upstream version 4:24.2.0.upstream/4%24.2.0
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'include/toolkit/helper')
-rw-r--r-- | include/toolkit/helper/accessiblefactory.hxx | 151 | ||||
-rw-r--r-- | include/toolkit/helper/convert.hxx | 61 | ||||
-rw-r--r-- | include/toolkit/helper/emptyfontdescriptor.hxx | 40 | ||||
-rw-r--r-- | include/toolkit/helper/listenermultiplexer.hxx | 310 | ||||
-rw-r--r-- | include/toolkit/helper/macros.hxx | 166 | ||||
-rw-r--r-- | include/toolkit/helper/vclunohelper.hxx | 156 |
6 files changed, 884 insertions, 0 deletions
diff --git a/include/toolkit/helper/accessiblefactory.hxx b/include/toolkit/helper/accessiblefactory.hxx new file mode 100644 index 0000000000..6c0532ce9e --- /dev/null +++ b/include/toolkit/helper/accessiblefactory.hxx @@ -0,0 +1,151 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * 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/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_TOOLKIT_HELPER_ACCESSIBLEFACTORY_HXX +#define INCLUDED_TOOLKIT_HELPER_ACCESSIBLEFACTORY_HXX + +#include <com/sun/star/uno/Reference.hxx> +#include <salhelper/simplereferenceobject.hxx> + +namespace com::sun::star::accessibility { + class XAccessible; + class XAccessibleContext; +} +class SVTXNumericField; +class VCLXButton; +class VCLXCheckBox; +class VCLXRadioButton; +class VCLXListBox; +class VCLXFixedHyperlink; +class VCLXFixedText; +class VCLXScrollBar; +class VCLXEdit; +class VCLXComboBox; +class VCLXMultiLineEdit; +class VCLXToolBox; +class VCLXHeaderBar; +class VCLXWindow; +class Menu; + + +namespace toolkit +{ + + + /** a function which is able to create a factory for the standard Accessible/Context + components needed for standard toolkit controls + + The returned pointer denotes an instance of the IAccessibleFactory, which has been acquired + <em>once</em>. The caller is responsible for holding this reference as long as it needs the + factory, and release it afterwards. + */ + typedef void* (* GetStandardAccComponentFactory)( ); + + + //= IAccessibleFactory + + class IAccessibleFactory : public virtual salhelper::SimpleReferenceObject + { + public: + /** creates an accessible context for a button window + */ + virtual css::uno::Reference< css::accessibility::XAccessibleContext > + createAccessibleContext( VCLXButton* _pXWindow ) = 0; + + /** creates an accessible context for a checkbox window + */ + virtual css::uno::Reference< css::accessibility::XAccessibleContext > + createAccessibleContext( VCLXCheckBox* _pXWindow ) = 0; + + /** creates an accessible context for a radio button window + */ + virtual css::uno::Reference< css::accessibility::XAccessibleContext > + createAccessibleContext( VCLXRadioButton* _pXWindow ) = 0; + + /** creates an accessible context for a listbox window + */ + virtual css::uno::Reference< css::accessibility::XAccessibleContext > + createAccessibleContext( VCLXListBox* _pXWindow ) = 0; + + /** creates an accessible context for a fixed hyperlink window + */ + virtual css::uno::Reference< css::accessibility::XAccessibleContext > + createAccessibleContext( VCLXFixedHyperlink* _pXWindow ) = 0; + + /** creates an accessible context for a fixed text window + */ + virtual css::uno::Reference< css::accessibility::XAccessibleContext > + createAccessibleContext( VCLXFixedText* _pXWindow ) = 0; + + /** creates an accessible context for a scrollbar window + */ + virtual css::uno::Reference< css::accessibility::XAccessibleContext > + createAccessibleContext( VCLXScrollBar* _pXWindow ) = 0; + + /** creates an accessible context for an edit window + */ + virtual css::uno::Reference< css::accessibility::XAccessibleContext > + createAccessibleContext( VCLXEdit* _pXWindow ) = 0; + + /** creates an accessible context for a multiline edit window + */ + virtual css::uno::Reference< css::accessibility::XAccessibleContext > + createAccessibleContext( VCLXMultiLineEdit* _pXWindow ) = 0; + + /** creates an accessible context for a combo box window + */ + virtual css::uno::Reference< css::accessibility::XAccessibleContext > + createAccessibleContext( VCLXComboBox* _pXWindow ) = 0; + + /** creates an accessible context for a toolbox window + */ + virtual css::uno::Reference< css::accessibility::XAccessibleContext > + createAccessibleContext( VCLXToolBox* _pXWindow ) = 0; + + /** creates an accessible context for a headerbar window + */ + virtual css::uno::Reference< css::accessibility::XAccessibleContext > + createAccessibleContext( VCLXHeaderBar* _pXWindow ) = 0; + + /** creates an accessible context for a numeric field + */ + virtual css::uno::Reference< css::accessibility::XAccessibleContext > + createAccessibleContext( SVTXNumericField* _pXWindow ) = 0; + + /** creates an accessible context for a generic window + */ + virtual css::uno::Reference< css::accessibility::XAccessibleContext > + createAccessibleContext( VCLXWindow* _pXWindow ) = 0; + + /** creates an accessible component for the given menu + */ + virtual css::uno::Reference< css::accessibility::XAccessible > + createAccessible( Menu* _pMenu, bool _bIsMenuBar ) = 0; + + protected: + virtual ~IAccessibleFactory() override {} + }; + + +} // namespace toolkit + + +#endif // INCLUDED_TOOLKIT_HELPER_ACCESSIBLEFACTORY_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/toolkit/helper/convert.hxx b/include/toolkit/helper/convert.hxx new file mode 100644 index 0000000000..255d5b26b4 --- /dev/null +++ b/include/toolkit/helper/convert.hxx @@ -0,0 +1,61 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * 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/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_TOOLKIT_HELPER_CONVERT_HXX +#define INCLUDED_TOOLKIT_HELPER_CONVERT_HXX + +#include <com/sun/star/awt/Rectangle.hpp> +#include <com/sun/star/awt/Size.hpp> +#include <com/sun/star/awt/Point.hpp> + +#include <tools/gen.hxx> + +inline css::awt::Size AWTSize( const Size& rVCLSize ) +{ + return css::awt::Size( rVCLSize.Width(), rVCLSize.Height() ); +} + +inline ::Size VCLSize( const css::awt::Size& rAWTSize ) +{ + return ::Size( rAWTSize.Width, rAWTSize.Height ); +} + +inline css::awt::Point AWTPoint( const PointTemplateBase& rVCLPoint ) +{ + return css::awt::Point( rVCLPoint.X(), rVCLPoint.Y() ); +} + +inline ::Point VCLPoint( const css::awt::Point& rAWTPoint ) +{ + return ::Point( rAWTPoint.X, rAWTPoint.Y ); +} + +inline css::awt::Rectangle AWTRectangle( const RectangleTemplateBase& rVCLRect ) +{ + return css::awt::Rectangle( rVCLRect.Left(), rVCLRect.Top(), rVCLRect.GetWidth(), rVCLRect.GetHeight() ); +} + +inline ::tools::Rectangle VCLRectangle( const css::awt::Rectangle& rAWTRect ) +{ + return ::tools::Rectangle( ::Point( rAWTRect.X, rAWTRect.Y ), ::Size( rAWTRect.Width, rAWTRect.Height ) ); +} + +#endif // INCLUDED_TOOLKIT_HELPER_CONVERT_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/toolkit/helper/emptyfontdescriptor.hxx b/include/toolkit/helper/emptyfontdescriptor.hxx new file mode 100644 index 0000000000..77ac9a1d18 --- /dev/null +++ b/include/toolkit/helper/emptyfontdescriptor.hxx @@ -0,0 +1,40 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * 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/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include <com/sun/star/awt/FontDescriptor.hpp> +#include <com/sun/star/awt/FontSlant.hpp> +#include <com/sun/star/awt/FontUnderline.hpp> +#include <com/sun/star/awt/FontStrikeout.hpp> + +class EmptyFontDescriptor : public css::awt::FontDescriptor +{ +public: + EmptyFontDescriptor() + { + // Not all enums are initialized correctly in FontDescriptor-CTOR because + // they are set to the first enum value, this is not always the default value. + Slant = css::awt::FontSlant_DONTKNOW; + Underline = css::awt::FontUnderline::DONTKNOW; + Strikeout = css::awt::FontStrikeout::DONTKNOW; + } +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/toolkit/helper/listenermultiplexer.hxx b/include/toolkit/helper/listenermultiplexer.hxx new file mode 100644 index 0000000000..b7113c17ee --- /dev/null +++ b/include/toolkit/helper/listenermultiplexer.hxx @@ -0,0 +1,310 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * 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/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_TOOLKIT_HELPER_LISTENERMULTIPLEXER_HXX +#define INCLUDED_TOOLKIT_HELPER_LISTENERMULTIPLEXER_HXX + +#include <config_options.h> +#include <toolkit/dllapi.h> +#include <com/sun/star/lang/XEventListener.hpp> +#include <com/sun/star/awt/XFocusListener.hpp> +#include <com/sun/star/awt/XWindowListener.hpp> +#include <com/sun/star/awt/XVclContainerListener.hpp> +#include <com/sun/star/awt/XKeyListener.hpp> +#include <com/sun/star/awt/XMouseListener.hpp> +#include <com/sun/star/awt/XMouseMotionListener.hpp> +#include <com/sun/star/awt/XPaintListener.hpp> +#include <com/sun/star/awt/XTopWindowListener.hpp> +#include <com/sun/star/awt/XTextListener.hpp> +#include <com/sun/star/awt/XActionListener.hpp> +#include <com/sun/star/awt/XItemListener.hpp> +#include <com/sun/star/awt/XTabListener.hpp> +#include <com/sun/star/container/XContainerListener.hpp> +#include <com/sun/star/awt/XSpinListener.hpp> +#include <com/sun/star/awt/XAdjustmentListener.hpp> +#include <com/sun/star/awt/XMenuListener.hpp> +#include <com/sun/star/awt/tree/XTreeExpansionListener.hpp> +#include <com/sun/star/awt/tree/XTreeEditListener.hpp> +#include <com/sun/star/view/XSelectionChangeListener.hpp> +#include <cppuhelper/queryinterface.hxx> +#include <cppuhelper/weak.hxx> +#include <comphelper/interfacecontainer4.hxx> +#include <toolkit/helper/macros.hxx> +#include <com/sun/star/awt/grid/XGridSelectionListener.hpp> +#include <com/sun/star/awt/tab/XTabPageContainerListener.hpp> + +// class ListenerMultiplexerBase + +template <class ListenerT> +class UNLESS_MERGELIBS(TOOLKIT_DLLPUBLIC) ListenerMultiplexerBase : + public css::uno::XInterface +{ +private: + ::cppu::OWeakObject& mrContext; +protected: + mutable std::mutex m_aMutex; + ::comphelper::OInterfaceContainerHelper4<ListenerT> maListeners; + + ::cppu::OWeakObject& GetContext() { return mrContext; } + +public: + ListenerMultiplexerBase( ::cppu::OWeakObject& rSource ) + : mrContext(rSource) + { + } + + virtual ~ListenerMultiplexerBase() + { + } + + // css::uno::XInterface + css::uno::Any SAL_CALL queryInterface(const css::uno::Type & rType) override + { + return ::cppu::queryInterface(rType, static_cast<css::uno::XInterface*>(this)); + } + + void SAL_CALL acquire() noexcept override { mrContext.acquire(); } + void SAL_CALL release() noexcept override { mrContext.release(); } + + void addInterface( const css::uno::Reference<ListenerT>& l) + { + std::unique_lock g(m_aMutex); + maListeners.addInterface(g, l); + } + + void removeInterface( const css::uno::Reference<ListenerT>& l) + { + std::unique_lock g(m_aMutex); + maListeners.removeInterface(g, l); + } + + void disposeAndClear(const css::lang::EventObject& rDisposeEvent) + { + std::unique_lock g(m_aMutex); + maListeners.disposeAndClear(g, rDisposeEvent); + } + + void disposeAndClear(std::unique_lock<std::mutex>& rGuard, const css::lang::EventObject& rDisposeEvent) + { + maListeners.disposeAndClear(rGuard, rDisposeEvent); + } + + sal_Int32 getLength() const + { + std::unique_lock g(m_aMutex); + return maListeners.getLength(g); + } + + template <typename EventT> + inline void notifyEach(void (SAL_CALL ListenerT::*NotificationMethod)(const EventT&), + const EventT& Event) const + { + std::unique_lock g(m_aMutex); + return maListeners.notifyEach(g, NotificationMethod, Event); + } +}; + +// class EventListenerMultiplexer + +DECL_LISTENERMULTIPLEXER_START( EventListenerMultiplexer, css::lang::XEventListener ) +DECL_LISTENERMULTIPLEXER_END + + +// class FocusListenerMultiplexer + +DECL_LISTENERMULTIPLEXER_START_DLLPUB( FocusListenerMultiplexer, css::awt::XFocusListener ) + void SAL_CALL focusGained( const css::awt::FocusEvent& e ) override; + void SAL_CALL focusLost( const css::awt::FocusEvent& e ) override; +DECL_LISTENERMULTIPLEXER_END + + +// class WindowListenerMultiplexer + +DECL_LISTENERMULTIPLEXER_START_DLLPUB( WindowListenerMultiplexer, css::awt::XWindowListener ) + void SAL_CALL windowResized( const css::awt::WindowEvent& e ) override; + void SAL_CALL windowMoved( const css::awt::WindowEvent& e ) override; + void SAL_CALL windowShown( const css::lang::EventObject& e ) override; + void SAL_CALL windowHidden( const css::lang::EventObject& e ) override; +DECL_LISTENERMULTIPLEXER_END + + +// class VclContainerListenerMultiplexer + +DECL_LISTENERMULTIPLEXER_START( VclContainerListenerMultiplexer, css::awt::XVclContainerListener ) + void SAL_CALL windowAdded( const css::awt::VclContainerEvent& e ) override; + void SAL_CALL windowRemoved( const css::awt::VclContainerEvent& e ) override; +DECL_LISTENERMULTIPLEXER_END + + +// class KeyListenerMultiplexer + +DECL_LISTENERMULTIPLEXER_START_DLLPUB( KeyListenerMultiplexer, css::awt::XKeyListener ) + void SAL_CALL keyPressed( const css::awt::KeyEvent& e ) override; + void SAL_CALL keyReleased( const css::awt::KeyEvent& e ) override; +DECL_LISTENERMULTIPLEXER_END + + +// class MouseListenerMultiplexer + +DECL_LISTENERMULTIPLEXER_START_DLLPUB( MouseListenerMultiplexer, css::awt::XMouseListener ) + void SAL_CALL mousePressed( const css::awt::MouseEvent& e ) override; + void SAL_CALL mouseReleased( const css::awt::MouseEvent& e ) override; + void SAL_CALL mouseEntered( const css::awt::MouseEvent& e ) override; + void SAL_CALL mouseExited( const css::awt::MouseEvent& e ) override; +DECL_LISTENERMULTIPLEXER_END + + +// class MouseMotionListenerMultiplexer + +DECL_LISTENERMULTIPLEXER_START_DLLPUB( MouseMotionListenerMultiplexer, css::awt::XMouseMotionListener ) + void SAL_CALL mouseDragged( const css::awt::MouseEvent& e ) override; + void SAL_CALL mouseMoved( const css::awt::MouseEvent& e ) override; +DECL_LISTENERMULTIPLEXER_END + + +// class PaintListenerMultiplexer + +DECL_LISTENERMULTIPLEXER_START_DLLPUB( PaintListenerMultiplexer, css::awt::XPaintListener ) + void SAL_CALL windowPaint( const css::awt::PaintEvent& e ) override; +DECL_LISTENERMULTIPLEXER_END + + +// class TopWindowListenerMultiplexer + +DECL_LISTENERMULTIPLEXER_START( TopWindowListenerMultiplexer, css::awt::XTopWindowListener ) + void SAL_CALL windowOpened( const css::lang::EventObject& e ) override; + void SAL_CALL windowClosing( const css::lang::EventObject& e ) override; + void SAL_CALL windowClosed( const css::lang::EventObject& e ) override; + void SAL_CALL windowMinimized( const css::lang::EventObject& e ) override; + void SAL_CALL windowNormalized( const css::lang::EventObject& e ) override; + void SAL_CALL windowActivated( const css::lang::EventObject& e ) override; + void SAL_CALL windowDeactivated( const css::lang::EventObject& e ) override; +DECL_LISTENERMULTIPLEXER_END + + +// class TextListenerMultiplexer + +DECL_LISTENERMULTIPLEXER_START_DLLPUB( TextListenerMultiplexer, css::awt::XTextListener ) + void SAL_CALL textChanged( const css::awt::TextEvent& rEvent ) override; +DECL_LISTENERMULTIPLEXER_END + + +// class ActionListenerMultiplexer + +DECL_LISTENERMULTIPLEXER_START( ActionListenerMultiplexer, css::awt::XActionListener ) + void SAL_CALL actionPerformed( const css::awt::ActionEvent& rEvent ) override; +DECL_LISTENERMULTIPLEXER_END + + +// class ItemListenerMultiplexer + +DECL_LISTENERMULTIPLEXER_START( ItemListenerMultiplexer, css::awt::XItemListener ) + void SAL_CALL itemStateChanged( const css::awt::ItemEvent& rEvent ) override; +DECL_LISTENERMULTIPLEXER_END + + +// class TabListenerMultiplexer + +DECL_LISTENERMULTIPLEXER_START( TabListenerMultiplexer, css::awt::XTabListener ) + void SAL_CALL inserted( ::sal_Int32 ID ) override; + void SAL_CALL removed( ::sal_Int32 ID ) override; + void SAL_CALL changed( ::sal_Int32 ID, const css::uno::Sequence< css::beans::NamedValue >& Properties ) override; + void SAL_CALL activated( ::sal_Int32 ID ) override; + void SAL_CALL deactivated( ::sal_Int32 ID ) override; +DECL_LISTENERMULTIPLEXER_END + + +// class ContainerListenerMultiplexer + +DECL_LISTENERMULTIPLEXER_START( ContainerListenerMultiplexer, css::container::XContainerListener ) + void SAL_CALL elementInserted( const css::container::ContainerEvent& Event ) override; + void SAL_CALL elementRemoved( const css::container::ContainerEvent& Event ) override; + void SAL_CALL elementReplaced( const css::container::ContainerEvent& Event ) override; +DECL_LISTENERMULTIPLEXER_END + + +// class SpinListenerMultiplexer + +DECL_LISTENERMULTIPLEXER_START_DLLPUB( SpinListenerMultiplexer, css::awt::XSpinListener ) + void SAL_CALL up( const css::awt::SpinEvent& rEvent ) override; + void SAL_CALL down( const css::awt::SpinEvent& rEvent ) override; + void SAL_CALL first( const css::awt::SpinEvent& rEvent ) override; + void SAL_CALL last( const css::awt::SpinEvent& rEvent ) override; +DECL_LISTENERMULTIPLEXER_END + + +// class AdjustmentListenerMultiplexer + +DECL_LISTENERMULTIPLEXER_START( AdjustmentListenerMultiplexer, css::awt::XAdjustmentListener ) + void SAL_CALL adjustmentValueChanged( const css::awt::AdjustmentEvent& rEvent ) override; +DECL_LISTENERMULTIPLEXER_END + + +// class MenuListenerMultiplexer + +DECL_LISTENERMULTIPLEXER_START( MenuListenerMultiplexer, css::awt::XMenuListener ) + void SAL_CALL itemHighlighted( const css::awt::MenuEvent& rEvent ) override; + void SAL_CALL itemSelected( const css::awt::MenuEvent& rEvent ) override; + void SAL_CALL itemActivated( const css::awt::MenuEvent& rEvent ) override; + void SAL_CALL itemDeactivated( const css::awt::MenuEvent& rEvent ) override; +DECL_LISTENERMULTIPLEXER_END + + +// class TreeSelectionListenerMultiplexer + +DECL_LISTENERMULTIPLEXER_START( TreeSelectionListenerMultiplexer, css::view::XSelectionChangeListener ) + virtual void SAL_CALL selectionChanged( const css::lang::EventObject& aEvent ) override; +DECL_LISTENERMULTIPLEXER_END + + +// class TreeExpansionListenerMultiplexer + +DECL_LISTENERMULTIPLEXER_START( TreeExpansionListenerMultiplexer, css::awt::tree::XTreeExpansionListener ) + virtual void SAL_CALL requestChildNodes( const css::awt::tree::TreeExpansionEvent& aEvent ) override; + virtual void SAL_CALL treeExpanding( const css::awt::tree::TreeExpansionEvent& aEvent ) override; + virtual void SAL_CALL treeCollapsing( const css::awt::tree::TreeExpansionEvent& aEvent ) override; + virtual void SAL_CALL treeExpanded( const css::awt::tree::TreeExpansionEvent& aEvent ) override; + virtual void SAL_CALL treeCollapsed( const css::awt::tree::TreeExpansionEvent& aEvent ) override; +DECL_LISTENERMULTIPLEXER_END + + +// class TreeEditListenerMultiplexer + +DECL_LISTENERMULTIPLEXER_START( TreeEditListenerMultiplexer, css::awt::tree::XTreeEditListener ) + virtual void SAL_CALL nodeEditing( const css::uno::Reference< css::awt::tree::XTreeNode >& Node ) override; + virtual void SAL_CALL nodeEdited( const css::uno::Reference< css::awt::tree::XTreeNode >& Node, const OUString& NewText ) override; +DECL_LISTENERMULTIPLEXER_END + + +// class SelectionListenerMultiplexer + +DECL_LISTENERMULTIPLEXER_START_DLLPUB( SelectionListenerMultiplexer, css::awt::grid::XGridSelectionListener ) + void SAL_CALL selectionChanged( const css::awt::grid::GridSelectionEvent& aEvent ) override; +DECL_LISTENERMULTIPLEXER_END + + +// class TabPageListenerMultiplexer + +DECL_LISTENERMULTIPLEXER_START( TabPageListenerMultiplexer, css::awt::tab::XTabPageContainerListener ) + void SAL_CALL tabPageActivated( const css::awt::tab::TabPageActivatedEvent& aEvent ) override; +DECL_LISTENERMULTIPLEXER_END + +#endif // INCLUDED_TOOLKIT_HELPER_LISTENERMULTIPLEXER_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/toolkit/helper/macros.hxx b/include/toolkit/helper/macros.hxx new file mode 100644 index 0000000000..a959acd879 --- /dev/null +++ b/include/toolkit/helper/macros.hxx @@ -0,0 +1,166 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * 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/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_TOOLKIT_HELPER_MACROS_HXX +#define INCLUDED_TOOLKIT_HELPER_MACROS_HXX + +#include <sal/log.hxx> +#include <osl/diagnose.h> +#include <comphelper/diagnose_ex.hxx> + +#define IMPL_IMPLEMENTATION_ID( ClassName ) \ +css::uno::Sequence< sal_Int8 > ClassName::getImplementationId() \ +{ \ + return css::uno::Sequence<sal_Int8>(); \ +} + + +#define DECL_LISTENERMULTIPLEXER_START( ClassName, InterfaceName ) \ +class ClassName final : public ListenerMultiplexerBase<InterfaceName>, public InterfaceName \ +{ \ +public: \ + ClassName( ::cppu::OWeakObject& rSource ); \ + css::uno::Any SAL_CALL queryInterface( const css::uno::Type & rType ) override; \ + void SAL_CALL acquire() noexcept override; \ + void SAL_CALL release() noexcept override; \ + void SAL_CALL disposing( const css::lang::EventObject& Source ) override; + + +#define DECL_LISTENERMULTIPLEXER_START_DLLPUB( ClassName, InterfaceName ) \ +class TOOLKIT_DLLPUBLIC ClassName final : public ListenerMultiplexerBase<InterfaceName>, public InterfaceName \ +{ \ +public: \ + ClassName( ::cppu::OWeakObject& rSource ); \ + css::uno::Any SAL_CALL queryInterface( const css::uno::Type & rType ) override; \ + void SAL_CALL acquire() noexcept override; \ + void SAL_CALL release() noexcept override; \ + void SAL_CALL disposing( const css::lang::EventObject& Source ) override; + + +#define DECL_LISTENERMULTIPLEXER_END \ +}; + + +#define IMPL_LISTENERMULTIPLEXER_BASEMETHODS( ClassName, InterfaceName ) \ +ClassName::ClassName( ::cppu::OWeakObject& rSource ) \ + : ListenerMultiplexerBase<InterfaceName>(rSource) \ +{ \ +} \ +void SAL_CALL ClassName::acquire() noexcept { ListenerMultiplexerBase::acquire(); } \ +void SAL_CALL ClassName::release() noexcept { ListenerMultiplexerBase::release(); } \ +css::uno::Any ClassName::queryInterface( const css::uno::Type & rType ) \ +{ \ + css::uno::Any aRet = ::cppu::queryInterface( rType, \ + (static_cast< css::lang::XEventListener* >(this)), \ + (static_cast< InterfaceName* >(this)) ); \ + return (aRet.hasValue() ? aRet : ListenerMultiplexerBase::queryInterface( rType )); \ +} \ +void ClassName::disposing( const css::lang::EventObject& ) \ +{ \ +} + + +#if OSL_DEBUG_LEVEL > 0 + #define DISPLAY_EXCEPTION( ClassName, MethodName ) \ + css::uno::Any ex( cppu::getCaughtException() ); \ + SAL_WARN( "toolkit", #ClassName "::" #MethodName ": caught an exception! " << exceptionToString(ex)); +#else + #define DISPLAY_EXCEPTION( ClassName, MethodName ) +#endif + +#define IMPL_TABLISTENERMULTIPLEXER_LISTENERMETHOD_BODY_1PARAM( ClassName, InterfaceName, MethodName, ParamType1 ) \ +{ \ + ParamType1 aMulti( evt ); \ + std::unique_lock g(m_aMutex); \ + ::comphelper::OInterfaceIteratorHelper4 aIt(g, maListeners); \ + g.unlock(); \ + while( aIt.hasMoreElements() ) \ + { \ + css::uno::Reference<InterfaceName> xListener(aIt.next()); \ + try \ + { \ + xListener->MethodName( aMulti ); \ + } \ + catch(const css::lang::DisposedException& e) \ + { \ + OSL_ENSURE( e.Context.is(), "caught DisposedException with empty Context field" ); \ + if ( e.Context == xListener || !e.Context.is() ) \ + { \ + std::unique_lock g2(m_aMutex); \ + aIt.remove(g2); \ + } \ + } \ + catch(const css::uno::RuntimeException&) \ + { \ + DISPLAY_EXCEPTION( ClassName, MethodName ) \ + } \ + } \ +} + +#define IMPL_LISTENERMULTIPLEXER_LISTENERMETHOD_BODY( ClassName, InterfaceName, MethodName, EventType ) \ +{ \ + EventType aMulti( evt ); \ + aMulti.Source = &GetContext(); \ + std::unique_lock g(m_aMutex); \ + ::comphelper::OInterfaceIteratorHelper4 aIt(g, maListeners); \ + g.unlock(); \ + while( aIt.hasMoreElements() ) \ + { \ + css::uno::Reference<InterfaceName> xListener(aIt.next()); \ + try \ + { \ + xListener->MethodName( aMulti ); \ + } \ + catch(const css::lang::DisposedException& e) \ + { \ + OSL_ENSURE( e.Context.is(), "caught DisposedException with empty Context field" ); \ + if ( e.Context == xListener || !e.Context.is() ) \ + { \ + std::unique_lock g2(m_aMutex); \ + aIt.remove(g2); \ + } \ + } \ + catch(const css::uno::RuntimeException&) \ + { \ + DISPLAY_EXCEPTION( ClassName, MethodName ) \ + } \ + } \ +} + +#define IMPL_LISTENERMULTIPLEXER_LISTENERMETHOD_EXCEPTION( ClassName, InterfaceName, MethodName, EventType, Exception ) \ +void ClassName::MethodName( const EventType& evt ) \ +IMPL_LISTENERMULTIPLEXER_LISTENERMETHOD_BODY( ClassName, InterfaceName, MethodName, EventType ) + +#define IMPL_LISTENERMULTIPLEXER_LISTENERMETHOD( ClassName, InterfaceName, MethodName, EventType ) \ +void ClassName::MethodName( const EventType& evt ) \ +IMPL_LISTENERMULTIPLEXER_LISTENERMETHOD_BODY( ClassName, InterfaceName, MethodName, EventType ) + +#define DECLIMPL_SERVICEINFO_DERIVED( ImplName, BaseClass, ServiceName ) \ + OUString SAL_CALL getImplementationName( ) override { return "stardiv.Toolkit." #ImplName; } \ + css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override \ + { \ + css::uno::Sequence< OUString > aNames = BaseClass::getSupportedServiceNames( ); \ + aNames.realloc( aNames.getLength() + 1 ); \ + aNames.getArray()[ aNames.getLength() - 1 ] = ServiceName; \ + return aNames; \ + } \ + +#endif // INCLUDED_TOOLKIT_HELPER_MACROS_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/toolkit/helper/vclunohelper.hxx b/include/toolkit/helper/vclunohelper.hxx new file mode 100644 index 0000000000..07d4aeff10 --- /dev/null +++ b/include/toolkit/helper/vclunohelper.hxx @@ -0,0 +1,156 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * 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/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_TOOLKIT_HELPER_VCLUNOHELPER_HXX +#define INCLUDED_TOOLKIT_HELPER_VCLUNOHELPER_HXX + +#include <toolkit/dllapi.h> +#include <com/sun/star/uno/Reference.h> + +#include <com/sun/star/awt/MouseEvent.hpp> + +#include <vcl/bitmapex.hxx> +#include <vcl/font.hxx> +#include <vcl/region.hxx> +#include <tools/mapunit.hxx> +#include <tools/fldunit.hxx> +#include <tools/poly.hxx> + + +namespace com::sun::star::uno { template <typename > class Sequence; } + +namespace com::sun::star::uno { + class XInterface; +} + +namespace com::sun::star::awt { + class XBitmap; + class XWindow; + class XWindow2; + class XWindowPeer; + class XGraphics; + class XRegion; + class XDevice; + class XToolkit; + class XFont; + class XControlContainer; + struct Size; + struct Point; + struct SimpleFontMetric; + struct FontDescriptor; + struct Rectangle; + struct KeyEvent; +} + + +enum class PointerStyle; + +class FontMetric; +class OutputDevice; +class MouseEvent; +class KeyEvent; + +class TOOLKIT_DLLPUBLIC VCLUnoHelper +{ +public: + // Toolkit + static css::uno::Reference< css::awt::XToolkit> CreateToolkit(); + + // Bitmap + static BitmapEx GetBitmap( const css::uno::Reference< css::awt::XBitmap>& rxBitmap ); + static css::uno::Reference< css::awt::XBitmap> CreateBitmap( const BitmapEx& rBitmap ); + + // Window + static vcl::Window* GetWindow( const css::uno::Reference< css::awt::XWindow>& rxWindow ); + static vcl::Window* GetWindow( const css::uno::Reference< css::awt::XWindow2>& rxWindow2 ); + static vcl::Window* GetWindow( const css::uno::Reference< css::awt::XWindowPeer>& rxWindowPeer ); + static css::uno::Reference< css::awt::XWindow> GetInterface( vcl::Window* pWindow ); + + // OutputDevice + static OutputDevice* GetOutputDevice( const css::uno::Reference< css::awt::XDevice>& rxDevice ); + static OutputDevice* GetOutputDevice( const css::uno::Reference< css::awt::XGraphics>& rxGraphics ); + + // Region + static vcl::Region GetRegion( const css::uno::Reference< css::awt::XRegion >& rxRegion ); + + // Polygon + static tools::Polygon CreatePolygon( const css::uno::Sequence< sal_Int32 >& DataX, const css::uno::Sequence< sal_Int32 >& DataY ); + + /** convert Font to css::awt::FontDescriptor + @param rFont Font to be converted + @return the new FontDescriptor + */ + static css::awt::FontDescriptor CreateFontDescriptor( const vcl::Font& rFont ); + static vcl::Font CreateFont( const css::awt::FontDescriptor& rDescr, const vcl::Font& rInitFont ); + static vcl::Font CreateFont( const css::uno::Reference< css::awt::XFont >& rxFont ); + static css::awt::SimpleFontMetric CreateFontMetric( const FontMetric& rFontMetric ); + + // Rectangle + static bool IsZero(const css::awt::Rectangle& rRect); + + static css::uno::Reference< css::awt::XControlContainer> CreateControlContainer( vcl::Window* pWindow ); + + // MapUnits + static MapUnit UnoEmbed2VCLMapUnit( sal_Int32 nUnoEmbedMapUnit ); + static sal_Int32 VCL2UnoEmbedMapUnit( MapUnit nVCLMapUnit ); + + + //= MeasurementUnitConversion + + /** small helper to convert between MeasurementUnit and + FieldUnit + */ + static sal_Int16 ConvertToMeasurementUnit( FieldUnit _nFieldUnit, sal_Int16 _rFieldToUNOValueFactor ); + static FieldUnit ConvertToFieldUnit( sal_Int16 _nMeasurementUnit, sal_Int16& _rFieldToUNOValueFactor ); + + /// @throws css::lang::IllegalArgumentException + static MapUnit /* MapModeUnit */ ConvertToMapModeUnit(sal_Int16 /* com.sun.star.util.MeasureUnit.* */ _nMeasureUnit); + + static ::Size /* VCLSize */ ConvertToVCLSize(css::awt::Size const& _aSize); + static css::awt::Size ConvertToAWTSize(::Size /* VCLSize */ const& _aSize); + + static ::Point /* VCLPoint */ ConvertToVCLPoint(css::awt::Point const& _aPoint); + static css::awt::Point ConvertToAWTPoint(::Point /* VCLPoint */ const& _aPoint); + + static ::tools::Rectangle ConvertToVCLRect( css::awt::Rectangle const & _rRect ); + static css::awt::Rectangle ConvertToAWTRect( ::tools::Rectangle const & _rRect ); + + static css::awt::MouseEvent + createMouseEvent( + const ::MouseEvent& _rVclEvent, + const css::uno::Reference< css::uno::XInterface >& _rxContext + ); + + static ::MouseEvent createVCLMouseEvent( const css::awt::MouseEvent& _rAwtEvent ); + + static css::awt::KeyEvent + createKeyEvent( + const ::KeyEvent& _rVclEvent, + const css::uno::Reference< css::uno::XInterface >& _rxContext + ); + + static ::KeyEvent createVCLKeyEvent( const css::awt::KeyEvent& _rAwtEvent ); + + static ::PointerStyle getMousePointer(const css::uno::Reference<css::awt::XWindowPeer>& rWindowPeer); + static void setMousePointer(const css::uno::Reference<css::awt::XWindowPeer>& rWindowPeer, ::PointerStyle mousepointer); +}; + +#endif // INCLUDED_TOOLKIT_HELPER_VCLUNOHELPER_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |