diff options
author | Vladimir Glazounov <vg@openoffice.org> | 2003-03-26 11:47:45 +0000 |
---|---|---|
committer | Vladimir Glazounov <vg@openoffice.org> | 2003-03-26 11:47:45 +0000 |
commit | 1876175efc6dcf22b06a4070cec77ef01aa93388 (patch) | |
tree | 83e7e4f35db269e652bbf3483dae07128b9369cf /basctl/source/accessibility | |
parent | d7058d7774c2feb131fc9b37febe07169e1dbacb (diff) |
INTEGRATION: CWS tbe3 (1.1.2); FILE ADDED
2003/03/12 16:42:44 tbe 1.1.2.4: #103595# added FOCUSED state for AccessibleDialogControlShape
2003/03/03 17:15:52 tbe 1.1.2.3: #103595# accessibility for dialog editor
2003/02/28 17:19:33 tbe 1.1.2.2: #103595# accessibility for dialog editor
2003/02/27 13:57:07 tbe 1.1.2.1: #103595# accessibility for dialog editor
Diffstat (limited to 'basctl/source/accessibility')
-rw-r--r-- | basctl/source/accessibility/accessibledialogwindow.cxx | 1203 |
1 files changed, 1203 insertions, 0 deletions
diff --git a/basctl/source/accessibility/accessibledialogwindow.cxx b/basctl/source/accessibility/accessibledialogwindow.cxx new file mode 100644 index 000000000000..dd2f34f70c1b --- /dev/null +++ b/basctl/source/accessibility/accessibledialogwindow.cxx @@ -0,0 +1,1203 @@ +/************************************************************************* + * + * $RCSfile: accessibledialogwindow.cxx,v $ + * + * $Revision: 1.2 $ + * + * last change: $Author: vg $ $Date: 2003-03-26 12:47:45 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _BASCTL_ACCESSIBLEDIALOGWINDOW_HXX_ +#include <accessibledialogwindow.hxx> +#endif + +#ifndef _BASCTL_ACCESSIBLEDIALOGCONTROLSHAPE_HXX_ +#include <accessibledialogcontrolshape.hxx> +#endif +#ifndef _BASIDE3_HXX +#include <baside3.hxx> +#endif +#ifndef _BASCTL_DLGED_HXX +#include <dlged.hxx> +#endif +#ifndef _BASCTL_DLGEDMOD_HXX +#include <dlgedmod.hxx> +#endif +#ifndef _BASCTL_DLGEDPAGE_HXX +#include <dlgedpage.hxx> +#endif +#ifndef _BASCTL_DLGEDVIEW_HXX +#include <dlgedview.hxx> +#endif +#ifndef _BASCTL_DLGEDOBJ_HXX +#include <dlgedobj.hxx> +#endif + +#ifndef _DRAFTS_COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLEEVENTID_HPP_ +#include <drafts/com/sun/star/accessibility/AccessibleEventId.hpp> +#endif +#ifndef _DRAFTS_COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLEROLE_HPP_ +#include <drafts/com/sun/star/accessibility/AccessibleRole.hpp> +#endif +#ifndef _DRAFTS_COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLESTATETYPE_HPP_ +#include <drafts/com/sun/star/accessibility/AccessibleStateType.hpp> +#endif + +#ifndef _UTL_ACCESSIBLESTATESETHELPER_HXX_ +#include <unotools/accessiblestatesethelper.hxx> +#endif +#ifndef _UTL_ACCESSIBLERELATIONSETHELPER_HXX_ +#include <unotools/accessiblerelationsethelper.hxx> +#endif +#ifndef _TOOLKIT_AWT_VCLXFONT_HXX_ +#include <toolkit/awt/vclxfont.hxx> +#endif +#ifndef _TOOLKIT_HELPER_EXTERNALLOCK_HXX_ +#include <toolkit/helper/externallock.hxx> +#endif +#ifndef _TOOLKIT_HELPER_CONVERT_HXX_ +#include <toolkit/helper/convert.hxx> +#endif + +#include <vector> +#include <algorithm> + + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using namespace ::drafts::com::sun::star::accessibility; +using namespace ::comphelper; + +DBG_NAME( AccessibleDialogWindow ) + + +// ----------------------------------------------------------------------------- +// class ChildDescriptor +// ----------------------------------------------------------------------------- + +AccessibleDialogWindow::ChildDescriptor::ChildDescriptor() + :pDlgEdObj( 0 ) + ,rxAccessible( 0 ) +{ +} + +// ----------------------------------------------------------------------------- + +AccessibleDialogWindow::ChildDescriptor::ChildDescriptor( DlgEdObj* _pDlgEdObj ) + :pDlgEdObj( _pDlgEdObj ) + ,rxAccessible( 0 ) +{ +} + +// ----------------------------------------------------------------------------- + +AccessibleDialogWindow::ChildDescriptor::ChildDescriptor( DlgEdObj* _pDlgEdObj, const Reference< XAccessible >& _rxAccessible ) + :pDlgEdObj( _pDlgEdObj ) + ,rxAccessible( _rxAccessible ) +{ +} + +// ----------------------------------------------------------------------------- + +AccessibleDialogWindow::ChildDescriptor::~ChildDescriptor() +{ +} + +// ----------------------------------------------------------------------------- + +AccessibleDialogWindow::ChildDescriptor::ChildDescriptor( const ChildDescriptor& rDesc ) + :pDlgEdObj( rDesc.pDlgEdObj ) + ,rxAccessible( rDesc.rxAccessible ) +{ +} + +// ----------------------------------------------------------------------------- + +AccessibleDialogWindow::ChildDescriptor& AccessibleDialogWindow::ChildDescriptor::operator=( const ChildDescriptor& rDesc ) +{ + pDlgEdObj = rDesc.pDlgEdObj; + rxAccessible = rDesc.rxAccessible; + + return *this; +} + +// ----------------------------------------------------------------------------- + +bool AccessibleDialogWindow::ChildDescriptor::operator==( const ChildDescriptor& rDesc ) +{ + bool bRet = false; + if ( pDlgEdObj == rDesc.pDlgEdObj ) + bRet = true; + + return bRet; +} + +// ----------------------------------------------------------------------------- + +bool AccessibleDialogWindow::ChildDescriptor::operator<( const ChildDescriptor& rDesc ) const +{ + bool bRet = false; + if ( pDlgEdObj && rDesc.pDlgEdObj && pDlgEdObj->GetOrdNum() < rDesc.pDlgEdObj->GetOrdNum() ) + bRet = true; + + return bRet; +} + +// ----------------------------------------------------------------------------- +// class AccessibleDialogWindow +// ----------------------------------------------------------------------------- + +AccessibleDialogWindow::AccessibleDialogWindow( DialogWindow* pDialogWindow ) + :AccessibleExtendedComponentHelper_BASE( new VCLExternalSolarLock() ) + ,m_pDialogWindow( pDialogWindow ) +{ + DBG_CTOR( AccessibleDialogWindow, NULL ); + m_pExternalLock = static_cast< VCLExternalSolarLock* >( getExternalLock() ); + + if ( m_pDialogWindow ) + { + SdrPage* pSdrPage = m_pDialogWindow->GetPage(); + if ( pSdrPage ) + { + ULONG nCount = pSdrPage->GetObjCount(); + + for ( ULONG i = 0; i < nCount; ++i ) + { + SdrObject* pObj = pSdrPage->GetObj( i ); + DlgEdObj* pDlgEdObj = PTR_CAST( DlgEdObj, pObj ); + if ( pDlgEdObj ) + { + ChildDescriptor aDesc( pDlgEdObj ); + if ( IsChildVisible( aDesc ) ) + m_aAccessibleChildren.push_back( aDesc ); + } + } + } + + m_pDialogWindow->AddEventListener( LINK( this, AccessibleDialogWindow, WindowEventListener ) ); + + m_pDlgEditor = m_pDialogWindow->GetEditor(); + if ( m_pDlgEditor ) + StartListening( *m_pDlgEditor ); + + m_pDlgEdModel = m_pDialogWindow->GetModel(); + if ( m_pDlgEdModel ) + StartListening( *m_pDlgEdModel ); + } +} + +// ----------------------------------------------------------------------------- + +AccessibleDialogWindow::~AccessibleDialogWindow() +{ + DBG_DTOR( AccessibleDialogWindow, NULL ); + if ( m_pDialogWindow ) + m_pDialogWindow->RemoveEventListener( LINK( this, AccessibleDialogWindow, WindowEventListener ) ); + + if ( m_pDlgEditor ) + EndListening( *m_pDlgEditor ); + + if ( m_pDlgEdModel ) + EndListening( *m_pDlgEdModel ); + + delete m_pExternalLock; + m_pExternalLock = NULL; +} + +// ----------------------------------------------------------------------------- + +void AccessibleDialogWindow::UpdateFocused() +{ + for ( sal_uInt32 i = 0; i < m_aAccessibleChildren.size(); ++i ) + { + Reference< XAccessible > xChild( m_aAccessibleChildren[i].rxAccessible ); + if ( xChild.is() ) + { + AccessibleDialogControlShape* pShape = static_cast< AccessibleDialogControlShape* >( xChild.get() ); + if ( pShape ) + pShape->SetFocused( pShape->IsFocused() ); + } + } +} + +// ----------------------------------------------------------------------------- + +void AccessibleDialogWindow::UpdateSelected() +{ + NotifyAccessibleEvent( AccessibleEventId::ACCESSIBLE_SELECTION_EVENT, Any(), Any() ); + + for ( sal_uInt32 i = 0; i < m_aAccessibleChildren.size(); ++i ) + { + Reference< XAccessible > xChild( m_aAccessibleChildren[i].rxAccessible ); + if ( xChild.is() ) + { + AccessibleDialogControlShape* pShape = static_cast< AccessibleDialogControlShape* >( xChild.get() ); + if ( pShape ) + pShape->SetSelected( pShape->IsSelected() ); + } + } +} + +// ----------------------------------------------------------------------------- + +void AccessibleDialogWindow::UpdateBounds() +{ + for ( sal_uInt32 i = 0; i < m_aAccessibleChildren.size(); ++i ) + { + Reference< XAccessible > xChild( m_aAccessibleChildren[i].rxAccessible ); + if ( xChild.is() ) + { + AccessibleDialogControlShape* pShape = static_cast< AccessibleDialogControlShape* >( xChild.get() ); + if ( pShape ) + pShape->SetBounds( pShape->GetBounds() ); + } + } +} + +// ----------------------------------------------------------------------------- + +sal_Bool AccessibleDialogWindow::IsChildVisible( const ChildDescriptor& rDesc ) +{ + sal_Bool bVisible = sal_False; + + if ( m_pDialogWindow ) + { + // first check, if the shape is in a visible layer + SdrModel* pSdrModel = m_pDialogWindow->GetModel(); + if ( pSdrModel ) + { + SdrLayerAdmin& rLayerAdmin = pSdrModel->GetLayerAdmin(); + DlgEdObj* pDlgEdObj = rDesc.pDlgEdObj; + if ( pDlgEdObj ) + { + SdrLayerID nLayerId = pDlgEdObj->GetLayer(); + const SdrLayer* pSdrLayer = rLayerAdmin.GetLayerPerID( nLayerId ); + if ( pSdrLayer ) + { + String aLayerName = pSdrLayer->GetName(); + SdrView* pSdrView = m_pDialogWindow->GetView(); + if ( pSdrView && pSdrView->IsLayerVisible( aLayerName ) ) + { + // get the bounding box of the shape in logic units + Rectangle aRect = pDlgEdObj->GetSnapRect(); + + // transform coordinates relative to the parent + MapMode aMap = m_pDialogWindow->GetMapMode(); + Point aOrg = aMap.GetOrigin(); + aRect.Move( aOrg.X(), aOrg.Y() ); + + // convert logic units to pixel + aRect = m_pDialogWindow->LogicToPixel( aRect, MapMode(MAP_100TH_MM) ); + + // check, if the shape's bounding box intersects with the bounding box of its parent + Rectangle aParentRect( Point( 0, 0 ), m_pDialogWindow->GetSizePixel() ); + if ( aParentRect.IsOver( aRect ) ) + bVisible = sal_True; + } + } + } + } + } + + return bVisible; +} + +// ----------------------------------------------------------------------------- + +void AccessibleDialogWindow::InsertChild( const ChildDescriptor& rDesc ) +{ + // check, if object is already in child list + AccessibleChildren::iterator aIter = ::std::find( m_aAccessibleChildren.begin(), m_aAccessibleChildren.end(), rDesc ); + + // if not found, insert in child list + if ( aIter == m_aAccessibleChildren.end() ) + { + // insert entry in child list + m_aAccessibleChildren.push_back( rDesc ); + + // get the accessible of the inserted child + Reference< XAccessible > xChild( getAccessibleChild( m_aAccessibleChildren.size() - 1 ) ); + + // sort child list + SortChildren(); + + // send accessible child event + if ( xChild.is() ) + { + Any aOldValue, aNewValue; + aNewValue <<= xChild; + NotifyAccessibleEvent( AccessibleEventId::ACCESSIBLE_CHILD_EVENT, aOldValue, aNewValue ); + } + } +} + +// ----------------------------------------------------------------------------- + +void AccessibleDialogWindow::RemoveChild( const ChildDescriptor& rDesc ) +{ + // find object in child list + AccessibleChildren::iterator aIter = ::std::find( m_aAccessibleChildren.begin(), m_aAccessibleChildren.end(), rDesc ); + + // if found, remove from child list + if ( aIter != m_aAccessibleChildren.end() ) + { + // get the accessible of the removed child + Reference< XAccessible > xChild( aIter->rxAccessible ); + + // remove entry from child list + m_aAccessibleChildren.erase( aIter ); + + // send accessible child event + if ( xChild.is() ) + { + Any aOldValue, aNewValue; + aOldValue <<= xChild; + NotifyAccessibleEvent( AccessibleEventId::ACCESSIBLE_CHILD_EVENT, aOldValue, aNewValue ); + + Reference< XComponent > xComponent( xChild, UNO_QUERY ); + if ( xComponent.is() ) + xComponent->dispose(); + } + } +} + +// ----------------------------------------------------------------------------- + +void AccessibleDialogWindow::UpdateChild( const ChildDescriptor& rDesc ) +{ + if ( IsChildVisible( rDesc ) ) + { + // if the object is not in the child list, insert child + InsertChild( rDesc ); + } + else + { + // if the object is in the child list, remove child + RemoveChild( rDesc ); + } +} + +// ----------------------------------------------------------------------------- + +void AccessibleDialogWindow::UpdateChildren() +{ + if ( m_pDialogWindow ) + { + SdrPage* pSdrPage = m_pDialogWindow->GetPage(); + if ( pSdrPage ) + { + for ( ULONG i = 0, nCount = pSdrPage->GetObjCount(); i < nCount; ++i ) + { + SdrObject* pObj = pSdrPage->GetObj( i ); + DlgEdObj* pDlgEdObj = PTR_CAST( DlgEdObj, pObj ); + if ( pDlgEdObj ) + UpdateChild( ChildDescriptor( pDlgEdObj ) ); + } + } + } +} + +// ----------------------------------------------------------------------------- + +void AccessibleDialogWindow::SortChildren() +{ + // sort child list + ::std::sort( m_aAccessibleChildren.begin(), m_aAccessibleChildren.end() ); +} + +// ----------------------------------------------------------------------------- + +IMPL_LINK( AccessibleDialogWindow, WindowEventListener, VclSimpleEvent*, pEvent ) +{ + DBG_CHKTHIS( AccessibleDialogWindow, 0 ); + DBG_ASSERT( pEvent && pEvent->ISA( VclWindowEvent ), "AccessibleDialogWindow::WindowEventListener: unknown window event!" ); + + if ( pEvent && pEvent->ISA( VclWindowEvent ) ) + { + DBG_ASSERT( ((VclWindowEvent*)pEvent)->GetWindow(), "AccessibleDialogWindow::WindowEventListener: no window!" ); + if ( !((VclWindowEvent*)pEvent)->GetWindow()->IsAccessibilityEventsSuppressed() || ( pEvent->GetId() == VCLEVENT_OBJECT_DYING ) ) + { + ProcessWindowEvent( *(VclWindowEvent*)pEvent ); + } + } + + return 0; +} + +// ----------------------------------------------------------------------------- + +void AccessibleDialogWindow::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent ) +{ + Any aOldValue, aNewValue; + + switch ( rVclWindowEvent.GetId() ) + { + case VCLEVENT_WINDOW_ENABLED: + { + aNewValue <<= AccessibleStateType::ENABLED; + NotifyAccessibleEvent( AccessibleEventId::ACCESSIBLE_STATE_EVENT, aOldValue, aNewValue ); + } + break; + case VCLEVENT_WINDOW_DISABLED: + { + aOldValue <<= AccessibleStateType::ENABLED; + NotifyAccessibleEvent( AccessibleEventId::ACCESSIBLE_STATE_EVENT, aOldValue, aNewValue ); + } + break; + case VCLEVENT_WINDOW_ACTIVATE: + { + aNewValue <<= AccessibleStateType::ACTIVE; + NotifyAccessibleEvent( AccessibleEventId::ACCESSIBLE_STATE_EVENT, aOldValue, aNewValue ); + } + break; + case VCLEVENT_WINDOW_DEACTIVATE: + { + aOldValue <<= AccessibleStateType::ACTIVE; + NotifyAccessibleEvent( AccessibleEventId::ACCESSIBLE_STATE_EVENT, aOldValue, aNewValue ); + } + break; + case VCLEVENT_WINDOW_GETFOCUS: + { + aNewValue <<= AccessibleStateType::FOCUSED; + NotifyAccessibleEvent( AccessibleEventId::ACCESSIBLE_STATE_EVENT, aOldValue, aNewValue ); + } + break; + case VCLEVENT_WINDOW_LOSEFOCUS: + { + aOldValue <<= AccessibleStateType::FOCUSED; + NotifyAccessibleEvent( AccessibleEventId::ACCESSIBLE_STATE_EVENT, aOldValue, aNewValue ); + } + break; + case VCLEVENT_WINDOW_SHOW: + { + aNewValue <<= AccessibleStateType::SHOWING; + NotifyAccessibleEvent( AccessibleEventId::ACCESSIBLE_STATE_EVENT, aOldValue, aNewValue ); + } + break; + case VCLEVENT_WINDOW_HIDE: + { + aOldValue <<= AccessibleStateType::SHOWING; + NotifyAccessibleEvent( AccessibleEventId::ACCESSIBLE_STATE_EVENT, aOldValue, aNewValue ); + } + break; + case VCLEVENT_WINDOW_RESIZE: + { + NotifyAccessibleEvent( AccessibleEventId::ACCESSIBLE_BOUNDRECT_EVENT, aOldValue, aNewValue ); + UpdateChildren(); + UpdateBounds(); + } + break; + case VCLEVENT_OBJECT_DYING: + { + if ( m_pDialogWindow ) + { + m_pDialogWindow->RemoveEventListener( LINK( this, AccessibleDialogWindow, WindowEventListener ) ); + m_pDialogWindow = NULL; + + if ( m_pDlgEditor ) + EndListening( *m_pDlgEditor ); + m_pDlgEditor = NULL; + + if ( m_pDlgEdModel ) + EndListening( *m_pDlgEdModel ); + m_pDlgEdModel = NULL; + + // dispose all children + for ( sal_uInt32 i = 0; i < m_aAccessibleChildren.size(); ++i ) + { + Reference< XComponent > xComponent( m_aAccessibleChildren[i].rxAccessible, UNO_QUERY ); + if ( xComponent.is() ) + xComponent->dispose(); + } + m_aAccessibleChildren.clear(); + } + } + break; + default: + { + } + break; + } +} + +// ----------------------------------------------------------------------------- + +void AccessibleDialogWindow::FillAccessibleStateSet( utl::AccessibleStateSetHelper& rStateSet ) +{ + if ( m_pDialogWindow ) + { + if ( m_pDialogWindow->IsEnabled() ) + rStateSet.AddState( AccessibleStateType::ENABLED ); + + rStateSet.AddState( AccessibleStateType::FOCUSABLE ); + + if ( m_pDialogWindow->HasFocus() ) + rStateSet.AddState( AccessibleStateType::FOCUSED ); + + rStateSet.AddState( AccessibleStateType::VISIBLE ); + + if ( m_pDialogWindow->IsVisible() ) + rStateSet.AddState( AccessibleStateType::SHOWING ); + + rStateSet.AddState( AccessibleStateType::OPAQUE ); + + rStateSet.AddState( AccessibleStateType::RESIZABLE ); + } +} + +// ----------------------------------------------------------------------------- +// OCommonAccessibleComponent +// ----------------------------------------------------------------------------- + +awt::Rectangle AccessibleDialogWindow::implGetBounds() throw (RuntimeException) +{ + awt::Rectangle aBounds; + if ( m_pDialogWindow ) + aBounds = AWTRectangle( Rectangle( m_pDialogWindow->GetPosPixel(), m_pDialogWindow->GetSizePixel() ) ); + + return aBounds; +} + +// ----------------------------------------------------------------------------- +// SfxListener +// ----------------------------------------------------------------------------- + +void AccessibleDialogWindow::Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) +{ + if ( rHint.ISA( SdrHint ) ) + { + SdrHint* pSdrHint = (SdrHint*)&rHint; + switch ( pSdrHint->GetKind() ) + { + case HINT_OBJINSERTED: + { + SdrObject* pObj = (SdrObject*)pSdrHint->GetObject(); + DlgEdObj* pDlgEdObj = PTR_CAST( DlgEdObj, pObj ); + if ( pDlgEdObj ) + { + ChildDescriptor aDesc( pDlgEdObj ); + if ( IsChildVisible( aDesc ) ) + InsertChild( aDesc ); + } + } + break; + case HINT_OBJREMOVED: + { + SdrObject* pObj = (SdrObject*)pSdrHint->GetObject(); + DlgEdObj* pDlgEdObj = PTR_CAST( DlgEdObj, pObj ); + if ( pDlgEdObj ) + RemoveChild( ChildDescriptor( pDlgEdObj ) ); + } + break; + } + } + else if ( rHint.ISA( DlgEdHint ) ) + { + DlgEdHint* pDlgEdHint = (DlgEdHint*)&rHint; + switch ( pDlgEdHint->GetKind() ) + { + case DLGED_HINT_WINDOWSCROLLED: + { + UpdateChildren(); + UpdateBounds(); + } + break; + case DLGED_HINT_LAYERCHANGED: + { + DlgEdObj* pDlgEdObj = pDlgEdHint->GetObject(); + if ( pDlgEdObj ) + UpdateChild( ChildDescriptor( pDlgEdObj ) ); + } + break; + case DLGED_HINT_OBJORDERCHANGED: + { + SortChildren(); + } + break; + case DLGED_HINT_SELECTIONCHANGED: + { + UpdateFocused(); + UpdateSelected(); + } + break; + } + } +} + +// ----------------------------------------------------------------------------- +// XInterface +// ----------------------------------------------------------------------------- + +IMPLEMENT_FORWARD_XINTERFACE2( AccessibleDialogWindow, AccessibleExtendedComponentHelper_BASE, AccessibleDialogWindow_BASE ) + +// ----------------------------------------------------------------------------- +// XTypeProvider +// ----------------------------------------------------------------------------- + +IMPLEMENT_FORWARD_XTYPEPROVIDER2( AccessibleDialogWindow, AccessibleExtendedComponentHelper_BASE, AccessibleDialogWindow_BASE ) + +// ----------------------------------------------------------------------------- +// XComponent +// ----------------------------------------------------------------------------- + +void AccessibleDialogWindow::disposing() +{ + AccessibleExtendedComponentHelper_BASE::disposing(); + + if ( m_pDialogWindow ) + { + m_pDialogWindow->RemoveEventListener( LINK( this, AccessibleDialogWindow, WindowEventListener ) ); + m_pDialogWindow = NULL; + + if ( m_pDlgEditor ) + EndListening( *m_pDlgEditor ); + m_pDlgEditor = NULL; + + if ( m_pDlgEdModel ) + EndListening( *m_pDlgEdModel ); + m_pDlgEdModel = NULL; + + // dispose all children + for ( sal_uInt32 i = 0; i < m_aAccessibleChildren.size(); ++i ) + { + Reference< XComponent > xComponent( m_aAccessibleChildren[i].rxAccessible, UNO_QUERY ); + if ( xComponent.is() ) + xComponent->dispose(); + } + m_aAccessibleChildren.clear(); + } +} + +// ----------------------------------------------------------------------------- +// XServiceInfo +// ----------------------------------------------------------------------------- + +::rtl::OUString AccessibleDialogWindow::getImplementationName() throw (RuntimeException) +{ + return ::rtl::OUString::createFromAscii( "com.sun.star.comp.basctl.AccessibleWindow" ); +} + +// ----------------------------------------------------------------------------- + +sal_Bool AccessibleDialogWindow::supportsService( const ::rtl::OUString& rServiceName ) throw (RuntimeException) +{ + Sequence< ::rtl::OUString > aNames( getSupportedServiceNames() ); + const ::rtl::OUString* pNames = aNames.getConstArray(); + const ::rtl::OUString* pEnd = pNames + aNames.getLength(); + for ( ; pNames != pEnd && !pNames->equals( rServiceName ); ++pNames ) + ; + + return pNames != pEnd; +} + +// ----------------------------------------------------------------------------- + +Sequence< ::rtl::OUString > AccessibleDialogWindow::getSupportedServiceNames() throw (RuntimeException) +{ + Sequence< ::rtl::OUString > aNames(1); + aNames[0] = ::rtl::OUString::createFromAscii( "drafts.com.sun.star.awt.AccessibleWindow" ); + return aNames; +} + +// ----------------------------------------------------------------------------- +// XAccessible +// ----------------------------------------------------------------------------- + +Reference< XAccessibleContext > AccessibleDialogWindow::getAccessibleContext( ) throw (RuntimeException) +{ + OExternalLockGuard aGuard( this ); + + return this; +} + +// ----------------------------------------------------------------------------- +// XAccessibleContext +// ----------------------------------------------------------------------------- + +sal_Int32 AccessibleDialogWindow::getAccessibleChildCount() throw (RuntimeException) +{ + OExternalLockGuard aGuard( this ); + + return m_aAccessibleChildren.size(); +} + +// ----------------------------------------------------------------------------- + +Reference< XAccessible > AccessibleDialogWindow::getAccessibleChild( sal_Int32 i ) throw (IndexOutOfBoundsException, RuntimeException) +{ + OExternalLockGuard aGuard( this ); + + if ( i < 0 || i >= getAccessibleChildCount() ) + throw IndexOutOfBoundsException(); + + Reference< XAccessible > xChild = m_aAccessibleChildren[i].rxAccessible; + if ( !xChild.is() ) + { + if ( m_pDialogWindow ) + { + DlgEdObj* pDlgEdObj = m_aAccessibleChildren[i].pDlgEdObj; + if ( pDlgEdObj ) + { + xChild = new AccessibleDialogControlShape( m_pDialogWindow, pDlgEdObj ); + + // insert into child list + m_aAccessibleChildren[i].rxAccessible = xChild; + } + } + } + + return xChild; +} + +// ----------------------------------------------------------------------------- + +Reference< XAccessible > AccessibleDialogWindow::getAccessibleParent( ) throw (RuntimeException) +{ + OExternalLockGuard aGuard( this ); + + Reference< XAccessible > xParent; + if ( m_pDialogWindow ) + { + Window* pParent = m_pDialogWindow->GetAccessibleParentWindow(); + if ( pParent ) + xParent = pParent->GetAccessible(); + } + + return xParent; +} + +// ----------------------------------------------------------------------------- + +sal_Int32 AccessibleDialogWindow::getAccessibleIndexInParent( ) throw (RuntimeException) +{ + OExternalLockGuard aGuard( this ); + + sal_Int32 nIndexInParent = -1; + if ( m_pDialogWindow ) + { + Window* pParent = m_pDialogWindow->GetAccessibleParentWindow(); + if ( pParent ) + { + for ( USHORT i = 0, nCount = pParent->GetAccessibleChildWindowCount(); i < nCount; ++i ) + { + Window* pChild = pParent->GetAccessibleChildWindow( i ); + if ( pChild == static_cast< Window* >( m_pDialogWindow ) ) + { + nIndexInParent = i; + break; + } + } + } + } + + return nIndexInParent; +} + +// ----------------------------------------------------------------------------- + +sal_Int16 AccessibleDialogWindow::getAccessibleRole( ) throw (RuntimeException) +{ + OExternalLockGuard aGuard( this ); + + return AccessibleRole::PANEL; +} + +// ----------------------------------------------------------------------------- + +::rtl::OUString AccessibleDialogWindow::getAccessibleDescription( ) throw (RuntimeException) +{ + OExternalLockGuard aGuard( this ); + + ::rtl::OUString sDescription; + if ( m_pDialogWindow ) + sDescription = m_pDialogWindow->GetAccessibleDescription(); + + return sDescription; +} + +// ----------------------------------------------------------------------------- + +::rtl::OUString AccessibleDialogWindow::getAccessibleName( ) throw (RuntimeException) +{ + OExternalLockGuard aGuard( this ); + + ::rtl::OUString sName; + if ( m_pDialogWindow ) + sName = m_pDialogWindow->GetAccessibleName(); + + return sName; +} + +// ----------------------------------------------------------------------------- + +Reference< XAccessibleRelationSet > AccessibleDialogWindow::getAccessibleRelationSet( ) throw (RuntimeException) +{ + OExternalLockGuard aGuard( this ); + + utl::AccessibleRelationSetHelper* pRelationSetHelper = new utl::AccessibleRelationSetHelper; + Reference< XAccessibleRelationSet > xSet = pRelationSetHelper; + return xSet; +} + +// ----------------------------------------------------------------------------- + +Reference< XAccessibleStateSet > AccessibleDialogWindow::getAccessibleStateSet( ) throw (RuntimeException) +{ + OExternalLockGuard aGuard( this ); + + utl::AccessibleStateSetHelper* pStateSetHelper = new utl::AccessibleStateSetHelper; + Reference< XAccessibleStateSet > xSet = pStateSetHelper; + + if ( !rBHelper.bDisposed && !rBHelper.bInDispose ) + { + FillAccessibleStateSet( *pStateSetHelper ); + } + else + { + pStateSetHelper->AddState( AccessibleStateType::DEFUNC ); + } + + return xSet; +} + +// ----------------------------------------------------------------------------- + +Locale AccessibleDialogWindow::getLocale( ) throw (IllegalAccessibleComponentStateException, RuntimeException) +{ + OExternalLockGuard aGuard( this ); + + return Application::GetSettings().GetLocale(); +} + +// ----------------------------------------------------------------------------- +// XAccessibleComponent +// ----------------------------------------------------------------------------- + +Reference< XAccessible > AccessibleDialogWindow::getAccessibleAt( const awt::Point& rPoint ) throw (RuntimeException) +{ + OExternalLockGuard aGuard( this ); + + Reference< XAccessible > xChild; + for ( sal_uInt32 i = 0; i < m_aAccessibleChildren.size(); ++i ) + { + Reference< XAccessible > xAcc = getAccessibleChild( i ); + if ( xAcc.is() ) + { + Reference< XAccessibleComponent > xComp( xAcc->getAccessibleContext(), UNO_QUERY ); + if ( xComp.is() ) + { + Rectangle aRect = VCLRectangle( xComp->getBounds() ); + Point aPos = VCLPoint( rPoint ); + if ( aRect.IsInside( aPos ) ) + { + xChild = xAcc; + break; + } + } + } + } + + return xChild; +} + +// ----------------------------------------------------------------------------- + +void AccessibleDialogWindow::grabFocus( ) throw (RuntimeException) +{ + OExternalLockGuard aGuard( this ); + + if ( m_pDialogWindow ) + m_pDialogWindow->GrabFocus(); +} + +// ----------------------------------------------------------------------------- + +sal_Int32 AccessibleDialogWindow::getForeground( ) throw (RuntimeException) +{ + OExternalLockGuard aGuard( this ); + + sal_Int32 nColor = 0; + if ( m_pDialogWindow ) + { + if ( m_pDialogWindow->IsControlForeground() ) + nColor = m_pDialogWindow->GetControlForeground().GetColor(); + else + { + Font aFont; + if ( m_pDialogWindow->IsControlFont() ) + aFont = m_pDialogWindow->GetControlFont(); + else + aFont = m_pDialogWindow->GetFont(); + nColor = aFont.GetColor().GetColor(); + } + } + + return nColor; +} + +// ----------------------------------------------------------------------------- + +sal_Int32 AccessibleDialogWindow::getBackground( ) throw (RuntimeException) +{ + OExternalLockGuard aGuard( this ); + + sal_Int32 nColor = 0; + if ( m_pDialogWindow ) + { + if ( m_pDialogWindow->IsControlBackground() ) + nColor = m_pDialogWindow->GetControlBackground().GetColor(); + else + nColor = m_pDialogWindow->GetBackground().GetColor().GetColor(); + } + + return nColor; +} + +// ----------------------------------------------------------------------------- +// XAccessibleExtendedComponent +// ----------------------------------------------------------------------------- + +Reference< awt::XFont > AccessibleDialogWindow::getFont( ) throw (RuntimeException) +{ + OExternalLockGuard aGuard( this ); + + Reference< awt::XFont > xFont; + if ( m_pDialogWindow ) + { + Reference< awt::XDevice > xDev( m_pDialogWindow->GetComponentInterface(), UNO_QUERY ); + if ( xDev.is() ) + { + Font aFont; + if ( m_pDialogWindow->IsControlFont() ) + aFont = m_pDialogWindow->GetControlFont(); + else + aFont = m_pDialogWindow->GetFont(); + VCLXFont* pVCLXFont = new VCLXFont; + pVCLXFont->Init( *xDev.get(), aFont ); + xFont = pVCLXFont; + } + } + + return xFont; +} + +// ----------------------------------------------------------------------------- + +::rtl::OUString AccessibleDialogWindow::getTitledBorderText( ) throw (RuntimeException) +{ + OExternalLockGuard aGuard( this ); + + return ::rtl::OUString(); +} + +// ----------------------------------------------------------------------------- + +::rtl::OUString AccessibleDialogWindow::getToolTipText( ) throw (RuntimeException) +{ + OExternalLockGuard aGuard( this ); + + ::rtl::OUString sText; + if ( m_pDialogWindow ) + sText = m_pDialogWindow->GetQuickHelpText(); + + return sText; +} + +// ----------------------------------------------------------------------------- +// XAccessibleSelection +// ----------------------------------------------------------------------------- + +void AccessibleDialogWindow::selectAccessibleChild( sal_Int32 nChildIndex ) throw (IndexOutOfBoundsException, RuntimeException) +{ + OExternalLockGuard aGuard( this ); + + if ( nChildIndex < 0 || nChildIndex >= getAccessibleChildCount() ) + throw IndexOutOfBoundsException(); + + if ( m_pDialogWindow ) + { + DlgEdObj* pDlgEdObj = m_aAccessibleChildren[nChildIndex].pDlgEdObj; + if ( pDlgEdObj ) + { + SdrView* pSdrView = m_pDialogWindow->GetView(); + if ( pSdrView ) + { + SdrPageView* pPgView = pSdrView->GetPageViewPvNum(0); + if ( pPgView ) + pSdrView->MarkObj( pDlgEdObj, pPgView ); + } + } + } +} + +// ----------------------------------------------------------------------------- + +sal_Bool AccessibleDialogWindow::isAccessibleChildSelected( sal_Int32 nChildIndex ) throw (IndexOutOfBoundsException, RuntimeException) +{ + OExternalLockGuard aGuard( this ); + + if ( nChildIndex < 0 || nChildIndex >= getAccessibleChildCount() ) + throw IndexOutOfBoundsException(); + + sal_Bool bSelected = sal_False; + if ( m_pDialogWindow ) + { + DlgEdObj* pDlgEdObj = m_aAccessibleChildren[nChildIndex].pDlgEdObj; + if ( pDlgEdObj ) + { + SdrView* pSdrView = m_pDialogWindow->GetView(); + if ( pSdrView ) + bSelected = pSdrView->IsObjMarked( pDlgEdObj ); + } + } + + return bSelected; +} + +// ----------------------------------------------------------------------------- + +void AccessibleDialogWindow::clearAccessibleSelection( ) throw (RuntimeException) +{ + OExternalLockGuard aGuard( this ); + + if ( m_pDialogWindow ) + { + SdrView* pSdrView = m_pDialogWindow->GetView(); + if ( pSdrView ) + pSdrView->UnmarkAll(); + } +} + +// ----------------------------------------------------------------------------- + +void AccessibleDialogWindow::selectAllAccessible( ) throw (RuntimeException) +{ + OExternalLockGuard aGuard( this ); + + if ( m_pDialogWindow ) + { + SdrView* pSdrView = m_pDialogWindow->GetView(); + if ( pSdrView ) + pSdrView->MarkAll(); + } +} + +// ----------------------------------------------------------------------------- + +sal_Int32 AccessibleDialogWindow::getSelectedAccessibleChildCount( ) throw (RuntimeException) +{ + OExternalLockGuard aGuard( this ); + + sal_Int32 nRet = 0; + + for ( sal_Int32 i = 0, nCount = getAccessibleChildCount(); i < nCount; ++i ) + { + if ( isAccessibleChildSelected( i ) ) + ++nRet; + } + + return nRet; +} + +// ----------------------------------------------------------------------------- + +Reference< XAccessible > AccessibleDialogWindow::getSelectedAccessibleChild( sal_Int32 nSelectedChildIndex ) throw (IndexOutOfBoundsException, RuntimeException) +{ + OExternalLockGuard aGuard( this ); + + if ( nSelectedChildIndex < 0 || nSelectedChildIndex >= getSelectedAccessibleChildCount() ) + throw IndexOutOfBoundsException(); + + Reference< XAccessible > xChild; + + for ( sal_Int32 i = 0, j = 0, nCount = getAccessibleChildCount(); i < nCount; ++i ) + { + if ( isAccessibleChildSelected( i ) && ( j++ == nSelectedChildIndex ) ) + { + xChild = getAccessibleChild( i ); + break; + } + } + + return xChild; +} + +// ----------------------------------------------------------------------------- + +void AccessibleDialogWindow::deselectSelectedAccessibleChild( sal_Int32 nChildIndex ) throw (IndexOutOfBoundsException, RuntimeException) +{ + OExternalLockGuard aGuard( this ); + + if ( nChildIndex < 0 || nChildIndex >= getAccessibleChildCount() ) + throw IndexOutOfBoundsException(); + + if ( m_pDialogWindow ) + { + DlgEdObj* pDlgEdObj = m_aAccessibleChildren[nChildIndex].pDlgEdObj; + if ( pDlgEdObj ) + { + SdrView* pSdrView = m_pDialogWindow->GetView(); + if ( pSdrView ) + { + SdrPageView* pPgView = pSdrView->GetPageViewPvNum(0); + if ( pPgView ) + pSdrView->MarkObj( pDlgEdObj, pPgView, TRUE ); + } + } + } +} + +// ----------------------------------------------------------------------------- |