blob: a0d311a5a90d76f3880d1837997d3bf2c51ba5ff [file] [log] [blame]
/**************************************************************
*
* 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
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_basctl.hxx"
#include <accessibledialogcontrolshape.hxx>
#include <baside3.hxx>
#include <dlgeddef.hxx>
#include <dlgedview.hxx>
#include <dlgedobj.hxx>
#include <com/sun/star/accessibility/AccessibleEventId.hpp>
#include <com/sun/star/accessibility/AccessibleRole.hpp>
#include <com/sun/star/accessibility/AccessibleStateType.hpp>
#include <unotools/accessiblestatesethelper.hxx>
#include <unotools/accessiblerelationsethelper.hxx>
#include <toolkit/awt/vclxfont.hxx>
#include <toolkit/helper/externallock.hxx>
#include <toolkit/helper/convert.hxx>
#include <toolkit/helper/vclunohelper.hxx>
#include <vcl/svapp.hxx>
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;
// -----------------------------------------------------------------------------
// class AccessibleDialogControlShape
// -----------------------------------------------------------------------------
AccessibleDialogControlShape::AccessibleDialogControlShape( DialogWindow* pDialogWindow, DlgEdObj* pDlgEdObj )
:AccessibleExtendedComponentHelper_BASE( new VCLExternalSolarLock() )
,m_pDialogWindow( pDialogWindow )
,m_pDlgEdObj( pDlgEdObj )
{
m_pExternalLock = static_cast< VCLExternalSolarLock* >( getExternalLock() );
if ( m_pDlgEdObj )
m_xControlModel = Reference< XPropertySet >( m_pDlgEdObj->GetUnoControlModel(), UNO_QUERY );
if ( m_xControlModel.is() )
m_xControlModel->addPropertyChangeListener( ::rtl::OUString(), static_cast< beans::XPropertyChangeListener* >( this ) );
m_bFocused = IsFocused();
m_bSelected = IsSelected();
m_aBounds = GetBounds();
}
// -----------------------------------------------------------------------------
AccessibleDialogControlShape::~AccessibleDialogControlShape()
{
if ( m_xControlModel.is() )
m_xControlModel->removePropertyChangeListener( ::rtl::OUString(), static_cast< beans::XPropertyChangeListener* >( this ) );
delete m_pExternalLock;
m_pExternalLock = NULL;
}
// -----------------------------------------------------------------------------
sal_Bool AccessibleDialogControlShape::IsFocused()
{
sal_Bool bFocused = sal_False;
if ( m_pDialogWindow )
{
SdrView* pSdrView = m_pDialogWindow->GetView();
if ( pSdrView && pSdrView->IsObjMarked( m_pDlgEdObj ) && pSdrView->GetMarkedObjectList().GetMarkCount() == 1 )
bFocused = sal_True;
}
return bFocused;
}
// -----------------------------------------------------------------------------
sal_Bool AccessibleDialogControlShape::IsSelected()
{
sal_Bool bSelected = sal_False;
if ( m_pDialogWindow )
{
SdrView* pSdrView = m_pDialogWindow->GetView();
if ( pSdrView )
bSelected = pSdrView->IsObjMarked( m_pDlgEdObj );
}
return bSelected;
}
// -----------------------------------------------------------------------------
void AccessibleDialogControlShape::SetFocused( sal_Bool bFocused )
{
if ( m_bFocused != bFocused )
{
Any aOldValue, aNewValue;
if ( m_bFocused )
aOldValue <<= AccessibleStateType::FOCUSED;
else
aNewValue <<= AccessibleStateType::FOCUSED;
m_bFocused = bFocused;
NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue );
}
}
// -----------------------------------------------------------------------------
void AccessibleDialogControlShape::SetSelected( sal_Bool bSelected )
{
if ( m_bSelected != bSelected )
{
Any aOldValue, aNewValue;
if ( m_bSelected )
aOldValue <<= AccessibleStateType::SELECTED;
else
aNewValue <<= AccessibleStateType::SELECTED;
m_bSelected = bSelected;
NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue );
}
}
// -----------------------------------------------------------------------------
awt::Rectangle AccessibleDialogControlShape::GetBounds()
{
awt::Rectangle aBounds( 0, 0, 0, 0 );
if ( m_pDlgEdObj )
{
// get the bounding box of the shape in logic units
Rectangle aRect = m_pDlgEdObj->GetSnapRect();
if ( m_pDialogWindow )
{
// 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) );
// clip the shape's bounding box with the bounding box of its parent
Rectangle aParentRect( Point( 0, 0 ), m_pDialogWindow->GetSizePixel() );
aRect = aRect.GetIntersection( aParentRect );
aBounds = AWTRectangle( aRect );
}
}
return aBounds;
}
// -----------------------------------------------------------------------------
void AccessibleDialogControlShape::SetBounds( const awt::Rectangle& aBounds )
{
if ( m_aBounds.X != aBounds.X || m_aBounds.Y != aBounds.Y || m_aBounds.Width != aBounds.Width || m_aBounds.Height != aBounds.Height )
{
m_aBounds = aBounds;
NotifyAccessibleEvent( AccessibleEventId::BOUNDRECT_CHANGED, Any(), Any() );
}
}
// -----------------------------------------------------------------------------
Window* AccessibleDialogControlShape::GetWindow() const
{
Window* pWindow = NULL;
if ( m_pDlgEdObj )
{
Reference< awt::XControl > xControl( m_pDlgEdObj->GetControl(), UNO_QUERY );
if ( xControl.is() )
pWindow = VCLUnoHelper::GetWindow( xControl->getPeer() );
}
return pWindow;
}
// -----------------------------------------------------------------------------
::rtl::OUString AccessibleDialogControlShape::GetModelStringProperty( const sal_Char* pPropertyName )
{
::rtl::OUString sReturn;
try
{
if ( m_xControlModel.is() )
{
::rtl::OUString sPropertyName( ::rtl::OUString::createFromAscii( pPropertyName ) );
Reference< XPropertySetInfo > xInfo = m_xControlModel->getPropertySetInfo();
if ( xInfo.is() && xInfo->hasPropertyByName( sPropertyName ) )
m_xControlModel->getPropertyValue( sPropertyName ) >>= sReturn;
}
}
catch ( const Exception& )
{
OSL_ENSURE( sal_False, "AccessibleDialogControlShape::GetModelStringProperty: caught an exception!" );
}
return sReturn;
}
// -----------------------------------------------------------------------------
void AccessibleDialogControlShape::FillAccessibleStateSet( utl::AccessibleStateSetHelper& rStateSet )
{
rStateSet.AddState( AccessibleStateType::ENABLED );
rStateSet.AddState( AccessibleStateType::VISIBLE );
rStateSet.AddState( AccessibleStateType::SHOWING );
rStateSet.AddState( AccessibleStateType::FOCUSABLE );
if ( IsFocused() )
rStateSet.AddState( AccessibleStateType::FOCUSED );
rStateSet.AddState( AccessibleStateType::SELECTABLE );
if ( IsSelected() )
rStateSet.AddState( AccessibleStateType::SELECTED );
rStateSet.AddState( AccessibleStateType::RESIZABLE );
}
// -----------------------------------------------------------------------------
// OCommonAccessibleComponent
// -----------------------------------------------------------------------------
awt::Rectangle AccessibleDialogControlShape::implGetBounds() throw (RuntimeException)
{
return GetBounds();
}
// -----------------------------------------------------------------------------
// XInterface
// -----------------------------------------------------------------------------
IMPLEMENT_FORWARD_XINTERFACE2( AccessibleDialogControlShape, AccessibleExtendedComponentHelper_BASE, AccessibleDialogControlShape_BASE )
// -----------------------------------------------------------------------------
// XTypeProvider
// -----------------------------------------------------------------------------
IMPLEMENT_FORWARD_XTYPEPROVIDER2( AccessibleDialogControlShape, AccessibleExtendedComponentHelper_BASE, AccessibleDialogControlShape_BASE )
// -----------------------------------------------------------------------------
// XComponent
// -----------------------------------------------------------------------------
void AccessibleDialogControlShape::disposing()
{
AccessibleExtendedComponentHelper_BASE::disposing();
m_pDialogWindow = NULL;
m_pDlgEdObj = NULL;
if ( m_xControlModel.is() )
m_xControlModel->removePropertyChangeListener( ::rtl::OUString(), static_cast< beans::XPropertyChangeListener* >( this ) );
m_xControlModel.clear();
}
// -----------------------------------------------------------------------------
// XEventListener
// -----------------------------------------------------------------------------
void AccessibleDialogControlShape::disposing( const lang::EventObject& ) throw (RuntimeException)
{
if ( m_xControlModel.is() )
m_xControlModel->removePropertyChangeListener( ::rtl::OUString(), static_cast< beans::XPropertyChangeListener* >( this ) );
m_xControlModel.clear();
}
// -----------------------------------------------------------------------------
// XPropertyChangeListener
// -----------------------------------------------------------------------------
void AccessibleDialogControlShape::propertyChange( const beans::PropertyChangeEvent& rEvent ) throw (RuntimeException)
{
if ( rEvent.PropertyName == DLGED_PROP_NAME )
{
NotifyAccessibleEvent( AccessibleEventId::NAME_CHANGED, rEvent.OldValue, rEvent.NewValue );
}
else if ( rEvent.PropertyName == DLGED_PROP_POSITIONX ||
rEvent.PropertyName == DLGED_PROP_POSITIONY ||
rEvent.PropertyName == DLGED_PROP_WIDTH ||
rEvent.PropertyName == DLGED_PROP_HEIGHT )
{
SetBounds( GetBounds() );
}
else if ( rEvent.PropertyName == DLGED_PROP_BACKGROUNDCOLOR ||
rEvent.PropertyName == DLGED_PROP_TEXTCOLOR ||
rEvent.PropertyName == DLGED_PROP_TEXTLINECOLOR )
{
NotifyAccessibleEvent( AccessibleEventId::VISIBLE_DATA_CHANGED, Any(), Any() );
}
}
// -----------------------------------------------------------------------------
// XServiceInfo
// -----------------------------------------------------------------------------
::rtl::OUString AccessibleDialogControlShape::getImplementationName() throw (RuntimeException)
{
return ::rtl::OUString::createFromAscii( "com.sun.star.comp.basctl.AccessibleShape" );
}
// -----------------------------------------------------------------------------
sal_Bool AccessibleDialogControlShape::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 > AccessibleDialogControlShape::getSupportedServiceNames() throw (RuntimeException)
{
Sequence< ::rtl::OUString > aNames(1);
aNames[0] = ::rtl::OUString::createFromAscii( "com.sun.star.drawing.AccessibleShape" );
return aNames;
}
// -----------------------------------------------------------------------------
// XAccessible
// -----------------------------------------------------------------------------
Reference< XAccessibleContext > AccessibleDialogControlShape::getAccessibleContext( ) throw (RuntimeException)
{
OExternalLockGuard aGuard( this );
return this;
}
// -----------------------------------------------------------------------------
// XAccessibleContext
// -----------------------------------------------------------------------------
sal_Int32 AccessibleDialogControlShape::getAccessibleChildCount() throw (RuntimeException)
{
OExternalLockGuard aGuard( this );
return 0;
}
// -----------------------------------------------------------------------------
Reference< XAccessible > AccessibleDialogControlShape::getAccessibleChild( sal_Int32 i ) throw (IndexOutOfBoundsException, RuntimeException)
{
OExternalLockGuard aGuard( this );
if ( i < 0 || i >= getAccessibleChildCount() )
throw IndexOutOfBoundsException();
return Reference< XAccessible >();
}
// -----------------------------------------------------------------------------
Reference< XAccessible > AccessibleDialogControlShape::getAccessibleParent( ) throw (RuntimeException)
{
OExternalLockGuard aGuard( this );
Reference< XAccessible > xParent;
if ( m_pDialogWindow )
xParent = m_pDialogWindow->GetAccessible();
return xParent;
}
// -----------------------------------------------------------------------------
sal_Int32 AccessibleDialogControlShape::getAccessibleIndexInParent( ) throw (RuntimeException)
{
OExternalLockGuard aGuard( this );
sal_Int32 nIndexInParent = -1;
Reference< XAccessible > xParent( getAccessibleParent() );
if ( xParent.is() )
{
Reference< XAccessibleContext > xParentContext( xParent->getAccessibleContext() );
if ( xParentContext.is() )
{
for ( sal_Int32 i = 0, nCount = xParentContext->getAccessibleChildCount(); i < nCount; ++i )
{
Reference< XAccessible > xChild( xParentContext->getAccessibleChild( i ) );
if ( xChild.is() )
{
Reference< XAccessibleContext > xChildContext = xChild->getAccessibleContext();
if ( xChildContext == (XAccessibleContext*)this )
{
nIndexInParent = i;
break;
}
}
}
}
}
return nIndexInParent;
}
// -----------------------------------------------------------------------------
sal_Int16 AccessibleDialogControlShape::getAccessibleRole( ) throw (RuntimeException)
{
OExternalLockGuard aGuard( this );
return AccessibleRole::SHAPE;
}
// -----------------------------------------------------------------------------
::rtl::OUString AccessibleDialogControlShape::getAccessibleDescription( ) throw (RuntimeException)
{
OExternalLockGuard aGuard( this );
return GetModelStringProperty( "HelpText" );
}
// -----------------------------------------------------------------------------
::rtl::OUString AccessibleDialogControlShape::getAccessibleName( ) throw (RuntimeException)
{
OExternalLockGuard aGuard( this );
return GetModelStringProperty( "Name" );
}
// -----------------------------------------------------------------------------
Reference< XAccessibleRelationSet > AccessibleDialogControlShape::getAccessibleRelationSet( ) throw (RuntimeException)
{
OExternalLockGuard aGuard( this );
utl::AccessibleRelationSetHelper* pRelationSetHelper = new utl::AccessibleRelationSetHelper;
Reference< XAccessibleRelationSet > xSet = pRelationSetHelper;
return xSet;
}
// -----------------------------------------------------------------------------
Reference< XAccessibleStateSet > AccessibleDialogControlShape::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 AccessibleDialogControlShape::getLocale( ) throw (IllegalAccessibleComponentStateException, RuntimeException)
{
OExternalLockGuard aGuard( this );
return Application::GetSettings().GetLocale();
}
// -----------------------------------------------------------------------------
// XAccessibleComponent
// -----------------------------------------------------------------------------
Reference< XAccessible > AccessibleDialogControlShape::getAccessibleAtPoint( const awt::Point& ) throw (RuntimeException)
{
OExternalLockGuard aGuard( this );
return Reference< XAccessible >();
}
// -----------------------------------------------------------------------------
void AccessibleDialogControlShape::grabFocus( ) throw (RuntimeException)
{
// no focus for shapes
}
// -----------------------------------------------------------------------------
sal_Int32 AccessibleDialogControlShape::getForeground( ) throw (RuntimeException)
{
OExternalLockGuard aGuard( this );
sal_Int32 nColor = 0;
Window* pWindow = GetWindow();
if ( pWindow )
{
if ( pWindow->IsControlForeground() )
nColor = pWindow->GetControlForeground().GetColor();
else
{
Font aFont;
if ( pWindow->IsControlFont() )
aFont = pWindow->GetControlFont();
else
aFont = pWindow->GetFont();
nColor = aFont.GetColor().GetColor();
}
}
return nColor;
}
// -----------------------------------------------------------------------------
sal_Int32 AccessibleDialogControlShape::getBackground( ) throw (RuntimeException)
{
OExternalLockGuard aGuard( this );
sal_Int32 nColor = 0;
Window* pWindow = GetWindow();
if ( pWindow )
{
if ( pWindow->IsControlBackground() )
nColor = pWindow->GetControlBackground().GetColor();
else
nColor = pWindow->GetBackground().GetColor().GetColor();
}
return nColor;
}
// -----------------------------------------------------------------------------
// XAccessibleExtendedComponent
// -----------------------------------------------------------------------------
Reference< awt::XFont > AccessibleDialogControlShape::getFont( ) throw (RuntimeException)
{
OExternalLockGuard aGuard( this );
Reference< awt::XFont > xFont;
Window* pWindow = GetWindow();
if ( pWindow )
{
Reference< awt::XDevice > xDev( pWindow->GetComponentInterface(), UNO_QUERY );
if ( xDev.is() )
{
Font aFont;
if ( pWindow->IsControlFont() )
aFont = pWindow->GetControlFont();
else
aFont = pWindow->GetFont();
VCLXFont* pVCLXFont = new VCLXFont;
pVCLXFont->Init( *xDev.get(), aFont );
xFont = pVCLXFont;
}
}
return xFont;
}
// -----------------------------------------------------------------------------
::rtl::OUString AccessibleDialogControlShape::getTitledBorderText( ) throw (RuntimeException)
{
OExternalLockGuard aGuard( this );
return ::rtl::OUString();
}
// -----------------------------------------------------------------------------
::rtl::OUString AccessibleDialogControlShape::getToolTipText( ) throw (RuntimeException)
{
OExternalLockGuard aGuard( this );
::rtl::OUString sText;
Window* pWindow = GetWindow();
if ( pWindow )
sText = pWindow->GetQuickHelpText();
return sText;
}
// -----------------------------------------------------------------------------