/* -*- 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 _SVXRECTACCESSIBLECONTEXT_HXX #define _SVXRECTACCESSIBLECONTEXT_HXX #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace com { namespace sun { namespace star { namespace awt { struct Point; struct Rectangle; struct Size; class XFocusListener; } } } } class Rectangle; class SvxRectCtl; class SvxRectCtlChildAccessibleContext; class Window; typedef ::cppu::WeakAggComponentImplHelper6< ::com::sun::star::accessibility::XAccessible, ::com::sun::star::accessibility::XAccessibleComponent, ::com::sun::star::accessibility::XAccessibleContext, ::com::sun::star::accessibility::XAccessibleEventBroadcaster, ::com::sun::star::accessibility::XAccessibleSelection, ::com::sun::star::lang::XServiceInfo > SvxRectCtlAccessibleContext_Base; class SvxRectCtlAccessibleContext : public ::comphelper::OBaseMutex, public SvxRectCtlAccessibleContext_Base { public: //===== internal ======================================================== SvxRectCtlAccessibleContext( const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible>& rxParent, SvxRectCtl& rRepresentation, const ::rtl::OUString* pName = NULL, const ::rtl::OUString* pDescription = NULL ); protected: virtual ~SvxRectCtlAccessibleContext(); public: //===== XAccessible ===================================================== virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext> SAL_CALL getAccessibleContext( void ) throw( ::com::sun::star::uno::RuntimeException ); //===== XAccessibleComponent ============================================ virtual sal_Bool SAL_CALL containsPoint( const ::com::sun::star::awt::Point& rPoint ) throw( ::com::sun::star::uno::RuntimeException ); virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > SAL_CALL getAccessibleAtPoint( const ::com::sun::star::awt::Point& rPoint ) throw( ::com::sun::star::uno::RuntimeException ); virtual ::com::sun::star::awt::Rectangle SAL_CALL getBounds() throw( ::com::sun::star::uno::RuntimeException ); virtual ::com::sun::star::awt::Point SAL_CALL getLocation() throw( ::com::sun::star::uno::RuntimeException ); virtual ::com::sun::star::awt::Point SAL_CALL getLocationOnScreen() throw( ::com::sun::star::uno::RuntimeException ); virtual ::com::sun::star::awt::Size SAL_CALL getSize() throw( ::com::sun::star::uno::RuntimeException ); virtual sal_Bool SAL_CALL isShowing() throw( ::com::sun::star::uno::RuntimeException ); virtual sal_Bool SAL_CALL isVisible() throw( ::com::sun::star::uno::RuntimeException ); virtual sal_Bool SAL_CALL isFocusTraversable() throw( ::com::sun::star::uno::RuntimeException ); virtual void SAL_CALL addFocusListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XFocusListener >& xListener ) throw( ::com::sun::star::uno::RuntimeException ); virtual void SAL_CALL removeFocusListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XFocusListener >& xListener ) throw( ::com::sun::star::uno::RuntimeException ); virtual void SAL_CALL grabFocus() throw( ::com::sun::star::uno::RuntimeException ); virtual ::com::sun::star::uno::Any SAL_CALL getAccessibleKeyBinding() throw( ::com::sun::star::uno::RuntimeException ); virtual sal_Int32 SAL_CALL getForeground( ) throw (::com::sun::star::uno::RuntimeException); virtual sal_Int32 SAL_CALL getBackground( ) throw (::com::sun::star::uno::RuntimeException); //===== XAccessibleContext ============================================== virtual sal_Int32 SAL_CALL getAccessibleChildCount( void ) throw( ::com::sun::star::uno::RuntimeException ); virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible> SAL_CALL getAccessibleChild( sal_Int32 nIndex ) throw( ::com::sun::star::uno::RuntimeException, ::com::sun::star::lang::IndexOutOfBoundsException ); virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible> SAL_CALL getAccessibleParent( void ) throw( ::com::sun::star::uno::RuntimeException ); virtual sal_Int32 SAL_CALL getAccessibleIndexInParent( void ) throw( ::com::sun::star::uno::RuntimeException ); virtual sal_Int16 SAL_CALL getAccessibleRole( void ) throw( ::com::sun::star::uno::RuntimeException ); virtual ::rtl::OUString SAL_CALL getAccessibleDescription( void ) throw (::com::sun::star::uno::RuntimeException); virtual ::rtl::OUString SAL_CALL getAccessibleName( void ) throw (::com::sun::star::uno::RuntimeException); virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleRelationSet > SAL_CALL getAccessibleRelationSet( void ) throw( ::com::sun::star::uno::RuntimeException ); virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleStateSet > SAL_CALL getAccessibleStateSet( void ) throw( ::com::sun::star::uno::RuntimeException ); virtual ::com::sun::star::lang::Locale SAL_CALL getLocale( void ) throw( ::com::sun::star::uno::RuntimeException, ::com::sun::star::accessibility::IllegalAccessibleComponentStateException ); //===== XAccessibleEventBroadcaster ===================================== virtual void SAL_CALL addAccessibleEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleEventListener >& xListener ) throw( com::sun::star::uno::RuntimeException ); virtual void SAL_CALL removeAccessibleEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleEventListener >& xListener ) throw( com::sun::star::uno::RuntimeException ); //===== XServiceInfo ==================================================== virtual ::rtl::OUString SAL_CALL getImplementationName( void ) throw( ::com::sun::star::uno::RuntimeException ); virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& sServiceName ) throw( ::com::sun::star::uno::RuntimeException ); virtual ::com::sun::star::uno::Sequence< ::rtl::OUString> SAL_CALL getSupportedServiceNames( void ) throw( ::com::sun::star::uno::RuntimeException ); //===== XTypeProvider =================================================== virtual ::com::sun::star::uno::Sequence SAL_CALL getImplementationId( void ) throw( ::com::sun::star::uno::RuntimeException ); //===== XAccessibleSelection ============================================= virtual void SAL_CALL selectAccessibleChild( sal_Int32 nChildIndex ) throw( ::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException ); virtual sal_Bool SAL_CALL isAccessibleChildSelected( sal_Int32 nChildIndex ) throw( ::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException ); virtual void SAL_CALL clearAccessibleSelection() throw( ::com::sun::star::uno::RuntimeException ); virtual void SAL_CALL selectAllAccessibleChildren() throw( ::com::sun::star::uno::RuntimeException ); virtual sal_Int32 SAL_CALL getSelectedAccessibleChildCount() throw( ::com::sun::star::uno::RuntimeException ); virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > SAL_CALL getSelectedAccessibleChild( sal_Int32 nSelectedChildIndex ) throw( ::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException ); virtual void SAL_CALL deselectAccessibleChild( sal_Int32 nSelectedChildIndex ) throw( ::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException ); protected: //===== internals ======================================================== void checkChildIndex( long nIndexOfChild ) throw( ::com::sun::star::lang::IndexOutOfBoundsException ); void checkChildIndexOnSelection( long nIndexOfChild ) throw( ::com::sun::star::lang::IndexOutOfBoundsException ); /** Selects a new child by index.

If the child was not selected before, the state of the child will be updated. If the index is invalid, the index will internaly set to NOCHILDSELECTED

@param nIndexOfChild Index of the new child which should be selected. */ void selectChild( long nIndexOfChild ); public: /** Selects a new child by point.

If the child was not selected before, the state of the child will be updated. If the point is not invalid, the index will internaly set to NOCHILDSELECTED

@param eButton Button which belongs to the child which should be selected. */ void selectChild( RECT_POINT ePoint ); private: static ::com::sun::star::uno::Sequence< sal_Int8 > getUniqueId( void ); protected: /// @Return the object's current bounding box relative to the desktop. virtual Rectangle GetBoundingBoxOnScreen( void ) throw( ::com::sun::star::uno::RuntimeException ); /// @Return the object's current bounding box relative to the parent object. virtual Rectangle GetBoundingBox( void ) throw( ::com::sun::star::uno::RuntimeException ); virtual void SAL_CALL disposing(); /// @returns true if it's disposed or in disposing inline sal_Bool IsAlive( void ) const; /// @returns true if it's not disposed and no in disposing inline sal_Bool IsNotAlive( void ) const; /// throws the exception DisposedException if it's not alive void ThrowExceptionIfNotAlive( void ) throw( ::com::sun::star::lang::DisposedException ); private: /** Description of this object. This is not a constant because it can be set from the outside. */ ::rtl::OUString msDescription; /** Name of this object. */ ::rtl::OUString msName; /// Reference to the parent object. ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > mxParent; /// pointer to internal representation SvxRectCtl* mpRepr; /// array for all possible children SvxRectCtlChildAccessibleContext** mpChildren; /// client id in the AccessibleEventNotifier queue sal_uInt32 mnClientId; /// actual selected child long mnSelectedChild; /// mode of control (true -> 8 points, false -> 9 points) sal_Bool mbAngleMode; }; inline sal_Bool SvxRectCtlAccessibleContext::IsAlive( void ) const { return !rBHelper.bDisposed && !rBHelper.bInDispose; } inline sal_Bool SvxRectCtlAccessibleContext::IsNotAlive( void ) const { return rBHelper.bDisposed || rBHelper.bInDispose; } typedef ::cppu::WeakAggComponentImplHelper6< ::com::sun::star::accessibility::XAccessible, ::com::sun::star::accessibility::XAccessibleComponent, ::com::sun::star::accessibility::XAccessibleContext, ::com::sun::star::accessibility::XAccessibleEventBroadcaster, ::com::sun::star::accessibility::XAccessibleValue, ::com::sun::star::lang::XServiceInfo > SvxRectCtlChildAccessibleContext_Base; class SvxRectCtlChildAccessibleContext : public SvxRectCtlChildAccessibleContext_Base { public: SvxRectCtlChildAccessibleContext( const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible>& rxParent, const Window& rParentWindow, const ::rtl::OUString& rName, const ::rtl::OUString& rDescription, const Rectangle& rBoundingBox, long nIndexInParent ); protected: virtual ~SvxRectCtlChildAccessibleContext(); public: //===== XAccessible ===================================================== virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext> SAL_CALL getAccessibleContext( void ) throw( ::com::sun::star::uno::RuntimeException ); //===== XAccessibleComponent ============================================ virtual sal_Bool SAL_CALL containsPoint( const ::com::sun::star::awt::Point& rPoint ) throw( ::com::sun::star::uno::RuntimeException ); virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > SAL_CALL getAccessibleAtPoint( const ::com::sun::star::awt::Point& rPoint ) throw( ::com::sun::star::uno::RuntimeException ); virtual ::com::sun::star::awt::Rectangle SAL_CALL getBounds() throw( ::com::sun::star::uno::RuntimeException ); virtual ::com::sun::star::awt::Point SAL_CALL getLocation() throw( ::com::sun::star::uno::RuntimeException ); virtual ::com::sun::star::awt::Point SAL_CALL getLocationOnScreen() throw( ::com::sun::star::uno::RuntimeException ); virtual ::com::sun::star::awt::Size SAL_CALL getSize() throw( ::com::sun::star::uno::RuntimeException ); virtual sal_Bool SAL_CALL isShowing() throw( ::com::sun::star::uno::RuntimeException ); virtual sal_Bool SAL_CALL isVisible() throw( ::com::sun::star::uno::RuntimeException ); virtual sal_Bool SAL_CALL isFocusTraversable() throw( ::com::sun::star::uno::RuntimeException ); virtual void SAL_CALL addFocusListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XFocusListener >& xListener ) throw( ::com::sun::star::uno::RuntimeException ); virtual void SAL_CALL removeFocusListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XFocusListener >& xListener ) throw (::com::sun::star::uno::RuntimeException); virtual void SAL_CALL grabFocus() throw( ::com::sun::star::uno::RuntimeException ); virtual ::com::sun::star::uno::Any SAL_CALL getAccessibleKeyBinding() throw( ::com::sun::star::uno::RuntimeException ); virtual sal_Int32 SAL_CALL getForeground( ) throw (::com::sun::star::uno::RuntimeException); virtual sal_Int32 SAL_CALL getBackground( ) throw (::com::sun::star::uno::RuntimeException); //===== XAccessibleContext ============================================== virtual sal_Int32 SAL_CALL getAccessibleChildCount( void ) throw( ::com::sun::star::uno::RuntimeException ); virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > SAL_CALL getAccessibleChild( sal_Int32 nIndex ) throw( ::com::sun::star::uno::RuntimeException, ::com::sun::star::lang::IndexOutOfBoundsException ); virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > SAL_CALL getAccessibleParent( void ) throw( ::com::sun::star::uno::RuntimeException ); virtual sal_Int32 SAL_CALL getAccessibleIndexInParent( void ) throw( ::com::sun::star::uno::RuntimeException ); virtual sal_Int16 SAL_CALL getAccessibleRole( void ) throw( ::com::sun::star::uno::RuntimeException ); virtual ::rtl::OUString SAL_CALL getAccessibleDescription( void ) throw( ::com::sun::star::uno::RuntimeException ); virtual ::rtl::OUString SAL_CALL getAccessibleName( void ) throw( ::com::sun::star::uno::RuntimeException ); virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleRelationSet > SAL_CALL getAccessibleRelationSet( void ) throw( ::com::sun::star::uno::RuntimeException ); virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleStateSet > SAL_CALL getAccessibleStateSet( void ) throw( ::com::sun::star::uno::RuntimeException ); virtual ::com::sun::star::lang::Locale SAL_CALL getLocale( void ) throw( ::com::sun::star::uno::RuntimeException, ::com::sun::star::accessibility::IllegalAccessibleComponentStateException ); //===== XAccessibleEventBroadcaster ===================================== virtual void SAL_CALL addAccessibleEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleEventListener >& xListener ) throw( ::com::sun::star::uno::RuntimeException ); virtual void SAL_CALL removeAccessibleEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleEventListener >& xListener ) throw( com::sun::star::uno::RuntimeException ); //===== XAccessibleValue ================================================ virtual ::com::sun::star::uno::Any SAL_CALL getCurrentValue() throw( ::com::sun::star::uno::RuntimeException ); virtual sal_Bool SAL_CALL setCurrentValue( const ::com::sun::star::uno::Any& aNumber ) throw( ::com::sun::star::uno::RuntimeException ); virtual ::com::sun::star::uno::Any SAL_CALL getMaximumValue() throw( ::com::sun::star::uno::RuntimeException ); virtual ::com::sun::star::uno::Any SAL_CALL getMinimumValue() throw( ::com::sun::star::uno::RuntimeException ); //===== XServiceInfo ==================================================== virtual ::rtl::OUString SAL_CALL getImplementationName( void ) throw( ::com::sun::star::uno::RuntimeException ); virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& sServiceName ) throw( ::com::sun::star::uno::RuntimeException ); virtual ::com::sun::star::uno::Sequence< ::rtl::OUString> SAL_CALL getSupportedServiceNames( void ) throw( ::com::sun::star::uno::RuntimeException ); //===== XTypeProvider =================================================== virtual ::com::sun::star::uno::Sequence SAL_CALL getImplementationId( void ) throw( ::com::sun::star::uno::RuntimeException ); //===== internal ========================================================== /// Sets the checked status void setStateChecked( sal_Bool bChecked ); protected: virtual Rectangle GetBoundingBoxOnScreen( void ) throw( ::com::sun::star::uno::RuntimeException ); virtual Rectangle GetBoundingBox( void ) throw( ::com::sun::star::uno::RuntimeException ); void CommitChange( const com::sun::star::accessibility::AccessibleEventObject& rEvent ); virtual void SAL_CALL disposing(); /// @returns true if it's disposed or in disposing inline sal_Bool IsAlive( void ) const; /// @returns true if it's not disposed and no in disposing inline sal_Bool IsNotAlive( void ) const; /// throws the exception DisposedException if it's not alive void ThrowExceptionIfNotAlive( void ) throw( ::com::sun::star::lang::DisposedException ); /// Mutex guarding this object. ::osl::Mutex maMutex; private: /** Description of this object. This is not a constant because it can be set from the outside. Furthermore, it changes according the the draw page's display mode. */ ::rtl::OUString msDescription; /** Name of this object. It changes according the the draw page's display mode. */ ::rtl::OUString msName; /// Reference to the parent object. ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > mxParent; /// Bounding box Rectangle* mpBoundingBox; /// window of parent const Window& mrParentWindow; /// client id in the AccessibleEventNotifier queue sal_uInt32 mnClientId; /// index of child in parent long mnIndexInParent; /// Indicates, if object is checked sal_Bool mbIsChecked; }; inline sal_Bool SvxRectCtlChildAccessibleContext::IsAlive( void ) const { return !rBHelper.bDisposed && !rBHelper.bInDispose; } inline sal_Bool SvxRectCtlChildAccessibleContext::IsNotAlive( void ) const { return rBHelper.bDisposed || rBHelper.bInDispose; } #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */