diff options
Diffstat (limited to 'include/svx/AccessibleControlShape.hxx')
-rw-r--r-- | include/svx/AccessibleControlShape.hxx | 210 |
1 files changed, 210 insertions, 0 deletions
diff --git a/include/svx/AccessibleControlShape.hxx b/include/svx/AccessibleControlShape.hxx new file mode 100644 index 000000000000..54cdd7719c99 --- /dev/null +++ b/include/svx/AccessibleControlShape.hxx @@ -0,0 +1,210 @@ +/* -*- 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 _SVX_ACCESSIBILITY_ACCESSIBLE_CONTROL_SHAPE_HXX +#define _SVX_ACCESSIBILITY_ACCESSIBLE_CONTROL_SHAPE_HXX + +#include <svx/AccessibleShape.hxx> + +#include <com/sun/star/accessibility/XAccessibleAction.hpp> +#include <com/sun/star/accessibility/XAccessibleEventListener.hpp> +#include <com/sun/star/util/XModeChangeBroadcaster.hpp> +#include <com/sun/star/container/XContainerListener.hpp> +#include <cppuhelper/implbase3.hxx> +#include <comphelper/uno3.hxx> + +namespace com { namespace sun { namespace star { namespace awt { + class XControl; +} } } } + +namespace comphelper +{ + class OWrappedAccessibleChildrenManager; +} + +class SdrObject; +namespace accessibility { + + typedef ::cppu::ImplHelper4 < ::com::sun::star::beans::XPropertyChangeListener + , ::com::sun::star::util::XModeChangeListener + , ::com::sun::star::container::XContainerListener + , ::com::sun::star::accessibility::XAccessibleEventListener + > AccessibleControlShape_Base; +/** @descr +*/ +class AccessibleControlShape + :public AccessibleShape + ,public AccessibleControlShape_Base +{ +public: + //===== internal ======================================================== + AccessibleControlShape( + const AccessibleShapeInfo& rShapeInfo, + const AccessibleShapeTreeInfo& rShapeTreeInfo); + virtual ~AccessibleControlShape( ); + +protected: + //--- XAccessible ---------------------------------------- + virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext> SAL_CALL getAccessibleContext( ) throw(::com::sun::star::uno::RuntimeException); + + //--- XAccessibleComponent ------------------------------- + /// forward the focus to the contained control(in alive mode) + virtual void SAL_CALL grabFocus( ) throw(::com::sun::star::uno::RuntimeException); + + //--- XAccessibleContext --------------------------------- + virtual sal_Int32 SAL_CALL getAccessibleChildCount( ) throw(::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > SAL_CALL getAccessibleChild( sal_Int32 i ) throw(::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleRelationSet > SAL_CALL getAccessibleRelationSet( ) throw (::com::sun::star::uno::RuntimeException); + + //--- XServiceInfo --------------------------------------- + virtual OUString SAL_CALL getImplementationName( ) throw(::com::sun::star::uno::RuntimeException); + + //--- XInterface ----------------------------------------- + DECLARE_XINTERFACE( ) + + //--- XTypeProvider -------------------------------------- + DECLARE_XTYPEPROVIDER( ) + + //--- XPropertyChangeListener ---------------------------- + virtual void SAL_CALL propertyChange( const ::com::sun::star::beans::PropertyChangeEvent& _rEvent ) throw(::com::sun::star::uno::RuntimeException); + + //--- XComponent ----------------------------------------- + virtual void SAL_CALL disposing( ); + + //--- XEventListener ------------------------------------- + virtual void SAL_CALL disposing(const ::com::sun::star::lang::EventObject& Source) throw(::com::sun::star::uno::RuntimeException); + + //--- XModeChangeListener -------------------------------- + virtual void SAL_CALL modeChanged( const ::com::sun::star::util::ModeChangeEvent& _rSource ) throw(::com::sun::star::uno::RuntimeException); + + //--- XAccessibleEventListener ---------------------------- + virtual void SAL_CALL notifyEvent( const ::com::sun::star::accessibility::AccessibleEventObject& aEvent ) throw(::com::sun::star::uno::RuntimeException); + + //--- document::XEventListener ---------------------------- + using AccessibleShape::notifyEvent; + + // XVclContainerListener + virtual void SAL_CALL elementInserted( const ::com::sun::star::container::ContainerEvent& Event ) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL elementRemoved( const ::com::sun::star::container::ContainerEvent& Event ) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL elementReplaced( const ::com::sun::star::container::ContainerEvent& Event ) throw (::com::sun::star::uno::RuntimeException); + +protected: + /** Initialize a new shape. See the documentation of the base' constructor + for the reason of this method's existence. + */ + virtual void Init( ); + + /// Create a name string that contains the accessible name. + virtual OUString + CreateAccessibleBaseName( ) + throw(::com::sun::star::uno::RuntimeException); + + /** Create a unique name string that contains the accessible name. The + name consists of the base name and the index. + */ + virtual OUString + CreateAccessibleName( ) + throw(::com::sun::star::uno::RuntimeException); + + /// Create a description string that contains the accessible description. + virtual OUString + CreateAccessibleDescription( ) + throw(::com::sun::star::uno::RuntimeException); + +#ifdef DBG_UTIL + /// Set the specified state + virtual sal_Bool SetState( sal_Int16 _nState ); +#endif // DBG_UTIL + + /// (safely) reads the given property from the model of the UNO control + OUString getControlModelStringProperty( const OUString& _rPropertyName ) const SAL_THROW(( )); + + /// ensure that our control model exists(will be retrieved upon need only) + sal_Bool ensureControlModelAccess( ) SAL_THROW(( )); + + /// ensures that we're listening for the given property if(and only if!) necessary + bool ensureListeningState( const bool _bCurrentlyListening, const bool _bNeedNewListening, + const OUString& _rPropertyName ); + + /// starts multiplexing the state changes of our aggregate context + void startStateMultiplexing( ); + /// stops multiplexing the state changes of our aggregate context + void stopStateMultiplexing( ); + + /// retrieves the SdrObject of the shape we represent + SdrObject* getSdrObject( ) const; + + /** adjusts our AccessibleRole, depending on the control type we're working for + + <p>Only to be called during inituialization</p> + */ + void adjustAccessibleRole( ); + + /** initializes composed states of the context + + <p>Some of the states of our inner context need to be propagated to the "composed context", too + (such as "checked" for check boxes). At lifetime, this is done by multiplexing state changes, + at initialization time, this method is used.</p> + */ + void initializeComposedState( ); + +private: + ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > + m_xControlModel; + ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > + m_xModelPropsMeta; // cache this for performance reasons + ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl > + m_xUnoControl; // our UNO control + + ::com::sun::star::uno::WeakReference< ::com::sun::star::accessibility::XAccessibleContext > + m_aControlContext; // the AccessibleContext of the control + ::com::sun::star::uno::Reference< ::com::sun::star::uno::XAggregation > + m_xControlContextProxy; // the proxy for "aggregating" the AccessibleContext of the control + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XTypeProvider > + m_xControlContextTypeAccess; // cached interface of our aggregate + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent > + m_xControlContextComponent; // cached interface of our aggregate + + ::comphelper::OWrappedAccessibleChildrenManager* + m_pChildManager; + + bool m_bListeningForName : 1; // are we currently listening for changes of the "Name" property? + bool m_bListeningForDesc : 1; // are we currently listening for changes of the "HelpText" property? + bool m_bMultiplexingStates : 1; // are we currently multiplexing state changes of the native context? + bool m_bDisposeNativeContext : 1; // do we need to dispose mxNativeContextComponent? + bool m_bWaitingForControl : 1; // if we are created before our control exists, we need to wait for it to appear ... + +private: + /** Don't use the default constructor. Use the public constructor that + takes the original shape and the parent as arguments instead. + */ + AccessibleControlShape( ); + + /// Don't use the constructor. not implemented. + AccessibleControlShape(const AccessibleControlShape&); + + /// Don't use the assignment operator. not implemented. + AccessibleControlShape& operator= (const AccessibleControlShape&); +}; + +} // end of namespace accessibility + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |