diff options
Diffstat (limited to 'sc/source/ui/Accessibility/AccessibleSpreadsheet.cxx')
-rw-r--r-- | sc/source/ui/Accessibility/AccessibleSpreadsheet.cxx | 974 |
1 files changed, 0 insertions, 974 deletions
diff --git a/sc/source/ui/Accessibility/AccessibleSpreadsheet.cxx b/sc/source/ui/Accessibility/AccessibleSpreadsheet.cxx deleted file mode 100644 index 94639bed4..000000000 --- a/sc/source/ui/Accessibility/AccessibleSpreadsheet.cxx +++ /dev/null @@ -1,974 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * 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 - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - - -#include "AccessibleSpreadsheet.hxx" -#include "AccessibilityHints.hxx" -#include "AccessibleCell.hxx" -#include "AccessibleDocument.hxx" -#include "tabvwsh.hxx" -#include "document.hxx" -#include "hints.hxx" -#include "scmod.hxx" - -#include <unotools/accessiblestatesethelper.hxx> -#include <com/sun/star/accessibility/AccessibleRole.hpp> -#include <com/sun/star/accessibility/AccessibleStateType.hpp> -#include <com/sun/star/accessibility/AccessibleEventId.hpp> -#include <com/sun/star/accessibility/AccessibleTableModelChangeType.hpp> -#include <comphelper/servicehelper.hxx> -#include <tools/gen.hxx> -#include <svtools/colorcfg.hxx> -#include <vcl/svapp.hxx> - -#include <algorithm> - -using namespace ::com::sun::star; -using namespace ::com::sun::star::accessibility; - -//===== internal ============================================================ - -ScAccessibleSpreadsheet::ScAccessibleSpreadsheet( - ScAccessibleDocument* pAccDoc, - ScTabViewShell* pViewShell, - SCTAB nTab, - ScSplitPos eSplitPos) - : - ScAccessibleTableBase (pAccDoc, GetDocument(pViewShell), - ScRange(ScAddress(0, 0, nTab),ScAddress(MAXCOL, MAXROW, nTab))), - mbIsSpreadsheet( sal_True ) -{ - ConstructScAccessibleSpreadsheet( pAccDoc, pViewShell, nTab, eSplitPos ); -} - -ScAccessibleSpreadsheet::ScAccessibleSpreadsheet( - ScAccessibleSpreadsheet& rParent, const ScRange& rRange ) : - ScAccessibleTableBase( rParent.mpAccDoc, rParent.mpDoc, rRange), - mbIsSpreadsheet( false ) -{ - ConstructScAccessibleSpreadsheet( rParent.mpAccDoc, rParent.mpViewShell, rParent.mnTab, rParent.meSplitPos ); -} - -ScAccessibleSpreadsheet::~ScAccessibleSpreadsheet() -{ - if (mpMarkedRanges) - delete mpMarkedRanges; - if (mpSortedMarkedCells) - delete mpSortedMarkedCells; - if (mpViewShell) - mpViewShell->RemoveAccessibilityObject(*this); -} - -void ScAccessibleSpreadsheet::ConstructScAccessibleSpreadsheet( - ScAccessibleDocument* pAccDoc, - ScTabViewShell* pViewShell, - SCTAB nTab, - ScSplitPos eSplitPos) -{ - mpViewShell = pViewShell; - mpMarkedRanges = 0; - mpSortedMarkedCells = 0; - mpAccDoc = pAccDoc; - mpAccCell = 0; - meSplitPos = eSplitPos; - mnTab = nTab; - mbHasSelection = false; - mbDelIns = false; - mbIsFocusSend = false; - maVisCells = GetVisCells(GetVisArea(mpViewShell, meSplitPos)); - if (mpViewShell) - { - mpViewShell->AddAccessibilityObject(*this); - - const ScViewData& rViewData = *mpViewShell->GetViewData(); - const ScMarkData& rMarkData = rViewData.GetMarkData(); - maActiveCell = rViewData.GetCurPos(); - mbHasSelection = rMarkData.GetTableSelect(maActiveCell.Tab()) && - (rMarkData.IsMarked() || rMarkData.IsMultiMarked()); - mpAccCell = GetAccessibleCellAt(maActiveCell.Row(), maActiveCell.Col()); - mpAccCell->acquire(); - mpAccCell->Init(); - } -} - -void SAL_CALL ScAccessibleSpreadsheet::disposing() -{ - SolarMutexGuard aGuard; - if (mpViewShell) - { - mpViewShell->RemoveAccessibilityObject(*this); - mpViewShell = NULL; - } - if (mpAccCell) - { - mpAccCell->release(); - mpAccCell = NULL; - } - - ScAccessibleTableBase::disposing(); -} - -void ScAccessibleSpreadsheet::CompleteSelectionChanged(sal_Bool bNewState) -{ - if (mpMarkedRanges) - DELETEZ(mpMarkedRanges); - if (mpSortedMarkedCells) - DELETEZ(mpSortedMarkedCells); - - mbHasSelection = bNewState; - - AccessibleEventObject aEvent; - aEvent.EventId = AccessibleEventId::STATE_CHANGED; - if (bNewState) - aEvent.NewValue = uno::makeAny(AccessibleStateType::SELECTED); - else - aEvent.OldValue = uno::makeAny(AccessibleStateType::SELECTED); - aEvent.Source = uno::Reference< XAccessibleContext >(this); - - CommitChange(aEvent); -} - -void ScAccessibleSpreadsheet::LostFocus() -{ - AccessibleEventObject aEvent; - aEvent.EventId = AccessibleEventId::ACTIVE_DESCENDANT_CHANGED; - aEvent.Source = uno::Reference< XAccessibleContext >(this); - uno::Reference< XAccessible > xOld = mpAccCell; - aEvent.OldValue <<= xOld; - - CommitChange(aEvent); - - CommitFocusLost(); -} - -void ScAccessibleSpreadsheet::GotFocus() -{ - CommitFocusGained(); - - AccessibleEventObject aEvent; - aEvent.EventId = AccessibleEventId::ACTIVE_DESCENDANT_CHANGED; - aEvent.Source = uno::Reference< XAccessibleContext >(this); - uno::Reference< XAccessible > xNew = mpAccCell; - aEvent.NewValue <<= xNew; - - CommitChange(aEvent); -} - -void ScAccessibleSpreadsheet::BoundingBoxChanged() -{ - AccessibleEventObject aEvent; - aEvent.EventId = AccessibleEventId::BOUNDRECT_CHANGED; - aEvent.Source = uno::Reference< XAccessibleContext >(this); - - CommitChange(aEvent); -} - -void ScAccessibleSpreadsheet::VisAreaChanged() -{ - AccessibleEventObject aEvent; - aEvent.EventId = AccessibleEventId::VISIBLE_DATA_CHANGED; - aEvent.Source = uno::Reference< XAccessibleContext >(this); - - CommitChange(aEvent); -} - - //===== SfxListener ===================================================== - -void ScAccessibleSpreadsheet::Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) -{ - if (rHint.ISA( SfxSimpleHint ) ) - { - const SfxSimpleHint& rRef = (const SfxSimpleHint&)rHint; - // only notify if child exist, otherwise it is not necessary - if ((rRef.GetId() == SC_HINT_ACC_CURSORCHANGED)) - { - if (mpViewShell) - { - ScAddress aNewCell = mpViewShell->GetViewData()->GetCurPos(); - sal_Bool bNewMarked(mpViewShell->GetViewData()->GetMarkData().GetTableSelect(aNewCell.Tab()) && - (mpViewShell->GetViewData()->GetMarkData().IsMarked() || - mpViewShell->GetViewData()->GetMarkData().IsMultiMarked())); - sal_Bool bNewCellSelected(isAccessibleSelected(aNewCell.Row(), aNewCell.Col())); - if ((bNewMarked != mbHasSelection) || - (!bNewCellSelected && bNewMarked) || - (bNewCellSelected && mbHasSelection)) - { - if (mpMarkedRanges) - DELETEZ(mpMarkedRanges); - if (mpSortedMarkedCells) - DELETEZ(mpSortedMarkedCells); - AccessibleEventObject aEvent; - aEvent.EventId = AccessibleEventId::SELECTION_CHANGED; - aEvent.Source = uno::Reference< XAccessibleContext >(this); - - mbHasSelection = bNewMarked; - - CommitChange(aEvent); - } - - // active descendant changed event (new cell selected) - bool bFireActiveDescChanged = (aNewCell != maActiveCell) && - (aNewCell.Tab() == maActiveCell.Tab()) && IsFocused(); - - /* Remember old active cell and set new active cell. - #i82409# always update the class members mpAccCell and - maActiveCell, even if the sheet is not focused, e.g. when - using the name box in the toolbar. */ - uno::Reference< XAccessible > xOld = mpAccCell; - mpAccCell->release(); - mpAccCell = GetAccessibleCellAt(aNewCell.Row(), aNewCell.Col()); - mpAccCell->acquire(); - mpAccCell->Init(); - uno::Reference< XAccessible > xNew = mpAccCell; - maActiveCell = aNewCell; - - // #i14108# fire event only if sheet is focused - if( bFireActiveDescChanged ) - { - AccessibleEventObject aEvent; - aEvent.EventId = AccessibleEventId::ACTIVE_DESCENDANT_CHANGED; - aEvent.Source = uno::Reference< XAccessibleContext >(this); - aEvent.OldValue <<= xOld; - aEvent.NewValue <<= xNew; - CommitChange(aEvent); - } - } - } - else if ((rRef.GetId() == SC_HINT_DATACHANGED)) - { - if (!mbDelIns) - CommitTableModelChange(maRange.aStart.Row(), maRange.aStart.Col(), maRange.aEnd.Row(), maRange.aEnd.Col(), AccessibleTableModelChangeType::UPDATE); - else - mbDelIns = false; - } - // commented out, because to use a ModelChangeEvent is not the right way - // at the moment there is no way, but the Java/Gnome Api should be extended sometime -/* if (mpViewShell) - { - Rectangle aNewVisCells(GetVisCells(GetVisArea(mpViewShell, meSplitPos))); - - Rectangle aNewPos(aNewVisCells); - - if (aNewVisCells.IsOver(maVisCells)) - aNewPos.Union(maVisCells); - else - CommitTableModelChange(maVisCells.Top(), maVisCells.Left(), maVisCells.Bottom(), maVisCells.Right(), AccessibleTableModelChangeType::UPDATE); - - maVisCells = aNewVisCells; - - CommitTableModelChange(aNewPos.Top(), aNewPos.Left(), aNewPos.Bottom(), aNewPos.Right(), AccessibleTableModelChangeType::UPDATE); - } - }*/ - } - else if (rHint.ISA( ScUpdateRefHint )) - { - const ScUpdateRefHint& rRef = (const ScUpdateRefHint&)rHint; - if (rRef.GetMode() == URM_INSDEL && rRef.GetDz() == 0) //test whether table is inserted or deleted - { - if (((rRef.GetRange().aStart.Col() == maRange.aStart.Col()) && - (rRef.GetRange().aEnd.Col() == maRange.aEnd.Col())) || - ((rRef.GetRange().aStart.Row() == maRange.aStart.Row()) && - (rRef.GetRange().aEnd.Row() == maRange.aEnd.Row()))) - { - // ignore next SC_HINT_DATACHANGED notification - mbDelIns = sal_True; - - sal_Int16 nId(0); - SCsCOL nX(rRef.GetDx()); - SCsROW nY(rRef.GetDy()); - ScRange aRange(rRef.GetRange()); - if ((nX < 0) || (nY < 0)) - { - OSL_ENSURE(!((nX < 0) && (nY < 0)), "should not be possible to remove row and column at the same time"); - nId = AccessibleTableModelChangeType::DELETE; - if (nX < 0) - { - nX = -nX; - nY = aRange.aEnd.Row() - aRange.aStart.Row(); - } - else - { - nY = -nY; - nX = aRange.aEnd.Col() - aRange.aStart.Col(); - } - } - else if ((nX > 0) || (nY > 0)) - { - OSL_ENSURE(!((nX > 0) && (nY > 0)), "should not be possible to add row and column at the same time"); - nId = AccessibleTableModelChangeType::INSERT; - if (nX < 0) - nY = aRange.aEnd.Row() - aRange.aStart.Row(); - else - nX = aRange.aEnd.Col() - aRange.aStart.Col(); - } - else - { - OSL_FAIL("is it a deletion or a insertion?"); - } - - CommitTableModelChange(rRef.GetRange().aStart.Row(), - rRef.GetRange().aStart.Col(), - rRef.GetRange().aStart.Row() + nY, - rRef.GetRange().aStart.Col() + nX, nId); - - AccessibleEventObject aEvent; - aEvent.EventId = AccessibleEventId::ACTIVE_DESCENDANT_CHANGED; - aEvent.Source = uno::Reference< XAccessibleContext >(this); - uno::Reference< XAccessible > xNew = mpAccCell; - aEvent.NewValue <<= xNew; - - CommitChange(aEvent); - } - } - } - - ScAccessibleTableBase::Notify(rBC, rHint); -} - - //===== XAccessibleTable ================================================ - -uno::Reference< XAccessibleTable > SAL_CALL ScAccessibleSpreadsheet::getAccessibleRowHeaders( ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - IsObjectValid(); - uno::Reference< XAccessibleTable > xAccessibleTable; - if( mpDoc && mbIsSpreadsheet ) - { - if( const ScRange* pRowRange = mpDoc->GetRepeatRowRange( mnTab ) ) - { - SCROW nStart = pRowRange->aStart.Row(); - SCROW nEnd = pRowRange->aEnd.Row(); - if( (0 <= nStart) && (nStart <= nEnd) && (nEnd <= MAXROW) ) - xAccessibleTable.set( new ScAccessibleSpreadsheet( *this, ScRange( 0, nStart, mnTab, MAXCOL, nEnd, mnTab ) ) ); - } - } - return xAccessibleTable; -} - -uno::Reference< XAccessibleTable > SAL_CALL ScAccessibleSpreadsheet::getAccessibleColumnHeaders( ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - IsObjectValid(); - uno::Reference< XAccessibleTable > xAccessibleTable; - if( mpDoc && mbIsSpreadsheet ) - { - if( const ScRange* pColRange = mpDoc->GetRepeatColRange( mnTab ) ) - { - SCCOL nStart = pColRange->aStart.Col(); - SCCOL nEnd = pColRange->aEnd.Col(); - if( (0 <= nStart) && (nStart <= nEnd) && (nEnd <= MAXCOL) ) - xAccessibleTable.set( new ScAccessibleSpreadsheet( *this, ScRange( nStart, 0, mnTab, nEnd, MAXROW, mnTab ) ) ); - } - } - return xAccessibleTable; -} - -uno::Sequence< sal_Int32 > SAL_CALL ScAccessibleSpreadsheet::getSelectedAccessibleRows( ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - IsObjectValid(); - uno::Sequence<sal_Int32> aSequence; - if (mpViewShell && mpViewShell->GetViewData()) - { - aSequence.realloc(maRange.aEnd.Row() - maRange.aStart.Row() + 1); - const ScMarkData& rMarkdata = mpViewShell->GetViewData()->GetMarkData(); - sal_Int32* pSequence = aSequence.getArray(); - sal_Int32 nCount(0); - for (SCROW i = maRange.aStart.Row(); i <= maRange.aEnd.Row(); ++i) - { - if (rMarkdata.IsRowMarked(i)) - { - pSequence[nCount] = i; - ++nCount; - } - } - aSequence.realloc(nCount); - } - else - aSequence.realloc(0); - return aSequence; -} - -uno::Sequence< sal_Int32 > SAL_CALL ScAccessibleSpreadsheet::getSelectedAccessibleColumns( ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - IsObjectValid(); - uno::Sequence<sal_Int32> aSequence; - if (mpViewShell && mpViewShell->GetViewData()) - { - aSequence.realloc(maRange.aEnd.Col() - maRange.aStart.Col() + 1); - const ScMarkData& rMarkdata = mpViewShell->GetViewData()->GetMarkData(); - sal_Int32* pSequence = aSequence.getArray(); - sal_Int32 nCount(0); - for (SCCOL i = maRange.aStart.Col(); i <= maRange.aEnd.Col(); ++i) - { - if (rMarkdata.IsColumnMarked(i)) - { - pSequence[nCount] = i; - ++nCount; - } - } - aSequence.realloc(nCount); - } - else - aSequence.realloc(0); - return aSequence; -} - -sal_Bool SAL_CALL ScAccessibleSpreadsheet::isAccessibleRowSelected( sal_Int32 nRow ) - throw (uno::RuntimeException, lang::IndexOutOfBoundsException) -{ - SolarMutexGuard aGuard; - IsObjectValid(); - - if ((nRow > (maRange.aEnd.Row() - maRange.aStart.Row())) || (nRow < 0)) - throw lang::IndexOutOfBoundsException(); - - sal_Bool bResult(false); - if (mpViewShell && mpViewShell->GetViewData()) - { - const ScMarkData& rMarkdata = mpViewShell->GetViewData()->GetMarkData(); - bResult = rMarkdata.IsRowMarked((SCROW)nRow); - } - return bResult; -} - -sal_Bool SAL_CALL ScAccessibleSpreadsheet::isAccessibleColumnSelected( sal_Int32 nColumn ) - throw (uno::RuntimeException, lang::IndexOutOfBoundsException) -{ - SolarMutexGuard aGuard; - IsObjectValid(); - - if ((nColumn > (maRange.aEnd.Col() - maRange.aStart.Col())) || (nColumn < 0)) - throw lang::IndexOutOfBoundsException(); - - sal_Bool bResult(false); - if (mpViewShell && mpViewShell->GetViewData()) - { - const ScMarkData& rMarkdata = mpViewShell->GetViewData()->GetMarkData(); - bResult = rMarkdata.IsColumnMarked((SCCOL)nColumn); - } - return bResult; -} - -ScAccessibleCell* ScAccessibleSpreadsheet::GetAccessibleCellAt(sal_Int32 nRow, sal_Int32 nColumn) -{ - ScAccessibleCell* pAccessibleCell = NULL; - ScAddress aCellAddress(static_cast<SCCOL>(maRange.aStart.Col() + nColumn), - static_cast<SCROW>(maRange.aStart.Row() + nRow), maRange.aStart.Tab()); - if ((aCellAddress == maActiveCell) && mpAccCell) - { - pAccessibleCell = mpAccCell; - } - else - pAccessibleCell = new ScAccessibleCell(this, mpViewShell, aCellAddress, getAccessibleIndex(nRow, nColumn), meSplitPos, mpAccDoc); - - return pAccessibleCell; -} - -uno::Reference< XAccessible > SAL_CALL ScAccessibleSpreadsheet::getAccessibleCellAt( sal_Int32 nRow, sal_Int32 nColumn ) - throw (uno::RuntimeException, lang::IndexOutOfBoundsException) -{ - SolarMutexGuard aGuard; - IsObjectValid(); - if (nRow > (maRange.aEnd.Row() - maRange.aStart.Row()) || - nRow < 0 || - nColumn > (maRange.aEnd.Col() - maRange.aStart.Col()) || - nColumn < 0) - throw lang::IndexOutOfBoundsException(); - - uno::Reference<XAccessible> xAccessible; - ScAccessibleCell* pAccessibleCell = GetAccessibleCellAt(nRow, nColumn); - xAccessible = pAccessibleCell; - pAccessibleCell->Init(); - return xAccessible; -} - -sal_Bool SAL_CALL ScAccessibleSpreadsheet::isAccessibleSelected( sal_Int32 nRow, sal_Int32 nColumn ) - throw (uno::RuntimeException, lang::IndexOutOfBoundsException) -{ - SolarMutexGuard aGuard; - IsObjectValid(); - - if ((nColumn > (maRange.aEnd.Col() - maRange.aStart.Col())) || (nColumn < 0) || - (nRow > (maRange.aEnd.Row() - maRange.aStart.Row())) || (nRow < 0)) - throw lang::IndexOutOfBoundsException(); - - sal_Bool bResult(false); - if (mpViewShell) - { - const ScMarkData& rMarkdata = mpViewShell->GetViewData()->GetMarkData(); - bResult = rMarkdata.IsCellMarked(static_cast<SCCOL>(nColumn), static_cast<SCROW>(nRow)); - } - return bResult; -} - - //===== XAccessibleComponent ============================================ - -uno::Reference< XAccessible > SAL_CALL ScAccessibleSpreadsheet::getAccessibleAtPoint( - const awt::Point& rPoint ) - throw (uno::RuntimeException) -{ - uno::Reference< XAccessible > xAccessible; - if (containsPoint(rPoint)) - { - SolarMutexGuard aGuard; - IsObjectValid(); - if (mpViewShell) - { - SCsCOL nX; - SCsROW nY; - mpViewShell->GetViewData()->GetPosFromPixel( rPoint.X, rPoint.Y, meSplitPos, nX, nY); - xAccessible = getAccessibleCellAt(nY, nX); - } - } - return xAccessible; -} - -void SAL_CALL ScAccessibleSpreadsheet::grabFocus( ) - throw (uno::RuntimeException) -{ - if (getAccessibleParent().is()) - { - uno::Reference<XAccessibleComponent> xAccessibleComponent(getAccessibleParent()->getAccessibleContext(), uno::UNO_QUERY); - if (xAccessibleComponent.is()) - xAccessibleComponent->grabFocus(); - } -} - -sal_Int32 SAL_CALL ScAccessibleSpreadsheet::getForeground( ) - throw (uno::RuntimeException) -{ - return COL_BLACK; -} - -sal_Int32 SAL_CALL ScAccessibleSpreadsheet::getBackground( ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - IsObjectValid(); - return SC_MOD()->GetColorConfig().GetColorValue( ::svtools::DOCCOLOR ).nColor; -} - - //===== XAccessibleContext ============================================== - -uno::Reference<XAccessibleRelationSet> SAL_CALL ScAccessibleSpreadsheet::getAccessibleRelationSet(void) - throw (::com::sun::star::uno::RuntimeException) -{ - utl::AccessibleRelationSetHelper* pRelationSet = NULL; - if(mpAccDoc) - pRelationSet = mpAccDoc->GetRelationSet(NULL); - if (!pRelationSet) - pRelationSet = new utl::AccessibleRelationSetHelper(); - return pRelationSet; -} - -uno::Reference<XAccessibleStateSet> SAL_CALL - ScAccessibleSpreadsheet::getAccessibleStateSet(void) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference<XAccessibleStateSet> xParentStates; - if (getAccessibleParent().is()) - { - uno::Reference<XAccessibleContext> xParentContext = getAccessibleParent()->getAccessibleContext(); - xParentStates = xParentContext->getAccessibleStateSet(); - } - utl::AccessibleStateSetHelper* pStateSet = new utl::AccessibleStateSetHelper(); - if (IsDefunc(xParentStates)) - pStateSet->AddState(AccessibleStateType::DEFUNC); - else - { - pStateSet->AddState(AccessibleStateType::MANAGES_DESCENDANTS); - if (IsEditable(xParentStates)) - pStateSet->AddState(AccessibleStateType::EDITABLE); - pStateSet->AddState(AccessibleStateType::ENABLED); - pStateSet->AddState(AccessibleStateType::FOCUSABLE); - if (IsFocused()) - pStateSet->AddState(AccessibleStateType::FOCUSED); - pStateSet->AddState(AccessibleStateType::MULTI_SELECTABLE); - pStateSet->AddState(AccessibleStateType::OPAQUE); - pStateSet->AddState(AccessibleStateType::SELECTABLE); - if (IsCompleteSheetSelected()) - pStateSet->AddState(AccessibleStateType::SELECTED); - if (isShowing()) - pStateSet->AddState(AccessibleStateType::SHOWING); - if (isVisible()) - pStateSet->AddState(AccessibleStateType::VISIBLE); - } - return pStateSet; -} - - ///===== XAccessibleSelection =========================================== - -void SAL_CALL - ScAccessibleSpreadsheet::selectAccessibleChild( sal_Int32 nChildIndex ) - throw (lang::IndexOutOfBoundsException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - IsObjectValid(); - if (nChildIndex < 0 || nChildIndex >= getAccessibleChildCount()) - throw lang::IndexOutOfBoundsException(); - - if (mpViewShell) - { - sal_Int32 nCol(getAccessibleColumn(nChildIndex)); - sal_Int32 nRow(getAccessibleRow(nChildIndex)); - - SelectCell(nRow, nCol, false); - } -} - -void SAL_CALL - ScAccessibleSpreadsheet::clearAccessibleSelection( ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - IsObjectValid(); - if (mpViewShell) - { - mpViewShell->Unmark(); - } -} - -void SAL_CALL - ScAccessibleSpreadsheet::selectAllAccessibleChildren( ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - IsObjectValid(); - if (mpViewShell) - { - mpViewShell->SelectAll(); - } -} - -sal_Int32 SAL_CALL - ScAccessibleSpreadsheet::getSelectedAccessibleChildCount( ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - IsObjectValid(); - sal_Int32 nResult(0); - if (mpViewShell) - { - if (!mpMarkedRanges) - { - mpMarkedRanges = new ScRangeList(); - ScMarkData aMarkData(mpViewShell->GetViewData()->GetMarkData()); - aMarkData.MarkToMulti(); - aMarkData.FillRangeListWithMarks(mpMarkedRanges, false); - } - // is possible, because there shouldn't be overlapped ranges in it - if (mpMarkedRanges) - nResult = mpMarkedRanges->GetCellCount(); - } - return nResult; -} - -uno::Reference<XAccessible > SAL_CALL - ScAccessibleSpreadsheet::getSelectedAccessibleChild( sal_Int32 nSelectedChildIndex ) - throw (lang::IndexOutOfBoundsException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - IsObjectValid(); - uno::Reference < XAccessible > xAccessible; - if (mpViewShell) - { - if (!mpMarkedRanges) - { - mpMarkedRanges = new ScRangeList(); - mpViewShell->GetViewData()->GetMarkData().FillRangeListWithMarks(mpMarkedRanges, false); - } - if (mpMarkedRanges) - { - if (!mpSortedMarkedCells) - CreateSortedMarkedCells(); - if (mpSortedMarkedCells) - { - if ((nSelectedChildIndex < 0) || - (mpSortedMarkedCells->size() <= static_cast<sal_uInt32>(nSelectedChildIndex))) - throw lang::IndexOutOfBoundsException(); - else - xAccessible = getAccessibleCellAt((*mpSortedMarkedCells)[nSelectedChildIndex].Row(), (*mpSortedMarkedCells)[nSelectedChildIndex].Col()); - } - } - } - return xAccessible; -} - -void SAL_CALL - ScAccessibleSpreadsheet::deselectAccessibleChild( sal_Int32 nChildIndex ) - throw (lang::IndexOutOfBoundsException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - IsObjectValid(); - - if (nChildIndex < 0 || nChildIndex >= getAccessibleChildCount()) - throw lang::IndexOutOfBoundsException(); - - if (mpViewShell) - { - sal_Int32 nCol(getAccessibleColumn(nChildIndex)); - sal_Int32 nRow(getAccessibleRow(nChildIndex)); - - if (mpViewShell->GetViewData()->GetMarkData().IsCellMarked(static_cast<SCCOL>(nCol), static_cast<SCROW>(nRow))) - SelectCell(nRow, nCol, sal_True); - } -} - -void ScAccessibleSpreadsheet::SelectCell(sal_Int32 nRow, sal_Int32 nCol, sal_Bool bDeselect) -{ - mpViewShell->SetTabNo( maRange.aStart.Tab() ); - - mpViewShell->DoneBlockMode( sal_True ); // continue selecting - mpViewShell->InitBlockMode( static_cast<SCCOL>(nCol), static_cast<SCROW>(nRow), maRange.aStart.Tab(), bDeselect, false, false ); - - mpViewShell->SelectionChanged(); -} - -void ScAccessibleSpreadsheet::CreateSortedMarkedCells() -{ - mpSortedMarkedCells = new std::vector<ScMyAddress>(); - mpSortedMarkedCells->reserve(mpMarkedRanges->GetCellCount()); - for ( size_t i = 0, ListSize = mpMarkedRanges->size(); i < ListSize; ++i ) - { - ScRange* pRange = (*mpMarkedRanges)[i]; - if (pRange->aStart.Tab() != pRange->aEnd.Tab()) - { - if ((maActiveCell.Tab() >= pRange->aStart.Tab()) || - maActiveCell.Tab() <= pRange->aEnd.Tab()) - { - ScRange aRange(*pRange); - aRange.aStart.SetTab(maActiveCell.Tab()); - aRange.aEnd.SetTab(maActiveCell.Tab()); - AddMarkedRange(aRange); - } - else - { - OSL_FAIL("Range of wrong table"); - } - } - else if(pRange->aStart.Tab() == maActiveCell.Tab()) - AddMarkedRange(*pRange); - else - { - OSL_FAIL("Range of wrong table"); - } - } - std::sort(mpSortedMarkedCells->begin(), mpSortedMarkedCells->end()); -} - -void ScAccessibleSpreadsheet::AddMarkedRange(const ScRange& rRange) -{ - for (SCROW nRow = rRange.aStart.Row(); nRow <= rRange.aEnd.Row(); ++nRow) - { - for (SCCOL nCol = rRange.aStart.Col(); nCol <= rRange.aEnd.Col(); ++nCol) - { - ScMyAddress aCell(nCol, nRow, maActiveCell.Tab()); - mpSortedMarkedCells->push_back(aCell); - } - } -} - - //===== XServiceInfo ==================================================== - -::rtl::OUString SAL_CALL ScAccessibleSpreadsheet::getImplementationName(void) - throw (uno::RuntimeException) -{ - return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM ("ScAccessibleSpreadsheet")); -} - -uno::Sequence< ::rtl::OUString> SAL_CALL - ScAccessibleSpreadsheet::getSupportedServiceNames (void) - throw (uno::RuntimeException) -{ - uno::Sequence< ::rtl::OUString > aSequence = ScAccessibleTableBase::getSupportedServiceNames(); - sal_Int32 nOldSize(aSequence.getLength()); - aSequence.realloc(nOldSize + 1); - ::rtl::OUString* pNames = aSequence.getArray(); - - pNames[nOldSize] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.AccessibleSpreadsheet")); - - return aSequence; -} - -//===== XTypeProvider ======================================================= - -namespace -{ - class theScAccessibleSpreadsheetImplementationId : public rtl::Static< UnoTunnelIdInit, theScAccessibleSpreadsheetImplementationId > {}; -} - -uno::Sequence<sal_Int8> SAL_CALL - ScAccessibleSpreadsheet::getImplementationId(void) - throw (uno::RuntimeException) -{ - return theScAccessibleSpreadsheetImplementationId::get().getSeq(); -} - -///===== XAccessibleEventBroadcaster ===================================== - -void SAL_CALL ScAccessibleSpreadsheet::addEventListener(const uno::Reference<XAccessibleEventListener>& xListener) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - IsObjectValid(); - ScAccessibleTableBase::addEventListener(xListener); - - if (!mbIsFocusSend) - { - mbIsFocusSend = sal_True; - CommitFocusGained(); - - AccessibleEventObject aEvent; - aEvent.EventId = AccessibleEventId::ACTIVE_DESCENDANT_CHANGED; - aEvent.Source = uno::Reference< XAccessibleContext >(this); - aEvent.NewValue <<= getAccessibleCellAt(maActiveCell.Row(), maActiveCell.Col()); - - CommitChange(aEvent); - } -} - - //==== internal ========================================================= - -Rectangle ScAccessibleSpreadsheet::GetBoundingBoxOnScreen() const - throw (uno::RuntimeException) -{ - Rectangle aRect; - if (mpViewShell) - { - Window* pWindow = mpViewShell->GetWindowByPos(meSplitPos); - if (pWindow) - aRect = pWindow->GetWindowExtentsRelative(NULL); - } - return aRect; -} - -Rectangle ScAccessibleSpreadsheet::GetBoundingBox() const - throw (uno::RuntimeException) -{ - Rectangle aRect; - if (mpViewShell) - { - Window* pWindow = mpViewShell->GetWindowByPos(meSplitPos); - if (pWindow) - //#101986#; extends to the same window, because the parent is the document and it has the same window - aRect = pWindow->GetWindowExtentsRelative(pWindow); - } - return aRect; -} - -sal_Bool ScAccessibleSpreadsheet::IsDefunc( - const uno::Reference<XAccessibleStateSet>& rxParentStates) -{ - return ScAccessibleContextBase::IsDefunc() || (mpViewShell == NULL) || !getAccessibleParent().is() || - (rxParentStates.is() && rxParentStates->contains(AccessibleStateType::DEFUNC)); -} - -sal_Bool ScAccessibleSpreadsheet::IsEditable( - const uno::Reference<XAccessibleStateSet>& /* rxParentStates */) -{ - sal_Bool bProtected(false); - if (mpDoc && mpDoc->IsTabProtected(maRange.aStart.Tab())) - bProtected = sal_True; - return !bProtected; -} - -sal_Bool ScAccessibleSpreadsheet::IsFocused() -{ - sal_Bool bFocused(false); - if (mpViewShell) - { - if (mpViewShell->GetViewData()->GetActivePart() == meSplitPos) - bFocused = mpViewShell->GetActiveWin()->HasFocus(); - } - return bFocused; -} - -sal_Bool ScAccessibleSpreadsheet::IsCompleteSheetSelected() -{ - sal_Bool bResult(false); - if(mpViewShell) - { - //#103800#; use a copy of MarkData - ScMarkData aMarkData(mpViewShell->GetViewData()->GetMarkData()); - aMarkData.MarkToMulti(); - if (aMarkData.IsAllMarked(maRange)) - bResult = sal_True; - } - return bResult; -} - -ScDocument* ScAccessibleSpreadsheet::GetDocument(ScTabViewShell* pViewShell) -{ - ScDocument* pDoc = NULL; - if (pViewShell) - pDoc = pViewShell->GetViewData()->GetDocument(); - return pDoc; -} - -Rectangle ScAccessibleSpreadsheet::GetVisArea(ScTabViewShell* pViewShell, ScSplitPos eSplitPos) -{ - Rectangle aVisArea; - if (pViewShell) - { - Window* pWindow = pViewShell->GetWindowByPos(eSplitPos); - if (pWindow) - { - aVisArea.SetPos(pViewShell->GetViewData()->GetPixPos(eSplitPos)); - aVisArea.SetSize(pWindow->GetSizePixel()); - } - } - return aVisArea; -} - -Rectangle ScAccessibleSpreadsheet::GetVisCells(const Rectangle& rVisArea) -{ - if (mpViewShell) - { - SCsCOL nStartX, nEndX; - SCsROW nStartY, nEndY; - - mpViewShell->GetViewData()->GetPosFromPixel( 1, 1, meSplitPos, nStartX, nStartY); - mpViewShell->GetViewData()->GetPosFromPixel( rVisArea.GetWidth(), rVisArea.GetHeight(), meSplitPos, nEndX, nEndY); - - return Rectangle(nStartX, nStartY, nEndX, nEndY); - } - else - return Rectangle(); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |