summaryrefslogtreecommitdiff
path: root/svx/source/accessibility/AccessibleFrameSelector.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'svx/source/accessibility/AccessibleFrameSelector.cxx')
-rw-r--r--svx/source/accessibility/AccessibleFrameSelector.cxx740
1 files changed, 740 insertions, 0 deletions
diff --git a/svx/source/accessibility/AccessibleFrameSelector.cxx b/svx/source/accessibility/AccessibleFrameSelector.cxx
new file mode 100644
index 000000000000..82c522e1b0ff
--- /dev/null
+++ b/svx/source/accessibility/AccessibleFrameSelector.cxx
@@ -0,0 +1,740 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org 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 version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_svx.hxx"
+#include "AccessibleFrameSelector.hxx"
+#include <com/sun/star/awt/KeyEvent.hpp>
+#include <com/sun/star/awt/KeyModifier.hpp>
+#include <com/sun/star/awt/Key.hpp>
+#ifndef _COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLESTATETYPE_HDL_
+#include <com/sun/star/accessibility/AccessibleStateType.hpp>
+#endif
+#ifndef _COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLERELATIONTYPE_HDL_
+#include <com/sun/star/accessibility/AccessibleRelationType.hpp>
+#endif
+#ifndef _COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLEROLE_HDL_
+#include <com/sun/star/accessibility/AccessibleRole.hpp>
+#endif
+#include <com/sun/star/accessibility/AccessibleEventId.hpp>
+#include <com/sun/star/awt/FocusChangeReason.hpp>
+#include <unotools/accessiblestatesethelper.hxx>
+#include <unotools/accessiblerelationsethelper.hxx>
+#include <vos/mutex.hxx>
+#include <vcl/svapp.hxx>
+#include <svx/frmsel.hxx>
+#include <svx/dialmgr.hxx>
+#include "editeng/unolingu.hxx"
+
+#ifndef _SVX_DIALOGS_HRC
+#include <svx/dialogs.hrc>
+#endif
+#ifndef SVX_FRMSEL_HRC
+#include "frmsel.hrc"
+#endif
+
+#ifndef MNEMONIC_CHAR
+#define MNEMONIC_CHAR ((sal_Unicode)'~')
+#endif
+
+namespace svx {
+namespace a11y {
+
+using ::rtl::OUString;
+using ::com::sun::star::uno::Any;
+using ::com::sun::star::uno::UNO_QUERY;
+using ::com::sun::star::uno::Reference;
+using ::com::sun::star::uno::Sequence;
+using ::com::sun::star::uno::RuntimeException;
+using ::com::sun::star::uno::XInterface;
+using ::com::sun::star::lang::Locale;
+using ::com::sun::star::lang::EventObject;
+using ::com::sun::star::beans::XPropertyChangeListener;
+using ::com::sun::star::awt::XFocusListener;
+
+using namespace ::com::sun::star::accessibility;
+
+namespace AwtKey = ::com::sun::star::awt::Key;
+namespace AwtKeyModifier = ::com::sun::star::awt::KeyModifier;
+namespace AwtFocusChangeReason = ::com::sun::star::awt::FocusChangeReason;
+
+typedef ::com::sun::star::awt::Point AwtPoint;
+typedef ::com::sun::star::awt::Size AwtSize;
+typedef ::com::sun::star::awt::Rectangle AwtRectangle;
+typedef ::com::sun::star::awt::KeyEvent AwtKeyEvent;
+typedef ::com::sun::star::awt::FocusEvent AwtFocusEvent;
+
+// ============================================================================
+
+AccFrameSelector::AccFrameSelector( FrameSelector& rFrameSel, FrameBorderType eBorder ) :
+ Resource( SVX_RES( RID_SVXSTR_BORDER_CONTROL ) ),
+ mpFrameSel( &rFrameSel ),
+ meBorder( eBorder ),
+ maFocusListeners( maFocusMutex ),
+ maPropertyListeners( maPropertyMutex ),
+ maNames( SVX_RES( ARR_TEXTS ) ),
+ maDescriptions( SVX_RES(ARR_DESCRIPTIONS ) ),
+ mnClientId( 0 )
+{
+ FreeResource();
+
+ if ( mpFrameSel )
+ {
+ mpFrameSel->AddEventListener( LINK( this, AccFrameSelector, WindowEventListener ) );
+ }
+}
+
+// ----------------------------------------------------------------------------
+
+AccFrameSelector::~AccFrameSelector()
+{
+ if ( mpFrameSel )
+ {
+ mpFrameSel->RemoveEventListener( LINK( this, AccFrameSelector, WindowEventListener ) );
+ }
+}
+
+// ----------------------------------------------------------------------------
+
+Reference< XAccessibleContext > AccFrameSelector::getAccessibleContext( )
+ throw (RuntimeException)
+{
+ return this;
+}
+
+// ----------------------------------------------------------------------------
+
+sal_Int32 AccFrameSelector::getAccessibleChildCount( ) throw (RuntimeException)
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ IsValid();
+ return (meBorder == FRAMEBORDER_NONE) ? mpFrameSel->GetEnabledBorderCount() : 0;
+}
+
+// ----------------------------------------------------------------------------
+
+Reference< XAccessible > AccFrameSelector::getAccessibleChild( sal_Int32 i )
+ throw (RuntimeException)
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ IsValid();
+ Reference< XAccessible > xRet;
+ if( meBorder == FRAMEBORDER_NONE )
+ xRet = mpFrameSel->GetChildAccessible( i );
+ if( !xRet.is() )
+ throw RuntimeException();
+ return xRet;
+}
+
+// ----------------------------------------------------------------------------
+
+Reference< XAccessible > AccFrameSelector::getAccessibleParent( )
+ throw (RuntimeException)
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ IsValid();
+ Reference< XAccessible > xRet;
+ if(meBorder == FRAMEBORDER_NONE)
+ xRet = mpFrameSel->GetParent()->GetAccessible( sal_True );
+ else
+ xRet = mpFrameSel->CreateAccessible();
+ return xRet;
+}
+
+// ----------------------------------------------------------------------------
+
+sal_Int32 AccFrameSelector::getAccessibleIndexInParent( )
+ throw (RuntimeException)
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ IsValid();
+
+ sal_Int32 nIdx = 0;
+ if( meBorder == FRAMEBORDER_NONE )
+ {
+ Window* pTabPage = mpFrameSel->GetParent();
+ sal_Int32 nChildren = pTabPage->GetChildCount();
+ for( nIdx = 0; nIdx < nChildren; ++nIdx )
+ if( pTabPage->GetChild( static_cast< USHORT >( nIdx ) ) == mpFrameSel )
+ break;
+ }
+ else
+ nIdx = mpFrameSel->GetEnabledBorderIndex( meBorder );
+
+ if( nIdx < 0 )
+ throw RuntimeException();
+ return nIdx;
+}
+
+// ----------------------------------------------------------------------------
+
+sal_Int16 AccFrameSelector::getAccessibleRole( ) throw (RuntimeException)
+{
+ return AccessibleRole::OPTION_PANE;
+}
+
+// ----------------------------------------------------------------------------
+
+OUString AccFrameSelector::getAccessibleDescription( )
+ throw (RuntimeException)
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ IsValid();
+ return maDescriptions.GetString(meBorder);
+}
+
+// ----------------------------------------------------------------------------
+
+OUString AccFrameSelector::getAccessibleName( )
+ throw (RuntimeException)
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ IsValid();
+ return maNames.GetString(meBorder);
+}
+
+// ----------------------------------------------------------------------------
+
+Reference< XAccessibleRelationSet > AccFrameSelector::getAccessibleRelationSet( )
+ throw (RuntimeException)
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ IsValid();
+ utl::AccessibleRelationSetHelper* pHelper;
+ Reference< XAccessibleRelationSet > xRet = pHelper = new utl::AccessibleRelationSetHelper;
+ if(meBorder == FRAMEBORDER_NONE)
+ {
+ //add the label relation
+ Window* pPrev = mpFrameSel->GetWindow( WINDOW_PREV );
+ if(pPrev && WINDOW_FIXEDTEXT == pPrev->GetType())
+ {
+ AccessibleRelation aLabelRelation;
+ aLabelRelation.RelationType = AccessibleRelationType::LABELED_BY;
+ aLabelRelation.TargetSet.realloc(1);
+ aLabelRelation.TargetSet.getArray()[0] = pPrev->GetAccessible();
+ pHelper->AddRelation(aLabelRelation);
+ }
+ }
+ return xRet;
+}
+
+// ----------------------------------------------------------------------------
+
+Reference< XAccessibleStateSet > AccFrameSelector::getAccessibleStateSet( )
+ throw (RuntimeException)
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ utl::AccessibleStateSetHelper* pStateSetHelper = new utl::AccessibleStateSetHelper;
+ Reference< XAccessibleStateSet > xRet = pStateSetHelper;
+
+ if(!mpFrameSel)
+ pStateSetHelper->AddState(AccessibleStateType::DEFUNC);
+ else
+ {
+ const sal_Int16 aStandardStates[] =
+ {
+ AccessibleStateType::EDITABLE,
+ AccessibleStateType::FOCUSABLE,
+ AccessibleStateType::MULTI_SELECTABLE,
+ AccessibleStateType::SELECTABLE,
+ AccessibleStateType::SHOWING,
+ AccessibleStateType::VISIBLE,
+ AccessibleStateType::OPAQUE,
+ 0};
+ sal_Int16 nState = 0;
+ while(aStandardStates[nState])
+ {
+ pStateSetHelper->AddState(aStandardStates[nState++]);
+ }
+ if(mpFrameSel->IsEnabled())
+ {
+ pStateSetHelper->AddState(AccessibleStateType::ENABLED);
+ pStateSetHelper->AddState(AccessibleStateType::SENSITIVE);
+ }
+
+ sal_Bool bIsParent = meBorder == FRAMEBORDER_NONE;
+ if(mpFrameSel->HasFocus() &&
+ (bIsParent || mpFrameSel->IsBorderSelected(meBorder)))
+ {
+ pStateSetHelper->AddState(AccessibleStateType::ACTIVE);
+ pStateSetHelper->AddState(AccessibleStateType::FOCUSED);
+ pStateSetHelper->AddState(AccessibleStateType::SELECTED);
+ }
+ }
+ return xRet;
+}
+
+// ----------------------------------------------------------------------------
+
+Locale AccFrameSelector::getLocale( )
+ throw (IllegalAccessibleComponentStateException, RuntimeException)
+{
+ Locale aRet;
+ SvxLanguageToLocale( aRet, Application::GetSettings().GetUILanguage() );
+ return aRet;
+}
+
+// ----------------------------------------------------------------------------
+
+void AccFrameSelector::addPropertyChangeListener(
+ const Reference< XPropertyChangeListener >& xListener )
+ throw (RuntimeException)
+{
+ maPropertyListeners.addInterface( xListener );
+}
+
+// ----------------------------------------------------------------------------
+
+void AccFrameSelector::removePropertyChangeListener( const Reference< XPropertyChangeListener >& xListener )
+ throw (RuntimeException)
+{
+ maPropertyListeners.removeInterface( xListener );
+}
+
+// ----------------------------------------------------------------------------
+
+sal_Bool AccFrameSelector::containsPoint( const AwtPoint& aPt )
+ throw (RuntimeException)
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ IsValid();
+ //aPt is relative to the frame selector
+ return mpFrameSel->ContainsClickPoint( Point( aPt.X, aPt.Y ) );
+}
+
+// ----------------------------------------------------------------------------
+
+Reference< XAccessible > AccFrameSelector::getAccessibleAtPoint(
+ const AwtPoint& aPt )
+ throw (RuntimeException)
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ IsValid();
+ //aPt is relative to the frame selector
+ return mpFrameSel->GetChildAccessible( Point( aPt.X, aPt.Y ) );
+}
+
+AwtRectangle AccFrameSelector::getBounds( ) throw (RuntimeException)
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ IsValid();
+ Size aSz;
+ Point aPos;
+ switch(meBorder)
+ {
+ case FRAMEBORDER_NONE:
+ aSz = mpFrameSel->GetSizePixel();
+ aPos = mpFrameSel->GetPosPixel();
+ break;
+ default:
+ const Rectangle aSpot = mpFrameSel->GetClickBoundRect( meBorder );
+ aPos = aSpot.TopLeft();
+ aSz = aSpot.GetSize();
+ }
+ AwtRectangle aRet;
+ aRet.X = aPos.X();
+ aRet.Y = aPos.Y();
+ aRet.Width = aSz.Width();
+ aRet.Height = aSz.Height();
+ return aRet;
+}
+
+// ----------------------------------------------------------------------------
+
+AwtPoint AccFrameSelector::getLocation( ) throw (RuntimeException)
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ IsValid();
+ Point aPos;
+ switch(meBorder)
+ {
+ case FRAMEBORDER_NONE:
+ aPos = mpFrameSel->GetPosPixel();
+ break;
+ default:
+ const Rectangle aSpot = mpFrameSel->GetClickBoundRect( meBorder );
+ aPos = aSpot.TopLeft();
+ }
+ AwtPoint aRet(aPos.X(), aPos.Y());
+ return aRet;
+}
+
+// ----------------------------------------------------------------------------
+
+AwtPoint AccFrameSelector::getLocationOnScreen( ) throw (RuntimeException)
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ IsValid();
+ Point aPos;
+ switch(meBorder)
+ {
+ case FRAMEBORDER_NONE:
+ aPos = mpFrameSel->GetPosPixel();
+ break;
+ default:
+ const Rectangle aSpot = mpFrameSel->GetClickBoundRect( meBorder );
+ aPos = aSpot.TopLeft();
+ }
+ aPos = mpFrameSel->OutputToAbsoluteScreenPixel( aPos );
+ AwtPoint aRet(aPos.X(), aPos.Y());
+ return aRet;
+}
+
+// ----------------------------------------------------------------------------
+
+AwtSize AccFrameSelector::getSize( ) throw (RuntimeException)
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ IsValid();
+ Size aSz;
+ switch(meBorder)
+ {
+ case FRAMEBORDER_NONE:
+ aSz = mpFrameSel->GetSizePixel();
+ break;
+ default:
+ const Rectangle aSpot = mpFrameSel->GetClickBoundRect( meBorder );
+ aSz = aSpot.GetSize();
+ }
+ AwtSize aRet(aSz.Width(), aSz.Height());
+ return aRet;
+}
+
+// ----------------------------------------------------------------------------
+
+sal_Bool AccFrameSelector::isShowing( ) throw (RuntimeException)
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ IsValid();
+ return sal_True;
+}
+
+// ----------------------------------------------------------------------------
+
+sal_Bool AccFrameSelector::isVisible( ) throw (RuntimeException)
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ IsValid();
+ return sal_True;
+}
+
+// ----------------------------------------------------------------------------
+
+sal_Bool AccFrameSelector::isFocusTraversable( ) throw (RuntimeException)
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ IsValid();
+ return sal_True;
+}
+
+// ----------------------------------------------------------------------------
+
+void AccFrameSelector::addFocusListener( const Reference< XFocusListener >& xListener ) throw (RuntimeException)
+{
+ maFocusListeners.addInterface( xListener );
+}
+
+// ----------------------------------------------------------------------------
+
+void AccFrameSelector::removeFocusListener( const Reference< XFocusListener >& xListener ) throw (RuntimeException)
+{
+ maFocusListeners.removeInterface( xListener );
+}
+
+// ----------------------------------------------------------------------------
+
+void AccFrameSelector::grabFocus( ) throw (RuntimeException)
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ IsValid();
+ mpFrameSel->GrabFocus();
+}
+
+// ----------------------------------------------------------------------------
+
+Any AccFrameSelector::getAccessibleKeyBinding( ) throw (RuntimeException)
+{
+ Any aRet;
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ IsValid();
+ utl::AccessibleRelationSetHelper* pHelper;
+ Reference< XAccessibleRelationSet > xRet = pHelper = new utl::AccessibleRelationSetHelper;
+ if(meBorder == FRAMEBORDER_NONE)
+ {
+ Window* pPrev = mpFrameSel->GetWindow( WINDOW_PREV );
+ if(pPrev && WINDOW_FIXEDTEXT == pPrev->GetType())
+ {
+ String sText = pPrev->GetText();
+ xub_StrLen nFound = sText.Search( MNEMONIC_CHAR );
+ if(STRING_NOTFOUND != nFound && ++nFound < sText.Len())
+ {
+ sText.ToUpperAscii();
+ sal_Unicode cChar = sText.GetChar(nFound);
+ AwtKeyEvent aEvent;
+
+ aEvent.KeyCode = 0;
+ aEvent.KeyChar = cChar;
+ aEvent.KeyFunc = 0;
+ if(cChar >= 'A' && cChar <= 'Z')
+ {
+ aEvent.KeyCode = AwtKey::A + cChar - 'A';
+ }
+ aEvent.Modifiers = AwtKeyModifier::MOD2;
+ aRet <<= aEvent;
+ }
+ }
+ }
+ return aRet;
+}
+
+// ----------------------------------------------------------------------------
+
+sal_Int32 AccFrameSelector::getForeground( )
+ throw (RuntimeException)
+{
+ Any aRet;
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ IsValid();
+ return mpFrameSel->GetControlForeground().GetColor();
+}
+
+// ----------------------------------------------------------------------------
+
+sal_Int32 AccFrameSelector::getBackground( )
+ throw (RuntimeException)
+{
+ Any aRet;
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ IsValid();
+ return mpFrameSel->GetControlBackground().GetColor();
+}
+
+// ----------------------------------------------------------------------------
+
+void AccFrameSelector::addEventListener( const Reference< XAccessibleEventListener >& xListener ) throw (RuntimeException)
+{
+ vos::OGuard aGuard( Application::GetSolarMutex() );
+
+ if ( xListener.is() )
+ {
+ if ( !mnClientId )
+ {
+ mnClientId = ::comphelper::AccessibleEventNotifier::registerClient();
+ }
+ ::comphelper::AccessibleEventNotifier::addEventListener( mnClientId, xListener );
+ }
+}
+
+// ----------------------------------------------------------------------------
+
+void AccFrameSelector::removeEventListener( const Reference< XAccessibleEventListener >& xListener ) throw (RuntimeException)
+{
+ vos::OGuard aGuard( Application::GetSolarMutex() );
+
+ if ( xListener.is() && mnClientId != 0 &&
+ ::comphelper::AccessibleEventNotifier::removeEventListener( mnClientId, xListener ) == 0 )
+ {
+ // no listeners anymore
+ // -> revoke ourself. This may lead to the notifier thread dying (if we were the last client),
+ // and at least to us not firing any events anymore, in case somebody calls
+ // NotifyAccessibleEvent, again
+ ::comphelper::AccessibleEventNotifier::TClientId nId( mnClientId );
+ mnClientId = 0;
+ ::comphelper::AccessibleEventNotifier::revokeClient( nId );
+ }
+}
+
+// ----------------------------------------------------------------------------
+
+OUString AccFrameSelector::getImplementationName( ) throw (RuntimeException)
+{
+ return OUString::createFromAscii("AccFrameSelector");
+}
+
+// ----------------------------------------------------------------------------
+
+const sal_Char sAccessible[] = "Accessible";
+const sal_Char sAccessibleContext[] = "AccessibleContext";
+const sal_Char sAccessibleComponent[] = "AccessibleComponent";
+
+sal_Bool AccFrameSelector::supportsService( const OUString& rServiceName )
+ throw (RuntimeException)
+{
+ return rServiceName.equalsAsciiL( sAccessible , sizeof(sAccessible )-1 ) ||
+ rServiceName.equalsAsciiL( sAccessibleContext , sizeof(sAccessibleContext )-1 ) ||
+ rServiceName.equalsAsciiL( sAccessibleComponent, sizeof(sAccessibleComponent)-1 );
+}
+
+// ----------------------------------------------------------------------------
+
+Sequence< OUString > AccFrameSelector::getSupportedServiceNames( )
+ throw (RuntimeException)
+{
+ Sequence< OUString > aRet(3);
+ OUString* pArray = aRet.getArray();
+ pArray[0] = OUString( RTL_CONSTASCII_USTRINGPARAM(sAccessible ) );
+ pArray[1] = OUString( RTL_CONSTASCII_USTRINGPARAM(sAccessibleContext ) );
+ pArray[2] = OUString( RTL_CONSTASCII_USTRINGPARAM(sAccessibleComponent) );
+ return aRet;
+}
+
+// ----------------------------------------------------------------------------
+
+void AccFrameSelector::IsValid() throw (RuntimeException)
+{
+ if(!mpFrameSel)
+ throw RuntimeException();
+}
+
+// ----------------------------------------------------------------------------
+
+void AccFrameSelector::NotifyFocusListeners(sal_Bool bGetFocus)
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ AwtFocusEvent aEvent;
+ aEvent.FocusFlags = 0;
+ if(bGetFocus)
+ {
+ USHORT nFocusFlags = mpFrameSel->GetGetFocusFlags();
+ if(nFocusFlags&GETFOCUS_TAB)
+ aEvent.FocusFlags |= AwtFocusChangeReason::TAB;
+ if(nFocusFlags&GETFOCUS_CURSOR)
+ aEvent.FocusFlags |= AwtFocusChangeReason::CURSOR;
+ if(nFocusFlags&GETFOCUS_MNEMONIC)
+ aEvent.FocusFlags |= AwtFocusChangeReason::MNEMONIC;
+ if(nFocusFlags&GETFOCUS_FORWARD)
+ aEvent.FocusFlags |= AwtFocusChangeReason::FORWARD;
+ if(nFocusFlags&GETFOCUS_BACKWARD)
+ aEvent.FocusFlags |= AwtFocusChangeReason::BACKWARD;
+ if(nFocusFlags&GETFOCUS_AROUND)
+ aEvent.FocusFlags |= AwtFocusChangeReason::AROUND;
+ if(nFocusFlags&GETFOCUS_UNIQUEMNEMONIC)
+ aEvent.FocusFlags |= AwtFocusChangeReason::UNIQUEMNEMONIC;
+ // if(nFocusFlags&GETFOCUS_INIT)
+ // aEvent.FocusFlags |= AwtFocusChangeReason::
+ }
+// else
+ //how can I find the current focus window?
+// aEvent.NextFocus = ;
+ aEvent.Temporary = sal_False;
+
+ Reference < XAccessibleContext > xThis( this );
+ aEvent.Source = xThis;
+
+ ::cppu::OInterfaceIteratorHelper aIter( maFocusListeners );
+ while( aIter.hasMoreElements() )
+ {
+ Reference < XFocusListener > xListener( aIter.next(), UNO_QUERY );
+ if(bGetFocus)
+ xListener->focusGained( aEvent );
+ else
+ xListener->focusLost( aEvent );
+ }
+}
+
+// ----------------------------------------------------------------------------
+
+IMPL_LINK( AccFrameSelector, WindowEventListener, VclSimpleEvent*, pEvent )
+{
+ VclWindowEvent* pWinEvent = dynamic_cast< VclWindowEvent* >( pEvent );
+ DBG_ASSERT( pWinEvent, "AccFrameSelector::WindowEventListener - unknown window event" );
+ if ( pWinEvent )
+ {
+ Window* pWindow = pWinEvent->GetWindow();
+ DBG_ASSERT( pWindow, "AccFrameSelector::WindowEventListener: no window!" );
+ if ( !pWindow->IsAccessibilityEventsSuppressed() || ( pWinEvent->GetId() == VCLEVENT_OBJECT_DYING ) )
+ {
+ ProcessWindowEvent( *pWinEvent );
+ }
+ }
+
+ return 0;
+}
+
+// ----------------------------------------------------------------------------
+
+void AccFrameSelector::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent )
+{
+ switch ( rVclWindowEvent.GetId() )
+ {
+ case VCLEVENT_WINDOW_GETFOCUS:
+ {
+ if ( meBorder == FRAMEBORDER_NONE )
+ {
+ Any aOldValue, aNewValue;
+ aNewValue <<= AccessibleStateType::FOCUSED;
+ NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue );
+ }
+ }
+ break;
+ case VCLEVENT_WINDOW_LOSEFOCUS:
+ {
+ if ( meBorder == FRAMEBORDER_NONE )
+ {
+ Any aOldValue, aNewValue;
+ aOldValue <<= AccessibleStateType::FOCUSED;
+ NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue );
+ }
+ }
+ break;
+ default:
+ {
+ }
+ break;
+ }
+}
+
+// ----------------------------------------------------------------------------
+
+void AccFrameSelector::NotifyAccessibleEvent( const sal_Int16 _nEventId,
+ const Any& _rOldValue, const Any& _rNewValue )
+{
+ if ( mnClientId )
+ {
+ Reference< XInterface > xSource( *this );
+ AccessibleEventObject aEvent( xSource, _nEventId, _rNewValue, _rOldValue );
+ ::comphelper::AccessibleEventNotifier::addEvent( mnClientId, aEvent );
+ }
+}
+
+// ----------------------------------------------------------------------------
+
+void AccFrameSelector::Invalidate()
+{
+ mpFrameSel = 0;
+ EventObject aEvent;
+ Reference < XAccessibleContext > xThis( this );
+ aEvent.Source = xThis;
+ maFocusListeners.disposeAndClear( aEvent );
+ maPropertyListeners.disposeAndClear( aEvent );
+}
+
+// ============================================================================
+
+} // namespace a11y
+} // namespace svx
+