blob: 88818bf6fbb49346daf9dc8e41f16d734d0cc2da [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_svx.hxx"
#ifndef _COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLEROLE_HPP_
#include <com/sun/star/accessibility/AccessibleRole.hpp>
#endif
#ifndef _COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLEEVENTID_HPP_
#include <com/sun/star/accessibility/AccessibleEventId.hpp>
#endif
#ifndef _UTL_ACCESSIBLESTATESETHELPER_HXX_
#include <unotools/accessiblestatesethelper.hxx>
#endif
#ifndef _COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLESTATETYPE_HPP_
#include <com/sun/star/accessibility/AccessibleStateType.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_PROPERTYCHANGEEVENT_HPP_
#include <com/sun/star/beans/PropertyChangeEvent.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XWINDOW_HPP_
#include <com/sun/star/awt/XWindow.hpp>
#endif
#ifndef _CPPUHELPER_TYPEPROVIDER_HXX_
#include <cppuhelper/typeprovider.hxx>
#endif
#ifndef _TOOLKIT_HELPER_VCLUNOHELPER_HXX_
#include <toolkit/helper/vclunohelper.hxx>
#endif
#ifndef _TOOLKIT_HELPER_CONVERT_HXX_
#include <toolkit/helper/convert.hxx>
#endif
#ifndef _SV_SVAPP_HXX
#include <vcl/svapp.hxx>
#endif
#ifndef _OSL_MUTEX_HXX_
#include <osl/mutex.hxx>
#endif
#ifndef _RTL_UUID_H_
#include <rtl/uuid.h>
#endif
#ifndef _TOOLS_DEBUG_HXX
#include <tools/debug.hxx>
#endif
#ifndef _SV_GEN_HXX
#include <tools/gen.hxx>
#endif
#include <svx/dialogs.hrc>
#include "accessibility.hrc"
#include <svx/dlgctrl.hxx>
#ifndef _SVX_DIALMGR_HXX
#include <svx/dialmgr.hxx>
#endif
#ifndef COMPHELPER_ACCESSIBLE_EVENT_NOTIFIER
#include <comphelper/accessibleeventnotifier.hxx>
#endif
#include <unotools/accessiblerelationsethelper.hxx>
#ifndef _SVXPIXELACCESSIBLECONTEXT_HXX
#include "svxpixelctlaccessiblecontext.hxx"
#endif
#ifndef _COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLERELATIONTYPE_HPP_
#include <com/sun/star/accessibility/AccessibleRelationType.hpp>
#endif
using namespace ::cppu;
using namespace ::osl;
using namespace ::rtl;
using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::accessibility;
SvxPixelCtlAccessible::SvxPixelCtlAccessible( SvxPixelCtl& rControl) :
SvxPixelCtlAccessible_BASE(m_aMutex),
pPixelCtl(&rControl),
mnClientId(0)
{
//FreeResource();
}
SvxPixelCtlAccessible::~SvxPixelCtlAccessible()
{
// DBG_DTOR( SvxPixelCtlAccessible, NULL );
if( IsAlive() )
{
osl_incrementInterlockedCount( &m_refCount );
dispose(); // set mpRepr = NULL & release all childs
}
}
/*-- 04.02.2002 14:11:55---------------------------------------------------
-----------------------------------------------------------------------*/
uno::Reference< XAccessibleContext > SvxPixelCtlAccessible::getAccessibleContext( )
throw (uno::RuntimeException)
{
return this;
}
sal_Int32 SvxPixelCtlAccessible::getAccessibleChildCount( ) throw (uno::RuntimeException)
{
::osl::MutexGuard aGuard( m_aMutex );
IsValid();
if(pPixelCtl)
{
return pPixelCtl->GetSquares();
}
else
return 0;
}
/*-- 04.02.2002 14:11:56---------------------------------------------------
-----------------------------------------------------------------------*/
uno::Reference< XAccessible > SvxPixelCtlAccessible::getAccessibleChild( sal_Int32 i )
throw (uno::RuntimeException)
{
::osl::MutexGuard aGuard( m_aMutex );
IsValid();
if ( i < 0 || i >= getAccessibleChildCount())
throw lang::IndexOutOfBoundsException();
uno::Reference <XAccessible> xAcc;
if(pPixelCtl)
{
return CreateChild(i, pPixelCtl->IndexToPoint(i));
}
else
return xAcc;
/*
throw lang::IndexOutOfBoundsException (
::rtl::OUString::createFromAscii ("no child with index " + i),
NULL);
*/
}
uno::Reference< XAccessible > SvxPixelCtlAccessible::getAccessibleParent( )
throw (uno::RuntimeException)
{
::osl::MutexGuard aGuard( m_aMutex );
IsValid();
uno::Reference< XAccessible > xRet;
if(pPixelCtl)
xRet = pPixelCtl->GetParent()->GetAccessible( sal_True );
return xRet;
}
sal_Int32 SvxPixelCtlAccessible::getAccessibleIndexInParent( )
throw (uno::RuntimeException)
{
::osl::MutexGuard aGuard( m_aMutex );
IsValid();
sal_uInt16 nIdx = 0;
if(pPixelCtl)
{
Window* pTabPage = pPixelCtl->GetParent();
sal_uInt16 nChildren = pTabPage->GetChildCount();
for(nIdx = 0; nIdx < nChildren; nIdx++)
if(pTabPage->GetChild( nIdx ) == pPixelCtl)
break;
}
return nIdx;
}
/*-- 04.02.2002 14:11:57---------------------------------------------------
-----------------------------------------------------------------------*/
sal_Int16 SvxPixelCtlAccessible::getAccessibleRole( ) throw (uno::RuntimeException)
{
return AccessibleRole::LIST;
}
::rtl::OUString SvxPixelCtlAccessible::getAccessibleDescription( )
throw (uno::RuntimeException)
{
::osl::MutexGuard aGuard( m_aMutex );
IsValid();
if(pPixelCtl)
return pPixelCtl->GetAccessibleDescription();
else
return String();
}
::rtl::OUString SvxPixelCtlAccessible::getAccessibleName( )
throw (uno::RuntimeException)
{
::osl::MutexGuard aGuard( m_aMutex );
IsValid();
if(pPixelCtl)
return pPixelCtl->GetAccessibleName();
else
return String();
}
uno::Reference< XAccessibleRelationSet > SvxPixelCtlAccessible::getAccessibleRelationSet( )
throw (uno::RuntimeException)
{
::osl::MutexGuard aGuard( m_aMutex );
IsValid();
Window* pWindow = (Window*)pPixelCtl;
utl::AccessibleRelationSetHelper* rRelationSet = new utl::AccessibleRelationSetHelper;
uno::Reference< accessibility::XAccessibleRelationSet > rSet = rRelationSet;
if ( pWindow )
{
Window *pLabeledBy = pWindow->GetAccessibleRelationLabeledBy();
if ( pLabeledBy && pLabeledBy != pWindow )
{
uno::Sequence< uno::Reference< uno::XInterface > > aSequence(1);
aSequence[0] = pLabeledBy->GetAccessible();
rRelationSet->AddRelation( accessibility::AccessibleRelation( accessibility::AccessibleRelationType::LABELED_BY, aSequence ) );
}
Window* pMemberOf = pWindow->GetAccessibleRelationMemberOf();
if ( pMemberOf && pMemberOf != pWindow )
{
uno::Sequence< uno::Reference< uno::XInterface > > aSequence(1);
aSequence[0] = pMemberOf->GetAccessible();
rRelationSet->AddRelation( accessibility::AccessibleRelation( accessibility::AccessibleRelationType::MEMBER_OF, aSequence ) );
}
return rSet;
}
return new utl::AccessibleRelationSetHelper;
}
uno::Reference< XAccessibleStateSet > SvxPixelCtlAccessible::getAccessibleStateSet( )
throw (uno::RuntimeException)
{
::osl::MutexGuard aGuard( m_aMutex );
utl::AccessibleStateSetHelper* pStateSetHelper = new utl::AccessibleStateSetHelper;
uno::Reference< XAccessibleStateSet > xRet = pStateSetHelper;
if(!pPixelCtl)
pStateSetHelper->AddState(AccessibleStateType::DEFUNC);
else
{
const sal_Int16 aStandardStates[] =
{
AccessibleStateType::FOCUSABLE,
AccessibleStateType::SELECTABLE,
AccessibleStateType::SHOWING,
AccessibleStateType::VISIBLE,
AccessibleStateType::OPAQUE,
0};
sal_Int16 nState = 0;
while(aStandardStates[nState])
{
pStateSetHelper->AddState(aStandardStates[nState++]);
}
if(pPixelCtl->IsEnabled())
pStateSetHelper->AddState(AccessibleStateType::ENABLED);
if(pPixelCtl->HasFocus())
pStateSetHelper->AddState(AccessibleStateType::FOCUSED);
pStateSetHelper->AddState(AccessibleStateType::MANAGES_DESCENDANTS);
}
return xRet;
}
com::sun::star::lang::Locale SvxPixelCtlAccessible::getLocale( )
throw (IllegalAccessibleComponentStateException, uno::RuntimeException)
{
::osl::MutexGuard aGuard( m_aMutex );
if( getAccessibleParent().is() )
{
uno::Reference< XAccessibleContext > xParentContext( getAccessibleParent()->getAccessibleContext() );
if( xParentContext.is() )
return xParentContext->getLocale();
}
// No locale and no parent. Therefore throw exception to indicate this
// cluelessness.
throw IllegalAccessibleComponentStateException();
}
sal_Bool SvxPixelCtlAccessible::containsPoint( const awt::Point& aPt )
throw (uno::RuntimeException)
{
::osl::MutexGuard aGuard( m_aMutex );
IsValid();
Point aPoint(aPt.X, aPt.Y);
if(pPixelCtl)
return (aPoint.X() >= 0)
&& (aPoint.X() < pPixelCtl->GetSizePixel().getWidth())
&& (aPoint.Y() >= 0)
&& (aPoint.Y() < pPixelCtl->GetSizePixel().getHeight());
else
return sal_False;
}
uno::Reference<XAccessible > SAL_CALL SvxPixelCtlAccessible::getAccessibleAtPoint (
const awt::Point& aPoint)
throw (uno::RuntimeException)
{
::osl::MutexGuard aGuard( m_aMutex );
ensureIsAlive();
uno::Reference <XAccessible> xAcc;
Point childPoint;
childPoint.X() = aPoint.X;
childPoint.Y() = aPoint.Y;
if(pPixelCtl)
{
Point pt= pPixelCtl->PixelToLogic(childPoint);
long nIndex = pPixelCtl->PointToIndex(pt);
return CreateChild(nIndex,pPixelCtl->IndexToPoint(nIndex));
}
else
return xAcc;
}
awt::Rectangle SvxPixelCtlAccessible::getBounds( ) throw (uno::RuntimeException)
{
::osl::MutexGuard aGuard( m_aMutex );
IsValid();
Size aSz;
Point aPos(0,0);
awt::Rectangle aRet;
if(pPixelCtl)
{
aSz = pPixelCtl->GetSizePixel();
aPos = pPixelCtl->GetPosPixel();
aRet.X = aPos.X();
aRet.Y = aPos.Y();
aRet.Width = aSz.Width();
aRet.Height = aSz.Height();
}
return aRet;
}
awt::Point SvxPixelCtlAccessible::getLocation( ) throw (uno::RuntimeException)
{
::osl::MutexGuard aGuard( m_aMutex );
IsValid();
Point aPos;
aPos = pPixelCtl->GetPosPixel();
awt::Point aRet(aPos.X(), aPos.Y());
return aRet;
}
awt::Point SvxPixelCtlAccessible::getLocationOnScreen( ) throw (uno::RuntimeException)
{
::osl::MutexGuard aGuard( m_aMutex );
IsValid();
Rectangle rect;
rect = pPixelCtl->GetWindowExtentsRelative(NULL);
awt::Point aRet(rect.Left(),rect.Top() );
return aRet;
}
awt::Size SvxPixelCtlAccessible::getSize( ) throw (uno::RuntimeException)
{
::osl::MutexGuard aGuard( m_aMutex );
IsValid();
Size aSz;
aSz = pPixelCtl->GetSizePixel();
awt::Size aRet(aSz.Width(),aSz.Height());
return aRet;
}
void SvxPixelCtlAccessible::grabFocus( ) throw (uno::RuntimeException)
{
::osl::MutexGuard aGuard( m_aMutex );
IsValid();
if(pPixelCtl)
pPixelCtl->GrabFocus();
}
sal_Int32 SvxPixelCtlAccessible::getForeground( )
throw (::com::sun::star::uno::RuntimeException)
{
uno::Any aRet;
::osl::MutexGuard aGuard( m_aMutex );
IsValid();
return pPixelCtl->GetControlForeground().GetColor();
}
sal_Int32 SvxPixelCtlAccessible::getBackground( )
throw (::com::sun::star::uno::RuntimeException)
{
uno::Any aRet;
::osl::MutexGuard aGuard( m_aMutex );
IsValid();
return pPixelCtl->GetControlBackground().GetColor();
}
::rtl::OUString SvxPixelCtlAccessible::getImplementationName( ) throw (uno::RuntimeException)
{
return rtl::OUString::createFromAscii("SvxPixelCtlAccessible");
}
/*-- 04.02.2002 14:12:05---------------------------------------------------
-----------------------------------------------------------------------*/
const sal_Char sAccessible[] = "Accessible";
const sal_Char sAccessibleContext[] = "AccessibleContext";
const sal_Char sAccessibleComponent[] = "AccessibleComponent";
//const sal_Char sAccessibleTable[] = "AccessibleTable";
sal_Bool SvxPixelCtlAccessible::supportsService( const ::rtl::OUString& rServiceName )
throw (uno::RuntimeException)
{
return rServiceName.equalsAsciiL( sAccessible , sizeof(sAccessible )-1 ) ||
rServiceName.equalsAsciiL( sAccessibleContext , sizeof(sAccessibleContext )-1 ) ||
rServiceName.equalsAsciiL( sAccessibleComponent, sizeof(sAccessibleComponent)-1 );// ||
// rServiceName.equalsAsciiL( sAccessibleTable, sizeof(sAccessibleTable)-1 );
}
/*-- 04.02.2002 14:12:05---------------------------------------------------
-----------------------------------------------------------------------*/
uno::Sequence< ::rtl::OUString > SvxPixelCtlAccessible::getSupportedServiceNames( )
throw (uno::RuntimeException)
{
uno::Sequence< OUString > aRet(2);
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) );
// pArray[3] = OUString( RTL_CONSTASCII_USTRINGPARAM(sAccessibleTable) );
return aRet;
}
// -----------------------------------------------------------------------------
// XAccessibleSelection
// -----------------------------------------------------------------------------
void SAL_CALL SvxPixelCtlAccessible::selectAccessibleChild( sal_Int32 nChildIndex ) throw (lang::IndexOutOfBoundsException, RuntimeException)
{
::osl::MutexGuard aGuard( m_aMutex );
IsValid();
if ( nChildIndex < 0 || nChildIndex >= getAccessibleChildCount())
throw lang::IndexOutOfBoundsException();
long nIndex = pPixelCtl->ShowPosition(pPixelCtl->IndexToPoint(nChildIndex));
NotifyChild(nIndex,sal_True,sal_False);
}
// -----------------------------------------------------------------------------
sal_Bool SAL_CALL SvxPixelCtlAccessible::isAccessibleChildSelected( sal_Int32 nChildIndex ) throw (lang::IndexOutOfBoundsException, RuntimeException)
{
::osl::MutexGuard aGuard( m_aMutex );
IsValid();
return pPixelCtl->GetFoucsPosIndex() == nChildIndex;
}
// -----------------------------------------------------------------------------
void SAL_CALL SvxPixelCtlAccessible::clearAccessibleSelection( ) throw (RuntimeException)
{
::osl::MutexGuard aGuard( m_aMutex );
IsValid();
}
// -----------------------------------------------------------------------------
void SAL_CALL SvxPixelCtlAccessible::selectAllAccessibleChildren( ) throw (RuntimeException)
{
::osl::MutexGuard aGuard( m_aMutex );
IsValid();
}
// -----------------------------------------------------------------------------
sal_Int32 SAL_CALL SvxPixelCtlAccessible::getSelectedAccessibleChildCount( ) throw (RuntimeException)
{
::osl::MutexGuard aGuard( m_aMutex );
IsValid();
return 1;
}
// -----------------------------------------------------------------------------
uno::Reference< XAccessible > SAL_CALL SvxPixelCtlAccessible::getSelectedAccessibleChild( sal_Int32 nSelectedChildIndex ) throw (lang::IndexOutOfBoundsException, RuntimeException)
{
::osl::MutexGuard aGuard( m_aMutex );
IsValid();
if ( nSelectedChildIndex >= 1)
throw lang::IndexOutOfBoundsException();
uno::Reference< XAccessible > xChild;
if(pPixelCtl)
{
if(m_xCurChild.is())
{
xChild = m_xCurChild;
}
}
return xChild;
}
// -----------------------------------------------------------------------------
void SAL_CALL SvxPixelCtlAccessible::deselectAccessibleChild( sal_Int32 ) throw (lang::IndexOutOfBoundsException, RuntimeException)
{
::osl::MutexGuard aGuard( m_aMutex );
IsValid();
}
// Added by lq
void SvxPixelCtlAccessible::ensureIsAlive() const
throw ( lang::DisposedException )
{
if( !IsAlive() )
throw lang::DisposedException();
}
void SvxPixelCtlAccessible::ensureIsValidRow( sal_Int32 nRow )
throw ( lang::IndexOutOfBoundsException )
{
if( nRow >= pPixelCtl->GetHeight() || nRow <0)
throw lang::IndexOutOfBoundsException(
OUString( RTL_CONSTASCII_USTRINGPARAM( "row index is invalid" ) ), *this );
}
void SvxPixelCtlAccessible::ensureIsValidColumn( sal_Int32 nColumn )
throw ( lang::IndexOutOfBoundsException )
{
if( nColumn >= pPixelCtl->GetWidth() || nColumn <0 )
throw lang::IndexOutOfBoundsException(
OUString( RTL_CONSTASCII_USTRINGPARAM("column index is invalid") ), *this );
}
void SvxPixelCtlAccessible::ensureIsValidAddress(
sal_Int32 nRow, sal_Int32 nColumn )
throw ( lang::IndexOutOfBoundsException )
{
ensureIsValidRow( nRow );
ensureIsValidColumn( nColumn );
}
void SvxPixelCtlAccessible::ensureIsValidIndex( sal_Int32 nChildIndex )
throw ( lang::IndexOutOfBoundsException )
{
if( nChildIndex >= pPixelCtl->GetSquares())
throw lang::IndexOutOfBoundsException(
OUString( RTL_CONSTASCII_USTRINGPARAM("child index is invalid") ), *this );
}
// XAccessibleTable -----------------------------------------------------------
/*
sal_Int32 SAL_CALL SvxPixelCtlAccessible::getAccessibleRowCount()
throw ( uno::RuntimeException )
{
::osl::MutexGuard aGuard( m_aMutex );
ensureIsAlive();
return pPixelCtl->GetLineCount();
}
sal_Int32 SAL_CALL SvxPixelCtlAccessible::getAccessibleColumnCount()
throw ( uno::RuntimeException )
{
::osl::MutexGuard aGuard( m_aMutex );
ensureIsAlive();
return pPixelCtl->GetLineCount();
}
sal_Int32 SAL_CALL SvxPixelCtlAccessible::getAccessibleRowExtentAt(
sal_Int32 nRow, sal_Int32 nColumn )
throw ( lang::IndexOutOfBoundsException, uno::RuntimeException )
{
::osl::MutexGuard aGuard( m_aMutex );
ensureIsAlive();
return 1; // merged cells not supported
}
sal_Int32 SAL_CALL SvxPixelCtlAccessible::getAccessibleColumnExtentAt(
sal_Int32 nRow, sal_Int32 nColumn )
throw ( lang::IndexOutOfBoundsException, uno::RuntimeException )
{
::osl::MutexGuard aGuard( m_aMutex );
ensureIsAlive();
return 1; // merged cells not supported
}
uno::Reference< XAccessible > SAL_CALL SvxPixelCtlAccessible::getAccessibleCaption()
throw ( uno::RuntimeException )
{
uno::Reference< XAccessible > xAccessble;
ensureIsAlive();
return xAccessble; // not supported
}
uno::Reference< XAccessible > SAL_CALL SvxPixelCtlAccessible::getAccessibleSummary()
throw ( uno::RuntimeException )
{
uno::Reference< XAccessible > xAccessble;
ensureIsAlive();
return xAccessble; // not supported
}
sal_Int32 SAL_CALL SvxPixelCtlAccessible::getAccessibleIndex(
sal_Int32 nRow, sal_Int32 nColumn )
throw ( lang::IndexOutOfBoundsException, uno::RuntimeException )
{
::osl::MutexGuard aGuard( m_aMutex );
ensureIsAlive();
ensureIsValidAddress(nRow,nColumn);
return nRow + nColumn * pPixelCtl->GetLineCount() ;
}
sal_Int32 SAL_CALL SvxPixelCtlAccessible::getAccessibleRow( sal_Int32 nChildIndex )
throw ( lang::IndexOutOfBoundsException, uno::RuntimeException )
{
::osl::MutexGuard aGuard( m_aMutex );
ensureIsAlive();
ensureIsValidIndex( nChildIndex );
return nChildIndex/pPixelCtl->GetLineCount();
}
sal_Int32 SAL_CALL SvxPixelCtlAccessible::getAccessibleColumn( sal_Int32 nChildIndex )
throw ( lang::IndexOutOfBoundsException, uno::RuntimeException )
{
::osl::MutexGuard aGuard( m_aMutex );
ensureIsAlive();
ensureIsValidIndex( nChildIndex );
return nChildIndex%pPixelCtl->GetLineCount();
}
::rtl::OUString SAL_CALL SvxPixelCtlAccessible::getAccessibleRowDescription( sal_Int32 nRow )
throw ( lang::IndexOutOfBoundsException, uno::RuntimeException )
{
::osl::MutexGuard aGuard( m_aMutex );
ensureIsAlive();
ensureIsValidRow( nRow );
return ::rtl::OUString::createFromAscii ("");
}
::rtl::OUString SAL_CALL SvxPixelCtlAccessible::getAccessibleColumnDescription( sal_Int32 nColumn )
throw ( lang::IndexOutOfBoundsException, uno::RuntimeException )
{
::osl::MutexGuard aGuard( m_aMutex );
ensureIsAlive();
ensureIsValidColumn( nColumn );
return ::rtl::OUString::createFromAscii ("");
}
uno::Reference< XAccessibleTable > SAL_CALL SvxPixelCtlAccessible::getAccessibleRowHeaders()
throw ( uno::RuntimeException )
{
::osl::MutexGuard aGuard( m_aMutex );
uno::Reference< XAccessibleTable > xAccessble;
ensureIsAlive();
return xAccessble;
}
uno::Reference< XAccessibleTable > SAL_CALL SvxPixelCtlAccessible::getAccessibleColumnHeaders()
throw ( uno::RuntimeException )
{
::osl::MutexGuard aGuard( m_aMutex );
uno::Reference< XAccessibleTable > xAccessble;
ensureIsAlive();
return xAccessble;
}
Sequence< sal_Int32 > SAL_CALL SvxPixelCtlAccessible::getSelectedAccessibleRows()
throw ( uno::RuntimeException )
{
::osl::MutexGuard aGuard( m_aMutex );
Sequence< sal_Int32 > accRows;
ensureIsAlive();
return accRows;
}
Sequence< sal_Int32 > SAL_CALL SvxPixelCtlAccessible::getSelectedAccessibleColumns()
throw ( uno::RuntimeException )
{
::osl::MutexGuard aGuard( m_aMutex );
Sequence< sal_Int32 > accColumns;
ensureIsAlive();
return accColumns;
}
sal_Bool SAL_CALL SvxPixelCtlAccessible::isAccessibleRowSelected( sal_Int32 nRow )
throw ( lang::IndexOutOfBoundsException, uno::RuntimeException )
{
::osl::MutexGuard aGuard( m_aMutex );
ensureIsAlive();
ensureIsValidRow( nRow );
return sal_False;
}
sal_Bool SAL_CALL SvxPixelCtlAccessible::isAccessibleColumnSelected( sal_Int32 nColumn )
throw ( lang::IndexOutOfBoundsException, uno::RuntimeException )
{
::osl::MutexGuard aGuard( m_aMutex );
ensureIsAlive();
ensureIsValidColumn( nColumn );
return sal_False;
}
uno::Reference< XAccessible > SAL_CALL SvxPixelCtlAccessible::getAccessibleCellAt(
sal_Int32 nRow, sal_Int32 nColumn )
throw ( lang::IndexOutOfBoundsException, uno::RuntimeException )
{
::osl::MutexGuard aGuard( m_aMutex );
ensureIsAlive();
ensureIsValidAddress( nRow, nColumn );
return getAccessibleChild(nRow*pPixelCtl->GetLineCount()+nColumn);
}
sal_Bool SAL_CALL SvxPixelCtlAccessible::isAccessibleSelected(
sal_Int32 nRow, sal_Int32 nColumn )
throw ( lang::IndexOutOfBoundsException, uno::RuntimeException )
{
::osl::MutexGuard aGuard( m_aMutex );
ensureIsAlive();
ensureIsValidAddress( nRow, nColumn );
return isAccessibleChildSelected(nRow*pPixelCtl->GetLineCount()+nColumn);
}
// Added by lq end
*/
//XAccessibleEventBroadcaster
void SAL_CALL SvxPixelCtlAccessible::addEventListener( const uno::Reference< XAccessibleEventListener >& xListener ) throw( RuntimeException )
{
if (xListener.is())
{
::osl::MutexGuard aGuard( m_aMutex );
if (!mnClientId)
mnClientId = comphelper::AccessibleEventNotifier::registerClient( );
comphelper::AccessibleEventNotifier::addEventListener( mnClientId, xListener );
}
}
void SAL_CALL SvxPixelCtlAccessible::removeEventListener( const uno::Reference< XAccessibleEventListener >& xListener )
throw( RuntimeException )
{
if (xListener.is())
{
::osl::MutexGuard aGuard( m_aMutex );
sal_Int32 nListenerCount = comphelper::AccessibleEventNotifier::removeEventListener( mnClientId, xListener );
if ( !nListenerCount )
{
comphelper::AccessibleEventNotifier::revokeClient( mnClientId );
mnClientId = 0;
}
}
}
void SvxPixelCtlAccessible::CommitChange( const AccessibleEventObject& rEvent )
{
if (mnClientId)
comphelper::AccessibleEventNotifier::addEvent( mnClientId, rEvent );
}
//Solution:Add the event handling method
void SvxPixelCtlAccessible::FireAccessibleEvent (short nEventId, const ::com::sun::star::uno::Any& rOld, const ::com::sun::star::uno::Any& rNew)
{
const uno::Reference< XInterface > xSource( *this );
CommitChange( AccessibleEventObject( xSource, nEventId, rNew,rOld ) );
}
void SAL_CALL SvxPixelCtlAccessible::disposing()
{
if( !rBHelper.bDisposed )
{
{
::osl::MutexGuard aGuard( m_aMutex );
if ( mnClientId )
{
comphelper::AccessibleEventNotifier::revokeClientNotifyDisposing( mnClientId, *this );
mnClientId = 0;
}
}
//mxParent = uno::Reference< XAccessible >();
}
}
void SvxPixelCtlAccessible::Invalidate()
{
pPixelCtl = 0;
}
void SvxPixelCtlAccessible::ThrowExceptionIfNotAlive( void ) throw( lang::DisposedException )
{
if( IsNotAlive() )
throw lang::DisposedException();
}
void SvxPixelCtlAccessible::IsValid() throw (uno::RuntimeException)
{
if(!pPixelCtl)
throw uno::RuntimeException();
}
void SvxPixelCtlAccessible::NotifyChild(long nIndex,sal_Bool bSelect ,sal_Bool bCheck)
{
DBG_ASSERT( !(!bSelect && !bCheck),"" );//non is false
SvxPixelCtlAccessibleChild *pChild= NULL;
if (m_xCurChild.is())
{
pChild= static_cast<SvxPixelCtlAccessibleChild*>(m_xCurChild.get());
DBG_ASSERT(pChild,"Child Must be Valid");
if (pChild->getAccessibleIndexInParent() == nIndex )
{
if (bSelect)
{
pChild->SelectChild(sal_True);
}
if (bCheck)
{
pChild->ChangePixelColorOrBG(sal_Bool(pPixelCtl->GetBitmapPixel(sal_uInt16(nIndex))));
pChild->CheckChild();
}
return ;
}
}
uno::Reference <XAccessible> xNewChild =CreateChild(nIndex, pPixelCtl->IndexToPoint(nIndex));
SvxPixelCtlAccessibleChild *pNewChild= static_cast<SvxPixelCtlAccessibleChild*>(xNewChild.get());
DBG_ASSERT(pNewChild,"Child Must be Valid");
Any aNewValue,aOldValue;
aNewValue<<= xNewChild;
FireAccessibleEvent( AccessibleEventId::ACTIVE_DESCENDANT_CHANGED,
aOldValue,
aNewValue );
if (bSelect)
{
if (pChild)
{
pChild->SelectChild(sal_False);
}
pNewChild->SelectChild(sal_True);
}
if (bCheck)
{
pNewChild->CheckChild();
}
m_xCurChild= xNewChild;
}
uno::Reference<XAccessible> SvxPixelCtlAccessible::CreateChild (long nIndex,Point mPoint)
{
long nX = mPoint.X();
long nY = mPoint.Y();
if( Application::GetSettings().GetLayoutRTL())
{
nX = (sal_uInt16) pPixelCtl->GetWidth() - 1 - nX;
}
sal_Bool bPixelColorOrBG= sal_Bool(pPixelCtl->GetBitmapPixel(sal_uInt16(nIndex)));
Size size(pPixelCtl->GetWidth() / pPixelCtl->GetLineCount(),pPixelCtl->GetHeight() / pPixelCtl->GetLineCount());
uno::Reference<XAccessible> xChild;
xChild = new SvxPixelCtlAccessibleChild(pPixelCtl,
bPixelColorOrBG,
Point(nX,nY),
Rectangle(mPoint,size),
this,
nIndex);
return xChild;
}
void SvxPixelCtlAccessible::LoseFocus()
{
m_xCurChild = uno::Reference< XAccessible >() ;
}
void SvxPixelCtlAccessibleChild::CheckChild()
{
Any aChecked;
aChecked <<= AccessibleStateType::CHECKED;
if (m_bPixelColorOrBG)//Current Child State
{
FireAccessibleEvent( AccessibleEventId::STATE_CHANGED,
Any(),
aChecked);
}
else
{
FireAccessibleEvent( AccessibleEventId::STATE_CHANGED,
aChecked,
Any() );
}
}
void SvxPixelCtlAccessibleChild::SelectChild( sal_Bool bSelect)
{
Any aSelected;
aSelected <<= AccessibleStateType::SELECTED;
if (bSelect)
{
FireAccessibleEvent( AccessibleEventId::STATE_CHANGED,
Any(),
aSelected);
}
else
{
FireAccessibleEvent( AccessibleEventId::STATE_CHANGED,
aSelected,
Any());
}
}
void SvxPixelCtlAccessibleChild::FireAccessibleEvent (
short nEventId,
const ::com::sun::star::uno::Any& rOld,
const ::com::sun::star::uno::Any& rNew)
{
const uno::Reference< XInterface > xSource( *this );
CommitChange( AccessibleEventObject( xSource, nEventId, rNew,rOld ) );
}
DBG_NAME( SvxPixelCtlAccessibleChild )
SvxPixelCtlAccessibleChild::SvxPixelCtlAccessibleChild(
SvxPixelCtl* rWindow,
sal_Bool bPixelColorOrBG,
const Point &aPoint,
const Rectangle& rBoundingBox,
const uno::Reference<XAccessible>& rxParent,
long nIndexInParent ) :
SvxPixelCtlAccessibleChild_BASE( m_aMutex ),
mrParentWindow( rWindow ),
mxParent(rxParent),
m_bPixelColorOrBG(bPixelColorOrBG),
maPoint(aPoint),
mpBoundingBox( new Rectangle( rBoundingBox ) ),
mnIndexInParent( nIndexInParent ),
mnClientId( 0 )
{
DBG_CTOR( SvxPixelCtlAccessibleChild, NULL );
}
SvxPixelCtlAccessibleChild::~SvxPixelCtlAccessibleChild()
{
DBG_DTOR( SvxPixelCtlAccessibleChild, NULL );
if( IsAlive() )
{
osl_incrementInterlockedCount( &m_refCount );
dispose(); // set mpRepr = NULL & release all childs
}
}
//===== XAccessible =========================================================
uno::Reference< XAccessibleContext> SAL_CALL SvxPixelCtlAccessibleChild::getAccessibleContext( void ) throw( RuntimeException )
{
return this;
}
//===== XAccessibleComponent ================================================
sal_Bool SAL_CALL SvxPixelCtlAccessibleChild::containsPoint( const awt::Point& rPoint ) throw( RuntimeException )
{
// no guard -> done in getBounds()
// return GetBoundingBox().IsInside( VCLPoint( rPoint ) );
return Rectangle( Point( 0, 0 ), GetBoundingBox().GetSize() ).IsInside( VCLPoint( rPoint ) );
}
uno::Reference< XAccessible > SAL_CALL SvxPixelCtlAccessibleChild::getAccessibleAtPoint( const awt::Point& ) throw( RuntimeException )
{
return uno::Reference< XAccessible >();
}
awt::Rectangle SAL_CALL SvxPixelCtlAccessibleChild::getBounds() throw( RuntimeException )
{
// no guard -> done in getBoundingBox()
//Modified by lq, 09/26
//return AWTRectangle( GetBoundingBox() );
awt::Rectangle rect = AWTRectangle( GetBoundingBox() );
rect.X = rect.X + mrParentWindow->GetClientWindowExtentsRelative(NULL).Left()-mrParentWindow->GetWindowExtentsRelative(NULL).Left();
rect.Y = rect.Y + mrParentWindow->GetClientWindowExtentsRelative(NULL).Top()-mrParentWindow->GetWindowExtentsRelative(NULL).Top();
return rect;
// End
}
awt::Point SAL_CALL SvxPixelCtlAccessibleChild::getLocation() throw( RuntimeException )
{
// no guard -> done in getBoundingBox()
return AWTPoint( GetBoundingBox().TopLeft() );
}
awt::Point SAL_CALL SvxPixelCtlAccessibleChild::getLocationOnScreen() throw( RuntimeException )
{
// no guard -> done in getBoundingBoxOnScreen()
return AWTPoint( GetBoundingBoxOnScreen().TopLeft() );
}
awt::Size SAL_CALL SvxPixelCtlAccessibleChild::getSize() throw( RuntimeException )
{
// no guard -> done in getBoundingBox()
return AWTSize( GetBoundingBox().GetSize() );
}
void SAL_CALL SvxPixelCtlAccessibleChild::grabFocus() throw( RuntimeException )
{
}
sal_Int32 SvxPixelCtlAccessibleChild::getForeground( )
throw (::com::sun::star::uno::RuntimeException)
{
//::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::MutexGuard aGuard( m_aMutex );
ThrowExceptionIfNotAlive();
return mrParentWindow->GetControlForeground().GetColor();
}
sal_Int32 SvxPixelCtlAccessibleChild::getBackground( )
throw (::com::sun::star::uno::RuntimeException)
{
//::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::MutexGuard aGuard( m_aMutex );
ThrowExceptionIfNotAlive();
return mrParentWindow->GetControlBackground().GetColor();
}
//===== XAccessibleContext ==================================================
sal_Int32 SAL_CALL SvxPixelCtlAccessibleChild::getAccessibleChildCount( void ) throw( RuntimeException )
{
return 0;
}
uno::Reference< XAccessible > SAL_CALL SvxPixelCtlAccessibleChild::getAccessibleChild( sal_Int32 ) throw ( RuntimeException )
{
throw lang::IndexOutOfBoundsException();
}
uno::Reference< XAccessible > SAL_CALL SvxPixelCtlAccessibleChild::getAccessibleParent( void ) throw( RuntimeException )
{
return mxParent;
}
sal_Int32 SAL_CALL SvxPixelCtlAccessibleChild::getAccessibleIndexInParent( void ) throw( RuntimeException )
{
return mnIndexInParent;
}
sal_Int16 SAL_CALL SvxPixelCtlAccessibleChild::getAccessibleRole( void ) throw( RuntimeException )
{
return AccessibleRole::CHECK_BOX;
}
OUString SAL_CALL SvxPixelCtlAccessibleChild::getAccessibleDescription( void ) throw( RuntimeException )
{
::osl::MutexGuard aGuard( m_aMutex );
return GetName();
}
OUString SAL_CALL SvxPixelCtlAccessibleChild::getAccessibleName( void ) throw( RuntimeException )
{
::osl::MutexGuard aGuard( m_aMutex );
return GetName();
}
/** Return empty uno::Reference to indicate that the relation set is not
supported.
*/
uno::Reference<XAccessibleRelationSet> SAL_CALL SvxPixelCtlAccessibleChild::getAccessibleRelationSet( void ) throw( RuntimeException )
{
return uno::Reference< XAccessibleRelationSet >();
}
uno::Reference< XAccessibleStateSet > SAL_CALL SvxPixelCtlAccessibleChild::getAccessibleStateSet( void ) throw( RuntimeException )
{
::osl::MutexGuard aGuard( m_aMutex );
utl::AccessibleStateSetHelper* pStateSetHelper = new utl::AccessibleStateSetHelper;
if( IsAlive() )
{
pStateSetHelper->AddState( AccessibleStateType::TRANSIENT );
pStateSetHelper->AddState( AccessibleStateType::ENABLED );
pStateSetHelper->AddState( AccessibleStateType::OPAQUE );
pStateSetHelper->AddState( AccessibleStateType::SELECTABLE );
pStateSetHelper->AddState( AccessibleStateType::SHOWING );
pStateSetHelper->AddState( AccessibleStateType::VISIBLE );
if (mrParentWindow )
{
long nIndex = mrParentWindow->GetFoucsPosIndex();
if ( nIndex == mnIndexInParent)
{
pStateSetHelper->AddState( AccessibleStateType::SELECTED );
}
if (mrParentWindow->GetBitmapPixel(sal_uInt16(mnIndexInParent)))
{
pStateSetHelper->AddState( AccessibleStateType::CHECKED );
}
}
}
else
pStateSetHelper->AddState( AccessibleStateType::DEFUNC );
return pStateSetHelper;
}
lang::Locale SAL_CALL SvxPixelCtlAccessibleChild::getLocale( void ) throw( IllegalAccessibleComponentStateException, RuntimeException )
{
::osl::MutexGuard aGuard( m_aMutex );
if( mxParent.is() )
{
uno::Reference< XAccessibleContext > xParentContext( mxParent->getAccessibleContext() );
if( xParentContext.is() )
return xParentContext->getLocale();
}
// No locale and no parent. Therefore throw exception to indicate this
// cluelessness.
throw IllegalAccessibleComponentStateException();
}
void SAL_CALL SvxPixelCtlAccessibleChild::addEventListener( const uno::Reference< XAccessibleEventListener >& xListener )
throw( RuntimeException )
{
if (xListener.is())
{
::osl::MutexGuard aGuard( m_aMutex );
if (!mnClientId)
mnClientId = comphelper::AccessibleEventNotifier::registerClient( );
comphelper::AccessibleEventNotifier::addEventListener( mnClientId, xListener );
}
}
void SAL_CALL SvxPixelCtlAccessibleChild::removeEventListener( const uno::Reference< XAccessibleEventListener >& xListener )
throw( RuntimeException )
{
if (xListener.is())
{
::osl::MutexGuard aGuard( m_aMutex );
sal_Int32 nListenerCount = comphelper::AccessibleEventNotifier::removeEventListener( mnClientId, xListener );
if ( !nListenerCount )
{
// 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::revokeClient( mnClientId );
mnClientId = 0;
}
}
}
//===== XServiceInfo ========================================================
OUString SAL_CALL SvxPixelCtlAccessibleChild::getImplementationName( void ) throw( RuntimeException )
{
return OUString( RTL_CONSTASCII_USTRINGPARAM( "SvxPixelCtlAccessibleChild" ) );
}
sal_Bool SAL_CALL SvxPixelCtlAccessibleChild::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 > SAL_CALL SvxPixelCtlAccessibleChild::getSupportedServiceNames( void ) throw( RuntimeException )
{
uno::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;
}
//===== internal ============================================================
void SvxPixelCtlAccessibleChild::CommitChange( const AccessibleEventObject& rEvent )
{
if (mnClientId)
comphelper::AccessibleEventNotifier::addEvent( mnClientId, rEvent );
}
void SAL_CALL SvxPixelCtlAccessibleChild::disposing()
{
if( !rBHelper.bDisposed )
{
::osl::MutexGuard aGuard( m_aMutex );
// Send a disposing to all listeners.
if ( mnClientId )
{
comphelper::AccessibleEventNotifier::revokeClientNotifyDisposing( mnClientId, *this );
mnClientId = 0;
}
mxParent = uno::Reference< XAccessible >();
delete mpBoundingBox;
}
}
void SvxPixelCtlAccessibleChild::ThrowExceptionIfNotAlive( void ) throw( lang::DisposedException )
{
if( IsNotAlive() )
throw lang::DisposedException();
}
Rectangle SvxPixelCtlAccessibleChild::GetBoundingBoxOnScreen( void ) throw( RuntimeException )
{
::osl::MutexGuard aGuard( m_aMutex );
// no ThrowExceptionIfNotAlive() because its done in GetBoundingBox()
Rectangle aRect( GetBoundingBox() );
return Rectangle( mrParentWindow->OutputToAbsoluteScreenPixel( aRect.TopLeft() ), aRect.GetSize() );
}
Rectangle SvxPixelCtlAccessibleChild::GetBoundingBox( void ) throw( RuntimeException )
{
// no guard neccessary, because no one changes mpBoundingBox after creating it
ThrowExceptionIfNotAlive();
return *mpBoundingBox;
}
::rtl::OUString SvxPixelCtlAccessibleChild::GetName()
{
sal_Int32 nXIndex = mnIndexInParent % mrParentWindow->GetLineCount();
sal_Int32 nYIndex = mnIndexInParent / mrParentWindow->GetLineCount();
OUString str;
str += OUString::createFromAscii("(");
str += OUString::valueOf(nXIndex);
str += OUString::createFromAscii(",");
str += OUString::valueOf(nYIndex);
// str += OUString::createFromAscii(",");
// str += OUString::valueOf(m_bPixelColorOrBG);
str += OUString::createFromAscii(")");
return str;
}