/************************************************************************* * * 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 * * for a copy of the LGPLv3 License. * ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sc.hxx" #include "AccessibleCellBase.hxx" #include "attrib.hxx" #include "scitems.hxx" #include "miscuno.hxx" #include "document.hxx" #include "docfunc.hxx" #include "cell.hxx" #include "unoguard.hxx" #include "scresid.hxx" #ifndef SC_SC_HRC #include "sc.hrc" #endif #include "unonames.hxx" #ifndef _COM_SUN_STAR_ACCESSIBILITY_XACCESSIBLEROLE_HPP_ #include #endif #ifndef _COM_SUN_STAR_ACCESSIBILITY_XACCESSIBLESTATETYPE_HPP_ #include #endif #include #include #include #include #include #include #include #include using namespace ::com::sun::star; using namespace ::com::sun::star::accessibility; //===== internal ============================================================ ScAccessibleCellBase::ScAccessibleCellBase( const uno::Reference& rxParent, ScDocument* pDoc, const ScAddress& rCellAddress, sal_Int32 nIndex) : ScAccessibleContextBase(rxParent, AccessibleRole::TABLE_CELL), maCellAddress(rCellAddress), mpDoc(pDoc), mnIndex(nIndex) { } ScAccessibleCellBase::~ScAccessibleCellBase() { } //===== XAccessibleComponent ============================================ sal_Bool SAL_CALL ScAccessibleCellBase::isVisible( ) throw (uno::RuntimeException) { ScUnoGuard aGuard; IsObjectValid(); // test whether the cell is hidden (column/row - hidden/filtered) sal_Bool bVisible(sal_True); if (mpDoc) { BYTE nColFlags = mpDoc->GetColFlags(maCellAddress.Col(), maCellAddress.Tab()); BYTE nRowFlags = mpDoc->GetRowFlags(maCellAddress.Row(), maCellAddress.Tab()); if (((nColFlags & CR_HIDDEN) == CR_HIDDEN) || ((nColFlags & CR_FILTERED) == CR_FILTERED) || ((nRowFlags & CR_HIDDEN) == CR_HIDDEN) || ((nRowFlags & CR_FILTERED) == CR_FILTERED)) bVisible = sal_False; } return bVisible; } sal_Int32 SAL_CALL ScAccessibleCellBase::getForeground() throw (uno::RuntimeException) { ScUnoGuard aGuard; IsObjectValid(); sal_Int32 nColor(0); if (mpDoc) { SfxObjectShell* pObjSh = mpDoc->GetDocumentShell(); if ( pObjSh ) { uno::Reference xSpreadDoc( pObjSh->GetModel(), uno::UNO_QUERY ); if ( xSpreadDoc.is() ) { uno::Reference xSheets = xSpreadDoc->getSheets(); uno::Reference xIndex( xSheets, uno::UNO_QUERY ); if ( xIndex.is() ) { uno::Any aTable = xIndex->getByIndex(maCellAddress.Tab()); uno::Reference xTable; if (aTable>>=xTable) { uno::Reference xCell = xTable->getCellByPosition(maCellAddress.Col(), maCellAddress.Row()); if (xCell.is()) { uno::Reference xCellProps(xCell, uno::UNO_QUERY); if (xCellProps.is()) { uno::Any aAny = xCellProps->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_CCOLOR))); aAny >>= nColor; } } } } } } } return nColor; } sal_Int32 SAL_CALL ScAccessibleCellBase::getBackground() throw (uno::RuntimeException) { ScUnoGuard aGuard; IsObjectValid(); sal_Int32 nColor(0); if (mpDoc) { SfxObjectShell* pObjSh = mpDoc->GetDocumentShell(); if ( pObjSh ) { uno::Reference xSpreadDoc( pObjSh->GetModel(), uno::UNO_QUERY ); if ( xSpreadDoc.is() ) { uno::Reference xSheets = xSpreadDoc->getSheets(); uno::Reference xIndex( xSheets, uno::UNO_QUERY ); if ( xIndex.is() ) { uno::Any aTable = xIndex->getByIndex(maCellAddress.Tab()); uno::Reference xTable; if (aTable>>=xTable) { uno::Reference xCell = xTable->getCellByPosition(maCellAddress.Col(), maCellAddress.Row()); if (xCell.is()) { uno::Reference xCellProps(xCell, uno::UNO_QUERY); if (xCellProps.is()) { uno::Any aAny = xCellProps->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_CELLBACK))); aAny >>= nColor; } } } } } } } return nColor; } //===== XInterface ===================================================== uno::Any SAL_CALL ScAccessibleCellBase::queryInterface( uno::Type const & rType ) throw (uno::RuntimeException) { uno::Any aAny (ScAccessibleCellBaseImpl::queryInterface(rType)); return aAny.hasValue() ? aAny : ScAccessibleContextBase::queryInterface(rType); } void SAL_CALL ScAccessibleCellBase::acquire() throw () { ScAccessibleContextBase::acquire(); } void SAL_CALL ScAccessibleCellBase::release() throw () { ScAccessibleContextBase::release(); } //===== XAccessibleContext ============================================== sal_Int32 ScAccessibleCellBase::getAccessibleIndexInParent(void) throw (uno::RuntimeException) { ScUnoGuard aGuard; IsObjectValid(); return mnIndex; } ::rtl::OUString SAL_CALL ScAccessibleCellBase::createAccessibleDescription(void) throw (uno::RuntimeException) { rtl::OUString sDescription = String(ScResId(STR_ACC_CELL_DESCR)); return sDescription; } ::rtl::OUString SAL_CALL ScAccessibleCellBase::createAccessibleName(void) throw (uno::RuntimeException) { String sName( ScResId(STR_ACC_CELL_NAME) ); String sAddress; // Document not needed, because only the cell address, but not the tablename is needed // always us OOO notation maCellAddress.Format( sAddress, SCA_VALID, NULL ); sName.SearchAndReplaceAscii("%1", sAddress); /* #i65103# ZoomText merges cell address and contents, e.g. if value 2 is contained in cell A1, ZT reads "cell A twelve" instead of "cell A1 - 2". Simple solution: Append a space character to the cell address. */ sName.Append( ' ' ); return rtl::OUString(sName); } //===== XAccessibleValue ================================================ uno::Any SAL_CALL ScAccessibleCellBase::getCurrentValue( ) throw (uno::RuntimeException) { ScUnoGuard aGuard; IsObjectValid(); uno::Any aAny; if (mpDoc) aAny <<= mpDoc->GetValue(maCellAddress); return aAny; } sal_Bool SAL_CALL ScAccessibleCellBase::setCurrentValue( const uno::Any& aNumber ) throw (uno::RuntimeException) { ScUnoGuard aGuard; IsObjectValid(); double fValue = 0; sal_Bool bResult(sal_False); if((aNumber >>= fValue) && mpDoc && mpDoc->GetDocumentShell()) { uno::Reference xParentStates; if (getAccessibleParent().is()) { uno::Reference xParentContext = getAccessibleParent()->getAccessibleContext(); xParentStates = xParentContext->getAccessibleStateSet(); } if (IsEditable(xParentStates)) { ScDocShell* pDocShell = (ScDocShell*) mpDoc->GetDocumentShell(); ScDocFunc aFunc(*pDocShell); bResult = aFunc.PutCell( maCellAddress, new ScValueCell(fValue), TRUE ); } } return bResult; } uno::Any SAL_CALL ScAccessibleCellBase::getMaximumValue( ) throw (uno::RuntimeException) { uno::Any aAny; aAny <<= DBL_MAX; return aAny; } uno::Any SAL_CALL ScAccessibleCellBase::getMinimumValue( ) throw (uno::RuntimeException) { uno::Any aAny; aAny <<= -DBL_MAX; return aAny; } //===== XServiceInfo ==================================================== ::rtl::OUString SAL_CALL ScAccessibleCellBase::getImplementationName(void) throw (uno::RuntimeException) { return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM ("ScAccessibleCellBase")); } //===== XTypeProvider =================================================== uno::Sequence< uno::Type > SAL_CALL ScAccessibleCellBase::getTypes() throw (uno::RuntimeException) { return comphelper::concatSequences(ScAccessibleCellBaseImpl::getTypes(), ScAccessibleContextBase::getTypes()); } uno::Sequence SAL_CALL ScAccessibleCellBase::getImplementationId(void) throw (uno::RuntimeException) { ScUnoGuard aGuard; IsObjectValid(); static uno::Sequence aId; if (aId.getLength() == 0) { aId.realloc (16); rtl_createUuid (reinterpret_cast(aId.getArray()), 0, sal_True); } return aId; } sal_Bool ScAccessibleCellBase::IsEditable( const uno::Reference& rxParentStates) { sal_Bool bEditable(sal_False); if (rxParentStates.is() && rxParentStates->contains(AccessibleStateType::EDITABLE)) bEditable = sal_True; return bEditable; }