2007-06-27 14:38:04 +00:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
2008-04-11 07:11:39 +00:00
|
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
2007-06-27 14:38:04 +00:00
|
|
|
*
|
2008-04-11 07:11:39 +00:00
|
|
|
* Copyright 2008 by Sun Microsystems, Inc.
|
2007-06-27 14:38:04 +00:00
|
|
|
*
|
2008-04-11 07:11:39 +00:00
|
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
2007-06-27 14:38:04 +00:00
|
|
|
*
|
2008-04-11 07:11:39 +00:00
|
|
|
* $RCSfile: vclxaccessibleedit.cxx,v $
|
2008-07-22 06:35:42 +00:00
|
|
|
* $Revision: 1.4 $
|
2007-06-27 14:38:04 +00:00
|
|
|
*
|
2008-04-11 07:11:39 +00:00
|
|
|
* This file is part of OpenOffice.org.
|
2007-06-27 14:38:04 +00:00
|
|
|
*
|
2008-04-11 07:11:39 +00:00
|
|
|
* 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.
|
2007-06-27 14:38:04 +00:00
|
|
|
*
|
2008-04-11 07:11:39 +00:00
|
|
|
* 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).
|
2007-06-27 14:38:04 +00:00
|
|
|
*
|
2008-04-11 07:11:39 +00:00
|
|
|
* 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.
|
2007-06-27 14:38:04 +00:00
|
|
|
*
|
|
|
|
************************************************************************/
|
|
|
|
|
|
|
|
// MARKER(update_precomp.py): autogen include statement, do not remove
|
|
|
|
#include "precompiled_accessibility.hxx"
|
|
|
|
|
|
|
|
// includes --------------------------------------------------------------
|
|
|
|
#include <accessibility/standard/vclxaccessibleedit.hxx>
|
|
|
|
|
|
|
|
#include <toolkit/awt/vclxwindows.hxx>
|
|
|
|
#include <toolkit/helper/convert.hxx>
|
|
|
|
#include <accessibility/helper/accresmgr.hxx>
|
|
|
|
#include <accessibility/helper/accessiblestrings.hrc>
|
|
|
|
|
|
|
|
#include <unotools/accessiblestatesethelper.hxx>
|
|
|
|
#include <unotools/accessiblerelationsethelper.hxx>
|
|
|
|
#include <com/sun/star/accessibility/AccessibleStateType.hpp>
|
|
|
|
#include <com/sun/star/accessibility/AccessibleEventId.hpp>
|
|
|
|
#include <com/sun/star/accessibility/AccessibleRole.hpp>
|
|
|
|
#include <com/sun/star/datatransfer/clipboard/XClipboard.hpp>
|
|
|
|
#include <cppuhelper/typeprovider.hxx>
|
|
|
|
#include <comphelper/sequence.hxx>
|
|
|
|
#include <vcl/svapp.hxx>
|
|
|
|
#include <vcl/window.hxx>
|
|
|
|
#include <vcl/edit.hxx>
|
|
|
|
#include <sot/exchange.hxx>
|
|
|
|
#include <sot/formats.hxx>
|
|
|
|
|
|
|
|
#include <algorithm>
|
|
|
|
|
|
|
|
using namespace ::com::sun::star;
|
|
|
|
using namespace ::com::sun::star::uno;
|
|
|
|
using namespace ::com::sun::star::lang;
|
|
|
|
using namespace ::com::sun::star::beans;
|
|
|
|
using namespace ::com::sun::star::accessibility;
|
|
|
|
using namespace ::comphelper;
|
|
|
|
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
// VCLXAccessibleEdit
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
VCLXAccessibleEdit::VCLXAccessibleEdit( VCLXWindow* pVCLWindow )
|
|
|
|
:VCLXAccessibleTextComponent( pVCLWindow )
|
|
|
|
{
|
|
|
|
m_nCaretPosition = getCaretPosition();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
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() )
|
|
|
|
{
|
|
|
|
case VCLEVENT_EDIT_MODIFY:
|
|
|
|
{
|
|
|
|
SetText( implGetText() );
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case VCLEVENT_EDIT_SELECTIONCHANGED:
|
|
|
|
{
|
|
|
|
Window* pWindow = GetWindow();
|
|
|
|
if ( pWindow && pWindow->HasChildPathFocus() )
|
|
|
|
{
|
|
|
|
NotifyAccessibleEvent( AccessibleEventId::TEXT_SELECTION_CHANGED, Any(), Any() );
|
|
|
|
UpdateCaretPosition();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
VCLXAccessibleTextComponent::ProcessWindowEvent( rVclWindowEvent );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
void VCLXAccessibleEdit::FillAccessibleStateSet( utl::AccessibleStateSetHelper& rStateSet )
|
|
|
|
{
|
|
|
|
VCLXAccessibleTextComponent::FillAccessibleStateSet( rStateSet );
|
|
|
|
|
|
|
|
VCLXEdit* pVCLXEdit = static_cast< VCLXEdit* >( GetVCLXWindow() );
|
|
|
|
if ( pVCLXEdit )
|
|
|
|
{
|
|
|
|
rStateSet.AddState( AccessibleStateType::FOCUSABLE );
|
|
|
|
rStateSet.AddState( AccessibleStateType::SINGLE_LINE );
|
|
|
|
if ( pVCLXEdit->isEditable() )
|
|
|
|
rStateSet.AddState( AccessibleStateType::EDITABLE );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
// OCommonAccessibleText
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
::rtl::OUString VCLXAccessibleEdit::implGetText()
|
|
|
|
{
|
|
|
|
::rtl::OUString aText;
|
|
|
|
|
|
|
|
Edit* pEdit = static_cast< Edit* >( GetWindow() );
|
|
|
|
if ( pEdit )
|
|
|
|
{
|
|
|
|
aText = OutputDevice::GetNonMnemonicString( pEdit->GetText() );
|
|
|
|
|
|
|
|
if ( getAccessibleRole() == AccessibleRole::PASSWORD_TEXT )
|
|
|
|
{
|
|
|
|
xub_Unicode cEchoChar = pEdit->GetEchoChar();
|
|
|
|
if ( !cEchoChar )
|
|
|
|
cEchoChar = '*';
|
|
|
|
XubString sTmp;
|
|
|
|
aText = sTmp.Fill( (USHORT)aText.getLength(), cEchoChar );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return aText;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
void VCLXAccessibleEdit::implGetSelection( sal_Int32& nStartIndex, sal_Int32& nEndIndex )
|
|
|
|
{
|
|
|
|
awt::Selection aSelection;
|
|
|
|
VCLXEdit* pVCLXEdit = static_cast< VCLXEdit* >( GetVCLXWindow() );
|
|
|
|
if ( pVCLXEdit )
|
|
|
|
aSelection = pVCLXEdit->getSelection();
|
|
|
|
|
|
|
|
nStartIndex = aSelection.Min;
|
|
|
|
nEndIndex = aSelection.Max;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
// XInterface
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
IMPLEMENT_FORWARD_XINTERFACE2( VCLXAccessibleEdit, VCLXAccessibleTextComponent, VCLXAccessibleEdit_BASE )
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
// XTypeProvider
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
IMPLEMENT_FORWARD_XTYPEPROVIDER2( VCLXAccessibleEdit, VCLXAccessibleTextComponent, VCLXAccessibleEdit_BASE )
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
// XServiceInfo
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
::rtl::OUString VCLXAccessibleEdit::getImplementationName() throw (RuntimeException)
|
|
|
|
{
|
|
|
|
return ::rtl::OUString::createFromAscii( "com.sun.star.comp.toolkit.AccessibleEdit" );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
Sequence< ::rtl::OUString > VCLXAccessibleEdit::getSupportedServiceNames() throw (RuntimeException)
|
|
|
|
{
|
|
|
|
Sequence< ::rtl::OUString > aNames(1);
|
|
|
|
aNames[0] = ::rtl::OUString::createFromAscii( "com.sun.star.awt.AccessibleEdit" );
|
|
|
|
return aNames;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
// XAccessibleContext
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
sal_Int32 VCLXAccessibleEdit::getAccessibleChildCount() throw (RuntimeException)
|
|
|
|
{
|
|
|
|
OExternalLockGuard aGuard( this );
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
Reference< XAccessible > VCLXAccessibleEdit::getAccessibleChild( sal_Int32 i ) throw (IndexOutOfBoundsException, RuntimeException)
|
|
|
|
{
|
|
|
|
OExternalLockGuard aGuard( this );
|
|
|
|
|
|
|
|
if ( i < 0 || i >= getAccessibleChildCount() )
|
|
|
|
throw IndexOutOfBoundsException();
|
|
|
|
|
|
|
|
return Reference< XAccessible >();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
sal_Int16 VCLXAccessibleEdit::getAccessibleRole( ) throw (RuntimeException)
|
|
|
|
{
|
|
|
|
OExternalLockGuard aGuard( this );
|
|
|
|
|
|
|
|
sal_Int16 nRole;
|
|
|
|
Edit* pEdit = static_cast< Edit* >( GetWindow() );
|
|
|
|
if ( pEdit && ( ( pEdit->GetStyle() & WB_PASSWORD ) || pEdit->GetEchoChar() ) )
|
|
|
|
nRole = AccessibleRole::PASSWORD_TEXT;
|
|
|
|
else
|
|
|
|
nRole = AccessibleRole::TEXT;
|
|
|
|
|
|
|
|
return nRole;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
// XAccessibleAction
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
sal_Int32 VCLXAccessibleEdit::getAccessibleActionCount( ) throw (RuntimeException)
|
|
|
|
{
|
|
|
|
OExternalLockGuard aGuard( this );
|
|
|
|
|
2008-07-22 06:35:42 +00:00
|
|
|
// There is one action: activate
|
|
|
|
return 1;
|
2007-06-27 14:38:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
sal_Bool VCLXAccessibleEdit::doAccessibleAction ( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException)
|
|
|
|
{
|
|
|
|
OExternalLockGuard aGuard( this );
|
|
|
|
|
|
|
|
if ( nIndex < 0 || nIndex >= getAccessibleActionCount() )
|
|
|
|
throw IndexOutOfBoundsException();
|
|
|
|
|
2008-07-22 06:35:42 +00:00
|
|
|
sal_Bool bDoAction = sal_False;
|
|
|
|
Window* pWindow = GetWindow();
|
|
|
|
if ( pWindow )
|
|
|
|
{
|
|
|
|
pWindow->GrabFocus();
|
|
|
|
bDoAction = sal_True;
|
|
|
|
}
|
|
|
|
|
|
|
|
return bDoAction;
|
2007-06-27 14:38:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
::rtl::OUString VCLXAccessibleEdit::getAccessibleActionDescription ( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException)
|
|
|
|
{
|
|
|
|
OExternalLockGuard aGuard( this );
|
|
|
|
|
|
|
|
if ( nIndex < 0 || nIndex >= getAccessibleActionCount() )
|
|
|
|
throw IndexOutOfBoundsException();
|
|
|
|
|
2008-07-22 06:35:42 +00:00
|
|
|
static const ::rtl::OUString sAction( RTL_CONSTASCII_USTRINGPARAM( "activate" ) );
|
|
|
|
return sAction;
|
2007-06-27 14:38:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
Reference< XAccessibleKeyBinding > VCLXAccessibleEdit::getAccessibleActionKeyBinding( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException)
|
|
|
|
{
|
|
|
|
OExternalLockGuard aGuard( this );
|
|
|
|
|
|
|
|
if ( nIndex < 0 || nIndex >= getAccessibleActionCount() )
|
|
|
|
throw IndexOutOfBoundsException();
|
|
|
|
|
|
|
|
return Reference< XAccessibleKeyBinding >();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
// XAccessibleText
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
sal_Bool VCLXAccessibleEdit::setCaretPosition( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException)
|
|
|
|
{
|
|
|
|
OExternalLockGuard aGuard( this );
|
|
|
|
|
|
|
|
return setSelection( nIndex, nIndex );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
sal_Unicode VCLXAccessibleEdit::getCharacter( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException)
|
|
|
|
{
|
|
|
|
OExternalLockGuard aGuard( this );
|
|
|
|
|
|
|
|
return VCLXAccessibleTextComponent::getCharacter( nIndex );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
Sequence< PropertyValue > VCLXAccessibleEdit::getCharacterAttributes( sal_Int32 nIndex, const Sequence< ::rtl::OUString >& aRequestedAttributes ) throw (IndexOutOfBoundsException, RuntimeException)
|
|
|
|
{
|
|
|
|
OExternalLockGuard aGuard( this );
|
|
|
|
|
|
|
|
return VCLXAccessibleTextComponent::getCharacterAttributes( nIndex, aRequestedAttributes );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
awt::Rectangle VCLXAccessibleEdit::getCharacterBounds( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException)
|
|
|
|
{
|
|
|
|
OExternalLockGuard aGuard( this );
|
|
|
|
|
|
|
|
awt::Rectangle aBounds( 0, 0, 0, 0 );
|
|
|
|
sal_Int32 nLength = implGetText().getLength();
|
|
|
|
|
|
|
|
if ( !implIsValidRange( nIndex, nIndex, nLength ) )
|
|
|
|
throw IndexOutOfBoundsException();
|
|
|
|
|
|
|
|
Control* pControl = static_cast< Control* >( GetWindow() );
|
|
|
|
if ( pControl )
|
|
|
|
{
|
|
|
|
if ( nIndex == nLength )
|
|
|
|
{
|
|
|
|
// #108914# calculate virtual bounding rectangle
|
|
|
|
for ( sal_Int32 i = 0; i < nLength; ++i )
|
|
|
|
{
|
|
|
|
Rectangle aRect = pControl->GetCharacterBounds( i );
|
|
|
|
sal_Int32 nHeight = aRect.GetHeight();
|
|
|
|
if ( aBounds.Height < nHeight )
|
|
|
|
{
|
|
|
|
aBounds.Y = aRect.Top();
|
|
|
|
aBounds.Height = nHeight;
|
|
|
|
}
|
|
|
|
if ( i == nLength - 1 )
|
|
|
|
{
|
|
|
|
aBounds.X = aRect.Right() + 1;
|
|
|
|
aBounds.Width = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
aBounds = AWTRectangle( pControl->GetCharacterBounds( nIndex ) );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return aBounds;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
sal_Int32 VCLXAccessibleEdit::getCharacterCount( ) throw (RuntimeException)
|
|
|
|
{
|
|
|
|
OExternalLockGuard aGuard( this );
|
|
|
|
|
|
|
|
return VCLXAccessibleTextComponent::getCharacterCount();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
sal_Int32 VCLXAccessibleEdit::getIndexAtPoint( const awt::Point& aPoint ) throw (RuntimeException)
|
|
|
|
{
|
|
|
|
OExternalLockGuard aGuard( this );
|
|
|
|
|
|
|
|
return VCLXAccessibleTextComponent::getIndexAtPoint( aPoint );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
::rtl::OUString VCLXAccessibleEdit::getSelectedText( ) throw (RuntimeException)
|
|
|
|
{
|
|
|
|
OExternalLockGuard aGuard( this );
|
|
|
|
|
|
|
|
return VCLXAccessibleTextComponent::getSelectedText();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
sal_Int32 VCLXAccessibleEdit::getSelectionStart( ) throw (RuntimeException)
|
|
|
|
{
|
|
|
|
OExternalLockGuard aGuard( this );
|
|
|
|
|
|
|
|
return VCLXAccessibleTextComponent::getSelectionStart();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
sal_Int32 VCLXAccessibleEdit::getSelectionEnd( ) throw (RuntimeException)
|
|
|
|
{
|
|
|
|
OExternalLockGuard aGuard( this );
|
|
|
|
|
|
|
|
return VCLXAccessibleTextComponent::getSelectionEnd();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
sal_Bool VCLXAccessibleEdit::setSelection( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) throw (IndexOutOfBoundsException, RuntimeException)
|
|
|
|
{
|
|
|
|
OExternalLockGuard aGuard( this );
|
|
|
|
|
|
|
|
sal_Bool bReturn = sal_False;
|
|
|
|
::rtl::OUString sText( implGetText() );
|
|
|
|
|
|
|
|
if ( !implIsValidRange( nStartIndex, nEndIndex, sText.getLength() ) )
|
|
|
|
throw IndexOutOfBoundsException();
|
|
|
|
|
|
|
|
VCLXEdit* pVCLXEdit = static_cast< VCLXEdit* >( GetVCLXWindow() );
|
|
|
|
Edit* pEdit = static_cast< Edit* >( GetWindow() );
|
|
|
|
if ( pVCLXEdit && pEdit && pEdit->IsEnabled() )
|
|
|
|
{
|
|
|
|
pVCLXEdit->setSelection( awt::Selection( nStartIndex, nEndIndex ) );
|
|
|
|
bReturn = sal_True;
|
|
|
|
}
|
|
|
|
|
|
|
|
return bReturn;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
::rtl::OUString VCLXAccessibleEdit::getText( ) throw (RuntimeException)
|
|
|
|
{
|
|
|
|
OExternalLockGuard aGuard( this );
|
|
|
|
|
|
|
|
return VCLXAccessibleTextComponent::getText();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
::rtl::OUString VCLXAccessibleEdit::getTextRange( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) throw (IndexOutOfBoundsException, RuntimeException)
|
|
|
|
{
|
|
|
|
OExternalLockGuard aGuard( this );
|
|
|
|
|
|
|
|
return VCLXAccessibleTextComponent::getTextRange( nStartIndex, nEndIndex );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
::com::sun::star::accessibility::TextSegment VCLXAccessibleEdit::getTextAtIndex( sal_Int32 nIndex, sal_Int16 aTextType ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException)
|
|
|
|
{
|
|
|
|
OExternalLockGuard aGuard( this );
|
|
|
|
|
|
|
|
return VCLXAccessibleTextComponent::getTextAtIndex( nIndex, aTextType );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
::com::sun::star::accessibility::TextSegment VCLXAccessibleEdit::getTextBeforeIndex( sal_Int32 nIndex, sal_Int16 aTextType ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException)
|
|
|
|
{
|
|
|
|
OExternalLockGuard aGuard( this );
|
|
|
|
|
|
|
|
return VCLXAccessibleTextComponent::getTextBeforeIndex( nIndex, aTextType );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
::com::sun::star::accessibility::TextSegment VCLXAccessibleEdit::getTextBehindIndex( sal_Int32 nIndex, sal_Int16 aTextType ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException)
|
|
|
|
{
|
|
|
|
OExternalLockGuard aGuard( this );
|
|
|
|
|
|
|
|
return VCLXAccessibleTextComponent::getTextBehindIndex( nIndex, aTextType );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
sal_Bool VCLXAccessibleEdit::copyText( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) throw (IndexOutOfBoundsException, RuntimeException)
|
|
|
|
{
|
|
|
|
OExternalLockGuard aGuard( this );
|
|
|
|
|
|
|
|
return VCLXAccessibleTextComponent::copyText( nStartIndex, nEndIndex );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
// XAccessibleEditableText
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
sal_Bool VCLXAccessibleEdit::cutText( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) throw (IndexOutOfBoundsException, RuntimeException)
|
|
|
|
{
|
|
|
|
OExternalLockGuard aGuard( this );
|
|
|
|
|
|
|
|
return copyText( nStartIndex, nEndIndex ) && deleteText( nStartIndex, nEndIndex );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
sal_Bool VCLXAccessibleEdit::pasteText( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException)
|
|
|
|
{
|
|
|
|
OExternalLockGuard aGuard( this );
|
|
|
|
|
|
|
|
sal_Bool bReturn = sal_False;
|
|
|
|
|
|
|
|
if ( GetWindow() )
|
|
|
|
{
|
|
|
|
Reference< datatransfer::clipboard::XClipboard > xClipboard = GetWindow()->GetClipboard();
|
|
|
|
if ( xClipboard.is() )
|
|
|
|
{
|
|
|
|
const sal_uInt32 nRef = Application::ReleaseSolarMutex();
|
|
|
|
Reference< datatransfer::XTransferable > xDataObj = xClipboard->getContents();
|
|
|
|
Application::AcquireSolarMutex( nRef );
|
|
|
|
if ( xDataObj.is() )
|
|
|
|
{
|
|
|
|
datatransfer::DataFlavor aFlavor;
|
|
|
|
SotExchange::GetFormatDataFlavor( SOT_FORMAT_STRING, aFlavor );
|
|
|
|
if ( xDataObj->isDataFlavorSupported( aFlavor ) )
|
|
|
|
{
|
|
|
|
Any aData = xDataObj->getTransferData( aFlavor );
|
|
|
|
::rtl::OUString sText;
|
|
|
|
aData >>= sText;
|
|
|
|
bReturn = replaceText( nIndex, nIndex, sText );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return bReturn;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
sal_Bool VCLXAccessibleEdit::deleteText( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) throw (IndexOutOfBoundsException, RuntimeException)
|
|
|
|
{
|
|
|
|
OExternalLockGuard aGuard( this );
|
|
|
|
|
|
|
|
return replaceText( nStartIndex, nEndIndex, ::rtl::OUString() );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
sal_Bool VCLXAccessibleEdit::insertText( const ::rtl::OUString& sText, sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException)
|
|
|
|
{
|
|
|
|
OExternalLockGuard aGuard( this );
|
|
|
|
|
|
|
|
return replaceText( nIndex, nIndex, sText );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
sal_Bool VCLXAccessibleEdit::replaceText( sal_Int32 nStartIndex, sal_Int32 nEndIndex, const ::rtl::OUString& sReplacement ) throw (IndexOutOfBoundsException, RuntimeException)
|
|
|
|
{
|
|
|
|
OExternalLockGuard aGuard( this );
|
|
|
|
|
|
|
|
sal_Bool bReturn = sal_False;
|
|
|
|
::rtl::OUString sText( implGetText() );
|
|
|
|
|
|
|
|
if ( !implIsValidRange( nStartIndex, nEndIndex, sText.getLength() ) )
|
|
|
|
throw IndexOutOfBoundsException();
|
|
|
|
|
|
|
|
sal_Int32 nMinIndex = ::std::min( nStartIndex, nEndIndex );
|
|
|
|
sal_Int32 nMaxIndex = ::std::max( nStartIndex, nEndIndex );
|
|
|
|
|
|
|
|
VCLXEdit* pVCLXEdit = static_cast< VCLXEdit* >( GetVCLXWindow() );
|
|
|
|
if ( pVCLXEdit && pVCLXEdit->isEditable() )
|
|
|
|
{
|
|
|
|
pVCLXEdit->setText( sText.replaceAt( nMinIndex, nMaxIndex - nMinIndex, sReplacement ) );
|
|
|
|
sal_Int32 nIndex = nMinIndex + sReplacement.getLength();
|
|
|
|
setSelection( nIndex, nIndex );
|
|
|
|
bReturn = sal_True;
|
|
|
|
}
|
|
|
|
|
|
|
|
return bReturn;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
sal_Bool VCLXAccessibleEdit::setAttributes( sal_Int32 nStartIndex, sal_Int32 nEndIndex, const Sequence<PropertyValue>& ) throw (IndexOutOfBoundsException, RuntimeException)
|
|
|
|
{
|
|
|
|
OExternalLockGuard aGuard( this );
|
|
|
|
|
|
|
|
if ( !implIsValidRange( nStartIndex, nEndIndex, implGetText().getLength() ) )
|
|
|
|
throw IndexOutOfBoundsException();
|
|
|
|
|
|
|
|
return sal_False; // attributes cannot be set for an edit
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
sal_Bool VCLXAccessibleEdit::setText( const ::rtl::OUString& sText ) throw (RuntimeException)
|
|
|
|
{
|
|
|
|
OExternalLockGuard aGuard( this );
|
|
|
|
|
|
|
|
sal_Bool bSuccess = sal_False;
|
|
|
|
try
|
|
|
|
{
|
|
|
|
bSuccess = replaceText( 0, implGetText().getLength(), sText );
|
|
|
|
}
|
|
|
|
catch( const IndexOutOfBoundsException& )
|
|
|
|
{
|
|
|
|
OSL_ENSURE( sal_False, "VCLXAccessibleText::setText: caught an exception!" );
|
|
|
|
}
|
|
|
|
return bSuccess;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|