1b3f79822SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3b3f79822SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4b3f79822SAndrew Rist * or more contributor license agreements. See the NOTICE file
5b3f79822SAndrew Rist * distributed with this work for additional information
6b3f79822SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7b3f79822SAndrew Rist * to you under the Apache License, Version 2.0 (the
8b3f79822SAndrew Rist * "License"); you may not use this file except in compliance
9b3f79822SAndrew Rist * with the License. You may obtain a copy of the License at
10b3f79822SAndrew Rist *
11b3f79822SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12b3f79822SAndrew Rist *
13b3f79822SAndrew Rist * Unless required by applicable law or agreed to in writing,
14b3f79822SAndrew Rist * software distributed under the License is distributed on an
15b3f79822SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16b3f79822SAndrew Rist * KIND, either express or implied. See the License for the
17b3f79822SAndrew Rist * specific language governing permissions and limitations
18b3f79822SAndrew Rist * under the License.
19b3f79822SAndrew Rist *
20b3f79822SAndrew Rist *************************************************************/
21b3f79822SAndrew Rist
22b3f79822SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sc.hxx"
26cdf0e10cSrcweir
27cdf0e10cSrcweir
28cdf0e10cSrcweir #include "AccessibleSpreadsheet.hxx"
29cdf0e10cSrcweir #include "AccessibilityHints.hxx"
30cdf0e10cSrcweir #include "AccessibleCell.hxx"
31cdf0e10cSrcweir #include "AccessibleDocument.hxx"
32cdf0e10cSrcweir #include "tabvwsh.hxx"
33cdf0e10cSrcweir #include "document.hxx"
34cdf0e10cSrcweir #include "unoguard.hxx"
35cdf0e10cSrcweir #include "hints.hxx"
36cdf0e10cSrcweir #include "scmod.hxx"
37cdf0e10cSrcweir
38cdf0e10cSrcweir #ifndef _UTL_ACCESSIBLESTATESETHELPER_HXX
39cdf0e10cSrcweir #include <unotools/accessiblestatesethelper.hxx>
40cdf0e10cSrcweir #endif
41cdf0e10cSrcweir #ifndef _COM_SUN_STAR_ACCESSIBILITY_XACCESSIBLEROLE_HPP_
42cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleRole.hpp>
43cdf0e10cSrcweir #endif
44cdf0e10cSrcweir #ifndef _COM_SUN_STAR_ACCESSIBILITY_XACCESSIBLESTATETYPE_HPP_
45cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleStateType.hpp>
46cdf0e10cSrcweir #endif
47cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleEventId.hpp>
48cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleTableModelChangeType.hpp>
49cdf0e10cSrcweir #include <rtl/uuid.h>
50cdf0e10cSrcweir #include <tools/debug.hxx>
51cdf0e10cSrcweir #include <tools/gen.hxx>
52cdf0e10cSrcweir #include <svtools/colorcfg.hxx>
530deba7fbSSteve Yin #include "scresid.hxx"
540deba7fbSSteve Yin #include "sc.hrc"
55cdf0e10cSrcweir #include <algorithm>
56cdf0e10cSrcweir
57cdf0e10cSrcweir using namespace ::com::sun::star;
58cdf0e10cSrcweir using namespace ::com::sun::star::accessibility;
59cdf0e10cSrcweir
CompMinCol(const std::pair<sal_uInt16,sal_uInt16> & pc1,const std::pair<sal_uInt16,sal_uInt16> & pc2)600deba7fbSSteve Yin bool CompMinCol(const std::pair<sal_uInt16,sal_uInt16> & pc1,const std::pair<sal_uInt16,sal_uInt16> &pc2)
610deba7fbSSteve Yin {
620deba7fbSSteve Yin return pc1.first < pc2.first;
630deba7fbSSteve Yin }
CalcScAddressFromRangeList(ScRangeList * pMarkedRanges,sal_Int32 nSelectedChildIndex)640deba7fbSSteve Yin ScMyAddress ScAccessibleSpreadsheet::CalcScAddressFromRangeList(ScRangeList *pMarkedRanges,sal_Int32 nSelectedChildIndex)
650deba7fbSSteve Yin {
660deba7fbSSteve Yin if (pMarkedRanges->Count() <= 1)
670deba7fbSSteve Yin {
680deba7fbSSteve Yin ScRange* pRange = pMarkedRanges->First();
690deba7fbSSteve Yin if (pRange)
700deba7fbSSteve Yin {
710deba7fbSSteve Yin // MT IA2: Not used.
720deba7fbSSteve Yin // const int nRowNum = pRange->aEnd.Row() - pRange->aStart.Row() + 1;
730deba7fbSSteve Yin const int nColNum = pRange->aEnd.Col() - pRange->aStart.Col() + 1;
740deba7fbSSteve Yin const int nCurCol = nSelectedChildIndex % nColNum;
750deba7fbSSteve Yin const int nCurRow = (nSelectedChildIndex - nCurCol)/nColNum;
760deba7fbSSteve Yin return ScMyAddress(static_cast<SCCOL>(pRange->aStart.Col() + nCurCol), pRange->aStart.Row() + nCurRow, maActiveCell.Tab());
770deba7fbSSteve Yin }
780deba7fbSSteve Yin }
790deba7fbSSteve Yin else
800deba7fbSSteve Yin {
810deba7fbSSteve Yin sal_Int32 nMinRow = MAXROW;
820deba7fbSSteve Yin sal_Int32 nMaxRow = 0;
830deba7fbSSteve Yin m_vecTempRange.clear();
840deba7fbSSteve Yin ScRange* pRange = pMarkedRanges->First();
850deba7fbSSteve Yin while (pRange)
860deba7fbSSteve Yin {
870deba7fbSSteve Yin if (pRange->aStart.Tab() != pRange->aEnd.Tab())
880deba7fbSSteve Yin {
890deba7fbSSteve Yin if ((maActiveCell.Tab() >= pRange->aStart.Tab()) ||
900deba7fbSSteve Yin maActiveCell.Tab() <= pRange->aEnd.Tab())
910deba7fbSSteve Yin {
920deba7fbSSteve Yin m_vecTempRange.push_back(pRange);
930deba7fbSSteve Yin nMinRow = std::min(pRange->aStart.Row(),nMinRow);
940deba7fbSSteve Yin nMaxRow = std::max(pRange->aEnd.Row(),nMaxRow);
950deba7fbSSteve Yin }
960deba7fbSSteve Yin else
970deba7fbSSteve Yin DBG_ERROR("Range of wrong table");
980deba7fbSSteve Yin }
990deba7fbSSteve Yin else if(pRange->aStart.Tab() == maActiveCell.Tab())
1000deba7fbSSteve Yin {
1010deba7fbSSteve Yin m_vecTempRange.push_back(pRange);
1020deba7fbSSteve Yin nMinRow = std::min(pRange->aStart.Row(),nMinRow);
1030deba7fbSSteve Yin nMaxRow = std::max(pRange->aEnd.Row(),nMaxRow);
1040deba7fbSSteve Yin }
1050deba7fbSSteve Yin else
1060deba7fbSSteve Yin DBG_ERROR("Range of wrong table");
1070deba7fbSSteve Yin pRange = pMarkedRanges->Next();
1080deba7fbSSteve Yin }
1090deba7fbSSteve Yin int nCurrentIndex = 0 ;
1100deba7fbSSteve Yin for(sal_Int32 row = nMinRow ; row <= nMaxRow ; ++row)
1110deba7fbSSteve Yin {
1120deba7fbSSteve Yin m_vecTempCol.clear();
1130deba7fbSSteve Yin {
1140deba7fbSSteve Yin VEC_RANGE::const_iterator vi = m_vecTempRange.begin();
1150deba7fbSSteve Yin for (; vi < m_vecTempRange.end(); ++vi)
1160deba7fbSSteve Yin {
1170deba7fbSSteve Yin ScRange *p = *vi;
1180deba7fbSSteve Yin if ( row >= p->aStart.Row() && row <= p->aEnd.Row())
1190deba7fbSSteve Yin {
1200deba7fbSSteve Yin m_vecTempCol.push_back(std::make_pair(p->aStart.Col(),p->aEnd.Col()));
1210deba7fbSSteve Yin }
1220deba7fbSSteve Yin }
1230deba7fbSSteve Yin }
1240deba7fbSSteve Yin std::sort(m_vecTempCol.begin(),m_vecTempCol.end(),CompMinCol);
1250deba7fbSSteve Yin {
1260deba7fbSSteve Yin VEC_COL::const_iterator vic = m_vecTempCol.begin();
1270deba7fbSSteve Yin for(; vic != m_vecTempCol.end(); ++vic)
1280deba7fbSSteve Yin {
1290deba7fbSSteve Yin const PAIR_COL &pariCol = *vic;
1300deba7fbSSteve Yin sal_uInt16 nCol = pariCol.second - pariCol.first + 1;
1310deba7fbSSteve Yin if (nCol + nCurrentIndex > nSelectedChildIndex)
1320deba7fbSSteve Yin {
1330deba7fbSSteve Yin return ScMyAddress(static_cast<SCCOL>(pariCol.first + nSelectedChildIndex - nCurrentIndex), row, maActiveCell.Tab());
1340deba7fbSSteve Yin }
1350deba7fbSSteve Yin nCurrentIndex += nCol;
1360deba7fbSSteve Yin }
1370deba7fbSSteve Yin }
1380deba7fbSSteve Yin }
1390deba7fbSSteve Yin }
1400deba7fbSSteve Yin return ScMyAddress(0,0,maActiveCell.Tab());
1410deba7fbSSteve Yin }
CalcScRangeDifferenceMax(ScRange * pSrc,ScRange * pDest,int nMax,VEC_MYADDR & vecRet,int & nSize)1420deba7fbSSteve Yin sal_Bool ScAccessibleSpreadsheet::CalcScRangeDifferenceMax(ScRange *pSrc,ScRange *pDest,int nMax,VEC_MYADDR &vecRet,int &nSize)
1430deba7fbSSteve Yin {
1440deba7fbSSteve Yin //Src Must be :Src > Dest
1450deba7fbSSteve Yin if (pDest->In(*pSrc))
1460deba7fbSSteve Yin {//Here is Src In Dest,Src <= Dest
1470deba7fbSSteve Yin return sal_False;
1480deba7fbSSteve Yin }
1490deba7fbSSteve Yin if (!pDest->Intersects(*pSrc))
1500deba7fbSSteve Yin {
1510deba7fbSSteve Yin int nCellCount = sal_uInt32(pDest->aEnd.Col() - pDest->aStart.Col() + 1)
1520deba7fbSSteve Yin * sal_uInt32(pDest->aEnd.Row() - pDest->aStart.Row() + 1)
1530deba7fbSSteve Yin * sal_uInt32(pDest->aEnd.Tab() - pDest->aStart.Tab() + 1);
1540deba7fbSSteve Yin if (nCellCount + nSize > nMax)
1550deba7fbSSteve Yin {
1560deba7fbSSteve Yin return sal_True;
1570deba7fbSSteve Yin }
1580deba7fbSSteve Yin else if(nCellCount > 0)
1590deba7fbSSteve Yin {
1600deba7fbSSteve Yin nCellCount +=nSize;
1610deba7fbSSteve Yin for (sal_Int32 row = pDest->aStart.Row(); row <= pDest->aEnd.Row();++row)
1620deba7fbSSteve Yin {
1630deba7fbSSteve Yin for (sal_uInt16 col = pDest->aStart.Col(); col <= pDest->aEnd.Col();++col)
1640deba7fbSSteve Yin {
1650deba7fbSSteve Yin vecRet.push_back(ScMyAddress(col,row,pDest->aStart.Tab()));
1660deba7fbSSteve Yin }
1670deba7fbSSteve Yin }
1680deba7fbSSteve Yin }
1690deba7fbSSteve Yin return sal_False;
1700deba7fbSSteve Yin }
1710deba7fbSSteve Yin sal_Int32 nMinRow = pSrc->aStart.Row();
1720deba7fbSSteve Yin sal_Int32 nMaxRow = pSrc->aEnd.Row();
1730deba7fbSSteve Yin for (; nMinRow <= nMaxRow ; ++nMinRow,--nMaxRow)
1740deba7fbSSteve Yin {
1750deba7fbSSteve Yin for (sal_uInt16 col = pSrc->aStart.Col(); col <= pSrc->aEnd.Col();++col)
1760deba7fbSSteve Yin {
1770deba7fbSSteve Yin if (nSize > nMax)
1780deba7fbSSteve Yin {
1790deba7fbSSteve Yin return sal_True;
1800deba7fbSSteve Yin }
1810deba7fbSSteve Yin ScMyAddress cell(col,nMinRow,pSrc->aStart.Tab());
1820deba7fbSSteve Yin if(!pDest->In(cell))
1830deba7fbSSteve Yin {//In Src ,Not In Dest
1840deba7fbSSteve Yin vecRet.push_back(cell);
1850deba7fbSSteve Yin ++nSize;
1860deba7fbSSteve Yin }
1870deba7fbSSteve Yin }
1880deba7fbSSteve Yin if (nMinRow != nMaxRow)
1890deba7fbSSteve Yin {
1900deba7fbSSteve Yin for (sal_uInt16 col = pSrc->aStart.Col(); col <= pSrc->aEnd.Col();++col)
1910deba7fbSSteve Yin {
1920deba7fbSSteve Yin if (nSize > nMax)
1930deba7fbSSteve Yin {
1940deba7fbSSteve Yin return sal_True;
1950deba7fbSSteve Yin }
1960deba7fbSSteve Yin ScMyAddress cell(col,nMaxRow,pSrc->aStart.Tab());
1970deba7fbSSteve Yin if(!pDest->In(cell))
1980deba7fbSSteve Yin {//In Src ,Not In Dest
1990deba7fbSSteve Yin vecRet.push_back(cell);
2000deba7fbSSteve Yin ++nSize;
2010deba7fbSSteve Yin }
2020deba7fbSSteve Yin }
2030deba7fbSSteve Yin }
2040deba7fbSSteve Yin }
2050deba7fbSSteve Yin return sal_False;
2060deba7fbSSteve Yin }
2070deba7fbSSteve Yin //In Src , Not in Dest
CalcScRangeListDifferenceMax(ScRangeList * pSrc,ScRangeList * pDest,int nMax,VEC_MYADDR & vecRet)2080deba7fbSSteve Yin sal_Bool ScAccessibleSpreadsheet::CalcScRangeListDifferenceMax(ScRangeList *pSrc,ScRangeList *pDest,int nMax,VEC_MYADDR &vecRet)
2090deba7fbSSteve Yin {
2100deba7fbSSteve Yin if (pSrc == NULL || pDest == NULL)
2110deba7fbSSteve Yin {
2120deba7fbSSteve Yin return sal_False;
2130deba7fbSSteve Yin }
2140deba7fbSSteve Yin int nSize =0;
2150deba7fbSSteve Yin if (pDest->GetCellCount() == 0)//if the Dest Rang List is empty
2160deba7fbSSteve Yin {
2170deba7fbSSteve Yin if (pSrc->GetCellCount() > sal_uInt32(nMax))//if the Src Cell count is greater then nMax
2180deba7fbSSteve Yin {
2190deba7fbSSteve Yin return sal_True;
2200deba7fbSSteve Yin }
2210deba7fbSSteve Yin //now the cell count is less then nMax
2220deba7fbSSteve Yin vecRet.reserve(10);
2230deba7fbSSteve Yin ScRange* pRange = pSrc->First();
2240deba7fbSSteve Yin while (pRange)
2250deba7fbSSteve Yin {
2260deba7fbSSteve Yin for (sal_Int32 row = pRange->aStart.Row(); row <= pRange->aEnd.Row();++row)
2270deba7fbSSteve Yin {
2280deba7fbSSteve Yin for (sal_uInt16 col = pRange->aStart.Col(); col <= pRange->aEnd.Col();++col)
2290deba7fbSSteve Yin {
2300deba7fbSSteve Yin vecRet.push_back(ScMyAddress(col,row,pRange->aStart.Tab()));
2310deba7fbSSteve Yin }
2320deba7fbSSteve Yin }
2330deba7fbSSteve Yin pRange = pSrc->Next();
2340deba7fbSSteve Yin }
2350deba7fbSSteve Yin return sal_False;
2360deba7fbSSteve Yin }
2370deba7fbSSteve Yin //the Dest Rang List is not empty
2380deba7fbSSteve Yin vecRet.reserve(10);
2390deba7fbSSteve Yin ScRange* pRange = pSrc->First();
2400deba7fbSSteve Yin while (pRange)
2410deba7fbSSteve Yin {
2420deba7fbSSteve Yin ScRange* pRangeDest = pDest->First();
2430deba7fbSSteve Yin while (pRangeDest)
2440deba7fbSSteve Yin {
2450deba7fbSSteve Yin if (CalcScRangeDifferenceMax(pRange,pRangeDest,nMax,vecRet,nSize))
2460deba7fbSSteve Yin {
2470deba7fbSSteve Yin return sal_True;
2480deba7fbSSteve Yin }
2490deba7fbSSteve Yin pRangeDest = pDest->Next();
2500deba7fbSSteve Yin }
2510deba7fbSSteve Yin pRange = pSrc->Next();
2520deba7fbSSteve Yin }
2530deba7fbSSteve Yin return sal_False;
2540deba7fbSSteve Yin }
255cdf0e10cSrcweir //===== internal ============================================================
256cdf0e10cSrcweir
ScAccessibleSpreadsheet(ScAccessibleDocument * pAccDoc,ScTabViewShell * pViewShell,SCTAB nTab,ScSplitPos eSplitPos)257cdf0e10cSrcweir ScAccessibleSpreadsheet::ScAccessibleSpreadsheet(
258cdf0e10cSrcweir ScAccessibleDocument* pAccDoc,
259cdf0e10cSrcweir ScTabViewShell* pViewShell,
260cdf0e10cSrcweir SCTAB nTab,
261cdf0e10cSrcweir ScSplitPos eSplitPos)
262cdf0e10cSrcweir :
263cdf0e10cSrcweir ScAccessibleTableBase (pAccDoc, GetDocument(pViewShell),
264cdf0e10cSrcweir ScRange(ScAddress(0, 0, nTab),ScAddress(MAXCOL, MAXROW, nTab))),
2650deba7fbSSteve Yin mbIsSpreadsheet( sal_True ),
2660deba7fbSSteve Yin m_bFormulaMode(sal_False),
2670deba7fbSSteve Yin m_bFormulaLastMode(sal_False),
2680deba7fbSSteve Yin m_pAccFormulaCell(NULL),
2690deba7fbSSteve Yin m_nMinX(0),m_nMaxX(0),m_nMinY(0),m_nMaxY(0)
270cdf0e10cSrcweir {
271cdf0e10cSrcweir ConstructScAccessibleSpreadsheet( pAccDoc, pViewShell, nTab, eSplitPos );
272cdf0e10cSrcweir }
273cdf0e10cSrcweir
ScAccessibleSpreadsheet(ScAccessibleSpreadsheet & rParent,const ScRange & rRange)274cdf0e10cSrcweir ScAccessibleSpreadsheet::ScAccessibleSpreadsheet(
275cdf0e10cSrcweir ScAccessibleSpreadsheet& rParent, const ScRange& rRange ) :
276cdf0e10cSrcweir ScAccessibleTableBase( rParent.mpAccDoc, rParent.mpDoc, rRange),
277cdf0e10cSrcweir mbIsSpreadsheet( sal_False )
278cdf0e10cSrcweir {
279cdf0e10cSrcweir ConstructScAccessibleSpreadsheet( rParent.mpAccDoc, rParent.mpViewShell, rParent.mnTab, rParent.meSplitPos );
280cdf0e10cSrcweir }
281cdf0e10cSrcweir
~ScAccessibleSpreadsheet()282cdf0e10cSrcweir ScAccessibleSpreadsheet::~ScAccessibleSpreadsheet()
283cdf0e10cSrcweir {
284cdf0e10cSrcweir if (mpMarkedRanges)
285cdf0e10cSrcweir delete mpMarkedRanges;
286cdf0e10cSrcweir if (mpViewShell)
287cdf0e10cSrcweir mpViewShell->RemoveAccessibilityObject(*this);
288cdf0e10cSrcweir }
289cdf0e10cSrcweir
ConstructScAccessibleSpreadsheet(ScAccessibleDocument * pAccDoc,ScTabViewShell * pViewShell,SCTAB nTab,ScSplitPos eSplitPos)290cdf0e10cSrcweir void ScAccessibleSpreadsheet::ConstructScAccessibleSpreadsheet(
291cdf0e10cSrcweir ScAccessibleDocument* pAccDoc,
292cdf0e10cSrcweir ScTabViewShell* pViewShell,
293cdf0e10cSrcweir SCTAB nTab,
294cdf0e10cSrcweir ScSplitPos eSplitPos)
295cdf0e10cSrcweir {
296cdf0e10cSrcweir mpViewShell = pViewShell;
297cdf0e10cSrcweir mpMarkedRanges = 0;
298cdf0e10cSrcweir mpSortedMarkedCells = 0;
299cdf0e10cSrcweir mpAccDoc = pAccDoc;
300cdf0e10cSrcweir mpAccCell = 0;
301cdf0e10cSrcweir meSplitPos = eSplitPos;
302cdf0e10cSrcweir mnTab = nTab;
303cdf0e10cSrcweir mbHasSelection = sal_False;
304cdf0e10cSrcweir mbDelIns = sal_False;
305cdf0e10cSrcweir mbIsFocusSend = sal_False;
306cdf0e10cSrcweir maVisCells = GetVisCells(GetVisArea(mpViewShell, meSplitPos));
307cdf0e10cSrcweir if (mpViewShell)
308cdf0e10cSrcweir {
309cdf0e10cSrcweir mpViewShell->AddAccessibilityObject(*this);
310cdf0e10cSrcweir
311cdf0e10cSrcweir const ScViewData& rViewData = *mpViewShell->GetViewData();
312cdf0e10cSrcweir const ScMarkData& rMarkData = rViewData.GetMarkData();
313cdf0e10cSrcweir maActiveCell = rViewData.GetCurPos();
314cdf0e10cSrcweir mbHasSelection = rMarkData.GetTableSelect(maActiveCell.Tab()) &&
315cdf0e10cSrcweir (rMarkData.IsMarked() || rMarkData.IsMultiMarked());
316cdf0e10cSrcweir mpAccCell = GetAccessibleCellAt(maActiveCell.Row(), maActiveCell.Col());
317cdf0e10cSrcweir mpAccCell->acquire();
318cdf0e10cSrcweir mpAccCell->Init();
3190deba7fbSSteve Yin ScDocument* pScDoc= GetDocument(mpViewShell);
3200deba7fbSSteve Yin if (pScDoc)
3210deba7fbSSteve Yin {
3220deba7fbSSteve Yin pScDoc->GetName( maActiveCell.Tab(), m_strOldTabName );
3230deba7fbSSteve Yin }
3240deba7fbSSteve Yin }
325cdf0e10cSrcweir }
326cdf0e10cSrcweir
disposing()327cdf0e10cSrcweir void SAL_CALL ScAccessibleSpreadsheet::disposing()
328cdf0e10cSrcweir {
329cdf0e10cSrcweir ScUnoGuard aGuard;
330cdf0e10cSrcweir if (mpViewShell)
331cdf0e10cSrcweir {
332cdf0e10cSrcweir mpViewShell->RemoveAccessibilityObject(*this);
333cdf0e10cSrcweir mpViewShell = NULL;
334cdf0e10cSrcweir }
335cdf0e10cSrcweir if (mpAccCell)
336cdf0e10cSrcweir {
337cdf0e10cSrcweir mpAccCell->release();
338cdf0e10cSrcweir mpAccCell = NULL;
339cdf0e10cSrcweir }
340cdf0e10cSrcweir
341cdf0e10cSrcweir ScAccessibleTableBase::disposing();
342cdf0e10cSrcweir }
343cdf0e10cSrcweir
CompleteSelectionChanged(sal_Bool bNewState)344cdf0e10cSrcweir void ScAccessibleSpreadsheet::CompleteSelectionChanged(sal_Bool bNewState)
345cdf0e10cSrcweir {
3460deba7fbSSteve Yin if (IsFormulaMode())
3470deba7fbSSteve Yin {
3480deba7fbSSteve Yin return ;
3490deba7fbSSteve Yin }
350cdf0e10cSrcweir if (mpMarkedRanges)
351cdf0e10cSrcweir DELETEZ(mpMarkedRanges);
352cdf0e10cSrcweir mbHasSelection = bNewState;
353cdf0e10cSrcweir
354cdf0e10cSrcweir AccessibleEventObject aEvent;
355cdf0e10cSrcweir aEvent.EventId = AccessibleEventId::STATE_CHANGED;
356cdf0e10cSrcweir if (bNewState)
357cdf0e10cSrcweir aEvent.NewValue = uno::makeAny(AccessibleStateType::SELECTED);
358cdf0e10cSrcweir else
359cdf0e10cSrcweir aEvent.OldValue = uno::makeAny(AccessibleStateType::SELECTED);
360cdf0e10cSrcweir aEvent.Source = uno::Reference< XAccessibleContext >(this);
361cdf0e10cSrcweir
362cdf0e10cSrcweir CommitChange(aEvent);
363cdf0e10cSrcweir }
364cdf0e10cSrcweir
LostFocus()365cdf0e10cSrcweir void ScAccessibleSpreadsheet::LostFocus()
366cdf0e10cSrcweir {
367cdf0e10cSrcweir AccessibleEventObject aEvent;
368cdf0e10cSrcweir aEvent.EventId = AccessibleEventId::ACTIVE_DESCENDANT_CHANGED;
369cdf0e10cSrcweir aEvent.Source = uno::Reference< XAccessibleContext >(this);
370cdf0e10cSrcweir uno::Reference< XAccessible > xOld = mpAccCell;
371cdf0e10cSrcweir aEvent.OldValue <<= xOld;
372cdf0e10cSrcweir
373cdf0e10cSrcweir CommitChange(aEvent);
374cdf0e10cSrcweir
375cdf0e10cSrcweir CommitFocusLost();
376cdf0e10cSrcweir }
377cdf0e10cSrcweir
GotFocus()378cdf0e10cSrcweir void ScAccessibleSpreadsheet::GotFocus()
379cdf0e10cSrcweir {
380cdf0e10cSrcweir AccessibleEventObject aEvent;
381cdf0e10cSrcweir aEvent.EventId = AccessibleEventId::ACTIVE_DESCENDANT_CHANGED;
382cdf0e10cSrcweir aEvent.Source = uno::Reference< XAccessibleContext >(this);
3830deba7fbSSteve Yin uno::Reference< XAccessible > xNew;
3840deba7fbSSteve Yin if (IsFormulaMode())
3850deba7fbSSteve Yin {
3860deba7fbSSteve Yin if (!m_pAccFormulaCell || !m_bFormulaLastMode)
3870deba7fbSSteve Yin {
3880deba7fbSSteve Yin ScAddress aFormulaAddr;
3890deba7fbSSteve Yin if(!GetFormulaCurrentFocusCell(aFormulaAddr))
3900deba7fbSSteve Yin {
3910deba7fbSSteve Yin return;
3920deba7fbSSteve Yin }
3930deba7fbSSteve Yin m_pAccFormulaCell = GetAccessibleCellAt(aFormulaAddr.Row(),aFormulaAddr.Col());
3940deba7fbSSteve Yin
3950deba7fbSSteve Yin m_pAccFormulaCell->acquire();
3960deba7fbSSteve Yin m_pAccFormulaCell->Init();
3970deba7fbSSteve Yin
3980deba7fbSSteve Yin
3990deba7fbSSteve Yin }
4000deba7fbSSteve Yin xNew = m_pAccFormulaCell;
4010deba7fbSSteve Yin }
4020deba7fbSSteve Yin else
4030deba7fbSSteve Yin {
4040deba7fbSSteve Yin if(mpAccCell->GetCellAddress() == maActiveCell)
4050deba7fbSSteve Yin {
4060deba7fbSSteve Yin xNew = mpAccCell;
4070deba7fbSSteve Yin }
4080deba7fbSSteve Yin else
4090deba7fbSSteve Yin {
4100deba7fbSSteve Yin CommitFocusCell(maActiveCell);
4110deba7fbSSteve Yin return ;
4120deba7fbSSteve Yin }
4130deba7fbSSteve Yin }
414cdf0e10cSrcweir aEvent.NewValue <<= xNew;
415cdf0e10cSrcweir
416cdf0e10cSrcweir CommitChange(aEvent);
417cdf0e10cSrcweir }
418cdf0e10cSrcweir
BoundingBoxChanged()419cdf0e10cSrcweir void ScAccessibleSpreadsheet::BoundingBoxChanged()
420cdf0e10cSrcweir {
421cdf0e10cSrcweir AccessibleEventObject aEvent;
422cdf0e10cSrcweir aEvent.EventId = AccessibleEventId::BOUNDRECT_CHANGED;
423cdf0e10cSrcweir aEvent.Source = uno::Reference< XAccessibleContext >(this);
424cdf0e10cSrcweir
425cdf0e10cSrcweir CommitChange(aEvent);
426cdf0e10cSrcweir }
427cdf0e10cSrcweir
VisAreaChanged()428cdf0e10cSrcweir void ScAccessibleSpreadsheet::VisAreaChanged()
429cdf0e10cSrcweir {
430cdf0e10cSrcweir AccessibleEventObject aEvent;
431cdf0e10cSrcweir aEvent.EventId = AccessibleEventId::VISIBLE_DATA_CHANGED;
432cdf0e10cSrcweir aEvent.Source = uno::Reference< XAccessibleContext >(this);
433cdf0e10cSrcweir
434cdf0e10cSrcweir CommitChange(aEvent);
435cdf0e10cSrcweir }
436cdf0e10cSrcweir
437cdf0e10cSrcweir //===== SfxListener =====================================================
438cdf0e10cSrcweir
Notify(SfxBroadcaster & rBC,const SfxHint & rHint)439cdf0e10cSrcweir void ScAccessibleSpreadsheet::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
440cdf0e10cSrcweir {
441cdf0e10cSrcweir if (rHint.ISA( SfxSimpleHint ) )
442cdf0e10cSrcweir {
443cdf0e10cSrcweir const SfxSimpleHint& rRef = (const SfxSimpleHint&)rHint;
444cdf0e10cSrcweir if ((rRef.GetId() == SC_HINT_ACC_CURSORCHANGED))
445cdf0e10cSrcweir {
446cdf0e10cSrcweir if (mpViewShell)
447cdf0e10cSrcweir {
4480deba7fbSSteve Yin ScViewData *pViewData = mpViewShell->GetViewData();
449cdf0e10cSrcweir
4500deba7fbSSteve Yin m_bFormulaMode = pViewData->IsRefMode() || SC_MOD()->IsFormulaMode();
4510deba7fbSSteve Yin if ( m_bFormulaMode )
4520deba7fbSSteve Yin {
4530deba7fbSSteve Yin NotifyRefMode();
4540deba7fbSSteve Yin m_bFormulaLastMode = true;
4550deba7fbSSteve Yin return ;
4560deba7fbSSteve Yin }
4570deba7fbSSteve Yin if (m_bFormulaLastMode)
4580deba7fbSSteve Yin {//Last Notify Mode Is Formula Mode.
4590deba7fbSSteve Yin m_vecFormulaLastMyAddr.clear();
4600deba7fbSSteve Yin RemoveFormulaSelection(sal_True);
4610deba7fbSSteve Yin if(m_pAccFormulaCell)
4620deba7fbSSteve Yin {
4630deba7fbSSteve Yin m_pAccFormulaCell->release();
4640deba7fbSSteve Yin m_pAccFormulaCell =NULL;
4650deba7fbSSteve Yin }
4660deba7fbSSteve Yin //Remove All Selection
4670deba7fbSSteve Yin }
4680deba7fbSSteve Yin m_bFormulaLastMode = m_bFormulaMode;
469cdf0e10cSrcweir
4700deba7fbSSteve Yin AccessibleEventObject aEvent;
4710deba7fbSSteve Yin aEvent.Source = uno::Reference< XAccessible >(this);
4720deba7fbSSteve Yin ScAddress aNewCell = pViewData->GetCurPos();
4730deba7fbSSteve Yin if(aNewCell.Tab() != maActiveCell.Tab())
4740deba7fbSSteve Yin {
4750deba7fbSSteve Yin aEvent.EventId = AccessibleEventId::PAGE_CHANGED;
4760deba7fbSSteve Yin ScAccessibleDocument *pAccDoc =
4770deba7fbSSteve Yin static_cast<ScAccessibleDocument*>(getAccessibleParent().get());
4780deba7fbSSteve Yin if(pAccDoc)
4790deba7fbSSteve Yin {
4800deba7fbSSteve Yin pAccDoc->CommitChange(aEvent);
4810deba7fbSSteve Yin }
4820deba7fbSSteve Yin }
4834b4244d8SSteve Yin sal_Bool bNewPosCell = (aNewCell != maActiveCell) || mpViewShell->GetForceFocusOnCurCell(); // i123629
4840deba7fbSSteve Yin sal_Bool bNewPosCellFocus=sal_False;
4850deba7fbSSteve Yin if ( bNewPosCell && IsFocused() && aNewCell.Tab() == maActiveCell.Tab() )
4860deba7fbSSteve Yin {//single Focus
4870deba7fbSSteve Yin bNewPosCellFocus=sal_True;
4880deba7fbSSteve Yin }
4890deba7fbSSteve Yin ScMarkData &refScMarkData = pViewData->GetMarkData();
4900deba7fbSSteve Yin // MT IA2: Not used
4910deba7fbSSteve Yin // int nSelCount = refScMarkData.GetSelectCount();
4920deba7fbSSteve Yin sal_Bool bIsMark =refScMarkData.IsMarked();
4930deba7fbSSteve Yin sal_Bool bIsMultMark = refScMarkData.IsMultiMarked();
4940deba7fbSSteve Yin sal_Bool bNewMarked = refScMarkData.GetTableSelect(aNewCell.Tab()) && ( bIsMark || bIsMultMark );
4950deba7fbSSteve Yin // sal_Bool bNewCellSelected = isAccessibleSelected(aNewCell.Row(), aNewCell.Col());
4960deba7fbSSteve Yin sal_uInt16 nTab = pViewData->GetTabNo();
4970deba7fbSSteve Yin ScRange aMarkRange;
4980deba7fbSSteve Yin refScMarkData.GetMarkArea(aMarkRange);
4990deba7fbSSteve Yin aEvent.OldValue <<= ::com::sun::star::uno::Any();
5000deba7fbSSteve Yin //Mark All
5010deba7fbSSteve Yin if ( !bNewPosCellFocus &&
5020deba7fbSSteve Yin (bNewMarked || bIsMark || bIsMultMark ) &&
5030deba7fbSSteve Yin aMarkRange == ScRange( 0,0,nTab, MAXCOL,MAXROW,nTab ) )
5040deba7fbSSteve Yin {
5050deba7fbSSteve Yin aEvent.EventId = AccessibleEventId::SELECTION_CHANGED_WITHIN;
5060deba7fbSSteve Yin aEvent.NewValue <<= ::com::sun::star::uno::Any();
507cdf0e10cSrcweir CommitChange(aEvent);
5080deba7fbSSteve Yin return ;
5090deba7fbSSteve Yin }
5100deba7fbSSteve Yin if (!mpMarkedRanges)
5110deba7fbSSteve Yin {
5120deba7fbSSteve Yin mpMarkedRanges = new ScRangeList();
5130deba7fbSSteve Yin }
5140deba7fbSSteve Yin refScMarkData.FillRangeListWithMarks(mpMarkedRanges, sal_True);
5150deba7fbSSteve Yin
5160deba7fbSSteve Yin //For Whole Col Row
5170deba7fbSSteve Yin sal_Bool bWholeRow = ::labs(aMarkRange.aStart.Row() - aMarkRange.aEnd.Row()) == MAXROW ;
5180deba7fbSSteve Yin sal_Bool bWholeCol = ::abs(aMarkRange.aStart.Col() - aMarkRange.aEnd.Col()) == MAXCOL ;
5190deba7fbSSteve Yin if ((bNewMarked || bIsMark || bIsMultMark ) && (bWholeCol || bWholeRow))
5200deba7fbSSteve Yin {
5210deba7fbSSteve Yin if ( aMarkRange != m_aLastWithInMarkRange )
5220deba7fbSSteve Yin {
5230deba7fbSSteve Yin RemoveSelection(refScMarkData);
5240deba7fbSSteve Yin if(bNewPosCell)
5250deba7fbSSteve Yin {
5260deba7fbSSteve Yin CommitFocusCell(aNewCell);
5270deba7fbSSteve Yin }
5280deba7fbSSteve Yin sal_Bool bLastIsWholeColRow =
5290deba7fbSSteve Yin ::labs(m_aLastWithInMarkRange.aStart.Row() - m_aLastWithInMarkRange.aEnd.Row()) == MAXROW && bWholeRow ||
5300deba7fbSSteve Yin ::abs(m_aLastWithInMarkRange.aStart.Col() - m_aLastWithInMarkRange.aEnd.Col()) == MAXCOL && bWholeCol ;
5310deba7fbSSteve Yin sal_Bool bSelSmaller=
5320deba7fbSSteve Yin bLastIsWholeColRow &&
5330deba7fbSSteve Yin !aMarkRange.In(m_aLastWithInMarkRange) &&
5340deba7fbSSteve Yin aMarkRange.Intersects(m_aLastWithInMarkRange);
5350deba7fbSSteve Yin if( !bSelSmaller )
5360deba7fbSSteve Yin {
5370deba7fbSSteve Yin aEvent.EventId = AccessibleEventId::SELECTION_CHANGED_WITHIN;
5380deba7fbSSteve Yin aEvent.NewValue <<= ::com::sun::star::uno::Any();
5390deba7fbSSteve Yin CommitChange(aEvent);
5400deba7fbSSteve Yin }
5410deba7fbSSteve Yin m_aLastWithInMarkRange = aMarkRange;
5420deba7fbSSteve Yin }
5430deba7fbSSteve Yin return ;
544cdf0e10cSrcweir }
5450deba7fbSSteve Yin m_aLastWithInMarkRange = aMarkRange;
5460deba7fbSSteve Yin int nNewMarkCount = mpMarkedRanges->GetCellCount();
5470deba7fbSSteve Yin sal_Bool bSendSingle= (0 == nNewMarkCount) && bNewPosCell;
5480deba7fbSSteve Yin if (bSendSingle)
5490deba7fbSSteve Yin {
5500deba7fbSSteve Yin RemoveSelection(refScMarkData);
5510deba7fbSSteve Yin if(bNewPosCellFocus)
5520deba7fbSSteve Yin {
5530deba7fbSSteve Yin CommitFocusCell(aNewCell);
5540deba7fbSSteve Yin }
5550deba7fbSSteve Yin uno::Reference< XAccessible > xChild ;
5560deba7fbSSteve Yin if (bNewPosCellFocus)
5570deba7fbSSteve Yin {
5580deba7fbSSteve Yin xChild = mpAccCell;
5590deba7fbSSteve Yin }
5600deba7fbSSteve Yin else
5610deba7fbSSteve Yin {
5620deba7fbSSteve Yin xChild = getAccessibleCellAt(aNewCell.Row(),aNewCell.Col());
5630deba7fbSSteve Yin
5640deba7fbSSteve Yin maActiveCell = aNewCell;
5650deba7fbSSteve Yin aEvent.EventId = AccessibleEventId::ACTIVE_DESCENDANT_CHANGED_NOFOCUS;
5660deba7fbSSteve Yin aEvent.NewValue <<= xChild;
5670deba7fbSSteve Yin aEvent.OldValue <<= uno::Reference< XAccessible >();
5680deba7fbSSteve Yin CommitChange(aEvent);
5690deba7fbSSteve Yin }
5700deba7fbSSteve Yin aEvent.EventId = AccessibleEventId::SELECTION_CHANGED;
5710deba7fbSSteve Yin aEvent.NewValue <<= xChild;
572cdf0e10cSrcweir CommitChange(aEvent);
5730deba7fbSSteve Yin OSL_ASSERT(m_mapSelectionSend.count(aNewCell) == 0 );
5740deba7fbSSteve Yin m_mapSelectionSend.insert(MAP_ADDR_XACC::value_type(aNewCell,xChild));
5750deba7fbSSteve Yin
5760deba7fbSSteve Yin }
5770deba7fbSSteve Yin else
5780deba7fbSSteve Yin {
5790deba7fbSSteve Yin ScRange aDelRange;
5800deba7fbSSteve Yin sal_Bool bIsDel = pViewData->GetDelMark( aDelRange );
5810deba7fbSSteve Yin if ( (!bIsDel || (bIsDel && aMarkRange != aDelRange)) &&
5820deba7fbSSteve Yin bNewMarked &&
5830deba7fbSSteve Yin nNewMarkCount > 0 &&
5840deba7fbSSteve Yin !IsSameMarkCell() )
5850deba7fbSSteve Yin {
5860deba7fbSSteve Yin RemoveSelection(refScMarkData);
5870deba7fbSSteve Yin if(bNewPosCellFocus)
5880deba7fbSSteve Yin {
5890deba7fbSSteve Yin CommitFocusCell(aNewCell);
5900deba7fbSSteve Yin }
5910deba7fbSSteve Yin VEC_MYADDR vecNew;
5920deba7fbSSteve Yin if(CalcScRangeListDifferenceMax(mpMarkedRanges,&m_LastMarkedRanges,10,vecNew))
5930deba7fbSSteve Yin {
5940deba7fbSSteve Yin aEvent.EventId = AccessibleEventId::SELECTION_CHANGED_WITHIN;
5950deba7fbSSteve Yin aEvent.NewValue <<= ::com::sun::star::uno::Any();
5960deba7fbSSteve Yin CommitChange(aEvent);
5970deba7fbSSteve Yin }
5980deba7fbSSteve Yin else
5990deba7fbSSteve Yin {
6000deba7fbSSteve Yin VEC_MYADDR::iterator viAddr = vecNew.begin();
6010deba7fbSSteve Yin for(; viAddr < vecNew.end() ; ++viAddr )
6020deba7fbSSteve Yin {
6030deba7fbSSteve Yin uno::Reference< XAccessible > xChild = getAccessibleCellAt(viAddr->Row(),viAddr->Col());
6040deba7fbSSteve Yin if (!(bNewPosCellFocus && *viAddr == aNewCell) )
6050deba7fbSSteve Yin {
6060deba7fbSSteve Yin aEvent.EventId = AccessibleEventId::ACTIVE_DESCENDANT_CHANGED_NOFOCUS;
6070deba7fbSSteve Yin aEvent.NewValue <<= xChild;
6080deba7fbSSteve Yin CommitChange(aEvent);
6090deba7fbSSteve Yin }
6100deba7fbSSteve Yin aEvent.EventId = AccessibleEventId::SELECTION_CHANGED_ADD;
6110deba7fbSSteve Yin aEvent.NewValue <<= xChild;
6120deba7fbSSteve Yin CommitChange(aEvent);
6130deba7fbSSteve Yin m_mapSelectionSend.insert(MAP_ADDR_XACC::value_type(*viAddr,xChild));
6140deba7fbSSteve Yin }
6150deba7fbSSteve Yin }
6160deba7fbSSteve Yin }
6170deba7fbSSteve Yin }
6180deba7fbSSteve Yin if (bNewPosCellFocus && maActiveCell != aNewCell)
6190deba7fbSSteve Yin {
6200deba7fbSSteve Yin CommitFocusCell(aNewCell);
6210deba7fbSSteve Yin }
6220deba7fbSSteve Yin m_LastMarkedRanges = *mpMarkedRanges;
623cdf0e10cSrcweir }
624cdf0e10cSrcweir }
625cdf0e10cSrcweir else if ((rRef.GetId() == SC_HINT_DATACHANGED))
626cdf0e10cSrcweir {
627cdf0e10cSrcweir if (!mbDelIns)
628cdf0e10cSrcweir CommitTableModelChange(maRange.aStart.Row(), maRange.aStart.Col(), maRange.aEnd.Row(), maRange.aEnd.Col(), AccessibleTableModelChangeType::UPDATE);
629cdf0e10cSrcweir else
630cdf0e10cSrcweir mbDelIns = sal_False;
6310deba7fbSSteve Yin ScViewData *pViewData = mpViewShell->GetViewData();
6320deba7fbSSteve Yin ScAddress aNewCell = pViewData->GetCurPos();
6330deba7fbSSteve Yin if( maActiveCell == aNewCell)
6340deba7fbSSteve Yin {
6350deba7fbSSteve Yin ScDocument* pScDoc= GetDocument(mpViewShell);
6360deba7fbSSteve Yin if (pScDoc)
6370deba7fbSSteve Yin {
6380deba7fbSSteve Yin String valStr;
6390deba7fbSSteve Yin pScDoc->GetString(aNewCell.Col(),aNewCell.Row(),aNewCell.Tab(), valStr);
6400deba7fbSSteve Yin if(m_strCurCellValue != valStr)
6410deba7fbSSteve Yin {
6420deba7fbSSteve Yin AccessibleEventObject aEvent;
6430deba7fbSSteve Yin aEvent.EventId = AccessibleEventId::VALUE_CHANGED;
6440deba7fbSSteve Yin mpAccCell->CommitChange(aEvent);
6450deba7fbSSteve Yin m_strCurCellValue=valStr;
6460deba7fbSSteve Yin }
6470deba7fbSSteve Yin String tabName;
6480deba7fbSSteve Yin pScDoc->GetName( maActiveCell.Tab(), tabName );
6490deba7fbSSteve Yin if( m_strOldTabName != tabName )
6500deba7fbSSteve Yin {
6510deba7fbSSteve Yin AccessibleEventObject aEvent;
6520deba7fbSSteve Yin aEvent.EventId = AccessibleEventId::NAME_CHANGED;
6530deba7fbSSteve Yin String sOldName(ScResId(STR_ACC_TABLE_NAME));
6540deba7fbSSteve Yin sOldName.SearchAndReplaceAscii("%1", m_strOldTabName);
6550deba7fbSSteve Yin aEvent.OldValue <<= ::rtl::OUString( sOldName );
6560deba7fbSSteve Yin String sNewName(ScResId(STR_ACC_TABLE_NAME));
6570deba7fbSSteve Yin sNewName.SearchAndReplaceAscii("%1", tabName);
6580deba7fbSSteve Yin aEvent.NewValue <<= ::rtl::OUString( sNewName );
6590deba7fbSSteve Yin CommitChange( aEvent );
6600deba7fbSSteve Yin m_strOldTabName = tabName;
6610deba7fbSSteve Yin }
6620deba7fbSSteve Yin }
6630deba7fbSSteve Yin }
6640deba7fbSSteve Yin }
665cdf0e10cSrcweir // no longer needed, because the document calls the VisAreaChanged method
666cdf0e10cSrcweir /* else if (rRef.GetId() == SC_HINT_ACC_VISAREACHANGED)
667cdf0e10cSrcweir {
668cdf0e10cSrcweir AccessibleEventObject aEvent;
669cdf0e10cSrcweir aEvent.EventId = AccessibleEventId::VISIBLE_DATA_CHANGED;
670cdf0e10cSrcweir aEvent.Source = uno::Reference< XAccessibleContext >(this);
671cdf0e10cSrcweir
672cdf0e10cSrcweir CommitChange(aEvent);*/
673cdf0e10cSrcweir // commented out, because to use a ModelChangeEvent is not the right way
674cdf0e10cSrcweir // at the moment there is no way, but the Java/Gnome Api should be extended sometime
675cdf0e10cSrcweir /* if (mpViewShell)
676cdf0e10cSrcweir {
677cdf0e10cSrcweir Rectangle aNewVisCells(GetVisCells(GetVisArea(mpViewShell, meSplitPos)));
678cdf0e10cSrcweir
679cdf0e10cSrcweir Rectangle aNewPos(aNewVisCells);
680cdf0e10cSrcweir
681cdf0e10cSrcweir if (aNewVisCells.IsOver(maVisCells))
682cdf0e10cSrcweir aNewPos.Union(maVisCells);
683cdf0e10cSrcweir else
684cdf0e10cSrcweir CommitTableModelChange(maVisCells.Top(), maVisCells.Left(), maVisCells.Bottom(), maVisCells.Right(), AccessibleTableModelChangeType::UPDATE);
685cdf0e10cSrcweir
686cdf0e10cSrcweir maVisCells = aNewVisCells;
687cdf0e10cSrcweir
688cdf0e10cSrcweir CommitTableModelChange(aNewPos.Top(), aNewPos.Left(), aNewPos.Bottom(), aNewPos.Right(), AccessibleTableModelChangeType::UPDATE);
689cdf0e10cSrcweir }
690cdf0e10cSrcweir }*/
691cdf0e10cSrcweir // no longer needed, because the document calls the BoundingBoxChanged method
692cdf0e10cSrcweir /* else if (rRef.GetId() == SC_HINT_ACC_WINDOWRESIZED)
693cdf0e10cSrcweir {
694cdf0e10cSrcweir AccessibleEventObject aEvent;
695cdf0e10cSrcweir aEvent.EventId = AccessibleEventId::BOUNDRECT_CHANGED;
696cdf0e10cSrcweir aEvent.Source = uno::Reference< XAccessibleContext >(this);
697cdf0e10cSrcweir
698cdf0e10cSrcweir CommitChange(aEvent);
699cdf0e10cSrcweir }*/
700cdf0e10cSrcweir }
701cdf0e10cSrcweir else if (rHint.ISA( ScUpdateRefHint ))
702cdf0e10cSrcweir {
703cdf0e10cSrcweir const ScUpdateRefHint& rRef = (const ScUpdateRefHint&)rHint;
704cdf0e10cSrcweir if (rRef.GetMode() == URM_INSDEL && rRef.GetDz() == 0) //#107250# test whether table is inserted or deleted
705cdf0e10cSrcweir {
706cdf0e10cSrcweir if (((rRef.GetRange().aStart.Col() == maRange.aStart.Col()) &&
707cdf0e10cSrcweir (rRef.GetRange().aEnd.Col() == maRange.aEnd.Col())) ||
708cdf0e10cSrcweir ((rRef.GetRange().aStart.Row() == maRange.aStart.Row()) &&
709cdf0e10cSrcweir (rRef.GetRange().aEnd.Row() == maRange.aEnd.Row())))
710cdf0e10cSrcweir {
711cdf0e10cSrcweir // ignore next SC_HINT_DATACHANGED notification
712cdf0e10cSrcweir mbDelIns = sal_True;
713cdf0e10cSrcweir
714cdf0e10cSrcweir sal_Int16 nId(0);
715cdf0e10cSrcweir SCsCOL nX(rRef.GetDx());
716cdf0e10cSrcweir SCsROW nY(rRef.GetDy());
717cdf0e10cSrcweir ScRange aRange(rRef.GetRange());
718cdf0e10cSrcweir if ((nX < 0) || (nY < 0))
719cdf0e10cSrcweir {
720cdf0e10cSrcweir DBG_ASSERT(!((nX < 0) && (nY < 0)), "should not be possible to remove row and column at the same time");
721cdf0e10cSrcweir nId = AccessibleTableModelChangeType::DELETE;
722cdf0e10cSrcweir if (nX < 0)
723cdf0e10cSrcweir {
724cdf0e10cSrcweir nX = -nX;
725cdf0e10cSrcweir nY = aRange.aEnd.Row() - aRange.aStart.Row();
726cdf0e10cSrcweir }
727cdf0e10cSrcweir else
728cdf0e10cSrcweir {
729cdf0e10cSrcweir nY = -nY;
730cdf0e10cSrcweir nX = aRange.aEnd.Col() - aRange.aStart.Col();
731cdf0e10cSrcweir }
732cdf0e10cSrcweir }
733cdf0e10cSrcweir else if ((nX > 0) || (nY > 0))
734cdf0e10cSrcweir {
735cdf0e10cSrcweir DBG_ASSERT(!((nX > 0) && (nY > 0)), "should not be possible to add row and column at the same time");
736cdf0e10cSrcweir nId = AccessibleTableModelChangeType::INSERT;
737cdf0e10cSrcweir if (nX < 0)
738cdf0e10cSrcweir nY = aRange.aEnd.Row() - aRange.aStart.Row();
739cdf0e10cSrcweir else
740cdf0e10cSrcweir nX = aRange.aEnd.Col() - aRange.aStart.Col();
741cdf0e10cSrcweir }
742cdf0e10cSrcweir else
743cdf0e10cSrcweir {
744cdf0e10cSrcweir DBG_ERROR("is it a deletion or a insertion?");
745cdf0e10cSrcweir }
746cdf0e10cSrcweir
747cdf0e10cSrcweir CommitTableModelChange(rRef.GetRange().aStart.Row(),
748cdf0e10cSrcweir rRef.GetRange().aStart.Col(),
749cdf0e10cSrcweir rRef.GetRange().aStart.Row() + nY,
750cdf0e10cSrcweir rRef.GetRange().aStart.Col() + nX, nId);
751cdf0e10cSrcweir
752cdf0e10cSrcweir AccessibleEventObject aEvent;
753cdf0e10cSrcweir aEvent.EventId = AccessibleEventId::ACTIVE_DESCENDANT_CHANGED;
754cdf0e10cSrcweir aEvent.Source = uno::Reference< XAccessibleContext >(this);
755cdf0e10cSrcweir uno::Reference< XAccessible > xNew = mpAccCell;
756cdf0e10cSrcweir aEvent.NewValue <<= xNew;
757cdf0e10cSrcweir
758cdf0e10cSrcweir CommitChange(aEvent);
759cdf0e10cSrcweir }
760cdf0e10cSrcweir }
761cdf0e10cSrcweir }
762cdf0e10cSrcweir
763cdf0e10cSrcweir ScAccessibleTableBase::Notify(rBC, rHint);
764cdf0e10cSrcweir }
RemoveSelection(ScMarkData & refScMarkData)7650deba7fbSSteve Yin void ScAccessibleSpreadsheet::RemoveSelection(ScMarkData &refScMarkData)
7660deba7fbSSteve Yin {
7670deba7fbSSteve Yin AccessibleEventObject aEvent;
7680deba7fbSSteve Yin aEvent.Source = uno::Reference< XAccessible >(this);
7690deba7fbSSteve Yin aEvent.OldValue <<= ::com::sun::star::uno::Any();
7700deba7fbSSteve Yin MAP_ADDR_XACC::iterator miRemove = m_mapSelectionSend.begin();
7710deba7fbSSteve Yin for(; miRemove != m_mapSelectionSend.end() ;)
7720deba7fbSSteve Yin {
7730deba7fbSSteve Yin if (refScMarkData.IsCellMarked(miRemove->first.Col(),miRemove->first.Row(),sal_True) ||
7740deba7fbSSteve Yin refScMarkData.IsCellMarked(miRemove->first.Col(),miRemove->first.Row(),sal_False) )
7750deba7fbSSteve Yin {
7760deba7fbSSteve Yin ++miRemove;
7770deba7fbSSteve Yin continue;
7780deba7fbSSteve Yin }
7790deba7fbSSteve Yin aEvent.EventId = AccessibleEventId::SELECTION_CHANGED_REMOVE;
7800deba7fbSSteve Yin aEvent.NewValue <<= miRemove->second;
7810deba7fbSSteve Yin CommitChange(aEvent);
7820deba7fbSSteve Yin MAP_ADDR_XACC::iterator miNext = miRemove;
7830deba7fbSSteve Yin ++miNext;
7840deba7fbSSteve Yin m_mapSelectionSend.erase(miRemove);
7850deba7fbSSteve Yin miRemove = miNext;
7860deba7fbSSteve Yin }
7870deba7fbSSteve Yin }
CommitFocusCell(const ScAddress & aNewCell)7880deba7fbSSteve Yin void ScAccessibleSpreadsheet::CommitFocusCell(const ScAddress &aNewCell)
7890deba7fbSSteve Yin {
7900deba7fbSSteve Yin OSL_ASSERT(!IsFormulaMode());
7910deba7fbSSteve Yin if(IsFormulaMode())
7920deba7fbSSteve Yin {
7930deba7fbSSteve Yin return ;
7940deba7fbSSteve Yin }
7950deba7fbSSteve Yin AccessibleEventObject aEvent;
7960deba7fbSSteve Yin aEvent.EventId = AccessibleEventId::ACTIVE_DESCENDANT_CHANGED;
7970deba7fbSSteve Yin aEvent.Source = uno::Reference< XAccessible >(this);
7980deba7fbSSteve Yin uno::Reference< XAccessible > xOld = mpAccCell;
7990deba7fbSSteve Yin mpAccCell->release();
8000deba7fbSSteve Yin mpAccCell=NULL;
8010deba7fbSSteve Yin aEvent.OldValue <<= xOld;
8020deba7fbSSteve Yin mpAccCell = GetAccessibleCellAt(aNewCell.Row(), aNewCell.Col());
8030deba7fbSSteve Yin mpAccCell->acquire();
8040deba7fbSSteve Yin mpAccCell->Init();
8050deba7fbSSteve Yin uno::Reference< XAccessible > xNew = mpAccCell;
8060deba7fbSSteve Yin aEvent.NewValue <<= xNew;
8070deba7fbSSteve Yin maActiveCell = aNewCell;
8080deba7fbSSteve Yin ScDocument* pScDoc= GetDocument(mpViewShell);
8090deba7fbSSteve Yin if (pScDoc)
8100deba7fbSSteve Yin {
8110deba7fbSSteve Yin pScDoc->GetString(maActiveCell.Col(),maActiveCell.Row(),maActiveCell.Tab(), m_strCurCellValue);
8120deba7fbSSteve Yin }
8130deba7fbSSteve Yin CommitChange(aEvent);
8140deba7fbSSteve Yin }
IsSameMarkCell()8150deba7fbSSteve Yin sal_Bool ScAccessibleSpreadsheet::IsSameMarkCell()
8160deba7fbSSteve Yin {
8170deba7fbSSteve Yin return m_LastMarkedRanges == *mpMarkedRanges;
8180deba7fbSSteve Yin }
819cdf0e10cSrcweir //===== XAccessibleTable ================================================
820cdf0e10cSrcweir
getAccessibleRowHeaders()821cdf0e10cSrcweir uno::Reference< XAccessibleTable > SAL_CALL ScAccessibleSpreadsheet::getAccessibleRowHeaders( )
822cdf0e10cSrcweir throw (uno::RuntimeException)
823cdf0e10cSrcweir {
824cdf0e10cSrcweir ScUnoGuard aGuard;
825cdf0e10cSrcweir IsObjectValid();
826cdf0e10cSrcweir uno::Reference< XAccessibleTable > xAccessibleTable;
827cdf0e10cSrcweir if( mpDoc && mbIsSpreadsheet )
828cdf0e10cSrcweir {
829cdf0e10cSrcweir if( const ScRange* pRowRange = mpDoc->GetRepeatRowRange( mnTab ) )
830cdf0e10cSrcweir {
831cdf0e10cSrcweir SCROW nStart = pRowRange->aStart.Row();
832cdf0e10cSrcweir SCROW nEnd = pRowRange->aEnd.Row();
833cdf0e10cSrcweir if( (0 <= nStart) && (nStart <= nEnd) && (nEnd <= MAXROW) )
834cdf0e10cSrcweir xAccessibleTable.set( new ScAccessibleSpreadsheet( *this, ScRange( 0, nStart, mnTab, MAXCOL, nEnd, mnTab ) ) );
835cdf0e10cSrcweir }
836cdf0e10cSrcweir }
837cdf0e10cSrcweir return xAccessibleTable;
838cdf0e10cSrcweir }
839cdf0e10cSrcweir
getAccessibleColumnHeaders()840cdf0e10cSrcweir uno::Reference< XAccessibleTable > SAL_CALL ScAccessibleSpreadsheet::getAccessibleColumnHeaders( )
841cdf0e10cSrcweir throw (uno::RuntimeException)
842cdf0e10cSrcweir {
843cdf0e10cSrcweir ScUnoGuard aGuard;
844cdf0e10cSrcweir IsObjectValid();
845cdf0e10cSrcweir uno::Reference< XAccessibleTable > xAccessibleTable;
846cdf0e10cSrcweir if( mpDoc && mbIsSpreadsheet )
847cdf0e10cSrcweir {
848cdf0e10cSrcweir if( const ScRange* pColRange = mpDoc->GetRepeatColRange( mnTab ) )
849cdf0e10cSrcweir {
850cdf0e10cSrcweir SCCOL nStart = pColRange->aStart.Col();
851cdf0e10cSrcweir SCCOL nEnd = pColRange->aEnd.Col();
852cdf0e10cSrcweir if( (0 <= nStart) && (nStart <= nEnd) && (nEnd <= MAXCOL) )
853cdf0e10cSrcweir xAccessibleTable.set( new ScAccessibleSpreadsheet( *this, ScRange( nStart, 0, mnTab, nEnd, MAXROW, mnTab ) ) );
854cdf0e10cSrcweir }
855cdf0e10cSrcweir }
856cdf0e10cSrcweir return xAccessibleTable;
857cdf0e10cSrcweir }
858cdf0e10cSrcweir
getSelectedAccessibleRows()859cdf0e10cSrcweir uno::Sequence< sal_Int32 > SAL_CALL ScAccessibleSpreadsheet::getSelectedAccessibleRows( )
860cdf0e10cSrcweir throw (uno::RuntimeException)
861cdf0e10cSrcweir {
862cdf0e10cSrcweir ScUnoGuard aGuard;
863cdf0e10cSrcweir IsObjectValid();
864cdf0e10cSrcweir uno::Sequence<sal_Int32> aSequence;
8650deba7fbSSteve Yin if (IsFormulaMode())
8660deba7fbSSteve Yin {
8670deba7fbSSteve Yin return aSequence;
8680deba7fbSSteve Yin }
869cdf0e10cSrcweir if (mpViewShell && mpViewShell->GetViewData())
870cdf0e10cSrcweir {
871cdf0e10cSrcweir aSequence.realloc(maRange.aEnd.Row() - maRange.aStart.Row() + 1);
872cdf0e10cSrcweir const ScMarkData& rMarkdata = mpViewShell->GetViewData()->GetMarkData();
873cdf0e10cSrcweir sal_Int32* pSequence = aSequence.getArray();
874cdf0e10cSrcweir sal_Int32 nCount(0);
875cdf0e10cSrcweir for (SCROW i = maRange.aStart.Row(); i <= maRange.aEnd.Row(); ++i)
876cdf0e10cSrcweir {
877cdf0e10cSrcweir if (rMarkdata.IsRowMarked(i))
878cdf0e10cSrcweir {
879cdf0e10cSrcweir pSequence[nCount] = i;
880cdf0e10cSrcweir ++nCount;
881cdf0e10cSrcweir }
882cdf0e10cSrcweir }
883cdf0e10cSrcweir aSequence.realloc(nCount);
884cdf0e10cSrcweir }
885cdf0e10cSrcweir else
886cdf0e10cSrcweir aSequence.realloc(0);
887cdf0e10cSrcweir return aSequence;
888cdf0e10cSrcweir }
889cdf0e10cSrcweir
getSelectedAccessibleColumns()890cdf0e10cSrcweir uno::Sequence< sal_Int32 > SAL_CALL ScAccessibleSpreadsheet::getSelectedAccessibleColumns( )
891cdf0e10cSrcweir throw (uno::RuntimeException)
892cdf0e10cSrcweir {
893cdf0e10cSrcweir ScUnoGuard aGuard;
894cdf0e10cSrcweir IsObjectValid();
895cdf0e10cSrcweir uno::Sequence<sal_Int32> aSequence;
8960deba7fbSSteve Yin if (IsFormulaMode())
8970deba7fbSSteve Yin {
8980deba7fbSSteve Yin return aSequence;
8990deba7fbSSteve Yin }
900cdf0e10cSrcweir if (mpViewShell && mpViewShell->GetViewData())
901cdf0e10cSrcweir {
902cdf0e10cSrcweir aSequence.realloc(maRange.aEnd.Col() - maRange.aStart.Col() + 1);
903cdf0e10cSrcweir const ScMarkData& rMarkdata = mpViewShell->GetViewData()->GetMarkData();
904cdf0e10cSrcweir sal_Int32* pSequence = aSequence.getArray();
905cdf0e10cSrcweir sal_Int32 nCount(0);
906cdf0e10cSrcweir for (SCCOL i = maRange.aStart.Col(); i <= maRange.aEnd.Col(); ++i)
907cdf0e10cSrcweir {
908cdf0e10cSrcweir if (rMarkdata.IsColumnMarked(i))
909cdf0e10cSrcweir {
910cdf0e10cSrcweir pSequence[nCount] = i;
911cdf0e10cSrcweir ++nCount;
912cdf0e10cSrcweir }
913cdf0e10cSrcweir }
914cdf0e10cSrcweir aSequence.realloc(nCount);
915cdf0e10cSrcweir }
916cdf0e10cSrcweir else
917cdf0e10cSrcweir aSequence.realloc(0);
918cdf0e10cSrcweir return aSequence;
919cdf0e10cSrcweir }
920cdf0e10cSrcweir
isAccessibleRowSelected(sal_Int32 nRow)921cdf0e10cSrcweir sal_Bool SAL_CALL ScAccessibleSpreadsheet::isAccessibleRowSelected( sal_Int32 nRow )
922cdf0e10cSrcweir throw (uno::RuntimeException, lang::IndexOutOfBoundsException)
923cdf0e10cSrcweir {
924cdf0e10cSrcweir ScUnoGuard aGuard;
925cdf0e10cSrcweir IsObjectValid();
9260deba7fbSSteve Yin if (IsFormulaMode())
9270deba7fbSSteve Yin {
9280deba7fbSSteve Yin return sal_False;
9290deba7fbSSteve Yin }
930cdf0e10cSrcweir
931cdf0e10cSrcweir if ((nRow > (maRange.aEnd.Row() - maRange.aStart.Row())) || (nRow < 0))
932cdf0e10cSrcweir throw lang::IndexOutOfBoundsException();
933cdf0e10cSrcweir
934cdf0e10cSrcweir sal_Bool bResult(sal_False);
935cdf0e10cSrcweir if (mpViewShell && mpViewShell->GetViewData())
936cdf0e10cSrcweir {
937cdf0e10cSrcweir const ScMarkData& rMarkdata = mpViewShell->GetViewData()->GetMarkData();
938cdf0e10cSrcweir bResult = rMarkdata.IsRowMarked((SCROW)nRow);
939cdf0e10cSrcweir }
940cdf0e10cSrcweir return bResult;
941cdf0e10cSrcweir }
942cdf0e10cSrcweir
isAccessibleColumnSelected(sal_Int32 nColumn)943cdf0e10cSrcweir sal_Bool SAL_CALL ScAccessibleSpreadsheet::isAccessibleColumnSelected( sal_Int32 nColumn )
944cdf0e10cSrcweir throw (uno::RuntimeException, lang::IndexOutOfBoundsException)
945cdf0e10cSrcweir {
946cdf0e10cSrcweir ScUnoGuard aGuard;
947cdf0e10cSrcweir IsObjectValid();
948cdf0e10cSrcweir
9490deba7fbSSteve Yin if (IsFormulaMode())
9500deba7fbSSteve Yin {
9510deba7fbSSteve Yin return sal_False;
9520deba7fbSSteve Yin }
953cdf0e10cSrcweir if ((nColumn > (maRange.aEnd.Col() - maRange.aStart.Col())) || (nColumn < 0))
954cdf0e10cSrcweir throw lang::IndexOutOfBoundsException();
955cdf0e10cSrcweir
956cdf0e10cSrcweir sal_Bool bResult(sal_False);
957cdf0e10cSrcweir if (mpViewShell && mpViewShell->GetViewData())
958cdf0e10cSrcweir {
959cdf0e10cSrcweir const ScMarkData& rMarkdata = mpViewShell->GetViewData()->GetMarkData();
960cdf0e10cSrcweir bResult = rMarkdata.IsColumnMarked((SCCOL)nColumn);
961cdf0e10cSrcweir }
962cdf0e10cSrcweir return bResult;
963cdf0e10cSrcweir }
964cdf0e10cSrcweir
GetAccessibleCellAt(sal_Int32 nRow,sal_Int32 nColumn)965cdf0e10cSrcweir ScAccessibleCell* ScAccessibleSpreadsheet::GetAccessibleCellAt(sal_Int32 nRow, sal_Int32 nColumn)
966cdf0e10cSrcweir {
967cdf0e10cSrcweir ScAccessibleCell* pAccessibleCell = NULL;
9680deba7fbSSteve Yin if (IsFormulaMode())
9690deba7fbSSteve Yin {
9700deba7fbSSteve Yin ScAddress aCellAddress(static_cast<SCCOL>(nColumn), nRow, mpViewShell->GetViewData()->GetTabNo());
9710deba7fbSSteve Yin if ((aCellAddress == m_aFormulaActiveCell) && m_pAccFormulaCell)
9720deba7fbSSteve Yin {
9730deba7fbSSteve Yin pAccessibleCell = m_pAccFormulaCell;
9740deba7fbSSteve Yin }
9750deba7fbSSteve Yin else
9760deba7fbSSteve Yin pAccessibleCell = new ScAccessibleCell(this, mpViewShell, aCellAddress, GetAccessibleIndexFormula(nRow, nColumn), meSplitPos, mpAccDoc);
9770deba7fbSSteve Yin }
9780deba7fbSSteve Yin else
9790deba7fbSSteve Yin {
980cdf0e10cSrcweir ScAddress aCellAddress(static_cast<SCCOL>(maRange.aStart.Col() + nColumn),
981cdf0e10cSrcweir static_cast<SCROW>(maRange.aStart.Row() + nRow), maRange.aStart.Tab());
982cdf0e10cSrcweir if ((aCellAddress == maActiveCell) && mpAccCell)
983cdf0e10cSrcweir {
984cdf0e10cSrcweir pAccessibleCell = mpAccCell;
985cdf0e10cSrcweir }
986cdf0e10cSrcweir else
987cdf0e10cSrcweir pAccessibleCell = new ScAccessibleCell(this, mpViewShell, aCellAddress, getAccessibleIndex(nRow, nColumn), meSplitPos, mpAccDoc);
9880deba7fbSSteve Yin }
989cdf0e10cSrcweir
990cdf0e10cSrcweir return pAccessibleCell;
991cdf0e10cSrcweir }
992cdf0e10cSrcweir
getAccessibleCellAt(sal_Int32 nRow,sal_Int32 nColumn)993cdf0e10cSrcweir uno::Reference< XAccessible > SAL_CALL ScAccessibleSpreadsheet::getAccessibleCellAt( sal_Int32 nRow, sal_Int32 nColumn )
994cdf0e10cSrcweir throw (uno::RuntimeException, lang::IndexOutOfBoundsException)
995cdf0e10cSrcweir {
996cdf0e10cSrcweir ScUnoGuard aGuard;
997cdf0e10cSrcweir IsObjectValid();
9980deba7fbSSteve Yin if (!IsFormulaMode())
9990deba7fbSSteve Yin {
1000cdf0e10cSrcweir if (nRow > (maRange.aEnd.Row() - maRange.aStart.Row()) ||
1001cdf0e10cSrcweir nRow < 0 ||
1002cdf0e10cSrcweir nColumn > (maRange.aEnd.Col() - maRange.aStart.Col()) ||
1003cdf0e10cSrcweir nColumn < 0)
1004cdf0e10cSrcweir throw lang::IndexOutOfBoundsException();
10050deba7fbSSteve Yin }
1006cdf0e10cSrcweir uno::Reference<XAccessible> xAccessible;
1007cdf0e10cSrcweir ScAccessibleCell* pAccessibleCell = GetAccessibleCellAt(nRow, nColumn);
1008cdf0e10cSrcweir xAccessible = pAccessibleCell;
1009cdf0e10cSrcweir pAccessibleCell->Init();
1010cdf0e10cSrcweir return xAccessible;
1011cdf0e10cSrcweir }
1012cdf0e10cSrcweir
isAccessibleSelected(sal_Int32 nRow,sal_Int32 nColumn)1013cdf0e10cSrcweir sal_Bool SAL_CALL ScAccessibleSpreadsheet::isAccessibleSelected( sal_Int32 nRow, sal_Int32 nColumn )
1014cdf0e10cSrcweir throw (uno::RuntimeException, lang::IndexOutOfBoundsException)
1015cdf0e10cSrcweir {
1016cdf0e10cSrcweir ScUnoGuard aGuard;
1017cdf0e10cSrcweir IsObjectValid();
1018cdf0e10cSrcweir
10190deba7fbSSteve Yin if (IsFormulaMode())
10200deba7fbSSteve Yin {
10210deba7fbSSteve Yin ScAddress addr(static_cast<SCCOL>(nColumn), nRow, 0);
10220deba7fbSSteve Yin return IsScAddrFormulaSel(addr);
10230deba7fbSSteve Yin }
1024cdf0e10cSrcweir if ((nColumn > (maRange.aEnd.Col() - maRange.aStart.Col())) || (nColumn < 0) ||
1025cdf0e10cSrcweir (nRow > (maRange.aEnd.Row() - maRange.aStart.Row())) || (nRow < 0))
1026cdf0e10cSrcweir throw lang::IndexOutOfBoundsException();
1027cdf0e10cSrcweir
1028cdf0e10cSrcweir sal_Bool bResult(sal_False);
1029cdf0e10cSrcweir if (mpViewShell)
1030cdf0e10cSrcweir {
1031cdf0e10cSrcweir const ScMarkData& rMarkdata = mpViewShell->GetViewData()->GetMarkData();
1032cdf0e10cSrcweir bResult = rMarkdata.IsCellMarked(static_cast<SCCOL>(nColumn), static_cast<SCROW>(nRow));
1033cdf0e10cSrcweir }
1034cdf0e10cSrcweir return bResult;
1035cdf0e10cSrcweir }
1036cdf0e10cSrcweir
1037cdf0e10cSrcweir //===== XAccessibleComponent ============================================
1038cdf0e10cSrcweir
getAccessibleAtPoint(const awt::Point & rPoint)1039cdf0e10cSrcweir uno::Reference< XAccessible > SAL_CALL ScAccessibleSpreadsheet::getAccessibleAtPoint(
1040cdf0e10cSrcweir const awt::Point& rPoint )
1041cdf0e10cSrcweir throw (uno::RuntimeException)
1042cdf0e10cSrcweir {
1043cdf0e10cSrcweir uno::Reference< XAccessible > xAccessible;
1044cdf0e10cSrcweir if (containsPoint(rPoint))
1045cdf0e10cSrcweir {
1046cdf0e10cSrcweir ScUnoGuard aGuard;
1047cdf0e10cSrcweir IsObjectValid();
1048cdf0e10cSrcweir if (mpViewShell)
1049cdf0e10cSrcweir {
1050cdf0e10cSrcweir SCsCOL nX;
1051cdf0e10cSrcweir SCsROW nY;
1052cdf0e10cSrcweir mpViewShell->GetViewData()->GetPosFromPixel( rPoint.X, rPoint.Y, meSplitPos, nX, nY);
10530deba7fbSSteve Yin try{
1054cdf0e10cSrcweir xAccessible = getAccessibleCellAt(nY, nX);
10550deba7fbSSteve Yin }
10560deba7fbSSteve Yin catch( ::com::sun::star::lang::IndexOutOfBoundsException e)
10570deba7fbSSteve Yin {
10580deba7fbSSteve Yin return NULL;
10590deba7fbSSteve Yin }
1060cdf0e10cSrcweir }
1061cdf0e10cSrcweir }
1062cdf0e10cSrcweir return xAccessible;
1063cdf0e10cSrcweir }
1064cdf0e10cSrcweir
grabFocus()1065cdf0e10cSrcweir void SAL_CALL ScAccessibleSpreadsheet::grabFocus( )
1066cdf0e10cSrcweir throw (uno::RuntimeException)
1067cdf0e10cSrcweir {
1068cdf0e10cSrcweir if (getAccessibleParent().is())
1069cdf0e10cSrcweir {
1070cdf0e10cSrcweir uno::Reference<XAccessibleComponent> xAccessibleComponent(getAccessibleParent()->getAccessibleContext(), uno::UNO_QUERY);
1071cdf0e10cSrcweir if (xAccessibleComponent.is())
1072cdf0e10cSrcweir xAccessibleComponent->grabFocus();
1073cdf0e10cSrcweir }
1074cdf0e10cSrcweir }
1075cdf0e10cSrcweir
getForeground()1076cdf0e10cSrcweir sal_Int32 SAL_CALL ScAccessibleSpreadsheet::getForeground( )
1077cdf0e10cSrcweir throw (uno::RuntimeException)
1078cdf0e10cSrcweir {
1079cdf0e10cSrcweir return COL_BLACK;
1080cdf0e10cSrcweir }
1081cdf0e10cSrcweir
getBackground()1082cdf0e10cSrcweir sal_Int32 SAL_CALL ScAccessibleSpreadsheet::getBackground( )
1083cdf0e10cSrcweir throw (uno::RuntimeException)
1084cdf0e10cSrcweir {
1085cdf0e10cSrcweir ScUnoGuard aGuard;
1086cdf0e10cSrcweir IsObjectValid();
1087cdf0e10cSrcweir return SC_MOD()->GetColorConfig().GetColorValue( ::svtools::DOCCOLOR ).nColor;
1088cdf0e10cSrcweir }
1089cdf0e10cSrcweir
1090cdf0e10cSrcweir //===== XAccessibleContext ==============================================
1091cdf0e10cSrcweir
getAccessibleRelationSet(void)1092cdf0e10cSrcweir uno::Reference<XAccessibleRelationSet> SAL_CALL ScAccessibleSpreadsheet::getAccessibleRelationSet(void)
1093cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException)
1094cdf0e10cSrcweir {
1095cdf0e10cSrcweir utl::AccessibleRelationSetHelper* pRelationSet = NULL;
1096cdf0e10cSrcweir if(mpAccDoc)
1097cdf0e10cSrcweir pRelationSet = mpAccDoc->GetRelationSet(NULL);
1098cdf0e10cSrcweir if (!pRelationSet)
1099cdf0e10cSrcweir pRelationSet = new utl::AccessibleRelationSetHelper();
1100cdf0e10cSrcweir return pRelationSet;
1101cdf0e10cSrcweir }
1102cdf0e10cSrcweir
1103cdf0e10cSrcweir uno::Reference<XAccessibleStateSet> SAL_CALL
getAccessibleStateSet(void)1104cdf0e10cSrcweir ScAccessibleSpreadsheet::getAccessibleStateSet(void)
1105cdf0e10cSrcweir throw (uno::RuntimeException)
1106cdf0e10cSrcweir {
1107cdf0e10cSrcweir ScUnoGuard aGuard;
1108cdf0e10cSrcweir uno::Reference<XAccessibleStateSet> xParentStates;
1109cdf0e10cSrcweir if (getAccessibleParent().is())
1110cdf0e10cSrcweir {
1111cdf0e10cSrcweir uno::Reference<XAccessibleContext> xParentContext = getAccessibleParent()->getAccessibleContext();
1112cdf0e10cSrcweir xParentStates = xParentContext->getAccessibleStateSet();
1113cdf0e10cSrcweir }
1114cdf0e10cSrcweir utl::AccessibleStateSetHelper* pStateSet = new utl::AccessibleStateSetHelper();
1115cdf0e10cSrcweir if (IsDefunc(xParentStates))
1116cdf0e10cSrcweir pStateSet->AddState(AccessibleStateType::DEFUNC);
1117cdf0e10cSrcweir else
1118cdf0e10cSrcweir {
1119cdf0e10cSrcweir pStateSet->AddState(AccessibleStateType::MANAGES_DESCENDANTS);
1120cdf0e10cSrcweir if (IsEditable(xParentStates))
1121cdf0e10cSrcweir pStateSet->AddState(AccessibleStateType::EDITABLE);
1122cdf0e10cSrcweir pStateSet->AddState(AccessibleStateType::ENABLED);
1123cdf0e10cSrcweir pStateSet->AddState(AccessibleStateType::FOCUSABLE);
1124cdf0e10cSrcweir if (IsFocused())
1125cdf0e10cSrcweir pStateSet->AddState(AccessibleStateType::FOCUSED);
1126cdf0e10cSrcweir pStateSet->AddState(AccessibleStateType::MULTI_SELECTABLE);
1127cdf0e10cSrcweir pStateSet->AddState(AccessibleStateType::OPAQUE);
1128cdf0e10cSrcweir pStateSet->AddState(AccessibleStateType::SELECTABLE);
1129cdf0e10cSrcweir if (IsCompleteSheetSelected())
1130cdf0e10cSrcweir pStateSet->AddState(AccessibleStateType::SELECTED);
1131cdf0e10cSrcweir if (isShowing())
1132cdf0e10cSrcweir pStateSet->AddState(AccessibleStateType::SHOWING);
1133cdf0e10cSrcweir if (isVisible())
1134cdf0e10cSrcweir pStateSet->AddState(AccessibleStateType::VISIBLE);
1135cdf0e10cSrcweir }
1136cdf0e10cSrcweir return pStateSet;
1137cdf0e10cSrcweir }
1138cdf0e10cSrcweir
1139cdf0e10cSrcweir ///===== XAccessibleSelection ===========================================
1140cdf0e10cSrcweir
1141cdf0e10cSrcweir void SAL_CALL
selectAccessibleChild(sal_Int32 nChildIndex)1142cdf0e10cSrcweir ScAccessibleSpreadsheet::selectAccessibleChild( sal_Int32 nChildIndex )
1143cdf0e10cSrcweir throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
1144cdf0e10cSrcweir {
1145cdf0e10cSrcweir ScUnoGuard aGuard;
1146cdf0e10cSrcweir IsObjectValid();
1147cdf0e10cSrcweir if (nChildIndex < 0 || nChildIndex >= getAccessibleChildCount())
1148cdf0e10cSrcweir throw lang::IndexOutOfBoundsException();
1149cdf0e10cSrcweir
1150cdf0e10cSrcweir if (mpViewShell)
1151cdf0e10cSrcweir {
1152cdf0e10cSrcweir sal_Int32 nCol(getAccessibleColumn(nChildIndex));
1153cdf0e10cSrcweir sal_Int32 nRow(getAccessibleRow(nChildIndex));
1154cdf0e10cSrcweir
1155cdf0e10cSrcweir SelectCell(nRow, nCol, sal_False);
1156cdf0e10cSrcweir }
1157cdf0e10cSrcweir }
1158cdf0e10cSrcweir
1159cdf0e10cSrcweir void SAL_CALL
clearAccessibleSelection()1160cdf0e10cSrcweir ScAccessibleSpreadsheet::clearAccessibleSelection( )
1161cdf0e10cSrcweir throw (uno::RuntimeException)
1162cdf0e10cSrcweir {
1163cdf0e10cSrcweir ScUnoGuard aGuard;
1164cdf0e10cSrcweir IsObjectValid();
1165cdf0e10cSrcweir if (mpViewShell)
1166cdf0e10cSrcweir {
11670deba7fbSSteve Yin if (!IsFormulaMode())
1168cdf0e10cSrcweir mpViewShell->Unmark();
1169cdf0e10cSrcweir }
1170cdf0e10cSrcweir }
1171cdf0e10cSrcweir
1172cdf0e10cSrcweir void SAL_CALL
selectAllAccessibleChildren()1173cdf0e10cSrcweir ScAccessibleSpreadsheet::selectAllAccessibleChildren( )
1174cdf0e10cSrcweir throw (uno::RuntimeException)
1175cdf0e10cSrcweir {
1176cdf0e10cSrcweir ScUnoGuard aGuard;
1177cdf0e10cSrcweir IsObjectValid();
1178cdf0e10cSrcweir if (mpViewShell)
1179cdf0e10cSrcweir {
11800deba7fbSSteve Yin if (IsFormulaMode())
11810deba7fbSSteve Yin {
11820deba7fbSSteve Yin ScViewData *pViewData = mpViewShell->GetViewData();
11830deba7fbSSteve Yin mpViewShell->InitRefMode( 0, 0, pViewData->GetTabNo(), SC_REFTYPE_REF );
11840deba7fbSSteve Yin pViewData->SetRefStart(0,0,pViewData->GetTabNo());
11850deba7fbSSteve Yin pViewData->SetRefStart(MAXCOL,MAXROW,pViewData->GetTabNo());
11860deba7fbSSteve Yin mpViewShell->UpdateRef(MAXCOL, MAXROW, pViewData->GetTabNo());
11870deba7fbSSteve Yin }
11880deba7fbSSteve Yin else
1189cdf0e10cSrcweir mpViewShell->SelectAll();
1190cdf0e10cSrcweir }
1191cdf0e10cSrcweir }
1192cdf0e10cSrcweir
1193cdf0e10cSrcweir sal_Int32 SAL_CALL
getSelectedAccessibleChildCount()1194cdf0e10cSrcweir ScAccessibleSpreadsheet::getSelectedAccessibleChildCount( )
1195cdf0e10cSrcweir throw (uno::RuntimeException)
1196cdf0e10cSrcweir {
1197cdf0e10cSrcweir ScUnoGuard aGuard;
1198cdf0e10cSrcweir IsObjectValid();
1199cdf0e10cSrcweir sal_Int32 nResult(0);
1200cdf0e10cSrcweir if (mpViewShell)
1201cdf0e10cSrcweir {
12020deba7fbSSteve Yin if (IsFormulaMode())
12030deba7fbSSteve Yin {
12040deba7fbSSteve Yin nResult = GetRowAll() * GetColAll() ;
12050deba7fbSSteve Yin }
12060deba7fbSSteve Yin else
12070deba7fbSSteve Yin {
1208cdf0e10cSrcweir if (!mpMarkedRanges)
1209cdf0e10cSrcweir {
1210cdf0e10cSrcweir mpMarkedRanges = new ScRangeList();
1211cdf0e10cSrcweir ScMarkData aMarkData(mpViewShell->GetViewData()->GetMarkData());
12120deba7fbSSteve Yin //aMarkData.MarkToMulti();
1213cdf0e10cSrcweir aMarkData.FillRangeListWithMarks(mpMarkedRanges, sal_False);
1214cdf0e10cSrcweir }
1215cdf0e10cSrcweir // is possible, because there shouldn't be overlapped ranges in it
1216cdf0e10cSrcweir if (mpMarkedRanges)
1217cdf0e10cSrcweir nResult = mpMarkedRanges->GetCellCount();
12180deba7fbSSteve Yin }
1219cdf0e10cSrcweir }
1220cdf0e10cSrcweir return nResult;
1221cdf0e10cSrcweir }
1222cdf0e10cSrcweir
1223cdf0e10cSrcweir uno::Reference<XAccessible > SAL_CALL
getSelectedAccessibleChild(sal_Int32 nSelectedChildIndex)1224cdf0e10cSrcweir ScAccessibleSpreadsheet::getSelectedAccessibleChild( sal_Int32 nSelectedChildIndex )
1225cdf0e10cSrcweir throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
1226cdf0e10cSrcweir {
1227cdf0e10cSrcweir ScUnoGuard aGuard;
1228cdf0e10cSrcweir IsObjectValid();
1229cdf0e10cSrcweir uno::Reference < XAccessible > xAccessible;
12300deba7fbSSteve Yin if (IsFormulaMode())
12310deba7fbSSteve Yin {
12320deba7fbSSteve Yin if(CheckChildIndex(nSelectedChildIndex))
12330deba7fbSSteve Yin {
12340deba7fbSSteve Yin ScAddress addr = GetChildIndexAddress(nSelectedChildIndex);
12350deba7fbSSteve Yin xAccessible = getAccessibleCellAt(addr.Row(), addr.Col());
12360deba7fbSSteve Yin }
12370deba7fbSSteve Yin return xAccessible;
12380deba7fbSSteve Yin }
1239cdf0e10cSrcweir if (mpViewShell)
1240cdf0e10cSrcweir {
1241cdf0e10cSrcweir if (!mpMarkedRanges)
1242cdf0e10cSrcweir {
1243cdf0e10cSrcweir mpMarkedRanges = new ScRangeList();
1244cdf0e10cSrcweir mpViewShell->GetViewData()->GetMarkData().FillRangeListWithMarks(mpMarkedRanges, sal_False);
1245cdf0e10cSrcweir }
1246cdf0e10cSrcweir if (mpMarkedRanges)
1247cdf0e10cSrcweir {
12480deba7fbSSteve Yin //if (!mpSortedMarkedCells)
12490deba7fbSSteve Yin // CreateSortedMarkedCells();
12500deba7fbSSteve Yin //if (mpSortedMarkedCells)
12510deba7fbSSteve Yin //{
12520deba7fbSSteve Yin // if ((nSelectedChildIndex < 0) ||
12530deba7fbSSteve Yin // (mpSortedMarkedCells->size() <= static_cast<sal_uInt32>(nSelectedChildIndex)))
12540deba7fbSSteve Yin // throw lang::IndexOutOfBoundsException();
12550deba7fbSSteve Yin // else
12560deba7fbSSteve Yin // xAccessible = getAccessibleCellAt((*mpSortedMarkedCells)[nSelectedChildIndex].Row(), (*mpSortedMarkedCells)[nSelectedChildIndex].Col());
12570deba7fbSSteve Yin if ((nSelectedChildIndex < 0) ||
12580deba7fbSSteve Yin (mpMarkedRanges->GetCellCount() <= static_cast<sal_uInt32>(nSelectedChildIndex)))
1259cdf0e10cSrcweir {
12600deba7fbSSteve Yin throw lang::IndexOutOfBoundsException();
1261cdf0e10cSrcweir }
12620deba7fbSSteve Yin ScMyAddress addr = CalcScAddressFromRangeList(mpMarkedRanges,nSelectedChildIndex);
12630deba7fbSSteve Yin if( m_mapSelectionSend.find(addr) != m_mapSelectionSend.end() )
12640deba7fbSSteve Yin xAccessible = m_mapSelectionSend[addr];
12650deba7fbSSteve Yin else
12660deba7fbSSteve Yin xAccessible = getAccessibleCellAt(addr.Row(), addr.Col());
1267cdf0e10cSrcweir }
1268cdf0e10cSrcweir }
1269cdf0e10cSrcweir return xAccessible;
1270cdf0e10cSrcweir }
1271cdf0e10cSrcweir
1272cdf0e10cSrcweir void SAL_CALL
deselectAccessibleChild(sal_Int32 nChildIndex)1273cdf0e10cSrcweir ScAccessibleSpreadsheet::deselectAccessibleChild( sal_Int32 nChildIndex )
1274cdf0e10cSrcweir throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
1275cdf0e10cSrcweir {
1276cdf0e10cSrcweir ScUnoGuard aGuard;
1277cdf0e10cSrcweir IsObjectValid();
1278cdf0e10cSrcweir
1279cdf0e10cSrcweir if (nChildIndex < 0 || nChildIndex >= getAccessibleChildCount())
1280cdf0e10cSrcweir throw lang::IndexOutOfBoundsException();
1281cdf0e10cSrcweir
1282cdf0e10cSrcweir if (mpViewShell)
1283cdf0e10cSrcweir {
1284cdf0e10cSrcweir sal_Int32 nCol(getAccessibleColumn(nChildIndex));
1285cdf0e10cSrcweir sal_Int32 nRow(getAccessibleRow(nChildIndex));
1286cdf0e10cSrcweir
12870deba7fbSSteve Yin if (IsFormulaMode())
12880deba7fbSSteve Yin {
12890deba7fbSSteve Yin if(IsScAddrFormulaSel(
12900deba7fbSSteve Yin ScAddress(static_cast<SCCOL>(nCol), nRow,mpViewShell->GetViewData()->GetTabNo()))
12910deba7fbSSteve Yin )
12920deba7fbSSteve Yin {
12930deba7fbSSteve Yin SelectCell(nRow, nCol, sal_True);
12940deba7fbSSteve Yin }
12950deba7fbSSteve Yin return ;
12960deba7fbSSteve Yin }
1297cdf0e10cSrcweir if (mpViewShell->GetViewData()->GetMarkData().IsCellMarked(static_cast<SCCOL>(nCol), static_cast<SCROW>(nRow)))
1298cdf0e10cSrcweir SelectCell(nRow, nCol, sal_True);
1299cdf0e10cSrcweir }
1300cdf0e10cSrcweir }
1301cdf0e10cSrcweir
SelectCell(sal_Int32 nRow,sal_Int32 nCol,sal_Bool bDeselect)1302cdf0e10cSrcweir void ScAccessibleSpreadsheet::SelectCell(sal_Int32 nRow, sal_Int32 nCol, sal_Bool bDeselect)
1303cdf0e10cSrcweir {
13040deba7fbSSteve Yin if (IsFormulaMode())
1305cdf0e10cSrcweir {
13060deba7fbSSteve Yin if (bDeselect)
13070deba7fbSSteve Yin {//??
13080deba7fbSSteve Yin return ;
1309cdf0e10cSrcweir }
1310cdf0e10cSrcweir else
1311cdf0e10cSrcweir {
13120deba7fbSSteve Yin ScViewData *pViewData = mpViewShell->GetViewData();
13130deba7fbSSteve Yin
13140deba7fbSSteve Yin mpViewShell->InitRefMode( static_cast<SCCOL>(nCol), nRow, pViewData->GetTabNo(), SC_REFTYPE_REF );
13150deba7fbSSteve Yin mpViewShell->UpdateRef(static_cast<SCCOL>(nCol), nRow, pViewData->GetTabNo());
1316cdf0e10cSrcweir }
13170deba7fbSSteve Yin return ;
1318cdf0e10cSrcweir }
13190deba7fbSSteve Yin mpViewShell->SetTabNo( maRange.aStart.Tab() );
1320cdf0e10cSrcweir
13210deba7fbSSteve Yin mpViewShell->DoneBlockMode( sal_True ); // continue selecting
13220deba7fbSSteve Yin mpViewShell->InitBlockMode( static_cast<SCCOL>(nCol), static_cast<SCROW>(nRow), maRange.aStart.Tab(), bDeselect, sal_False, sal_False );
13230deba7fbSSteve Yin
13240deba7fbSSteve Yin mpViewShell->SelectionChanged();
13250deba7fbSSteve Yin }
1326cdf0e10cSrcweir
1327cdf0e10cSrcweir //===== XServiceInfo ====================================================
1328cdf0e10cSrcweir
getImplementationName(void)1329cdf0e10cSrcweir ::rtl::OUString SAL_CALL ScAccessibleSpreadsheet::getImplementationName(void)
1330cdf0e10cSrcweir throw (uno::RuntimeException)
1331cdf0e10cSrcweir {
1332cdf0e10cSrcweir return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM ("ScAccessibleSpreadsheet"));
1333cdf0e10cSrcweir }
1334cdf0e10cSrcweir
1335cdf0e10cSrcweir uno::Sequence< ::rtl::OUString> SAL_CALL
getSupportedServiceNames(void)1336cdf0e10cSrcweir ScAccessibleSpreadsheet::getSupportedServiceNames (void)
1337cdf0e10cSrcweir throw (uno::RuntimeException)
1338cdf0e10cSrcweir {
1339cdf0e10cSrcweir uno::Sequence< ::rtl::OUString > aSequence = ScAccessibleTableBase::getSupportedServiceNames();
1340cdf0e10cSrcweir sal_Int32 nOldSize(aSequence.getLength());
1341cdf0e10cSrcweir aSequence.realloc(nOldSize + 1);
1342cdf0e10cSrcweir ::rtl::OUString* pNames = aSequence.getArray();
1343cdf0e10cSrcweir
1344cdf0e10cSrcweir pNames[nOldSize] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.AccessibleSpreadsheet"));
1345cdf0e10cSrcweir
1346cdf0e10cSrcweir return aSequence;
1347cdf0e10cSrcweir }
1348cdf0e10cSrcweir
1349cdf0e10cSrcweir //===== XTypeProvider =======================================================
1350cdf0e10cSrcweir
1351cdf0e10cSrcweir uno::Sequence<sal_Int8> SAL_CALL
getImplementationId(void)1352cdf0e10cSrcweir ScAccessibleSpreadsheet::getImplementationId(void)
1353cdf0e10cSrcweir throw (uno::RuntimeException)
1354cdf0e10cSrcweir {
1355cdf0e10cSrcweir ScUnoGuard aGuard;
1356cdf0e10cSrcweir IsObjectValid();
1357cdf0e10cSrcweir static uno::Sequence<sal_Int8> aId;
1358cdf0e10cSrcweir if (aId.getLength() == 0)
1359cdf0e10cSrcweir {
1360cdf0e10cSrcweir aId.realloc (16);
1361cdf0e10cSrcweir rtl_createUuid (reinterpret_cast<sal_uInt8 *>(aId.getArray()), 0, sal_True);
1362cdf0e10cSrcweir }
1363cdf0e10cSrcweir return aId;
1364cdf0e10cSrcweir }
1365cdf0e10cSrcweir
1366cdf0e10cSrcweir ///===== XAccessibleEventBroadcaster =====================================
1367cdf0e10cSrcweir
addEventListener(const uno::Reference<XAccessibleEventListener> & xListener)1368cdf0e10cSrcweir void SAL_CALL ScAccessibleSpreadsheet::addEventListener(const uno::Reference<XAccessibleEventListener>& xListener)
1369cdf0e10cSrcweir throw (uno::RuntimeException)
1370cdf0e10cSrcweir {
1371cdf0e10cSrcweir ScUnoGuard aGuard;
1372cdf0e10cSrcweir IsObjectValid();
1373cdf0e10cSrcweir ScAccessibleTableBase::addEventListener(xListener);
1374cdf0e10cSrcweir }
1375cdf0e10cSrcweir
1376cdf0e10cSrcweir //==== internal =========================================================
1377cdf0e10cSrcweir
GetBoundingBoxOnScreen() const1378cdf0e10cSrcweir Rectangle ScAccessibleSpreadsheet::GetBoundingBoxOnScreen() const
1379cdf0e10cSrcweir throw (uno::RuntimeException)
1380cdf0e10cSrcweir {
1381cdf0e10cSrcweir Rectangle aRect;
1382cdf0e10cSrcweir if (mpViewShell)
1383cdf0e10cSrcweir {
1384cdf0e10cSrcweir Window* pWindow = mpViewShell->GetWindowByPos(meSplitPos);
1385cdf0e10cSrcweir if (pWindow)
1386cdf0e10cSrcweir aRect = pWindow->GetWindowExtentsRelative(NULL);
1387cdf0e10cSrcweir }
1388cdf0e10cSrcweir return aRect;
1389cdf0e10cSrcweir }
1390cdf0e10cSrcweir
GetBoundingBox() const1391cdf0e10cSrcweir Rectangle ScAccessibleSpreadsheet::GetBoundingBox() const
1392cdf0e10cSrcweir throw (uno::RuntimeException)
1393cdf0e10cSrcweir {
1394cdf0e10cSrcweir Rectangle aRect;
1395cdf0e10cSrcweir if (mpViewShell)
1396cdf0e10cSrcweir {
1397cdf0e10cSrcweir Window* pWindow = mpViewShell->GetWindowByPos(meSplitPos);
1398cdf0e10cSrcweir if (pWindow)
1399cdf0e10cSrcweir //#101986#; extends to the same window, because the parent is the document and it has the same window
1400cdf0e10cSrcweir aRect = pWindow->GetWindowExtentsRelative(pWindow);
1401cdf0e10cSrcweir }
1402cdf0e10cSrcweir return aRect;
1403cdf0e10cSrcweir }
1404cdf0e10cSrcweir
IsDefunc(const uno::Reference<XAccessibleStateSet> & rxParentStates)1405cdf0e10cSrcweir sal_Bool ScAccessibleSpreadsheet::IsDefunc(
1406cdf0e10cSrcweir const uno::Reference<XAccessibleStateSet>& rxParentStates)
1407cdf0e10cSrcweir {
1408cdf0e10cSrcweir return ScAccessibleContextBase::IsDefunc() || (mpViewShell == NULL) || !getAccessibleParent().is() ||
1409cdf0e10cSrcweir (rxParentStates.is() && rxParentStates->contains(AccessibleStateType::DEFUNC));
1410cdf0e10cSrcweir }
1411cdf0e10cSrcweir
IsEditable(const uno::Reference<XAccessibleStateSet> &)1412cdf0e10cSrcweir sal_Bool ScAccessibleSpreadsheet::IsEditable(
1413cdf0e10cSrcweir const uno::Reference<XAccessibleStateSet>& /* rxParentStates */)
1414cdf0e10cSrcweir {
14150deba7fbSSteve Yin if (IsFormulaMode())
14160deba7fbSSteve Yin {
14170deba7fbSSteve Yin return sal_False;
14180deba7fbSSteve Yin }
1419cdf0e10cSrcweir sal_Bool bProtected(sal_False);
1420cdf0e10cSrcweir if (mpDoc && mpDoc->IsTabProtected(maRange.aStart.Tab()))
1421cdf0e10cSrcweir bProtected = sal_True;
1422cdf0e10cSrcweir return !bProtected;
1423cdf0e10cSrcweir }
1424cdf0e10cSrcweir
IsFocused()1425cdf0e10cSrcweir sal_Bool ScAccessibleSpreadsheet::IsFocused()
1426cdf0e10cSrcweir {
1427cdf0e10cSrcweir sal_Bool bFocused(sal_False);
1428cdf0e10cSrcweir if (mpViewShell)
1429cdf0e10cSrcweir {
1430cdf0e10cSrcweir if (mpViewShell->GetViewData()->GetActivePart() == meSplitPos)
1431cdf0e10cSrcweir bFocused = mpViewShell->GetActiveWin()->HasFocus();
1432cdf0e10cSrcweir }
1433cdf0e10cSrcweir return bFocused;
1434cdf0e10cSrcweir }
1435cdf0e10cSrcweir
IsCompleteSheetSelected()1436cdf0e10cSrcweir sal_Bool ScAccessibleSpreadsheet::IsCompleteSheetSelected()
1437cdf0e10cSrcweir {
14380deba7fbSSteve Yin if (IsFormulaMode())
14390deba7fbSSteve Yin {
14400deba7fbSSteve Yin return sal_False;
14410deba7fbSSteve Yin }
1442cdf0e10cSrcweir sal_Bool bResult(sal_False);
1443cdf0e10cSrcweir if(mpViewShell)
1444cdf0e10cSrcweir {
1445cdf0e10cSrcweir //#103800#; use a copy of MarkData
1446cdf0e10cSrcweir ScMarkData aMarkData(mpViewShell->GetViewData()->GetMarkData());
1447cdf0e10cSrcweir aMarkData.MarkToMulti();
1448cdf0e10cSrcweir if (aMarkData.IsAllMarked(maRange))
1449cdf0e10cSrcweir bResult = sal_True;
1450cdf0e10cSrcweir }
1451cdf0e10cSrcweir return bResult;
1452cdf0e10cSrcweir }
1453cdf0e10cSrcweir
GetDocument(ScTabViewShell * pViewShell)1454cdf0e10cSrcweir ScDocument* ScAccessibleSpreadsheet::GetDocument(ScTabViewShell* pViewShell)
1455cdf0e10cSrcweir {
1456cdf0e10cSrcweir ScDocument* pDoc = NULL;
1457cdf0e10cSrcweir if (pViewShell)
1458cdf0e10cSrcweir pDoc = pViewShell->GetViewData()->GetDocument();
1459cdf0e10cSrcweir return pDoc;
1460cdf0e10cSrcweir }
1461cdf0e10cSrcweir
GetVisArea(ScTabViewShell * pViewShell,ScSplitPos eSplitPos)1462cdf0e10cSrcweir Rectangle ScAccessibleSpreadsheet::GetVisArea(ScTabViewShell* pViewShell, ScSplitPos eSplitPos)
1463cdf0e10cSrcweir {
1464cdf0e10cSrcweir Rectangle aVisArea;
1465cdf0e10cSrcweir if (pViewShell)
1466cdf0e10cSrcweir {
1467cdf0e10cSrcweir Window* pWindow = pViewShell->GetWindowByPos(eSplitPos);
1468cdf0e10cSrcweir if (pWindow)
1469cdf0e10cSrcweir {
1470cdf0e10cSrcweir aVisArea.SetPos(pViewShell->GetViewData()->GetPixPos(eSplitPos));
1471cdf0e10cSrcweir aVisArea.SetSize(pWindow->GetSizePixel());
1472cdf0e10cSrcweir }
1473cdf0e10cSrcweir }
1474cdf0e10cSrcweir return aVisArea;
1475cdf0e10cSrcweir }
1476cdf0e10cSrcweir
GetVisCells(const Rectangle & rVisArea)1477cdf0e10cSrcweir Rectangle ScAccessibleSpreadsheet::GetVisCells(const Rectangle& rVisArea)
1478cdf0e10cSrcweir {
1479cdf0e10cSrcweir if (mpViewShell)
1480cdf0e10cSrcweir {
1481cdf0e10cSrcweir SCsCOL nStartX, nEndX;
1482cdf0e10cSrcweir SCsROW nStartY, nEndY;
1483cdf0e10cSrcweir
1484cdf0e10cSrcweir mpViewShell->GetViewData()->GetPosFromPixel( 1, 1, meSplitPos, nStartX, nStartY);
1485cdf0e10cSrcweir mpViewShell->GetViewData()->GetPosFromPixel( rVisArea.GetWidth(), rVisArea.GetHeight(), meSplitPos, nEndX, nEndY);
1486cdf0e10cSrcweir
1487cdf0e10cSrcweir return Rectangle(nStartX, nStartY, nEndX, nEndY);
1488cdf0e10cSrcweir }
1489cdf0e10cSrcweir else
1490cdf0e10cSrcweir return Rectangle();
1491cdf0e10cSrcweir }
selectRow(sal_Int32 row)14920deba7fbSSteve Yin sal_Bool SAL_CALL ScAccessibleSpreadsheet::selectRow( sal_Int32 row )
1493*4937ceefSSteve Yin throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
14940deba7fbSSteve Yin {
14950deba7fbSSteve Yin if (IsFormulaMode())
14960deba7fbSSteve Yin {
14970deba7fbSSteve Yin return sal_False;
14980deba7fbSSteve Yin }
14990deba7fbSSteve Yin
15000deba7fbSSteve Yin mpViewShell->SetTabNo( maRange.aStart.Tab() );
15010deba7fbSSteve Yin mpViewShell->DoneBlockMode( sal_True ); // continue selecting
15020deba7fbSSteve Yin mpViewShell->InitBlockMode( 0, row, maRange.aStart.Tab(), sal_False, sal_False, sal_True );
15030deba7fbSSteve Yin mpViewShell->MarkCursor( MAXCOL, row, maRange.aStart.Tab(), sal_False, sal_True );
15040deba7fbSSteve Yin mpViewShell->SelectionChanged();
15050deba7fbSSteve Yin return sal_True;
15060deba7fbSSteve Yin }
15070deba7fbSSteve Yin
selectColumn(sal_Int32 column)15080deba7fbSSteve Yin sal_Bool SAL_CALL ScAccessibleSpreadsheet::selectColumn( sal_Int32 column )
1509*4937ceefSSteve Yin throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
15100deba7fbSSteve Yin {
15110deba7fbSSteve Yin if (IsFormulaMode())
15120deba7fbSSteve Yin {
15130deba7fbSSteve Yin return sal_False;
15140deba7fbSSteve Yin }
15150deba7fbSSteve Yin
15160deba7fbSSteve Yin mpViewShell->SetTabNo( maRange.aStart.Tab() );
15170deba7fbSSteve Yin mpViewShell->DoneBlockMode( sal_True ); // continue selecting
15180deba7fbSSteve Yin mpViewShell->InitBlockMode( static_cast<SCCOL>(column), 0, maRange.aStart.Tab(), sal_False, sal_True, sal_False );
15190deba7fbSSteve Yin mpViewShell->MarkCursor( static_cast<SCCOL>(column), MAXROW, maRange.aStart.Tab(), sal_True, sal_False );
15200deba7fbSSteve Yin mpViewShell->SelectionChanged();
15210deba7fbSSteve Yin return sal_True;
15220deba7fbSSteve Yin }
15230deba7fbSSteve Yin
unselectRow(sal_Int32 row)15240deba7fbSSteve Yin sal_Bool SAL_CALL ScAccessibleSpreadsheet::unselectRow( sal_Int32 row )
1525*4937ceefSSteve Yin throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
15260deba7fbSSteve Yin {
15270deba7fbSSteve Yin if (IsFormulaMode())
15280deba7fbSSteve Yin {
15290deba7fbSSteve Yin return sal_False;
15300deba7fbSSteve Yin }
15310deba7fbSSteve Yin
15320deba7fbSSteve Yin mpViewShell->SetTabNo( maRange.aStart.Tab() );
15330deba7fbSSteve Yin mpViewShell->DoneBlockMode( sal_True ); // continue selecting
15340deba7fbSSteve Yin mpViewShell->InitBlockMode( 0, row, maRange.aStart.Tab(), sal_False, sal_False, sal_True, sal_True );
15350deba7fbSSteve Yin mpViewShell->MarkCursor( MAXCOL, row, maRange.aStart.Tab(), sal_False, sal_True );
15360deba7fbSSteve Yin mpViewShell->SelectionChanged();
15370deba7fbSSteve Yin mpViewShell->DoneBlockMode( sal_True );
15380deba7fbSSteve Yin return sal_True;
15390deba7fbSSteve Yin }
15400deba7fbSSteve Yin
unselectColumn(sal_Int32 column)15410deba7fbSSteve Yin sal_Bool SAL_CALL ScAccessibleSpreadsheet::unselectColumn( sal_Int32 column )
1542*4937ceefSSteve Yin throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
15430deba7fbSSteve Yin {
15440deba7fbSSteve Yin if (IsFormulaMode())
15450deba7fbSSteve Yin {
15460deba7fbSSteve Yin return sal_False;
15470deba7fbSSteve Yin }
15480deba7fbSSteve Yin
15490deba7fbSSteve Yin mpViewShell->SetTabNo( maRange.aStart.Tab() );
15500deba7fbSSteve Yin mpViewShell->DoneBlockMode( sal_True ); // continue selecting
15510deba7fbSSteve Yin mpViewShell->InitBlockMode( static_cast<SCCOL>(column), 0, maRange.aStart.Tab(), sal_False, sal_True, sal_False, sal_True );
15520deba7fbSSteve Yin mpViewShell->MarkCursor( static_cast<SCCOL>(column), MAXROW, maRange.aStart.Tab(), sal_True, sal_False );
15530deba7fbSSteve Yin mpViewShell->SelectionChanged();
15540deba7fbSSteve Yin mpViewShell->DoneBlockMode( sal_True );
15550deba7fbSSteve Yin return sal_True;
15560deba7fbSSteve Yin }
15570deba7fbSSteve Yin
FireFirstCellFocus()15580deba7fbSSteve Yin void ScAccessibleSpreadsheet::FireFirstCellFocus()
15590deba7fbSSteve Yin {
15600deba7fbSSteve Yin if (IsFormulaMode())
15610deba7fbSSteve Yin {
15620deba7fbSSteve Yin return ;
15630deba7fbSSteve Yin }
15640deba7fbSSteve Yin if (mbIsFocusSend)
15650deba7fbSSteve Yin {
15660deba7fbSSteve Yin return ;
15670deba7fbSSteve Yin }
15680deba7fbSSteve Yin mbIsFocusSend = sal_True;
15690deba7fbSSteve Yin AccessibleEventObject aEvent;
15700deba7fbSSteve Yin aEvent.EventId = AccessibleEventId::ACTIVE_DESCENDANT_CHANGED;
15710deba7fbSSteve Yin aEvent.Source = uno::Reference< XAccessible >(this);
15720deba7fbSSteve Yin aEvent.NewValue <<= getAccessibleCellAt(maActiveCell.Row(), maActiveCell.Col());
15730deba7fbSSteve Yin CommitChange(aEvent);
15740deba7fbSSteve Yin }
NotifyRefMode()15750deba7fbSSteve Yin void ScAccessibleSpreadsheet::NotifyRefMode()
15760deba7fbSSteve Yin {
15770deba7fbSSteve Yin ScViewData *pViewData = mpViewShell->GetViewData();
15780deba7fbSSteve Yin sal_uInt16 nRefStartX =pViewData->GetRefStartX();
15790deba7fbSSteve Yin sal_Int32 nRefStartY=pViewData->GetRefStartY();
15800deba7fbSSteve Yin sal_uInt16 nRefEndX=pViewData->GetRefEndX();
15810deba7fbSSteve Yin sal_Int32 nRefEndY=pViewData->GetRefEndY();
15820deba7fbSSteve Yin ScAddress aFormulaAddr;
15830deba7fbSSteve Yin if(!GetFormulaCurrentFocusCell(aFormulaAddr))
15840deba7fbSSteve Yin {
15850deba7fbSSteve Yin return ;
15860deba7fbSSteve Yin }
15870deba7fbSSteve Yin if (m_aFormulaActiveCell != aFormulaAddr)
15880deba7fbSSteve Yin {//New Focus
15890deba7fbSSteve Yin m_nMinX =std::min(nRefStartX,nRefEndX);
15900deba7fbSSteve Yin m_nMaxX =std::max(nRefStartX,nRefEndX);
15910deba7fbSSteve Yin m_nMinY = std::min(nRefStartY,nRefEndY);
15920deba7fbSSteve Yin m_nMaxY = std::max(nRefStartY,nRefEndY);
15930deba7fbSSteve Yin RemoveFormulaSelection();
15940deba7fbSSteve Yin AccessibleEventObject aEvent;
15950deba7fbSSteve Yin aEvent.Source = uno::Reference< XAccessible >(this);
15960deba7fbSSteve Yin aEvent.EventId = AccessibleEventId::ACTIVE_DESCENDANT_CHANGED;
15970deba7fbSSteve Yin aEvent.Source = uno::Reference< XAccessible >(this);
15980deba7fbSSteve Yin uno::Reference< XAccessible > xOld = m_pAccFormulaCell;
15990deba7fbSSteve Yin aEvent.OldValue <<= xOld;
16000deba7fbSSteve Yin m_pAccFormulaCell = GetAccessibleCellAt(aFormulaAddr.Row(), aFormulaAddr.Col());
16010deba7fbSSteve Yin m_pAccFormulaCell->acquire();
16020deba7fbSSteve Yin m_pAccFormulaCell->Init();
16030deba7fbSSteve Yin uno::Reference< XAccessible > xNew = m_pAccFormulaCell;
16040deba7fbSSteve Yin aEvent.NewValue <<= xNew;
16050deba7fbSSteve Yin CommitChange(aEvent);
16060deba7fbSSteve Yin if (nRefStartX == nRefEndX && nRefStartY == nRefEndY)
16070deba7fbSSteve Yin {//Selection Single
16080deba7fbSSteve Yin aEvent.EventId = AccessibleEventId::SELECTION_CHANGED;
16090deba7fbSSteve Yin aEvent.NewValue <<= xNew;
16100deba7fbSSteve Yin CommitChange(aEvent);
16110deba7fbSSteve Yin m_mapFormulaSelectionSend.insert(MAP_ADDR_XACC::value_type(aFormulaAddr,xNew));
16120deba7fbSSteve Yin m_vecFormulaLastMyAddr.clear();
16130deba7fbSSteve Yin m_vecFormulaLastMyAddr.push_back(aFormulaAddr);
16140deba7fbSSteve Yin }
16150deba7fbSSteve Yin else
16160deba7fbSSteve Yin {
16170deba7fbSSteve Yin VEC_MYADDR vecCurSel;
16180deba7fbSSteve Yin int nCurSize = (m_nMaxX - m_nMinX +1)*(m_nMaxY - m_nMinY +1) ;
16190deba7fbSSteve Yin vecCurSel.reserve(nCurSize);
16200deba7fbSSteve Yin for (sal_uInt16 x = m_nMinX ; x <= m_nMaxX ; ++x)
16210deba7fbSSteve Yin {
16220deba7fbSSteve Yin for (sal_Int32 y = m_nMinY ; y <= m_nMaxY ; ++y)
16230deba7fbSSteve Yin {
16240deba7fbSSteve Yin ScMyAddress aAddr(x,y,0);
16250deba7fbSSteve Yin vecCurSel.push_back(aAddr);
16260deba7fbSSteve Yin }
16270deba7fbSSteve Yin }
16280deba7fbSSteve Yin std::sort(vecCurSel.begin(), vecCurSel.end());
16290deba7fbSSteve Yin VEC_MYADDR vecNew;
16300deba7fbSSteve Yin std::set_difference(vecCurSel.begin(),vecCurSel.end(),
16310deba7fbSSteve Yin m_vecFormulaLastMyAddr.begin(),m_vecFormulaLastMyAddr.end(),
16320deba7fbSSteve Yin std::back_insert_iterator<VEC_MYADDR>(vecNew));
16330deba7fbSSteve Yin int nNewSize = vecNew.size();
16340deba7fbSSteve Yin if ( nNewSize > 10 )
16350deba7fbSSteve Yin {
16360deba7fbSSteve Yin aEvent.EventId = AccessibleEventId::SELECTION_CHANGED_WITHIN;
16370deba7fbSSteve Yin aEvent.NewValue <<= ::com::sun::star::uno::Any();
16380deba7fbSSteve Yin CommitChange(aEvent);
16390deba7fbSSteve Yin }
16400deba7fbSSteve Yin else
16410deba7fbSSteve Yin {
16420deba7fbSSteve Yin VEC_MYADDR::iterator viAddr = vecNew.begin();
16430deba7fbSSteve Yin for(; viAddr != vecNew.end() ; ++viAddr )
16440deba7fbSSteve Yin {
16450deba7fbSSteve Yin uno::Reference< XAccessible > xChild;
16460deba7fbSSteve Yin if (*viAddr == aFormulaAddr)
16470deba7fbSSteve Yin {
16480deba7fbSSteve Yin xChild = m_pAccFormulaCell;
16490deba7fbSSteve Yin }
16500deba7fbSSteve Yin else
16510deba7fbSSteve Yin {
16520deba7fbSSteve Yin xChild = getAccessibleCellAt(viAddr->Row(),viAddr->Col());
16530deba7fbSSteve Yin aEvent.EventId = AccessibleEventId::ACTIVE_DESCENDANT_CHANGED_NOFOCUS;
16540deba7fbSSteve Yin aEvent.NewValue <<= xChild;
16550deba7fbSSteve Yin CommitChange(aEvent);
16560deba7fbSSteve Yin }
16570deba7fbSSteve Yin aEvent.EventId = AccessibleEventId::SELECTION_CHANGED_ADD;
16580deba7fbSSteve Yin aEvent.NewValue <<= xChild;
16590deba7fbSSteve Yin CommitChange(aEvent);
16600deba7fbSSteve Yin m_mapFormulaSelectionSend.insert(MAP_ADDR_XACC::value_type(*viAddr,xChild));
16610deba7fbSSteve Yin }
16620deba7fbSSteve Yin }
16630deba7fbSSteve Yin m_vecFormulaLastMyAddr.swap(vecCurSel);
16640deba7fbSSteve Yin }
16650deba7fbSSteve Yin }
16660deba7fbSSteve Yin m_aFormulaActiveCell = aFormulaAddr;
16670deba7fbSSteve Yin }
RemoveFormulaSelection(sal_Bool bRemoveAll)16680deba7fbSSteve Yin void ScAccessibleSpreadsheet::RemoveFormulaSelection(sal_Bool bRemoveAll )
16690deba7fbSSteve Yin {
16700deba7fbSSteve Yin AccessibleEventObject aEvent;
16710deba7fbSSteve Yin aEvent.Source = uno::Reference< XAccessible >(this);
16720deba7fbSSteve Yin aEvent.OldValue <<= ::com::sun::star::uno::Any();
16730deba7fbSSteve Yin MAP_ADDR_XACC::iterator miRemove = m_mapFormulaSelectionSend.begin();
16740deba7fbSSteve Yin for(; miRemove != m_mapFormulaSelectionSend.end() ;)
16750deba7fbSSteve Yin {
16760deba7fbSSteve Yin if( !bRemoveAll && IsScAddrFormulaSel(miRemove->first) )
16770deba7fbSSteve Yin {
16780deba7fbSSteve Yin ++miRemove;
16790deba7fbSSteve Yin continue;
16800deba7fbSSteve Yin }
16810deba7fbSSteve Yin aEvent.EventId = AccessibleEventId::SELECTION_CHANGED_REMOVE;
16820deba7fbSSteve Yin aEvent.NewValue <<= miRemove->second;
16830deba7fbSSteve Yin CommitChange(aEvent);
16840deba7fbSSteve Yin MAP_ADDR_XACC::iterator miNext = miRemove;
16850deba7fbSSteve Yin ++miNext;
16860deba7fbSSteve Yin m_mapFormulaSelectionSend.erase(miRemove);
16870deba7fbSSteve Yin miRemove = miNext;
16880deba7fbSSteve Yin }
16890deba7fbSSteve Yin }
IsScAddrFormulaSel(const ScAddress & addr) const16900deba7fbSSteve Yin sal_Bool ScAccessibleSpreadsheet::IsScAddrFormulaSel(const ScAddress &addr) const
16910deba7fbSSteve Yin {
16920deba7fbSSteve Yin if( addr.Col() >= m_nMinX && addr.Col() <= m_nMaxX &&
16930deba7fbSSteve Yin addr.Row() >= m_nMinY && addr.Row() <= m_nMaxY &&
16940deba7fbSSteve Yin addr.Tab() == mpViewShell->GetViewData()->GetTabNo() )
16950deba7fbSSteve Yin {
16960deba7fbSSteve Yin return sal_True;
16970deba7fbSSteve Yin }
16980deba7fbSSteve Yin return sal_False;
16990deba7fbSSteve Yin }
CheckChildIndex(sal_Int32 nIndex) const17000deba7fbSSteve Yin sal_Bool ScAccessibleSpreadsheet::CheckChildIndex(sal_Int32 nIndex) const
17010deba7fbSSteve Yin {
17020deba7fbSSteve Yin sal_Int32 nMaxIndex = (m_nMaxX - m_nMinX +1)*(m_nMaxY - m_nMinY +1) -1 ;
17030deba7fbSSteve Yin return nIndex <= nMaxIndex && nIndex >= 0 ;
17040deba7fbSSteve Yin }
GetChildIndexAddress(sal_Int32 nIndex) const17050deba7fbSSteve Yin ScAddress ScAccessibleSpreadsheet::GetChildIndexAddress(sal_Int32 nIndex) const
17060deba7fbSSteve Yin {
17070deba7fbSSteve Yin sal_Int32 nRowAll = GetRowAll();
17080deba7fbSSteve Yin sal_uInt16 nColAll = GetColAll();
17090deba7fbSSteve Yin if (nIndex < 0 || nIndex >= nRowAll * nColAll )
17100deba7fbSSteve Yin {
17110deba7fbSSteve Yin return ScAddress();
17120deba7fbSSteve Yin }
17130deba7fbSSteve Yin return ScAddress(
17140deba7fbSSteve Yin static_cast<SCCOL>((nIndex - nIndex % nRowAll) / nRowAll + + m_nMinX),
17150deba7fbSSteve Yin nIndex % nRowAll + m_nMinY,
17160deba7fbSSteve Yin mpViewShell->GetViewData()->GetTabNo()
17170deba7fbSSteve Yin );
17180deba7fbSSteve Yin }
GetAccessibleIndexFormula(sal_Int32 nRow,sal_Int32 nColumn)17190deba7fbSSteve Yin sal_Int32 ScAccessibleSpreadsheet::GetAccessibleIndexFormula( sal_Int32 nRow, sal_Int32 nColumn )
17200deba7fbSSteve Yin {
17210deba7fbSSteve Yin sal_uInt16 nColRelative = sal_uInt16(nColumn) - GetColAll();
17220deba7fbSSteve Yin sal_Int32 nRowRelative = nRow - GetRowAll();
17230deba7fbSSteve Yin if (nRow < 0 || nColumn < 0 || nRowRelative >= GetRowAll() || nColRelative >= GetColAll() )
17240deba7fbSSteve Yin {
17250deba7fbSSteve Yin return -1;
17260deba7fbSSteve Yin }
17270deba7fbSSteve Yin return GetRowAll() * nRowRelative + nColRelative;
17280deba7fbSSteve Yin }
IsFormulaMode()17290deba7fbSSteve Yin sal_Bool ScAccessibleSpreadsheet::IsFormulaMode()
17300deba7fbSSteve Yin {
17310deba7fbSSteve Yin ScViewData *pViewData = mpViewShell->GetViewData();
17320deba7fbSSteve Yin m_bFormulaMode = pViewData->IsRefMode() || SC_MOD()->IsFormulaMode();
17330deba7fbSSteve Yin return m_bFormulaMode ;
17340deba7fbSSteve Yin }
GetFormulaCurrentFocusCell(ScAddress & addr)17350deba7fbSSteve Yin sal_Bool ScAccessibleSpreadsheet::GetFormulaCurrentFocusCell(ScAddress &addr)
17360deba7fbSSteve Yin {
17370deba7fbSSteve Yin ScViewData *pViewData = mpViewShell->GetViewData();
17380deba7fbSSteve Yin sal_uInt16 nRefX=0;
17390deba7fbSSteve Yin sal_Int32 nRefY=0;
17400deba7fbSSteve Yin if(m_bFormulaLastMode)
17410deba7fbSSteve Yin {
17420deba7fbSSteve Yin nRefX=pViewData->GetRefEndX();
17430deba7fbSSteve Yin nRefY=pViewData->GetRefEndY();
17440deba7fbSSteve Yin }
17450deba7fbSSteve Yin else
17460deba7fbSSteve Yin {
17470deba7fbSSteve Yin nRefX=pViewData->GetRefStartX();
17480deba7fbSSteve Yin nRefY=pViewData->GetRefStartY();
17490deba7fbSSteve Yin }
17500deba7fbSSteve Yin if( /* Always true: nRefX >= 0 && */ nRefX <= MAXCOL && nRefY >= 0 && nRefY <= MAXROW)
17510deba7fbSSteve Yin {
17520deba7fbSSteve Yin addr = ScAddress(nRefX,nRefY,pViewData->GetTabNo());
17530deba7fbSSteve Yin return sal_True;
17540deba7fbSSteve Yin }
17550deba7fbSSteve Yin return sal_False;
17560deba7fbSSteve Yin }
GetActiveCell()17570deba7fbSSteve Yin uno::Reference < XAccessible > ScAccessibleSpreadsheet::GetActiveCell()
17580deba7fbSSteve Yin {
17590deba7fbSSteve Yin if( m_mapSelectionSend.find( maActiveCell ) != m_mapSelectionSend.end() )
17600deba7fbSSteve Yin return m_mapSelectionSend[maActiveCell];
17610deba7fbSSteve Yin else
17620deba7fbSSteve Yin return getAccessibleCellAt(maActiveCell.Row(), maActiveCell .Col());
17630deba7fbSSteve Yin }
1764