summaryrefslogtreecommitdiff
path: root/accessibility/source/standard/vclxaccessibleedit.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'accessibility/source/standard/vclxaccessibleedit.cxx')
-rw-r--r--accessibility/source/standard/vclxaccessibleedit.cxx52
1 files changed, 24 insertions, 28 deletions
diff --git a/accessibility/source/standard/vclxaccessibleedit.cxx b/accessibility/source/standard/vclxaccessibleedit.cxx
index 0dd8376580ec..07378c0ea42f 100644
--- a/accessibility/source/standard/vclxaccessibleedit.cxx
+++ b/accessibility/source/standard/vclxaccessibleedit.cxx
@@ -67,6 +67,7 @@ using namespace ::comphelper;
VCLXAccessibleEdit::VCLXAccessibleEdit( VCLXWindow* pVCLWindow )
:VCLXAccessibleTextComponent( pVCLWindow )
{
+ m_nSelectionStart = getSelectionStart();
m_nCaretPosition = getCaretPosition();
}
@@ -78,22 +79,6 @@ VCLXAccessibleEdit::~VCLXAccessibleEdit()
// -----------------------------------------------------------------------------
-void VCLXAccessibleEdit::UpdateCaretPosition()
-{
- sal_Int32 nCaretPosition = getCaretPosition();
-
- if ( m_nCaretPosition != nCaretPosition )
- {
- Any aOldValue, aNewValue;
- aOldValue <<= (sal_Int32) m_nCaretPosition;
- aNewValue <<= (sal_Int32) nCaretPosition;
- m_nCaretPosition = nCaretPosition;
- NotifyAccessibleEvent( AccessibleEventId::CARET_CHANGED, aOldValue, aNewValue );
- }
-}
-
-// -----------------------------------------------------------------------------
-
void VCLXAccessibleEdit::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent )
{
switch ( rVclWindowEvent.GetId() )
@@ -105,11 +90,31 @@ void VCLXAccessibleEdit::ProcessWindowEvent( const VclWindowEvent& rVclWindowEve
break;
case VCLEVENT_EDIT_SELECTIONCHANGED:
{
+ sal_Int32 nOldCaretPosition = m_nCaretPosition;
+ sal_Int32 nOldSelectionStart = m_nSelectionStart;
+
+ m_nCaretPosition = getCaretPosition();
+ m_nSelectionStart = getSelectionStart();
+
Window* pWindow = GetWindow();
if ( pWindow && pWindow->HasChildPathFocus() )
{
- NotifyAccessibleEvent( AccessibleEventId::TEXT_SELECTION_CHANGED, Any(), Any() );
- UpdateCaretPosition();
+ if ( m_nCaretPosition != nOldCaretPosition )
+ {
+ Any aOldValue, aNewValue;
+ aOldValue <<= (sal_Int32) nOldCaretPosition;
+ aNewValue <<= (sal_Int32) m_nCaretPosition;
+ NotifyAccessibleEvent( AccessibleEventId::CARET_CHANGED, aOldValue, aNewValue );
+ }
+
+ // #i104470# VCL only has SELECTION_CHANGED, but UAA distinguishes between SELECTION_CHANGED and CARET_CHANGED
+ sal_Bool bHasSelection = ( m_nSelectionStart != m_nCaretPosition );
+ sal_Bool bHadSelection = ( nOldSelectionStart != nOldCaretPosition );
+ if ( ( bHasSelection != bHadSelection ) || ( bHasSelection && ( ( m_nCaretPosition != nOldCaretPosition ) || ( m_nSelectionStart != nOldSelectionStart ) ) ) )
+ {
+ NotifyAccessibleEvent( AccessibleEventId::TEXT_SELECTION_CHANGED, Any(), Any() );
+ }
+
}
}
break;
@@ -305,22 +310,13 @@ Reference< XAccessibleKeyBinding > VCLXAccessibleEdit::getAccessibleActionKeyBin
sal_Int32 VCLXAccessibleEdit::getCaretPosition( ) throw (RuntimeException)
{
- OExternalLockGuard aGuard( this );
-
- awt::Selection aSelection;
- VCLXEdit* pVCLXEdit = static_cast< VCLXEdit* >( GetVCLXWindow() );
- if ( pVCLXEdit )
- aSelection = pVCLXEdit->getSelection();
-
- return aSelection.Max;
+ return getSelectionEnd();
}
// -----------------------------------------------------------------------------
sal_Bool VCLXAccessibleEdit::setCaretPosition( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException)
{
- OExternalLockGuard aGuard( this );
-
return setSelection( nIndex, nIndex );
}